diff --git a/internal/runtime/executor/aistudio_executor.go b/internal/runtime/executor/aistudio_executor.go index 6faf028a..6e33472e 100644 --- a/internal/runtime/executor/aistudio_executor.go +++ b/internal/runtime/executor/aistudio_executor.go @@ -141,7 +141,7 @@ func (e *AIStudioExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, URL: endpoint, Method: http.MethodPost, Headers: wsReq.Headers.Clone(), - Body: bytes.Clone(body.payload), + Body: body.payload, Provider: e.Identifier(), AuthID: authID, AuthLabel: authLabel, @@ -156,14 +156,14 @@ func (e *AIStudioExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, } recordAPIResponseMetadata(ctx, e.cfg, wsResp.Status, wsResp.Headers.Clone()) if len(wsResp.Body) > 0 { - appendAPIResponseChunk(ctx, e.cfg, bytes.Clone(wsResp.Body)) + appendAPIResponseChunk(ctx, e.cfg, wsResp.Body) } if wsResp.Status < 200 || wsResp.Status >= 300 { return resp, statusErr{code: wsResp.Status, msg: string(wsResp.Body)} } reporter.publish(ctx, parseGeminiUsage(wsResp.Body)) var param any - out := sdktranslator.TranslateNonStream(ctx, body.toFormat, opts.SourceFormat, req.Model, opts.OriginalRequest, bytes.Clone(translatedReq), bytes.Clone(wsResp.Body), ¶m) + out := sdktranslator.TranslateNonStream(ctx, body.toFormat, opts.SourceFormat, req.Model, opts.OriginalRequest, translatedReq, wsResp.Body, ¶m) resp = cliproxyexecutor.Response{Payload: ensureColonSpacedJSON([]byte(out))} return resp, nil } @@ -199,7 +199,7 @@ func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth URL: endpoint, Method: http.MethodPost, Headers: wsReq.Headers.Clone(), - Body: bytes.Clone(body.payload), + Body: body.payload, Provider: e.Identifier(), AuthID: authID, AuthLabel: authLabel, @@ -225,7 +225,7 @@ func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth } var body bytes.Buffer if len(firstEvent.Payload) > 0 { - appendAPIResponseChunk(ctx, e.cfg, bytes.Clone(firstEvent.Payload)) + appendAPIResponseChunk(ctx, e.cfg, firstEvent.Payload) body.Write(firstEvent.Payload) } if firstEvent.Type == wsrelay.MessageTypeStreamEnd { @@ -244,7 +244,7 @@ func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth metadataLogged = true } if len(event.Payload) > 0 { - appendAPIResponseChunk(ctx, e.cfg, bytes.Clone(event.Payload)) + appendAPIResponseChunk(ctx, e.cfg, event.Payload) body.Write(event.Payload) } if event.Type == wsrelay.MessageTypeStreamEnd { @@ -274,12 +274,12 @@ func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth } case wsrelay.MessageTypeStreamChunk: if len(event.Payload) > 0 { - appendAPIResponseChunk(ctx, e.cfg, bytes.Clone(event.Payload)) + appendAPIResponseChunk(ctx, e.cfg, event.Payload) filtered := FilterSSEUsageMetadata(event.Payload) if detail, ok := parseGeminiStreamUsage(filtered); ok { reporter.publish(ctx, detail) } - lines := sdktranslator.TranslateStream(ctx, body.toFormat, opts.SourceFormat, req.Model, opts.OriginalRequest, translatedReq, bytes.Clone(filtered), ¶m) + lines := sdktranslator.TranslateStream(ctx, body.toFormat, opts.SourceFormat, req.Model, opts.OriginalRequest, translatedReq, filtered, ¶m) for i := range lines { out <- cliproxyexecutor.StreamChunk{Payload: ensureColonSpacedJSON([]byte(lines[i]))} } @@ -293,9 +293,9 @@ func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth metadataLogged = true } if len(event.Payload) > 0 { - appendAPIResponseChunk(ctx, e.cfg, bytes.Clone(event.Payload)) + appendAPIResponseChunk(ctx, e.cfg, event.Payload) } - lines := sdktranslator.TranslateStream(ctx, body.toFormat, opts.SourceFormat, req.Model, opts.OriginalRequest, translatedReq, bytes.Clone(event.Payload), ¶m) + lines := sdktranslator.TranslateStream(ctx, body.toFormat, opts.SourceFormat, req.Model, opts.OriginalRequest, translatedReq, event.Payload, ¶m) for i := range lines { out <- cliproxyexecutor.StreamChunk{Payload: ensureColonSpacedJSON([]byte(lines[i]))} } @@ -350,7 +350,7 @@ func (e *AIStudioExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.A URL: endpoint, Method: http.MethodPost, Headers: wsReq.Headers.Clone(), - Body: bytes.Clone(body.payload), + Body: body.payload, Provider: e.Identifier(), AuthID: authID, AuthLabel: authLabel, @@ -364,7 +364,7 @@ func (e *AIStudioExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.A } recordAPIResponseMetadata(ctx, e.cfg, resp.Status, resp.Headers.Clone()) if len(resp.Body) > 0 { - appendAPIResponseChunk(ctx, e.cfg, bytes.Clone(resp.Body)) + appendAPIResponseChunk(ctx, e.cfg, resp.Body) } if resp.Status < 200 || resp.Status >= 300 { return cliproxyexecutor.Response{}, statusErr{code: resp.Status, msg: string(resp.Body)} @@ -373,7 +373,7 @@ func (e *AIStudioExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.A if totalTokens <= 0 { return cliproxyexecutor.Response{}, fmt.Errorf("wsrelay: totalTokens missing in response") } - translated := sdktranslator.TranslateTokenCount(ctx, body.toFormat, opts.SourceFormat, totalTokens, bytes.Clone(resp.Body)) + translated := sdktranslator.TranslateTokenCount(ctx, body.toFormat, opts.SourceFormat, totalTokens, resp.Body) return cliproxyexecutor.Response{Payload: []byte(translated)}, nil } @@ -397,9 +397,9 @@ func (e *AIStudioExecutor) translateRequest(req cliproxyexecutor.Request, opts c if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, stream) - payload := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), stream) + payload := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, stream) payload, err := thinking.ApplyThinking(payload, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { return nil, translatedPayload{}, err diff --git a/internal/runtime/executor/antigravity_executor.go b/internal/runtime/executor/antigravity_executor.go index 7b38453f..24765740 100644 --- a/internal/runtime/executor/antigravity_executor.go +++ b/internal/runtime/executor/antigravity_executor.go @@ -137,9 +137,9 @@ func (e *AntigravityExecutor) Execute(ctx context.Context, auth *cliproxyauth.Au if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - translated := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + translated := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) translated, err = thinking.ApplyThinking(translated, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -279,9 +279,9 @@ func (e *AntigravityExecutor) executeClaudeNonStream(ctx context.Context, auth * if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - translated := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + translated := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) translated, err = thinking.ApplyThinking(translated, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -671,9 +671,9 @@ func (e *AntigravityExecutor) ExecuteStream(ctx context.Context, auth *cliproxya if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - translated := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + translated := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) translated, err = thinking.ApplyThinking(translated, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -875,7 +875,7 @@ func (e *AntigravityExecutor) CountTokens(ctx context.Context, auth *cliproxyaut respCtx := context.WithValue(ctx, "alt", opts.Alt) // Prepare payload once (doesn't depend on baseURL) - payload := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + payload := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) payload, err := thinking.ApplyThinking(payload, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { diff --git a/internal/runtime/executor/claude_executor.go b/internal/runtime/executor/claude_executor.go index 694de1ef..89a366ee 100644 --- a/internal/runtime/executor/claude_executor.go +++ b/internal/runtime/executor/claude_executor.go @@ -104,9 +104,9 @@ func (e *ClaudeExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, r if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, stream) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), stream) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, stream) body, _ = sjson.SetBytes(body, "model", baseModel) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) @@ -245,9 +245,9 @@ func (e *ClaudeExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.A if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) body, _ = sjson.SetBytes(body, "model", baseModel) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) @@ -413,7 +413,7 @@ func (e *ClaudeExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.Aut to := sdktranslator.FromString("claude") // Use streaming translation to preserve function calling, except for claude. stream := from != to - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), stream) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, stream) body, _ = sjson.SetBytes(body, "model", baseModel) if !strings.HasPrefix(baseModel, "claude-3-5-haiku") { diff --git a/internal/runtime/executor/codex_executor.go b/internal/runtime/executor/codex_executor.go index 3de2ba3b..afd7024e 100644 --- a/internal/runtime/executor/codex_executor.go +++ b/internal/runtime/executor/codex_executor.go @@ -92,9 +92,9 @@ func (e *CodexExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, re if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -202,9 +202,9 @@ func (e *CodexExecutor) executeCompact(ctx context.Context, auth *cliproxyauth.A if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -292,9 +292,9 @@ func (e *CodexExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Au if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -400,7 +400,7 @@ func (e *CodexExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.Auth from := opts.SourceFormat to := sdktranslator.FromString("codex") - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, err := thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { diff --git a/internal/runtime/executor/gemini_cli_executor.go b/internal/runtime/executor/gemini_cli_executor.go index a668c372..4ac7bdba 100644 --- a/internal/runtime/executor/gemini_cli_executor.go +++ b/internal/runtime/executor/gemini_cli_executor.go @@ -123,9 +123,9 @@ func (e *GeminiCLIExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - basePayload := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + basePayload := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) basePayload, err = thinking.ApplyThinking(basePayload, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -277,9 +277,9 @@ func (e *GeminiCLIExecutor) ExecuteStream(ctx context.Context, auth *cliproxyaut if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - basePayload := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + basePayload := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) basePayload, err = thinking.ApplyThinking(basePayload, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -408,7 +408,7 @@ func (e *GeminiCLIExecutor) ExecuteStream(ctx context.Context, auth *cliproxyaut } } - segments := sdktranslator.TranslateStream(respCtx, to, from, attemptModel, opts.OriginalRequest, reqBody, bytes.Clone([]byte("[DONE]")), ¶m) + segments := sdktranslator.TranslateStream(respCtx, to, from, attemptModel, opts.OriginalRequest, reqBody, []byte("[DONE]"), ¶m) for i := range segments { out <- cliproxyexecutor.StreamChunk{Payload: []byte(segments[i])} } @@ -435,7 +435,7 @@ func (e *GeminiCLIExecutor) ExecuteStream(ctx context.Context, auth *cliproxyaut out <- cliproxyexecutor.StreamChunk{Payload: []byte(segments[i])} } - segments = sdktranslator.TranslateStream(respCtx, to, from, attemptModel, opts.OriginalRequest, reqBody, bytes.Clone([]byte("[DONE]")), ¶m) + segments = sdktranslator.TranslateStream(respCtx, to, from, attemptModel, opts.OriginalRequest, reqBody, []byte("[DONE]"), ¶m) for i := range segments { out <- cliproxyexecutor.StreamChunk{Payload: []byte(segments[i])} } @@ -487,7 +487,7 @@ func (e *GeminiCLIExecutor) CountTokens(ctx context.Context, auth *cliproxyauth. // The loop variable attemptModel is only used as the concrete model id sent to the upstream // Gemini CLI endpoint when iterating fallback variants. for range models { - payload := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + payload := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) payload, err = thinking.ApplyThinking(payload, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { diff --git a/internal/runtime/executor/gemini_executor.go b/internal/runtime/executor/gemini_executor.go index 2d24d6ce..9e868df8 100644 --- a/internal/runtime/executor/gemini_executor.go +++ b/internal/runtime/executor/gemini_executor.go @@ -120,9 +120,9 @@ func (e *GeminiExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, r if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -227,9 +227,9 @@ func (e *GeminiExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.A if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -325,7 +325,7 @@ func (e *GeminiExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.A out <- cliproxyexecutor.StreamChunk{Payload: []byte(lines[i])} } } - lines := sdktranslator.TranslateStream(ctx, to, from, req.Model, opts.OriginalRequest, body, bytes.Clone([]byte("[DONE]")), ¶m) + lines := sdktranslator.TranslateStream(ctx, to, from, req.Model, opts.OriginalRequest, body, []byte("[DONE]"), ¶m) for i := range lines { out <- cliproxyexecutor.StreamChunk{Payload: []byte(lines[i])} } @@ -346,7 +346,7 @@ func (e *GeminiExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.Aut from := opts.SourceFormat to := sdktranslator.FromString("gemini") - translatedReq := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + translatedReq := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) translatedReq, err := thinking.ApplyThinking(translatedReq, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { diff --git a/internal/runtime/executor/gemini_vertex_executor.go b/internal/runtime/executor/gemini_vertex_executor.go index be2fc238..5eceac31 100644 --- a/internal/runtime/executor/gemini_vertex_executor.go +++ b/internal/runtime/executor/gemini_vertex_executor.go @@ -322,9 +322,9 @@ func (e *GeminiVertexExecutor) executeWithServiceAccount(ctx context.Context, au if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body = sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body = sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -437,9 +437,9 @@ func (e *GeminiVertexExecutor) executeWithAPIKey(ctx context.Context, auth *clip if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -542,9 +542,9 @@ func (e *GeminiVertexExecutor) executeStreamWithServiceAccount(ctx context.Conte if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -667,9 +667,9 @@ func (e *GeminiVertexExecutor) executeStreamWithAPIKey(ctx context.Context, auth if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -785,7 +785,7 @@ func (e *GeminiVertexExecutor) countTokensWithServiceAccount(ctx context.Context from := opts.SourceFormat to := sdktranslator.FromString("gemini") - translatedReq := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + translatedReq := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) translatedReq, err := thinking.ApplyThinking(translatedReq, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -869,7 +869,7 @@ func (e *GeminiVertexExecutor) countTokensWithAPIKey(ctx context.Context, auth * from := opts.SourceFormat to := sdktranslator.FromString("gemini") - translatedReq := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + translatedReq := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) translatedReq, err := thinking.ApplyThinking(translatedReq, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { diff --git a/internal/runtime/executor/iflow_executor.go b/internal/runtime/executor/iflow_executor.go index abe9bdfa..77e8d160 100644 --- a/internal/runtime/executor/iflow_executor.go +++ b/internal/runtime/executor/iflow_executor.go @@ -91,9 +91,9 @@ func (e *IFlowExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, re if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, _ = sjson.SetBytes(body, "model", baseModel) body, err = thinking.ApplyThinking(body, req.Model, from.String(), "iflow", e.Identifier()) @@ -194,9 +194,9 @@ func (e *IFlowExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Au if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) body, _ = sjson.SetBytes(body, "model", baseModel) body, err = thinking.ApplyThinking(body, req.Model, from.String(), "iflow", e.Identifier()) @@ -298,7 +298,7 @@ func (e *IFlowExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.Auth from := opts.SourceFormat to := sdktranslator.FromString("openai") - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) enc, err := tokenizerForModel(baseModel) if err != nil { diff --git a/internal/runtime/executor/logging_helpers.go b/internal/runtime/executor/logging_helpers.go index e9876243..ae2aee3f 100644 --- a/internal/runtime/executor/logging_helpers.go +++ b/internal/runtime/executor/logging_helpers.go @@ -80,7 +80,7 @@ func recordAPIRequest(ctx context.Context, cfg *config.Config, info upstreamRequ writeHeaders(builder, info.Headers) builder.WriteString("\nBody:\n") if len(info.Body) > 0 { - builder.WriteString(string(bytes.Clone(info.Body))) + builder.WriteString(string(info.Body)) } else { builder.WriteString("") } @@ -152,7 +152,7 @@ func appendAPIResponseChunk(ctx context.Context, cfg *config.Config, chunk []byt if cfg == nil || !cfg.RequestLog { return } - data := bytes.TrimSpace(bytes.Clone(chunk)) + data := bytes.TrimSpace(chunk) if len(data) == 0 { return } diff --git a/internal/runtime/executor/openai_compat_executor.go b/internal/runtime/executor/openai_compat_executor.go index 3906948f..b5796e44 100644 --- a/internal/runtime/executor/openai_compat_executor.go +++ b/internal/runtime/executor/openai_compat_executor.go @@ -92,9 +92,9 @@ func (e *OpenAICompatExecutor) Execute(ctx context.Context, auth *cliproxyauth.A if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, opts.Stream) - translated := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), opts.Stream) + translated := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, opts.Stream) requestedModel := payloadRequestedModel(opts, req.Model) translated = applyPayloadConfigWithRoot(e.cfg, baseModel, to.String(), "", translated, originalTranslated, requestedModel) if opts.Alt == "responses/compact" { @@ -194,9 +194,9 @@ func (e *OpenAICompatExecutor) ExecuteStream(ctx context.Context, auth *cliproxy if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - translated := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + translated := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) requestedModel := payloadRequestedModel(opts, req.Model) translated = applyPayloadConfigWithRoot(e.cfg, baseModel, to.String(), "", translated, originalTranslated, requestedModel) @@ -306,7 +306,7 @@ func (e *OpenAICompatExecutor) CountTokens(ctx context.Context, auth *cliproxyau from := opts.SourceFormat to := sdktranslator.FromString("openai") - translated := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + translated := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) modelForCounting := baseModel diff --git a/internal/runtime/executor/qwen_executor.go b/internal/runtime/executor/qwen_executor.go index 526c1389..28b803ad 100644 --- a/internal/runtime/executor/qwen_executor.go +++ b/internal/runtime/executor/qwen_executor.go @@ -85,9 +85,9 @@ func (e *QwenExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, req if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) body, _ = sjson.SetBytes(body, "model", baseModel) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) @@ -176,9 +176,9 @@ func (e *QwenExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Aut if len(opts.OriginalRequest) > 0 { originalPayloadSource = opts.OriginalRequest } - originalPayload := bytes.Clone(originalPayloadSource) + originalPayload := originalPayloadSource originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), true) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) body, _ = sjson.SetBytes(body, "model", baseModel) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) @@ -260,7 +260,7 @@ func (e *QwenExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Aut out <- cliproxyexecutor.StreamChunk{Payload: []byte(chunks[i])} } } - doneChunks := sdktranslator.TranslateStream(ctx, to, from, req.Model, opts.OriginalRequest, body, bytes.Clone([]byte("[DONE]")), ¶m) + doneChunks := sdktranslator.TranslateStream(ctx, to, from, req.Model, opts.OriginalRequest, body, []byte("[DONE]"), ¶m) for i := range doneChunks { out <- cliproxyexecutor.StreamChunk{Payload: []byte(doneChunks[i])} } @@ -278,7 +278,7 @@ func (e *QwenExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.Auth, from := opts.SourceFormat to := sdktranslator.FromString("openai") - body := sdktranslator.TranslateRequest(from, to, baseModel, bytes.Clone(req.Payload), false) + body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) modelName := gjson.GetBytes(body, "model").String() if strings.TrimSpace(modelName) == "" { diff --git a/internal/translator/antigravity/claude/antigravity_claude_request.go b/internal/translator/antigravity/claude/antigravity_claude_request.go index a6134087..69ed42e1 100644 --- a/internal/translator/antigravity/claude/antigravity_claude_request.go +++ b/internal/translator/antigravity/claude/antigravity_claude_request.go @@ -6,7 +6,6 @@ package claude import ( - "bytes" "strings" "github.com/router-for-me/CLIProxyAPI/v6/internal/cache" @@ -37,7 +36,7 @@ import ( // - []byte: The transformed request data in Gemini CLI API format func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _ bool) []byte { enableThoughtTranslate := true - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // system instruction systemInstructionJSON := "" diff --git a/internal/translator/antigravity/gemini/antigravity_gemini_request.go b/internal/translator/antigravity/gemini/antigravity_gemini_request.go index 2ad9bd80..1d044740 100644 --- a/internal/translator/antigravity/gemini/antigravity_gemini_request.go +++ b/internal/translator/antigravity/gemini/antigravity_gemini_request.go @@ -6,7 +6,6 @@ package gemini import ( - "bytes" "fmt" "strings" @@ -34,7 +33,7 @@ import ( // Returns: // - []byte: The transformed request data in Gemini API format func ConvertGeminiRequestToAntigravity(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON template := "" template = `{"project":"","request":{},"model":""}` template, _ = sjson.SetRaw(template, "request", string(rawJSON)) diff --git a/internal/translator/antigravity/openai/responses/antigravity_openai-responses_request.go b/internal/translator/antigravity/openai/responses/antigravity_openai-responses_request.go index 65d4dcd8..90bfa14c 100644 --- a/internal/translator/antigravity/openai/responses/antigravity_openai-responses_request.go +++ b/internal/translator/antigravity/openai/responses/antigravity_openai-responses_request.go @@ -1,14 +1,12 @@ package responses import ( - "bytes" - . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/antigravity/gemini" . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/openai/responses" ) func ConvertOpenAIResponsesRequestToAntigravity(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON rawJSON = ConvertOpenAIResponsesRequestToGemini(modelName, rawJSON, stream) return ConvertGeminiRequestToAntigravity(modelName, rawJSON, stream) } diff --git a/internal/translator/claude/gemini-cli/claude_gemini-cli_request.go b/internal/translator/claude/gemini-cli/claude_gemini-cli_request.go index c10b35ff..831d784d 100644 --- a/internal/translator/claude/gemini-cli/claude_gemini-cli_request.go +++ b/internal/translator/claude/gemini-cli/claude_gemini-cli_request.go @@ -6,8 +6,6 @@ package geminiCLI import ( - "bytes" - . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/claude/gemini" "github.com/tidwall/gjson" "github.com/tidwall/sjson" @@ -30,7 +28,7 @@ import ( // Returns: // - []byte: The transformed request data in Claude Code API format func ConvertGeminiCLIRequestToClaude(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON modelResult := gjson.GetBytes(rawJSON, "model") // Extract the inner request object and promote it to the top level diff --git a/internal/translator/claude/gemini/claude_gemini_request.go b/internal/translator/claude/gemini/claude_gemini_request.go index 3c1f9ec8..ea53da05 100644 --- a/internal/translator/claude/gemini/claude_gemini_request.go +++ b/internal/translator/claude/gemini/claude_gemini_request.go @@ -6,7 +6,6 @@ package gemini import ( - "bytes" "crypto/rand" "crypto/sha256" "encoding/hex" @@ -46,7 +45,7 @@ var ( // Returns: // - []byte: The transformed request data in Claude Code API format func ConvertGeminiRequestToClaude(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON if account == "" { u, _ := uuid.NewRandom() diff --git a/internal/translator/claude/openai/chat-completions/claude_openai_request.go b/internal/translator/claude/openai/chat-completions/claude_openai_request.go index 41274628..3cad1882 100644 --- a/internal/translator/claude/openai/chat-completions/claude_openai_request.go +++ b/internal/translator/claude/openai/chat-completions/claude_openai_request.go @@ -6,7 +6,6 @@ package chat_completions import ( - "bytes" "crypto/rand" "crypto/sha256" "encoding/hex" @@ -44,7 +43,7 @@ var ( // Returns: // - []byte: The transformed request data in Claude Code API format func ConvertOpenAIRequestToClaude(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON if account == "" { u, _ := uuid.NewRandom() diff --git a/internal/translator/claude/openai/responses/claude_openai-responses_request.go b/internal/translator/claude/openai/responses/claude_openai-responses_request.go index 5cbe23bf..337f9be9 100644 --- a/internal/translator/claude/openai/responses/claude_openai-responses_request.go +++ b/internal/translator/claude/openai/responses/claude_openai-responses_request.go @@ -1,7 +1,6 @@ package responses import ( - "bytes" "crypto/rand" "crypto/sha256" "encoding/hex" @@ -32,7 +31,7 @@ var ( // - max_output_tokens -> max_tokens // - stream passthrough via parameter func ConvertOpenAIResponsesRequestToClaude(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON if account == "" { u, _ := uuid.NewRandom() diff --git a/internal/translator/codex/claude/codex_claude_request.go b/internal/translator/codex/claude/codex_claude_request.go index aa91b175..d7320717 100644 --- a/internal/translator/codex/claude/codex_claude_request.go +++ b/internal/translator/codex/claude/codex_claude_request.go @@ -6,7 +6,6 @@ package claude import ( - "bytes" "fmt" "strconv" "strings" @@ -35,7 +34,7 @@ import ( // Returns: // - []byte: The transformed request data in internal client format func ConvertClaudeRequestToCodex(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON template := `{"model":"","instructions":"","input":[]}` diff --git a/internal/translator/codex/gemini-cli/codex_gemini-cli_request.go b/internal/translator/codex/gemini-cli/codex_gemini-cli_request.go index db056a24..8b32453d 100644 --- a/internal/translator/codex/gemini-cli/codex_gemini-cli_request.go +++ b/internal/translator/codex/gemini-cli/codex_gemini-cli_request.go @@ -6,8 +6,6 @@ package geminiCLI import ( - "bytes" - . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/codex/gemini" "github.com/tidwall/gjson" "github.com/tidwall/sjson" @@ -30,7 +28,7 @@ import ( // Returns: // - []byte: The transformed request data in Codex API format func ConvertGeminiCLIRequestToCodex(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON rawJSON = []byte(gjson.GetBytes(rawJSON, "request").Raw) rawJSON, _ = sjson.SetBytes(rawJSON, "model", modelName) diff --git a/internal/translator/codex/gemini/codex_gemini_request.go b/internal/translator/codex/gemini/codex_gemini_request.go index 2caa2c4a..9f5d7b31 100644 --- a/internal/translator/codex/gemini/codex_gemini_request.go +++ b/internal/translator/codex/gemini/codex_gemini_request.go @@ -6,7 +6,6 @@ package gemini import ( - "bytes" "crypto/rand" "fmt" "math/big" @@ -37,7 +36,7 @@ import ( // Returns: // - []byte: The transformed request data in Codex API format func ConvertGeminiRequestToCodex(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Base template out := `{"model":"","instructions":"","input":[]}` diff --git a/internal/translator/codex/openai/chat-completions/codex_openai_request.go b/internal/translator/codex/openai/chat-completions/codex_openai_request.go index 4cd23435..e79f97cd 100644 --- a/internal/translator/codex/openai/chat-completions/codex_openai_request.go +++ b/internal/translator/codex/openai/chat-completions/codex_openai_request.go @@ -7,8 +7,6 @@ package chat_completions import ( - "bytes" - "strconv" "strings" @@ -29,7 +27,7 @@ import ( // Returns: // - []byte: The transformed request data in OpenAI Responses API format func ConvertOpenAIRequestToCodex(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Start with empty JSON object out := `{"instructions":""}` diff --git a/internal/translator/codex/openai/responses/codex_openai-responses_request.go b/internal/translator/codex/openai/responses/codex_openai-responses_request.go index 868b6422..828c4d87 100644 --- a/internal/translator/codex/openai/responses/codex_openai-responses_request.go +++ b/internal/translator/codex/openai/responses/codex_openai-responses_request.go @@ -1,7 +1,6 @@ package responses import ( - "bytes" "fmt" "github.com/tidwall/gjson" @@ -9,7 +8,7 @@ import ( ) func ConvertOpenAIResponsesRequestToCodex(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON inputResult := gjson.GetBytes(rawJSON, "input") if inputResult.Type == gjson.String { diff --git a/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go b/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go index 0f896c6e..657d33c8 100644 --- a/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go +++ b/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go @@ -35,7 +35,7 @@ const geminiCLIClaudeThoughtSignature = "skip_thought_signature_validator" // Returns: // - []byte: The transformed request data in Gemini CLI API format func ConvertClaudeRequestToCLI(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON rawJSON = bytes.Replace(rawJSON, []byte(`"url":{"type":"string","format":"uri",`), []byte(`"url":{"type":"string",`), -1) // Build output Gemini CLI request JSON diff --git a/internal/translator/gemini-cli/gemini/gemini-cli_gemini_request.go b/internal/translator/gemini-cli/gemini/gemini-cli_gemini_request.go index ac6227fe..15ff8b98 100644 --- a/internal/translator/gemini-cli/gemini/gemini-cli_gemini_request.go +++ b/internal/translator/gemini-cli/gemini/gemini-cli_gemini_request.go @@ -6,7 +6,6 @@ package gemini import ( - "bytes" "fmt" "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/common" @@ -33,7 +32,7 @@ import ( // Returns: // - []byte: The transformed request data in Gemini API format func ConvertGeminiRequestToGeminiCLI(_ string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON template := "" template = `{"project":"","request":{},"model":""}` template, _ = sjson.SetRaw(template, "request", string(rawJSON)) diff --git a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go index 2351130f..53da71f4 100644 --- a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go +++ b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go @@ -3,7 +3,6 @@ package chat_completions import ( - "bytes" "fmt" "strings" @@ -28,7 +27,7 @@ const geminiCLIFunctionThoughtSignature = "skip_thought_signature_validator" // Returns: // - []byte: The transformed request data in Gemini CLI API format func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Base envelope (no default thinkingConfig) out := []byte(`{"project":"","request":{"contents":[]},"model":"gemini-2.5-pro"}`) diff --git a/internal/translator/gemini-cli/openai/responses/gemini-cli_openai-responses_request.go b/internal/translator/gemini-cli/openai/responses/gemini-cli_openai-responses_request.go index b70e3d83..657e45fd 100644 --- a/internal/translator/gemini-cli/openai/responses/gemini-cli_openai-responses_request.go +++ b/internal/translator/gemini-cli/openai/responses/gemini-cli_openai-responses_request.go @@ -1,14 +1,12 @@ package responses import ( - "bytes" - . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini-cli/gemini" . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/openai/responses" ) func ConvertOpenAIResponsesRequestToGeminiCLI(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON rawJSON = ConvertOpenAIResponsesRequestToGemini(modelName, rawJSON, stream) return ConvertGeminiRequestToGeminiCLI(modelName, rawJSON, stream) } diff --git a/internal/translator/gemini/claude/gemini_claude_request.go b/internal/translator/gemini/claude/gemini_claude_request.go index 0d5361a5..bab42952 100644 --- a/internal/translator/gemini/claude/gemini_claude_request.go +++ b/internal/translator/gemini/claude/gemini_claude_request.go @@ -28,7 +28,7 @@ const geminiClaudeThoughtSignature = "skip_thought_signature_validator" // Returns: // - []byte: The transformed request in Gemini CLI format. func ConvertClaudeRequestToGemini(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON rawJSON = bytes.Replace(rawJSON, []byte(`"url":{"type":"string","format":"uri",`), []byte(`"url":{"type":"string",`), -1) // Build output Gemini CLI request JSON diff --git a/internal/translator/gemini/gemini-cli/gemini_gemini-cli_request.go b/internal/translator/gemini/gemini-cli/gemini_gemini-cli_request.go index 3b70bd3e..1b2cdb46 100644 --- a/internal/translator/gemini/gemini-cli/gemini_gemini-cli_request.go +++ b/internal/translator/gemini/gemini-cli/gemini_gemini-cli_request.go @@ -6,7 +6,6 @@ package geminiCLI import ( - "bytes" "fmt" "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/common" @@ -19,7 +18,7 @@ import ( // It extracts the model name, system instruction, message contents, and tool declarations // from the raw JSON request and returns them in the format expected by the internal client. func ConvertGeminiCLIRequestToGemini(_ string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON modelResult := gjson.GetBytes(rawJSON, "model") rawJSON = []byte(gjson.GetBytes(rawJSON, "request").Raw) rawJSON, _ = sjson.SetBytes(rawJSON, "model", modelResult.String()) diff --git a/internal/translator/gemini/gemini/gemini_gemini_request.go b/internal/translator/gemini/gemini/gemini_gemini_request.go index 2388aaf8..8024e9e3 100644 --- a/internal/translator/gemini/gemini/gemini_gemini_request.go +++ b/internal/translator/gemini/gemini/gemini_gemini_request.go @@ -4,7 +4,6 @@ package gemini import ( - "bytes" "fmt" "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/common" @@ -19,7 +18,7 @@ import ( // // It keeps the payload otherwise unchanged. func ConvertGeminiRequestToGemini(_ string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Fast path: if no contents field, only attach safety settings contents := gjson.GetBytes(rawJSON, "contents") if !contents.Exists() { diff --git a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go index a7c20852..5de35681 100644 --- a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go +++ b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go @@ -3,7 +3,6 @@ package chat_completions import ( - "bytes" "fmt" "strings" @@ -28,7 +27,7 @@ const geminiFunctionThoughtSignature = "skip_thought_signature_validator" // Returns: // - []byte: The transformed request data in Gemini API format func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Base envelope (no default thinkingConfig) out := []byte(`{"contents":[]}`) diff --git a/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go b/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go index 5277b71b..1ddb1f36 100644 --- a/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go +++ b/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go @@ -1,7 +1,6 @@ package responses import ( - "bytes" "strings" "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/gemini/common" @@ -12,7 +11,7 @@ import ( const geminiResponsesThoughtSignature = "skip_thought_signature_validator" func ConvertOpenAIResponsesRequestToGemini(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Note: modelName and stream parameters are part of the fixed method signature _ = modelName // Unused but required by interface diff --git a/internal/translator/openai/claude/openai_claude_request.go b/internal/translator/openai/claude/openai_claude_request.go index dc832e9c..1d9db94b 100644 --- a/internal/translator/openai/claude/openai_claude_request.go +++ b/internal/translator/openai/claude/openai_claude_request.go @@ -6,7 +6,6 @@ package claude import ( - "bytes" "strings" "github.com/router-for-me/CLIProxyAPI/v6/internal/thinking" @@ -18,7 +17,7 @@ import ( // It extracts the model name, system instruction, message contents, and tool declarations // from the raw JSON request and returns them in the format expected by the OpenAI API. func ConvertClaudeRequestToOpenAI(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Base OpenAI Chat Completions API template out := `{"model":"","messages":[]}` diff --git a/internal/translator/openai/gemini-cli/openai_gemini_request.go b/internal/translator/openai/gemini-cli/openai_gemini_request.go index 2efd2fdd..847c278f 100644 --- a/internal/translator/openai/gemini-cli/openai_gemini_request.go +++ b/internal/translator/openai/gemini-cli/openai_gemini_request.go @@ -6,8 +6,6 @@ package geminiCLI import ( - "bytes" - . "github.com/router-for-me/CLIProxyAPI/v6/internal/translator/openai/gemini" "github.com/tidwall/gjson" "github.com/tidwall/sjson" @@ -17,7 +15,7 @@ import ( // It extracts the model name, generation config, message contents, and tool declarations // from the raw JSON request and returns them in the format expected by the OpenAI API. func ConvertGeminiCLIRequestToOpenAI(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON rawJSON = []byte(gjson.GetBytes(rawJSON, "request").Raw) rawJSON, _ = sjson.SetBytes(rawJSON, "model", modelName) if gjson.GetBytes(rawJSON, "systemInstruction").Exists() { diff --git a/internal/translator/openai/gemini/openai_gemini_request.go b/internal/translator/openai/gemini/openai_gemini_request.go index 7700a35d..167b71e9 100644 --- a/internal/translator/openai/gemini/openai_gemini_request.go +++ b/internal/translator/openai/gemini/openai_gemini_request.go @@ -6,7 +6,6 @@ package gemini import ( - "bytes" "crypto/rand" "fmt" "math/big" @@ -21,7 +20,7 @@ import ( // It extracts the model name, generation config, message contents, and tool declarations // from the raw JSON request and returns them in the format expected by the OpenAI API. func ConvertGeminiRequestToOpenAI(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Base OpenAI Chat Completions API template out := `{"model":"","messages":[]}` diff --git a/internal/translator/openai/openai/chat-completions/openai_openai_request.go b/internal/translator/openai/openai/chat-completions/openai_openai_request.go index 211c0eb4..a74cded6 100644 --- a/internal/translator/openai/openai/chat-completions/openai_openai_request.go +++ b/internal/translator/openai/openai/chat-completions/openai_openai_request.go @@ -3,7 +3,6 @@ package chat_completions import ( - "bytes" "github.com/tidwall/sjson" ) @@ -25,7 +24,7 @@ func ConvertOpenAIRequestToOpenAI(modelName string, inputRawJSON []byte, _ bool) // If there's an error, return the original JSON or handle the error appropriately. // For now, we'll return the original, but in a real scenario, logging or a more robust error // handling mechanism would be needed. - return bytes.Clone(inputRawJSON) + return inputRawJSON } return updatedJSON } diff --git a/internal/translator/openai/openai/responses/openai_openai-responses_request.go b/internal/translator/openai/openai/responses/openai_openai-responses_request.go index 1fb5ca1f..35445163 100644 --- a/internal/translator/openai/openai/responses/openai_openai-responses_request.go +++ b/internal/translator/openai/openai/responses/openai_openai-responses_request.go @@ -1,7 +1,6 @@ package responses import ( - "bytes" "strings" "github.com/tidwall/gjson" @@ -28,7 +27,7 @@ import ( // Returns: // - []byte: The transformed request data in OpenAI chat completions format func ConvertOpenAIResponsesRequestToOpenAIChatCompletions(modelName string, inputRawJSON []byte, stream bool) []byte { - rawJSON := bytes.Clone(inputRawJSON) + rawJSON := inputRawJSON // Base OpenAI chat completions template with default values out := `{"model":"","messages":[],"stream":false}` diff --git a/sdk/api/handlers/handlers.go b/sdk/api/handlers/handlers.go index 5fdf3dae..4ad2efb0 100644 --- a/sdk/api/handlers/handlers.go +++ b/sdk/api/handlers/handlers.go @@ -408,7 +408,7 @@ func (h *BaseAPIHandler) ExecuteWithAuthManager(ctx context.Context, handlerType } return nil, &interfaces.ErrorMessage{StatusCode: status, Error: err, Addon: addon} } - return cloneBytes(resp.Payload), nil + return resp.Payload, nil } // ExecuteCountWithAuthManager executes a non-streaming request via the core auth manager. @@ -451,7 +451,7 @@ func (h *BaseAPIHandler) ExecuteCountWithAuthManager(ctx context.Context, handle } return nil, &interfaces.ErrorMessage{StatusCode: status, Error: err, Addon: addon} } - return cloneBytes(resp.Payload), nil + return resp.Payload, nil } // ExecuteStreamWithAuthManager executes a streaming request via the core auth manager. @@ -696,7 +696,7 @@ func (h *BaseAPIHandler) WriteErrorResponse(c *gin.Context, msg *interfaces.Erro var previous []byte if existing, exists := c.Get("API_RESPONSE"); exists { if existingBytes, ok := existing.([]byte); ok && len(existingBytes) > 0 { - previous = bytes.Clone(existingBytes) + previous = existingBytes } } appendAPIResponse(c, body)