Convertisseur OpenAI ⇄ Anthropic
Convertissez des tableaux de messages entre OpenAI Chat Completions et Anthropic Messages API. Gère les system messages, tool calls, blocs d'image, multi-tour. Dans le navigateur, sans API keys.
À quoi ça sert ?
L'API Chat Completions d'OpenAI et l'API Messages d'Anthropic permettent toutes deux des conversations multi-tours, mais structurent le JSON de manière suffisamment différente pour que les prompts et traces de tool-calls ne tombent pas proprement quand on change de fournisseur. Les écarts sont petits (placement du system, tool-call vs tool-use, forme des blocs d'image, role: 'tool' vs tool_result en content) mais chacun est un trou de lapin de 10 minutes quand on est sous pression. Ce convertisseur fait la traduction pour que vous puissiez coller une conversation OpenAI et obtenir une version Anthropic (ou l'inverse).
Ce qui est traduit
- System messages. OpenAI : message normal avec
role: "system". Anthropic : champsystemau top-level du request. On déplace et concatène s'il y en a plusieurs. - Tool-calls (côté assistant). OpenAI :
tool_calls: [{id, type:'function', function:{name, arguments:'JSON-string'}}]. Anthropic : bloctool_usedanscontentavec{id, name, input}(objet parsé, pas une chaîne). On parse les arguments échappés d'OpenAI versinputstructuré ; le sens inverse re-sérialise. - Tool results. OpenAI : message à part avec
role: "tool",tool_call_id,content. Anthropic : bloctool_resultdans le contenu du prochain message user avectool_use_id. Les messagestoolconsécutifs d'OpenAI fusionnent en un user Anthropic avec plusieurstool_result. - Images. OpenAI :
{type:'image_url', image_url:{url}}. Anthropic :{type:'image', source:{type:'base64',media_type,data}}ou URL-source. On détecte les URLsdata:et on convertit ; les URLs simples passent en URL-source. - Texte brut. OpenAI utilise une string ; Anthropic accepte string ou tableau
[{type:'text', text}]à un élément. On prend ce qui est le plus simple.
Ce qui n'est pas traduit
- Événements de streaming. On gère JSON de request/response, pas les streams SSE. Si vous avez un dump de stream, reconstruisez le message final d'abord.
- Champs spécifiques au fournisseur.
logprobsd'OpenAI,stop_sequencesd'Anthropic, paramètres de sampling — vivent au top-level du request, pas dans les messages. - Hints cache-control. Le
cache_control: {type:'ephemeral'}d'Anthropic n'a pas d'équivalent OpenAI. Survit en OpenAI → Anthropic (pas de source), mais est jeté en Anthropic → OpenAI. - Définitions de tools. Le schéma de vos tools (champ
toolsdu request) vit hors du tableau messages. Format différent entre fournisseurs — convertir séparément.
Pièges courants
- Échappement des arguments OpenAI.
argumentsd'OpenAI est une chaîne JSON-encodée, pas un objet parsé. Si elle est cassée (rare, arrive avec petits modèles), on le met dans_rawdansinputAnthropic plutôt que de jeter. - System top-level d'Anthropic. En OpenAI → Anthropic le résultat est
{system, messages}. Si vous voulez juste le tableau, utilisez.messages— mais pensez à passersystemau request séparément. - Alternance stricte. Anthropic exige user/assistant en alternance stricte (après le system optionnel). Le convertisseur préserve en général ; si votre source OpenAI a deux user consécutifs, la sortie Anthropic aussi — et l'API rejettera. Fusionnez avant.
- Multi-modal en OpenAI. Un message user OpenAI avec images utilise un content array au lieu d'une string. On gère ; assurez-vous juste que votre entrée parse en JSON.
- Privacy. Rien ne quitte la page. Conversion en JS pur ; pas d'API keys, pas de réseau.