Konwerter OpenAI ⇄ Anthropic
Konwertuj tablice messages między OpenAI Chat Completions a Anthropic Messages API. Obsługuje system messages, tool calle, bloki obrazków, multi-turn. W przeglądarce, bez API keys.
Do czego to służy?
API Chat Completions od OpenAI i Messages API od Anthropica pozwalają na rozmowy multi-turn, ale strukturyzują JSON na tyle różnie, że prompty i trace tool-calli nie wpadają czysto przy zmianie providera. Różnice są małe (umiejscowienie system message, tool-call vs tool-use, kształt bloków obrazków, role: 'tool' vs tool_result w content) ale każda to 10-minutowa królicza nora gdy masz deadline. Ten konwerter robi tłumaczenie: wklejasz rozmowę OpenAI, dostajesz wersję Anthropic (lub odwrotnie).
Co jest tłumaczone
- System messages. OpenAI: zwykła wiadomość z
role: "system". Anthropic: polesystemtop-level w requeście. Przenosimy i konkatenujemy jeśli jest kilka. - Tool-calle (strona assistanta). OpenAI:
tool_calls: [{id, type:'function', function:{name, arguments:'JSON-string'}}]. Anthropic: bloktool_usewewnątrzcontentz{id, name, input}(sparsowany obiekt, nie string). Parsujemy escapowane arguments OpenAI do strukturyzowanegoinputdla Anthropica; odwrotny kierunek re-serializuje. - Tool results. OpenAI: oddzielna wiadomość z
role: "tool",tool_call_idicontent. Anthropic: bloktool_resultwewnątrz content następnej wiadomości user ztool_use_id. Kolejne wiadomościtoolOpenAI łączą się w jedną user Anthropica z wielomatool_result. - Obrazki. OpenAI:
{type:'image_url', image_url:{url}}. Anthropic:{type:'image', source:{type:'base64',media_type,data}}albo URL-source. Wykrywamy URLedata:i konwertujemy; gołe URLe przechodzą jako URL-source. - Zwykły tekst. OpenAI używa stringa; Anthropic akceptuje stringa lub jednoelementową tablicę
[{type:'text', text}]. Używamy czego prostsze.
Czego się nie tłumaczy
- Eventy streamingowe. Obsługujemy JSON request/response, nie strumienie SSE. Z dumpem streamingowym najpierw zrekonstruuj końcową wiadomość.
- Pola specyficzne dla providera.
logprobsOpenAI,stop_sequencesAnthropica, parametry samplingu — żyją w top-level requestu, nie w messages. - Wskazówki cache-control.
cache_control: {type:'ephemeral'}Anthropica nie ma odpowiednika w OpenAI. Przeżywa OpenAI → Anthropic (brak źródła), ale jest porzucany przy Anthropic → OpenAI. - Definicje toolów. Schemat twoich toolów (pole
toolsrequestu) żyje poza tablicą messages. Format różny między providerami — konwertuj osobno.
Częste pułapki
- Escapowanie argumentów OpenAI.
argumentsOpenAI to string JSON-zakodowany, nie sparsowany obiekt. Jeśli zepsuty (rzadko, zdarza się z małymi modelami), wkładamy do_rawwinputAnthropica zamiast rzucać. - System top-level Anthropica. W OpenAI → Anthropic wynik to
{system, messages}. Jeśli chcesz tylko tablicę, użyj.messages— ale pamiętaj dołączyćsystemdo requestu osobno. - Ścisła alternacja. Anthropic wymaga user/assistant w ścisłej alternacji (po opcjonalnym system). Konwerter zazwyczaj zachowuje; jeśli twoje źródło OpenAI ma dwa user pod rząd, wyjście Anthropic też — i API odrzuci. Zmerguj wcześniej.
- Multi-modal w OpenAI. Wiadomość user OpenAI z obrazkami używa content array zamiast stringa. Obsługujemy; tylko upewnij się że twój input parsuje jako JSON.
- Prywatność. Nic nie opuszcza strony. Konwersja w czystym JS; bez API keys, bez sieci.