mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-07 15:38:22 +08:00
修复 Grok 兼容测试与 errcheck 导致的 CI 失败
对齐 Grok ModelInput 对 function_call.status 的剥离,恢复畸形 tools 不改写 tool_choice 的行为,并检查测试中的类型断言。
This commit is contained in:
@@ -293,11 +293,17 @@ func TestApplyCodexOAuthTransform_NormalizesNativeToolCallPairsByType(t *testing
|
||||
|
||||
applyCodexOAuthTransform(reqBody, false, false)
|
||||
|
||||
input := reqBody["input"].([]any)
|
||||
custom := input[0].(map[string]any)
|
||||
customOutput := input[1].(map[string]any)
|
||||
search := input[2].(map[string]any)
|
||||
searchOutput := input[3].(map[string]any)
|
||||
input, ok := reqBody["input"].([]any)
|
||||
require.True(t, ok)
|
||||
require.Len(t, input, 4)
|
||||
custom, ok := input[0].(map[string]any)
|
||||
require.True(t, ok)
|
||||
customOutput, ok := input[1].(map[string]any)
|
||||
require.True(t, ok)
|
||||
search, ok := input[2].(map[string]any)
|
||||
require.True(t, ok)
|
||||
searchOutput, ok := input[3].(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.NotContains(t, custom, "id", "the invalid replay item id must be removed, not fabricated")
|
||||
require.Equal(t, "ctc_custom", custom["call_id"])
|
||||
require.Equal(t, custom["call_id"], customOutput["call_id"])
|
||||
@@ -319,13 +325,23 @@ func TestApplyCodexOAuthTransform_PreservesNativeCallIDsWhenRequested(t *testing
|
||||
|
||||
applyCodexOAuthTransformWithOptions(reqBody, codexOAuthTransformOptions{PreserveToolCallIDs: true})
|
||||
|
||||
input := reqBody["input"].([]any)
|
||||
require.Equal(t, "ctc_custom", input[0].(map[string]any)["id"])
|
||||
require.Equal(t, "call_custom", input[0].(map[string]any)["call_id"])
|
||||
require.Equal(t, "call_custom", input[1].(map[string]any)["call_id"])
|
||||
require.Equal(t, "tsc_search", input[2].(map[string]any)["id"])
|
||||
require.Equal(t, "call_search", input[2].(map[string]any)["call_id"])
|
||||
require.Equal(t, "call_search", input[3].(map[string]any)["call_id"])
|
||||
input, ok := reqBody["input"].([]any)
|
||||
require.True(t, ok)
|
||||
require.Len(t, input, 4)
|
||||
first, ok := input[0].(map[string]any)
|
||||
require.True(t, ok)
|
||||
second, ok := input[1].(map[string]any)
|
||||
require.True(t, ok)
|
||||
third, ok := input[2].(map[string]any)
|
||||
require.True(t, ok)
|
||||
fourth, ok := input[3].(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, "ctc_custom", first["id"])
|
||||
require.Equal(t, "call_custom", first["call_id"])
|
||||
require.Equal(t, "call_custom", second["call_id"])
|
||||
require.Equal(t, "tsc_search", third["id"])
|
||||
require.Equal(t, "call_search", third["call_id"])
|
||||
require.Equal(t, "call_search", fourth["call_id"])
|
||||
}
|
||||
|
||||
func TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing(t *testing.T) {
|
||||
@@ -340,9 +356,17 @@ func TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing(t
|
||||
|
||||
applyCodexOAuthTransformWithOptions(reqBody, codexOAuthTransformOptions{PreserveToolCallIDs: true})
|
||||
|
||||
input := reqBody["input"].([]any)
|
||||
callID := input[0].(map[string]any)["call_id"].(string)
|
||||
outputCallID := input[1].(map[string]any)["call_id"].(string)
|
||||
input, ok := reqBody["input"].([]any)
|
||||
require.True(t, ok)
|
||||
require.Len(t, input, 2)
|
||||
first, ok := input[0].(map[string]any)
|
||||
require.True(t, ok)
|
||||
second, ok := input[1].(map[string]any)
|
||||
require.True(t, ok)
|
||||
callID, ok := first["call_id"].(string)
|
||||
require.True(t, ok)
|
||||
outputCallID, ok := second["call_id"].(string)
|
||||
require.True(t, ok)
|
||||
require.LessOrEqual(t, len(callID), codexCallIDMaxLength)
|
||||
require.True(t, strings.HasPrefix(callID, "ctc_"))
|
||||
require.Equal(t, callID, outputCallID)
|
||||
@@ -1763,9 +1787,15 @@ func TestNormalizeOpenAIResponsesImageGenerationTools_StripsGPTImage2InputFideli
|
||||
}}
|
||||
|
||||
require.True(t, normalizeOpenAIResponsesImageGenerationTools(reqBody))
|
||||
tools := reqBody["tools"].([]any)
|
||||
require.NotContains(t, tools[0].(map[string]any), "input_fidelity")
|
||||
require.Equal(t, "high", tools[1].(map[string]any)["input_fidelity"])
|
||||
tools, ok := reqBody["tools"].([]any)
|
||||
require.True(t, ok)
|
||||
require.Len(t, tools, 2)
|
||||
first, ok := tools[0].(map[string]any)
|
||||
require.True(t, ok)
|
||||
second, ok := tools[1].(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.NotContains(t, first, "input_fidelity")
|
||||
require.Equal(t, "high", second["input_fidelity"])
|
||||
}
|
||||
|
||||
func TestOpenAIRequestBodyImageGenerationToolNeedsNormalization_GPTImage2InputFidelity(t *testing.T) {
|
||||
|
||||
@@ -984,7 +984,9 @@ func sanitizeGrokResponsesTools(body []byte) ([]byte, error) {
|
||||
return deleteGrokOrphanToolControls(body)
|
||||
}
|
||||
if !tools.IsArray() {
|
||||
return deleteGrokOrphanToolControls(body)
|
||||
// Leave malformed tools (and their tool_choice) untouched instead of
|
||||
// inventing an empty inventory.
|
||||
return body, nil
|
||||
}
|
||||
|
||||
rawTools := tools.Array()
|
||||
|
||||
@@ -106,7 +106,7 @@ func TestPatchGrokResponsesBodyWithClientToolsLowersDiscoveredToolsOutput(t *tes
|
||||
{"type":"function","name":"multi_agent_v1__wait_agent","parameters":{"type":"object","properties":{"timeout_ms":{"type":"integer"}},"additionalProperties":false}}
|
||||
],
|
||||
"input":[
|
||||
{"type":"function_call","call_id":"call_fixture","name":"tool_search","arguments":"{\"query\":\"subagent\"}","status":"completed"},
|
||||
{"type":"function_call","call_id":"call_fixture","name":"tool_search","arguments":"{\"query\":\"subagent\"}"},
|
||||
{"type":"function_call_output","call_id":"call_fixture","output":`+string(mustMarshalJSONForTest(t, output))+`}
|
||||
]
|
||||
}`, string(patched))
|
||||
|
||||
@@ -34,7 +34,8 @@ func TestSanitizeOpenAIResponsesOrphanToolOutputs(t *testing.T) {
|
||||
reqBody := map[string]any{"input": input}
|
||||
|
||||
require.True(t, sanitizeOpenAIResponsesOrphanToolOutputs(reqBody, input, false))
|
||||
got := reqBody["input"].([]any)
|
||||
got, ok := reqBody["input"].([]any)
|
||||
require.True(t, ok)
|
||||
require.Empty(t, got)
|
||||
})
|
||||
|
||||
@@ -90,14 +91,25 @@ func TestOpenAIResponsesInputTextIsNeverSilentlyTruncated(t *testing.T) {
|
||||
reqBody := map[string]any{"input": input}
|
||||
|
||||
require.False(t, truncateOpenAIResponsesInputText(reqBody))
|
||||
require.Equal(t, atLimit, input[0].(map[string]any)["output"])
|
||||
first, ok := input[0].(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, atLimit, first["output"])
|
||||
for _, rawItem := range input[1:5] {
|
||||
item := rawItem.(map[string]any)
|
||||
item, ok := rawItem.(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, oversized, item["output"])
|
||||
}
|
||||
content := input[5].(map[string]any)["content"].([]any)
|
||||
require.Equal(t, "short", content[0].(map[string]any)["text"])
|
||||
require.Equal(t, oversized, content[1].(map[string]any)["text"])
|
||||
last, ok := input[5].(map[string]any)
|
||||
require.True(t, ok)
|
||||
content, ok := last["content"].([]any)
|
||||
require.True(t, ok)
|
||||
require.Len(t, content, 2)
|
||||
shortPart, ok := content[0].(map[string]any)
|
||||
require.True(t, ok)
|
||||
oversizedPart, ok := content[1].(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, "short", shortPart["text"])
|
||||
require.Equal(t, oversized, oversizedPart["text"])
|
||||
}
|
||||
|
||||
func TestOpenAIResponsesInputNeverRequestsPreemptiveTruncation(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user