From 2f2e76f9c640d45c1cc7ddd46ef70c752d38e7f4 Mon Sep 17 00:00:00 2001 From: cyhhao Date: Mon, 19 Jan 2026 16:20:24 +0800 Subject: [PATCH] fix(gateway): gate streaming tool rewrites behind mimic --- backend/internal/service/gateway_service.go | 26 ++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/backend/internal/service/gateway_service.go b/backend/internal/service/gateway_service.go index f3a21bd6..8893dac1 100644 --- a/backend/internal/service/gateway_service.go +++ b/backend/internal/service/gateway_service.go @@ -3463,9 +3463,15 @@ func (s *GatewayService) handleStreamingResponse(ctx context.Context, resp *http clientDisconnected := false // 客户端断开标志,断开后继续读取上游以获取完整usage pendingEventLines := make([]string, 0, 4) - toolInputBuffers := make(map[int]string) + var toolInputBuffers map[int]string + if mimicClaudeCode { + toolInputBuffers = make(map[int]string) + } transformToolInputJSON := func(raw string) string { + if !mimicClaudeCode { + return raw + } raw = strings.TrimSpace(raw) if raw == "" { return raw @@ -3522,7 +3528,10 @@ func (s *GatewayService) handleStreamingResponse(ctx context.Context, resp *http var event map[string]any if err := json.Unmarshal([]byte(dataLine), &event); err != nil { - replaced := replaceToolNamesInText(dataLine, toolNameMap) + replaced := dataLine + if mimicClaudeCode { + replaced = replaceToolNamesInText(dataLine, toolNameMap) + } block := "" if eventName != "" { block = "event: " + eventName + "\n" @@ -3544,7 +3553,7 @@ func (s *GatewayService) handleStreamingResponse(ctx context.Context, resp *http } } - if eventType == "content_block_delta" { + if mimicClaudeCode && eventType == "content_block_delta" { if delta, ok := event["delta"].(map[string]any); ok { if deltaType, _ := delta["type"].(string); deltaType == "input_json_delta" { if indexVal, ok := event["index"].(float64); ok { @@ -3558,7 +3567,7 @@ func (s *GatewayService) handleStreamingResponse(ctx context.Context, resp *http } } - if eventType == "content_block_stop" { + if mimicClaudeCode && eventType == "content_block_stop" { if indexVal, ok := event["index"].(float64); ok { index := int(indexVal) if buffered := toolInputBuffers[index]; buffered != "" { @@ -3593,10 +3602,15 @@ func (s *GatewayService) handleStreamingResponse(ctx context.Context, resp *http } } - rewriteToolNamesInValue(event, toolNameMap) + if mimicClaudeCode { + rewriteToolNamesInValue(event, toolNameMap) + } newData, err := json.Marshal(event) if err != nil { - replaced := replaceToolNamesInText(dataLine, toolNameMap) + replaced := dataLine + if mimicClaudeCode { + replaced = replaceToolNamesInText(dataLine, toolNameMap) + } block := "" if eventName != "" { block = "event: " + eventName + "\n"