Convertitore OpenAI ⇄ Anthropic
Converti array di messages tra OpenAI Chat Completions e Anthropic Messages API. Gestisce system message, tool call, blocchi immagine, multi-turno. Nel browser, senza API key.
A cosa serve?
L'API Chat Completions di OpenAI e la Messages API di Anthropic permettono entrambe conversazioni multi-turno, ma strutturano il JSON in modo abbastanza diverso da impedire ai prompt e alle trace di tool-call di transitare puliti quando cambi provider. Le differenze sono piccole (posizione del system message, tool-call vs tool-use, forma dei blocchi immagine, role: 'tool' vs tool_result nel content) ma ognuna è una tana di coniglio da 10 minuti quando sei sotto deadline. Questo convertitore fa la traduzione: incolli una conversazione OpenAI e ottieni la versione Anthropic (o viceversa).
Cosa viene tradotto
- System messages. OpenAI: messaggio normale con
role: "system". Anthropic: camposystemtop-level sul request. Spostiamo e concateniamo se ne hai più di uno. - Tool-call (lato assistant). OpenAI:
tool_calls: [{id, type:'function', function:{name, arguments:'JSON-string'}}]. Anthropic: bloccotool_usedentrocontentcon{id, name, input}(oggetto parsato, non stringa). Parsiamo gli arguments escapati di OpenAI ininputstrutturato; il senso opposto ri-serializza. - Tool result. OpenAI: messaggio separato con
role: "tool",tool_call_id,content. Anthropic: bloccotool_resultnel content del prossimo messaggio user contool_use_id. Messaggitoolconsecutivi di OpenAI vengono coalesced in un singolo user Anthropic con piùtool_result. - Immagini. OpenAI:
{type:'image_url', image_url:{url}}. Anthropic:{type:'image', source:{type:'base64',media_type,data}}o URL-source. Rileviamo URLdata:e convertiamo; URL semplici passano come URL-source. - Testo semplice. OpenAI usa stringa; Anthropic accetta stringa o array
[{type:'text', text}]a un elemento. Usiamo ciò che è più semplice.
Cosa non viene tradotto
- Eventi di streaming. Gestiamo JSON di request/response, non gli stream SSE. Se hai un dump di stream, ricostruisci prima il messaggio finale.
- Campi provider-specifici.
logprobsdi OpenAI,stop_sequencesdi Anthropic, parametri di sampling — stanno al top-level del request, non dentro i messaggi. - Hint cache-control. Il
cache_control: {type:'ephemeral'}di Anthropic non ha equivalente OpenAI. Sopravvive a OpenAI → Anthropic (nessuna sorgente), ma viene scartato in Anthropic → OpenAI. - Definizioni di tool. Lo schema dei tuoi tool (campo
toolsdel request) sta fuori dall'array messages. Formato diverso tra provider — converti separatamente.
Trappole comuni
- Escaping arguments OpenAI.
argumentsdi OpenAI è una stringa JSON-encoded, non oggetto parsato. Se è malformato (raro, capita con modelli piccoli), lo mettiamo in_rawdentroinputAnthropic invece di lanciare. - System top-level Anthropic. In OpenAI → Anthropic il risultato è
{system, messages}. Se vuoi solo l'array, usa.messages— ma ricordati di attaccaresystemal request separatamente. - Alternanza stretta. Anthropic esige user/assistant in alternanza stretta (dopo il system opzionale). Il convertitore preserva in generale; se la sorgente OpenAI ha due user consecutivi, anche l'output Anthropic — e l'API rifiuterà. Mergeli prima.
- Multi-modal in OpenAI. Un messaggio user OpenAI con immagini usa un content array invece di stringa. Lo gestiamo; assicurati solo che il tuo input parsi come JSON.
- Privacy. Niente lascia la pagina. Conversione in JS puro; nessuna API key, nessuna chiamata di rete.