Merge pull request #3223 from feitianbubu/fix/intercept-streaming-haiku-probe

fix: 修复CC Switch改为流式测试后请求失败的问题
This commit is contained in:
Wesley Liddick
2026-06-16 20:27:33 +08:00
committed by GitHub
2 changed files with 13 additions and 14 deletions
+10 -11
View File
@@ -169,7 +169,7 @@ func (h *GatewayHandler) Messages(c *gin.Context) {
// 设置 max_tokens=1 + haiku 探测请求标识到 context 中
// 必须在 SetClaudeCodeClientContext 之前设置,因为 ClaudeCodeValidator 需要读取此标识进行绕过判断
if isMaxTokensOneHaikuRequest(reqModel, parsedReq.MaxTokens, reqStream) {
if isMaxTokensOneHaikuRequest(reqModel, parsedReq.MaxTokens) {
ctx := service.WithIsMaxTokensOneHaikuRequest(c.Request.Context(), true, h.metadataBridgeEnabled())
c.Request = c.Request.WithContext(ctx)
}
@@ -333,7 +333,7 @@ func (h *GatewayHandler) Messages(c *gin.Context) {
// 检查请求拦截(预热请求、SUGGESTION MODE等)
if account.IsInterceptWarmupEnabled() {
interceptType := detectInterceptType(body, reqModel, parsedReq.MaxTokens, reqStream, isClaudeCodeClient)
interceptType := detectInterceptType(body, reqModel, parsedReq.MaxTokens, isClaudeCodeClient)
if interceptType != InterceptTypeNone {
if selection.Acquired && selection.ReleaseFunc != nil {
selection.ReleaseFunc()
@@ -611,7 +611,7 @@ func (h *GatewayHandler) Messages(c *gin.Context) {
// 检查请求拦截(预热请求、SUGGESTION MODE等)
if account.IsInterceptWarmupEnabled() {
interceptType := detectInterceptType(body, reqModel, parsedReq.MaxTokens, reqStream, isClaudeCodeClient)
interceptType := detectInterceptType(body, reqModel, parsedReq.MaxTokens, isClaudeCodeClient)
if interceptType != InterceptTypeNone {
if selection.Acquired && selection.ReleaseFunc != nil {
selection.ReleaseFunc()
@@ -1797,10 +1797,10 @@ func isHaikuModel(model string) bool {
}
// isMaxTokensOneHaikuRequest 检查是否为 max_tokens=1 + haiku 模型的探测请求
// 这类请求用于 Claude Code 验证 API 连通性
// 条件:max_tokens == 1 且 model 包含 "haiku" 且非流式请求
func isMaxTokensOneHaikuRequest(model string, maxTokens int, isStream bool) bool {
return maxTokens == 1 && isHaikuModel(model) && !isStream
// 这类请求用于 Claude Code 验证 API 连通性(流式/非流式均会出现,如 cc-switch v3.9.0 起的健康检查探测为流式)
// 条件:max_tokens == 1 且 model 包含 "haiku"
func isMaxTokensOneHaikuRequest(model string, maxTokens int) bool {
return maxTokens == 1 && isHaikuModel(model)
}
// detectInterceptType 检测请求是否需要拦截,返回拦截类型
@@ -1808,11 +1808,10 @@ func isMaxTokensOneHaikuRequest(model string, maxTokens int, isStream bool) bool
// - body: 请求体字节
// - model: 请求的模型名称
// - maxTokens: max_tokens 值
// - isStream: 是否为流式请求
// - isClaudeCodeClient: 是否已通过 Claude Code 客户端校验
func detectInterceptType(body []byte, model string, maxTokens int, isStream bool, isClaudeCodeClient bool) InterceptType {
// 优先检查 max_tokens=1 + haiku 探测请求(仅非流式)
if isClaudeCodeClient && isMaxTokensOneHaikuRequest(model, maxTokens, isStream) {
func detectInterceptType(body []byte, model string, maxTokens int, isClaudeCodeClient bool) InterceptType {
// 优先检查 max_tokens=1 + haiku 探测请求(流式/非流式均适用)
if isClaudeCodeClient && isMaxTokensOneHaikuRequest(model, maxTokens) {
return InterceptTypeMaxTokensOneHaiku
}
@@ -14,10 +14,10 @@ import (
func TestDetectInterceptType_MaxTokensOneHaikuRequiresClaudeCodeClient(t *testing.T) {
body := []byte(`{"messages":[{"role":"user","content":[{"type":"text","text":"hello"}]}]}`)
notClaudeCode := detectInterceptType(body, "claude-haiku-4-5", 1, false, false)
notClaudeCode := detectInterceptType(body, "claude-haiku-4-5", 1, false)
require.Equal(t, InterceptTypeNone, notClaudeCode)
isClaudeCode := detectInterceptType(body, "claude-haiku-4-5", 1, false, true)
isClaudeCode := detectInterceptType(body, "claude-haiku-4-5", 1, true)
require.Equal(t, InterceptTypeMaxTokensOneHaiku, isClaudeCode)
}
@@ -30,7 +30,7 @@ func TestDetectInterceptType_SuggestionModeUnaffected(t *testing.T) {
"system":[]
}`)
got := detectInterceptType(body, "claude-sonnet-4-5", 256, false, false)
got := detectInterceptType(body, "claude-sonnet-4-5", 256, false)
require.Equal(t, InterceptTypeSuggestionMode, got)
}