fix: normalize web_search_preview for codex responses
This commit is contained in:
@@ -39,6 +39,7 @@ func ConvertOpenAIResponsesRequestToCodex(modelName string, inputRawJSON []byte,
|
|||||||
|
|
||||||
// Convert role "system" to "developer" in input array to comply with Codex API requirements.
|
// Convert role "system" to "developer" in input array to comply with Codex API requirements.
|
||||||
rawJSON = convertSystemRoleToDeveloper(rawJSON)
|
rawJSON = convertSystemRoleToDeveloper(rawJSON)
|
||||||
|
rawJSON = normalizeCodexBuiltinTools(rawJSON)
|
||||||
|
|
||||||
return rawJSON
|
return rawJSON
|
||||||
}
|
}
|
||||||
@@ -82,3 +83,26 @@ func convertSystemRoleToDeveloper(rawJSON []byte) []byte {
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// normalizeCodexBuiltinTools rewrites legacy/preview built-in tool variants to the
|
||||||
|
// stable names expected by the current Codex upstream.
|
||||||
|
func normalizeCodexBuiltinTools(rawJSON []byte) []byte {
|
||||||
|
result := rawJSON
|
||||||
|
|
||||||
|
tools := gjson.GetBytes(result, "tools")
|
||||||
|
if tools.IsArray() {
|
||||||
|
toolArray := tools.Array()
|
||||||
|
for i := 0; i < len(toolArray); i++ {
|
||||||
|
typePath := fmt.Sprintf("tools.%d.type", i)
|
||||||
|
if gjson.GetBytes(result, typePath).String() == "web_search_preview" {
|
||||||
|
result, _ = sjson.SetBytes(result, typePath, "web_search")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if gjson.GetBytes(result, "tool_choice.type").String() == "web_search_preview" {
|
||||||
|
result, _ = sjson.SetBytes(result, "tool_choice.type", "web_search")
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|||||||
@@ -264,6 +264,26 @@ func TestConvertSystemRoleToDeveloper_AssistantRole(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConvertOpenAIResponsesRequestToCodex_NormalizesWebSearchPreview(t *testing.T) {
|
||||||
|
inputJSON := []byte(`{
|
||||||
|
"model": "gpt-5.4-mini",
|
||||||
|
"input": "find latest OpenAI model news",
|
||||||
|
"tools": [
|
||||||
|
{"type": "web_search_preview"}
|
||||||
|
],
|
||||||
|
"tool_choice": {"type": "web_search_preview"}
|
||||||
|
}`)
|
||||||
|
|
||||||
|
output := ConvertOpenAIResponsesRequestToCodex("gpt-5.4-mini", inputJSON, false)
|
||||||
|
|
||||||
|
if got := gjson.GetBytes(output, "tools.0.type").String(); got != "web_search" {
|
||||||
|
t.Fatalf("tools.0.type = %q, want %q: %s", got, "web_search", string(output))
|
||||||
|
}
|
||||||
|
if got := gjson.GetBytes(output, "tool_choice.type").String(); got != "web_search" {
|
||||||
|
t.Fatalf("tool_choice.type = %q, want %q: %s", got, "web_search", string(output))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestUserFieldDeletion(t *testing.T) {
|
func TestUserFieldDeletion(t *testing.T) {
|
||||||
inputJSON := []byte(`{
|
inputJSON := []byte(`{
|
||||||
"model": "gpt-5.2",
|
"model": "gpt-5.2",
|
||||||
|
|||||||
Reference in New Issue
Block a user