diff --git a/assets/aicodemirror.png b/assets/aicodemirror.png new file mode 100644 index 00000000..b4585bcf Binary files /dev/null and b/assets/aicodemirror.png differ diff --git a/internal/translator/antigravity/claude/antigravity_claude_request.go b/internal/translator/antigravity/claude/antigravity_claude_request.go index 9bef7125..a6134087 100644 --- a/internal/translator/antigravity/claude/antigravity_claude_request.go +++ b/internal/translator/antigravity/claude/antigravity_claude_request.go @@ -115,7 +115,7 @@ func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _ if signatureResult.Exists() && signatureResult.String() != "" { arrayClientSignatures := strings.SplitN(signatureResult.String(), "#", 2) if len(arrayClientSignatures) == 2 { - if modelName == arrayClientSignatures[0] { + if cache.GetModelGroup(modelName) == arrayClientSignatures[0] { clientSignature = arrayClientSignatures[1] } } diff --git a/internal/translator/codex/openai/responses/codex_openai-responses_request.go b/internal/translator/codex/openai/responses/codex_openai-responses_request.go index 389c6d31..868b6422 100644 --- a/internal/translator/codex/openai/responses/codex_openai-responses_request.go +++ b/internal/translator/codex/openai/responses/codex_openai-responses_request.go @@ -11,6 +11,12 @@ import ( func ConvertOpenAIResponsesRequestToCodex(modelName string, inputRawJSON []byte, _ bool) []byte { rawJSON := bytes.Clone(inputRawJSON) + inputResult := gjson.GetBytes(rawJSON, "input") + if inputResult.Type == gjson.String { + input, _ := sjson.Set(`[{"type":"message","role":"user","content":[{"type":"input_text","text":""}]}]`, "0.content.0.text", inputResult.String()) + rawJSON, _ = sjson.SetRawBytes(rawJSON, "input", []byte(input)) + } + rawJSON, _ = sjson.SetBytes(rawJSON, "stream", true) rawJSON, _ = sjson.SetBytes(rawJSON, "store", false) rawJSON, _ = sjson.SetBytes(rawJSON, "parallel_tool_calls", true) diff --git a/internal/translator/openai/openai/responses/openai_openai-responses_request.go b/internal/translator/openai/openai/responses/openai_openai-responses_request.go index 86cf19f8..1fb5ca1f 100644 --- a/internal/translator/openai/openai/responses/openai_openai-responses_request.go +++ b/internal/translator/openai/openai/responses/openai_openai-responses_request.go @@ -68,6 +68,9 @@ func ConvertOpenAIResponsesRequestToOpenAIChatCompletions(modelName string, inpu case "message", "": // Handle regular message conversion role := item.Get("role").String() + if role == "developer" { + role = "user" + } message := `{"role":"","content":""}` message, _ = sjson.Set(message, "role", role) @@ -167,7 +170,8 @@ func ConvertOpenAIResponsesRequestToOpenAIChatCompletions(modelName string, inpu // Only function tools need structural conversion because Chat Completions nests details under "function". toolType := tool.Get("type").String() if toolType != "" && toolType != "function" && tool.IsObject() { - chatCompletionsTools = append(chatCompletionsTools, tool.Value()) + // Almost all providers lack built-in tools, so we just ignore them. + // chatCompletionsTools = append(chatCompletionsTools, tool.Value()) return true }