OpenAI ⇄ Anthropic Converter
Converteer messages-arrays tussen OpenAI Chat Completions en Anthropic Messages API. Behandelt system messages, tool calls, image-blokken, multi-turn. In de browser, geen API keys.
Waar is dit voor?
OpenAI's Chat Completions API en Anthropic's Messages API laten je beide multi-turn conversaties versturen, maar vormen het JSON net genoeg verschillend dat prompts en tool-call traces niet schoon overgaan als je van provider wisselt. De verschillen zijn klein (system message-plaatsing, tool-call vs tool-use, image-blok-vorm, role: 'tool' vs tool_result in content) maar elk is een 10-minuten konijnenhol als je deadline hebt. Deze converter doet de vertaling: plak een OpenAI-conversatie en krijg een Anthropic-versie terug (of andersom).
Wat er vertaald wordt
- System messages. OpenAI: gewoon bericht met
role: "system". Anthropic: top-levelsystem-veld op het request. We verplaatsen en concateneren bij meerdere. - Tool-calls (assistant-kant). OpenAI:
tool_calls: [{id, type:'function', function:{name, arguments:'JSON-string'}}]. Anthropic:tool_use-blok binnencontentmet{id, name, input}(geparseerd object, geen string). We parseren OpenAI's geëscapete arguments naar gestructureerdeinputvoor Anthropic; de omgekeerde richting re-serializeert. - Tool results. OpenAI: apart bericht met
role: "tool",tool_call_id,content. Anthropic:tool_result-blok binnen de content van het volgende user-bericht mettool_use_id. Opeenvolgende OpenAItool-berichten worden samengevoegd tot één Anthropic user met meerderetool_result-blokken. - Afbeeldingen. OpenAI:
{type:'image_url', image_url:{url}}. Anthropic:{type:'image', source:{type:'base64',media_type,data}}of URL-source. We detecterendata:-URLs en converteren; kale URLs gaan door als URL-source. - Platte tekst. OpenAI gebruikt een string; Anthropic accepteert een string of één-element-array
[{type:'text', text}]. We nemen wat eenvoudiger is.
Wat niet vertaald wordt
- Streaming-events. We behandelen request/response-JSON, geen SSE event-streams. Bij een stream-dump eerst het volledige eindbericht reconstrueren.
- Provider-specifieke velden. OpenAI's
logprobs, Anthropic'sstop_sequences, sampling-parameters — leven op request-top-level, niet binnen messages. - Cache-control hints. Anthropic's
cache_control: {type:'ephemeral'}heeft geen OpenAI-equivalent. Overleeft OpenAI → Anthropic (geen bron), maar wordt gedropt bij Anthropic → OpenAI. - Tool-definities. Het schema van je tools (het
tools-veld op het request) leeft buiten de messages-array. Format verschilt per provider — los converteren.
Veelvoorkomende valkuilen
- OpenAI argument-escaping. OpenAI's
argumentsis een JSON-encoded string, geen geparseerd object. Bij kapot JSON (zeldzaam, gebeurt bij kleine modellen) zetten we het in_rawin Anthropic'sinputin plaats van gooien. - Anthropic top-level system. Bij OpenAI → Anthropic is het resultaat
{system, messages}. Wil je alleen de array, gebruik.messages— maar onthoudsystemapart aan je API-request te hangen. - Strikte alternatie. Anthropic vereist user/assistant strikte alternatie (na het optionele system). De converter behoudt dit meestal; als je OpenAI-bron twee user-berichten achter elkaar heeft, heeft de Anthropic-output dat ook — en de API weigert. Eerst mergen.
- Multi-modaal in OpenAI. Een OpenAI user-bericht met afbeeldingen gebruikt een content array in plaats van een string. We behandelen dit; zorg alleen dat je input als JSON parseert.
- Privacy. Niets verlaat de pagina. Conversie is pure JS; geen API keys, geen netwerk-calls.