From 6762e081f38b80acd467d2c93999a0492ad7d70d Mon Sep 17 00:00:00 2001 From: can1357 Date: Sat, 3 Jan 2026 21:01:01 +0100 Subject: [PATCH] feat(translator): add developer role support for Gemini translators Treat OpenAI's "developer" role the same as "system" role in request translation for gemini, gemini-cli, and antigravity backends. --- .../openai/chat-completions/antigravity_openai_request.go | 4 ++-- .../openai/chat-completions/gemini-cli_openai_request.go | 4 ++-- .../gemini/openai/chat-completions/gemini_openai_request.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go index d1403d7b..f6ab2c12 100644 --- a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go +++ b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go @@ -184,7 +184,7 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _ role := m.Get("role").String() content := m.Get("content") - if role == "system" && len(arr) > 1 { + if (role == "system" || role == "developer") && len(arr) > 1 { // system -> request.systemInstruction as a user message style if content.Type == gjson.String { out, _ = sjson.SetBytes(out, "request.systemInstruction.role", "user") @@ -201,7 +201,7 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _ } } } - } else if role == "user" || (role == "system" && len(arr) == 1) { + } else if role == "user" || ((role == "system" || role == "developer") && len(arr) == 1) { // Build single user content node to avoid splitting into multiple contents node := []byte(`{"role":"user","parts":[]}`) if content.Type == gjson.String { diff --git a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go index e1d1a40b..82c5cf39 100644 --- a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go +++ b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go @@ -152,7 +152,7 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo role := m.Get("role").String() content := m.Get("content") - if role == "system" && len(arr) > 1 { + if (role == "system" || role == "developer") && len(arr) > 1 { // system -> request.systemInstruction as a user message style if content.Type == gjson.String { out, _ = sjson.SetBytes(out, "request.systemInstruction.role", "user") @@ -169,7 +169,7 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo } } } - } else if role == "user" || (role == "system" && len(arr) == 1) { + } else if role == "user" || ((role == "system" || role == "developer") && len(arr) == 1) { // Build single user content node to avoid splitting into multiple contents node := []byte(`{"role":"user","parts":[]}`) if content.Type == gjson.String { diff --git a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go index f0902b38..4d89d011 100644 --- a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go +++ b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go @@ -170,7 +170,7 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool) role := m.Get("role").String() content := m.Get("content") - if role == "system" && len(arr) > 1 { + if (role == "system" || role == "developer") && len(arr) > 1 { // system -> system_instruction as a user message style if content.Type == gjson.String { out, _ = sjson.SetBytes(out, "system_instruction.role", "user") @@ -187,7 +187,7 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool) } } } - } else if role == "user" || (role == "system" && len(arr) == 1) { + } else if role == "user" || ((role == "system" || role == "developer") && len(arr) == 1) { // Build single user content node to avoid splitting into multiple contents node := []byte(`{"role":"user","parts":[]}`) if content.Type == gjson.String {