From 33f4904b2524636ae2055f9f0c30d045bd790c32 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Fri, 22 May 2026 12:04:27 +0800 Subject: [PATCH] fix(translator): handle system role as developer in Claude request conversion - Updated `ConvertClaudeRequestToGemini` logic to treat `system` role as `developer`. - Added unit test case to validate the behavior. Closes: #3510 --- .../translator/codex/claude/codex_claude_request.go | 3 +++ .../codex/claude/codex_claude_request_test.go | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/internal/translator/codex/claude/codex_claude_request.go b/internal/translator/codex/claude/codex_claude_request.go index 3a40a513..b7a42d2c 100644 --- a/internal/translator/codex/claude/codex_claude_request.go +++ b/internal/translator/codex/claude/codex_claude_request.go @@ -87,6 +87,9 @@ func ConvertClaudeRequestToCodex(modelName string, inputRawJSON []byte, _ bool) for i := 0; i < len(messageResults); i++ { messageResult := messageResults[i] messageRole := messageResult.Get("role").String() + if messageRole == "system" { + messageRole = "developer" + } newMessage := func() []byte { msg := []byte(`{"type":"message","role":"","content":[]}`) diff --git a/internal/translator/codex/claude/codex_claude_request_test.go b/internal/translator/codex/claude/codex_claude_request_test.go index 9e2a0a33..eab12e47 100644 --- a/internal/translator/codex/claude/codex_claude_request_test.go +++ b/internal/translator/codex/claude/codex_claude_request_test.go @@ -42,6 +42,18 @@ func TestConvertClaudeRequestToCodex_SystemMessageScenarios(t *testing.T) { wantHasDeveloper: true, wantTexts: []string{"Be helpful"}, }, + { + name: "System role in messages", + inputJSON: `{ + "model": "claude-3-opus", + "messages": [ + {"role": "system", "content": "Follow the project instructions"}, + {"role": "user", "content": "hello"} + ] + }`, + wantHasDeveloper: true, + wantTexts: []string{"Follow the project instructions"}, + }, { name: "Array system field with filtered billing header", inputJSON: `{