feat(gateway): align body shape with real Claude Code CLI defaults
Three field-level alignments in normalizeClaudeOAuthRequestBody to
match real Claude Code CLI traffic byte-for-byte:
1. temperature: previously deleted unconditionally; now passes
through client value, defaults to 1 when absent (real CLI
always sends temperature, default 1).
2. max_tokens: defaults to 128000 when absent (real CLI default).
3. context_management: when thinking.type is enabled/adaptive
and the client did not provide context_management, inject
{"edits":[{"type":"clear_thinking_20251015","keep":"all"}]}
to mirror real CLI behavior.
tool_choice removal is unchanged (Claude Code OAuth credentials
do not allow client-supplied tool_choice).
Tests updated:
- gateway_body_order_test.go: temperature/max_tokens are now
expected in output; tool_choice still removed.
- gateway_prompt_test.go: system array is now 2 blocks
(billing + cc prompt), assertions adjusted.
- gateway_anthropic_apikey_passthrough_test.go: same 2-block
assertion.
This commit is contained in:
@@ -378,16 +378,27 @@ func TestRewriteSystemForNonClaudeCode(t *testing.T) {
|
||||
err := json.Unmarshal(result, &parsed)
|
||||
require.NoError(t, err)
|
||||
|
||||
// system 应为 array 格式: [{type: "text", text: "...", cache_control: {type: "ephemeral"}}]
|
||||
// system 应为 array 格式,对齐真实 Claude Code CLI 的 2-block 形态:
|
||||
// [0] billing attribution block (x-anthropic-billing-header: cc_version=...;)
|
||||
// [1] Claude Code prompt block (带 cache_control)
|
||||
systemArr, ok := parsed["system"].([]any)
|
||||
require.True(t, ok, "system should be an array, got %T", parsed["system"])
|
||||
require.Len(t, systemArr, 1, "system array should have exactly 1 block")
|
||||
systemBlock, ok := systemArr[0].(map[string]any)
|
||||
require.Len(t, systemArr, 2, "system array should have exactly 2 blocks (billing + cc prompt)")
|
||||
|
||||
billingBlock, ok := systemArr[0].(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, "text", billingBlock["type"])
|
||||
require.Contains(t, billingBlock["text"], "x-anthropic-billing-header:")
|
||||
require.Contains(t, billingBlock["text"], "cc_version=")
|
||||
require.Contains(t, billingBlock["text"], "cc_entrypoint=cli")
|
||||
require.Contains(t, billingBlock["text"], "cch=00000")
|
||||
|
||||
systemBlock, ok := systemArr[1].(map[string]any)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, "text", systemBlock["type"])
|
||||
require.Equal(t, tt.wantSystemText, systemBlock["text"])
|
||||
cc, ok := systemBlock["cache_control"].(map[string]any)
|
||||
require.True(t, ok, "system block should have cache_control")
|
||||
require.True(t, ok, "cc prompt block should have cache_control")
|
||||
require.Equal(t, "ephemeral", cc["type"])
|
||||
|
||||
// 检查 messages
|
||||
|
||||
Reference in New Issue
Block a user