Aller au contenu

Proxy de traduction

Le proxy de traduction est le coeur de Claudex. Il s’intercale entre Claude Code et vos fournisseurs IA, convertissant de maniere transparente entre l’API Anthropic Messages et l’API OpenAI Chat Completions (ou l’API Responses).

Claude Code → Anthropic Messages API request
└── Claudex Proxy (127.0.0.1:13456)
├── DirectAnthropic provider → forward with headers
├── OpenAICompatible provider
│ ├── Translate request: Anthropic → OpenAI Chat Completions
│ ├── Apply query_params, strip_params, custom_headers
│ ├── Forward to provider
│ └── Translate response: OpenAI → Anthropic
└── OpenAIResponses provider
├── Translate request: Anthropic → OpenAI Responses API
├── Forward to provider
└── Translate response: Responses → Anthropic

Claudex utilise un trait ProviderAdapter pour gerer les differences entre les API des fournisseurs. Trois adaptateurs sont implementes :

AdaptateurTraductionUtilise par
DirectAnthropicAucune (passthrough)Anthropic, MiniMax, Vertex AI
ChatCompletionsTraduction complete Anthropic ↔ OpenAIGrok, OpenAI, DeepSeek, Kimi, GLM, OpenRouter, Groq, Mistral, Together AI, Perplexity, Cerebras, Azure OpenAI, GitHub Copilot, GitLab Duo, Ollama, vLLM, LM Studio
ResponsesAnthropic ↔ API OpenAI ResponsesAbonnements ChatGPT/Codex
AnthropicOpenAI
Champ systemMessage systeme dans le tableau messages
Blocs messages[].content (text, image, tool_use, tool_result)messages[].content + tool_calls
Tableau tools (JSON Schema avec input_schema)Tableau tools (format function avec parameters)
tool_choice (auto, any, {name})tool_choice (auto, required, {function: {name}})
max_tokensmax_tokens (plafonne par le parametre max_tokens du profil si defini)
temperature, top_pCorrespondance directe (supprime si strip_params correspond)
OpenAIAnthropic
choices[0].message.contentBlocs content (type: text)
choices[0].message.tool_callsBlocs content (type: tool_use)
finish_reason: stopstop_reason: end_turn
finish_reason: tool_callsstop_reason: tool_use
usage.prompt_tokens / completion_tokensusage.input_tokens / output_tokens

Claude Code peut generer des noms d’outils depassant 64 caracteres (par ex. mcp__server-name__very-long-tool-name-that-exceeds-the-limit). OpenAI et de nombreux fournisseurs imposent une limite de 64 caracteres.

Claudex automatiquement :

  1. Tronque les noms depassant 64 caracteres dans les requetes sortantes
  2. Construit une table de correspondance des noms tronques vers les originaux
  3. Restaure les noms originaux dans les reponses du fournisseur

Cet aller-retour est entierement transparent.

Claudex supporte entierement le streaming SSE (Server-Sent Events), traduisant les chunks de flux OpenAI en evenements de flux Anthropic en temps reel :

SSE OpenAISSE Anthropic
Premier chunkmessage_start + content_block_start
choices[0].delta.contentcontent_block_delta (text_delta)
choices[0].delta.tool_callscontent_block_delta (input_json_delta)
finish_reason presentcontent_block_stop + message_delta + message_stop

Le traducteur en streaming maintient une machine d’etat pour gerer correctement l’accumulation des appels d’outils et les limites des blocs de contenu.

Azure OpenAI utilise un schema d’authentification et d’URL different :

  • Authentification : en-tete api-key au lieu de Authorization: Bearer
  • Format d’URL : https://{resource}.openai.azure.com/openai/deployments/{deployment}
  • Version API : requise via query_params

Claudex detecte automatiquement Azure en verifiant si la base_url contient openai.azure.com et ajuste l’authentification en consequence.

FournisseurTypeURL de base
AnthropicDirectAnthropichttps://api.anthropic.com
MiniMaxDirectAnthropichttps://api.minimax.io/anthropic
Google Vertex AIDirectAnthropichttps://REGION-aiplatform.googleapis.com/v1/projects/...
OpenRouterOpenAICompatiblehttps://openrouter.ai/api/v1
Grok (xAI)OpenAICompatiblehttps://api.x.ai/v1
OpenAIOpenAICompatiblehttps://api.openai.com/v1
DeepSeekOpenAICompatiblehttps://api.deepseek.com
Kimi/MoonshotOpenAICompatiblehttps://api.moonshot.ai/v1
GLM (Zhipu)OpenAICompatiblehttps://api.z.ai/api/paas/v4
GroqOpenAICompatiblehttps://api.groq.com/openai/v1
Mistral AIOpenAICompatiblehttps://api.mistral.ai/v1
Together AIOpenAICompatiblehttps://api.together.xyz/v1
PerplexityOpenAICompatiblehttps://api.perplexity.ai
CerebrasOpenAICompatiblehttps://api.cerebras.ai/v1
Azure OpenAIOpenAICompatiblehttps://{resource}.openai.azure.com/...
GitHub CopilotOpenAICompatiblehttps://api.githubcopilot.com
GitLab DuoOpenAICompatiblehttps://gitlab.com/api/v4/ai/llm/proxy
OllamaOpenAICompatiblehttp://localhost:11434/v1
vLLMOpenAICompatiblehttp://localhost:8000/v1
LM StudioOpenAICompatiblehttp://localhost:1234/v1
ChatGPT/Codex subOpenAIResponseshttps://chatgpt.com/backend-api/codex

Le proxy expose un endpoint /v1/models qui liste tous les profils actives. Chaque entree inclut des champs personnalises :

  • x-claudex-profile : nom du profil
  • x-claudex-provider : type de fournisseur (anthropic, openai-compatible, openai-responses)

Claude Code interroge cet endpoint pour decouvrir les modeles disponibles.

Fenêtre de terminal
# Demarrer le proxy en tant que daemon
claudex proxy start -d
# Verifier le statut du proxy
claudex proxy status
# Arreter le daemon proxy
claudex proxy stop
# Demarrer sur un port personnalise
claudex proxy start -p 8080

Lorsque vous executez claudex run <profile>, le proxy est automatiquement demarre en arriere-plan s’il ne tourne pas deja.