From c73b3fa43bdacb973d0470042004d5002103ee42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Sat, 15 Nov 2025 19:14:13 +0800 Subject: [PATCH] fix(claude translator): guard tool schema properties --- .../codex/claude/codex_claude_request.go | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/internal/translator/codex/claude/codex_claude_request.go b/internal/translator/codex/claude/codex_claude_request.go index 927c2238..3949fc3d 100644 --- a/internal/translator/codex/claude/codex_claude_request.go +++ b/internal/translator/codex/claude/codex_claude_request.go @@ -204,7 +204,7 @@ func ConvertClaudeRequestToCodex(modelName string, inputRawJSON []byte, _ bool) } tool, _ = sjson.Set(tool, "name", name) } - tool, _ = sjson.SetRaw(tool, "parameters", toolResult.Get("input_schema").Raw) + tool, _ = sjson.SetRaw(tool, "parameters", normalizeToolParameters(toolResult.Get("input_schema").Raw)) tool, _ = sjson.Delete(tool, "input_schema") tool, _ = sjson.Delete(tool, "parameters.$schema") tool, _ = sjson.Set(tool, "strict", false) @@ -334,3 +334,22 @@ func buildReverseMapFromClaudeOriginalToShort(original []byte) map[string]string } return m } + +// normalizeToolParameters ensures object schemas contain at least an empty properties map. +func normalizeToolParameters(raw string) string { + raw = strings.TrimSpace(raw) + if raw == "" || raw == "null" || !gjson.Valid(raw) { + return `{"type":"object","properties":{}}` + } + schema := raw + result := gjson.Parse(raw) + schemaType := result.Get("type").String() + if schemaType == "" { + schema, _ = sjson.Set(schema, "type", "object") + schemaType = "object" + } + if schemaType == "object" && !result.Get("properties").Exists() { + schema, _ = sjson.SetRaw(schema, "properties", `{}`) + } + return schema +}