mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-09-03 06:35:00 +08:00
- Add `is-compat` support to OpenAI compatibility model config, capabilities, hashing, and example config. - Propagate `IsCompat` through API-key model resolution and switch OpenAI-compat executor translation to compatibility-aware routing. - Keep Claude assistant thinking content in compatibility mode while keeping default behavior unchanged when `is-compat` is disabled. Closes: #4776
92 lines
5.5 KiB
Go
92 lines
5.5 KiB
Go
package helps
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
multiagentv2 "github.com/router-for-me/CLIProxyAPI/v7/internal/client/codex/optimize-multi-agent-v2"
|
|
"github.com/router-for-me/CLIProxyAPI/v7/internal/config"
|
|
"github.com/router-for-me/CLIProxyAPI/v7/internal/thinking"
|
|
openaichatclaude "github.com/router-for-me/CLIProxyAPI/v7/internal/translator/claude/openai/chat-completions"
|
|
responsesclaude "github.com/router-for-me/CLIProxyAPI/v7/internal/translator/claude/openai/responses"
|
|
codexclaude "github.com/router-for-me/CLIProxyAPI/v7/internal/translator/codex/claude"
|
|
geminiclaude "github.com/router-for-me/CLIProxyAPI/v7/internal/translator/gemini/claude"
|
|
interactionsclaude "github.com/router-for-me/CLIProxyAPI/v7/internal/translator/interactions/claude"
|
|
openaiclaude "github.com/router-for-me/CLIProxyAPI/v7/internal/translator/openai/claude"
|
|
cliproxyauth "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/auth"
|
|
sdktranslator "github.com/router-for-me/CLIProxyAPI/v7/sdk/translator"
|
|
)
|
|
|
|
// RewriteCodexSpawnAgentDescription optimizes spawn_agent definitions for
|
|
// official Codex clients when multi-agent v2 optimization is enabled.
|
|
func RewriteCodexSpawnAgentDescription(ctx context.Context, headers http.Header, payload []byte, cfg *config.Config) []byte {
|
|
return multiagentv2.RewriteCodexSpawnAgentDescription(ctx, headers, payload, cfg)
|
|
}
|
|
|
|
// RewriteCodexMultiAgentV2Input converts official Codex multi-agent input into
|
|
// standard Responses API messages when multi-agent v2 optimization is enabled.
|
|
func RewriteCodexMultiAgentV2Input(ctx context.Context, headers http.Header, payload []byte, cfg *config.Config) []byte {
|
|
return multiagentv2.RewriteCodexMultiAgentV2Input(ctx, headers, payload, cfg)
|
|
}
|
|
|
|
// TranslateRequestWithCodexMultiAgentV2 normalizes official Codex multi-agent
|
|
// input before translating it to a non-Codex target protocol.
|
|
func TranslateRequestWithCodexMultiAgentV2(ctx context.Context, headers http.Header, cfg *config.Config, from, to sdktranslator.Format, model string, payload []byte, stream bool) []byte {
|
|
return multiagentv2.TranslateRequestWithCodexMultiAgentV2(ctx, headers, cfg, from, to, model, payload, stream)
|
|
}
|
|
|
|
// TranslateRequestWithAPIKeyModelCompatibility applies compatibility-aware
|
|
// request translators when a configured API-key model enables compatibility mode.
|
|
func TranslateRequestWithAPIKeyModelCompatibility(ctx context.Context, headers http.Header, cfg *config.Config, from, to sdktranslator.Format, model string, payload []byte, stream, isCompat bool) []byte {
|
|
if !isCompat {
|
|
return TranslateRequestWithCodexMultiAgentV2(ctx, headers, cfg, from, to, model, payload, stream)
|
|
}
|
|
if from == sdktranslator.FormatOpenAIResponse && to != sdktranslator.FormatCodex && to != sdktranslator.FormatOpenAIResponse {
|
|
payload = multiagentv2.RewriteCodexMultiAgentV2Input(ctx, headers, payload, cfg)
|
|
}
|
|
|
|
var translated []byte
|
|
switch {
|
|
case from == sdktranslator.FormatClaude && to == sdktranslator.FormatCodex:
|
|
translated = codexclaude.ConvertClaudeRequestToCodexWithCompat(model, payload, stream)
|
|
case from == sdktranslator.FormatClaude && to == sdktranslator.FormatGemini:
|
|
translated = geminiclaude.ConvertClaudeRequestToGeminiWithCompat(model, payload, stream)
|
|
case from == sdktranslator.FormatClaude && to == sdktranslator.FormatInteractions:
|
|
translated = interactionsclaude.ConvertClaudeRequestToInteractionsWithCompat(model, payload, stream)
|
|
case from == sdktranslator.FormatClaude && to == sdktranslator.FormatOpenAI:
|
|
translated = openaiclaude.ConvertClaudeRequestToOpenAIWithCompat(model, payload, stream)
|
|
case from == sdktranslator.FormatOpenAI && to == sdktranslator.FormatClaude:
|
|
translated = openaichatclaude.ConvertOpenAIRequestToClaudeWithCompat(model, payload, stream)
|
|
case from == sdktranslator.FormatOpenAIResponse && to == sdktranslator.FormatClaude:
|
|
translated = responsesclaude.ConvertOpenAIResponsesRequestToClaudeWithCompat(model, payload, stream)
|
|
default:
|
|
return TranslateRequestWithCodexMultiAgentV2(ctx, headers, cfg, from, to, model, payload, stream)
|
|
}
|
|
|
|
summaryConfig := thinking.ExtractSummaryConfig(payload, from.String())
|
|
return thinking.ApplySummaryConfigForModel(translated, to.String(), model, summaryConfig)
|
|
}
|
|
|
|
// OptimizeCodexMultiAgentV2Request rewrites an eligible spawn_agent request and
|
|
// reports whether the collaboration namespace was renamed for upstream use.
|
|
func OptimizeCodexMultiAgentV2Request(ctx context.Context, headers http.Header, payload []byte, cfg *config.Config) ([]byte, bool) {
|
|
return multiagentv2.OptimizeCodexMultiAgentV2Request(ctx, headers, payload, cfg)
|
|
}
|
|
|
|
// OptimizeCodexMultiAgentV2RequestForAuth applies the standard Codex MultiAgentV2
|
|
// request optimization and, when the selected codex-api-key model has is-compat
|
|
// enabled, also converts agent_message items into portable message/user input.
|
|
func OptimizeCodexMultiAgentV2RequestForAuth(ctx context.Context, headers http.Header, payload []byte, cfg *config.Config, auth *cliproxyauth.Auth, model string) ([]byte, bool) {
|
|
updated, optimized := multiagentv2.OptimizeCodexMultiAgentV2Request(ctx, headers, payload, cfg)
|
|
if cliproxyauth.CodexAPIKeyModelIsCompat(cfg, auth, model) {
|
|
updated = multiagentv2.RewriteCodexMultiAgentV2Input(ctx, headers, updated, cfg)
|
|
}
|
|
return updated, optimized
|
|
}
|
|
|
|
// RestoreCodexMultiAgentV2Response restores optimized collaboration namespace
|
|
// values before an upstream response is translated and returned to the client.
|
|
func RestoreCodexMultiAgentV2Response(payload []byte, optimized bool) []byte {
|
|
return multiagentv2.RestoreCodexMultiAgentV2Response(payload, optimized)
|
|
}
|