fix: 非Claude Code客户端system prompt迁移至messages以绕过第三方应用检测

Anthropic近期引入基于system参数内容的第三方应用检测机制,原有的前置追加
Claude Code提示词策略无法通过检测(后续内容仍为非Claude Code格式触发429)。

新策略:对非Claude Code客户端的OAuth/SetupToken账号请求,将system字段
完整替换为Claude Code标识提示词,原始system内容作为user/assistant消息对
注入messages开头,模型仍接收完整指令。

仅影响/v1/messages路径,chat_completions和responses路径保持原有逻辑不变。
真正的Claude Code客户端请求完全不受影响(原样透传)。
This commit is contained in:
shaw
2026-04-07 17:06:47 +08:00
parent 9ab2fd7f9e
commit f3aa54b770
3 changed files with 219 additions and 3 deletions
@@ -761,7 +761,14 @@ func TestGatewayService_AnthropicOAuth_ForwardPreservesBillingHeaderSystemBlock(
system := gjson.GetBytes(upstream.lastBody, "system")
require.True(t, system.Exists())
require.Contains(t, system.Raw, "x-anthropic-billing-header keep")
require.Equal(t, claudeCodeSystemPrompt, system.String())
// 原始 system prompt 应迁移至 messages 中
messages := gjson.GetBytes(upstream.lastBody, "messages")
require.True(t, messages.IsArray())
firstMsg := messages.Array()[0]
require.Equal(t, "user", firstMsg.Get("role").String())
require.Contains(t, firstMsg.Get("content.0.text").String(), "x-anthropic-billing-header keep")
})
}
}