fix: use Responses-compatible function tool_choice format
This commit is contained in:
@@ -141,9 +141,7 @@ func applyCodexOAuthTransform(reqBody map[string]any, isCodexCLI bool, isCompact
|
||||
if name, ok := fcObj["name"].(string); ok && strings.TrimSpace(name) != "" {
|
||||
reqBody["tool_choice"] = map[string]any{
|
||||
"type": "function",
|
||||
"function": map[string]any{
|
||||
"name": name,
|
||||
},
|
||||
"name": name,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -219,9 +217,38 @@ func normalizeCodexToolChoice(reqBody map[string]any) bool {
|
||||
return false
|
||||
}
|
||||
choiceType := strings.TrimSpace(firstNonEmptyString(choiceMap["type"]))
|
||||
if choiceType == "" || codexToolsContainType(reqBody["tools"], choiceType) {
|
||||
if choiceType == "" {
|
||||
return false
|
||||
}
|
||||
modified := false
|
||||
if choiceType == "function" {
|
||||
name := strings.TrimSpace(firstNonEmptyString(choiceMap["name"]))
|
||||
if name == "" {
|
||||
if function, ok := choiceMap["function"].(map[string]any); ok {
|
||||
name = strings.TrimSpace(firstNonEmptyString(function["name"]))
|
||||
}
|
||||
}
|
||||
if name == "" {
|
||||
reqBody["tool_choice"] = "auto"
|
||||
return true
|
||||
}
|
||||
if strings.TrimSpace(firstNonEmptyString(choiceMap["name"])) != name {
|
||||
choiceMap["name"] = name
|
||||
modified = true
|
||||
}
|
||||
if _, ok := choiceMap["function"]; ok {
|
||||
delete(choiceMap, "function")
|
||||
modified = true
|
||||
}
|
||||
if !codexToolsContainFunctionName(reqBody["tools"], name) {
|
||||
reqBody["tool_choice"] = "auto"
|
||||
return true
|
||||
}
|
||||
return modified
|
||||
}
|
||||
if codexToolsContainType(reqBody["tools"], choiceType) {
|
||||
return modified
|
||||
}
|
||||
reqBody["tool_choice"] = "auto"
|
||||
return true
|
||||
}
|
||||
@@ -243,6 +270,33 @@ func codexToolsContainType(rawTools any, toolType string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func codexToolsContainFunctionName(rawTools any, name string) bool {
|
||||
tools, ok := rawTools.([]any)
|
||||
if !ok || strings.TrimSpace(name) == "" {
|
||||
return false
|
||||
}
|
||||
normalizedName := strings.TrimSpace(name)
|
||||
for _, rawTool := range tools {
|
||||
tool, ok := rawTool.(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if strings.TrimSpace(firstNonEmptyString(tool["type"])) != "function" {
|
||||
continue
|
||||
}
|
||||
toolName := strings.TrimSpace(firstNonEmptyString(tool["name"]))
|
||||
if toolName == "" {
|
||||
if function, ok := tool["function"].(map[string]any); ok {
|
||||
toolName = strings.TrimSpace(firstNonEmptyString(function["name"]))
|
||||
}
|
||||
}
|
||||
if toolName == normalizedName {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func normalizeCodexToolRoleMessages(input []any) ([]any, bool) {
|
||||
if len(input) == 0 {
|
||||
return input, false
|
||||
|
||||
Reference in New Issue
Block a user