OpenAI ⇄ Anthropic Dönüştürücü
Mesaj dizilerini OpenAI Chat Completions ile Anthropic Messages API arasında dönüştür. System mesajları, tool call'lar, görsel blokları, multi-turn'ü işler. Tarayıcıda, API anahtarı yok.
Bu ne işe yarar?
OpenAI'nin Chat Completions API'si ve Anthropic'in Messages API'si ikisi de multi-turn konuşma göndermene izin verir, ama JSON'u yeterince farklı şekillendirirler ki provider değiştirdiğinde prompt'lar ve tool-call trace'leri temizce geçmez. Farklar küçük (system mesaj yerleşimi, tool-call vs tool-use, görsel blok şekli, role: 'tool' vs content içinde tool_result) ama her biri deadline'dayken 10 dakikalık tavşan deliği. Bu dönüştürücü çeviriyi yapar: OpenAI konuşması yapıştır, Anthropic versiyonunu geri al (veya tersi).
Ne çevriliyor
- System mesajları. OpenAI:
role: "system"ile normal mesaj. Anthropic: request'in top-level'indesystemalanı. Birden fazlaysa taşıyıp birleştiriyoruz. - Tool-call'lar (assistant tarafı). OpenAI:
tool_calls: [{id, type:'function', function:{name, arguments:'JSON-string'}}]. Anthropic:contentiçindetool_usebloğu{id, name, input}ile (parse edilmiş nesne, string değil). OpenAI'nin escape'lenmiş arguments'ını Anthropic'in beklediği yapılandırılmışinput'a parse ediyoruz; tersi yön tekrar string yapıyor. - Tool sonuçları. OpenAI:
role: "tool",tool_call_idvecontentiçeren ayrı mesaj. Anthropic: sonraki user mesajının content dizisindetool_use_idiçerentool_resultbloğu. Ardışık OpenAItoolmesajları birden fazlatool_resultiçeren tek bir Anthropic user mesajında birleştiriliyor. - Görseller. OpenAI:
{type:'image_url', image_url:{url}}. Anthropic:{type:'image', source:{type:'base64',media_type,data}}veya URL-source.data:URL'leri tespit edip dönüştürüyoruz; çıplak URL'ler URL-source olarak geçiyor. - Düz metin. OpenAI string kullanır; Anthropic string veya tek elemanlı
[{type:'text', text}]dizisi kabul eder. Daha basit olanı kullanıyoruz.
Ne çevrilmiyor
- Streaming event'leri. Request/response JSON'unu ele alıyoruz, SSE event stream'lerini değil. Stream dump'ın varsa önce tam final mesajı yeniden oluştur.
- Sağlayıcıya özgü alanlar. OpenAI'nin
logprobs'u, Anthropic'instop_sequences'i, sampling parametreleri — request top-level'inde yaşar, messages içinde değil. - Cache-control ipuçları. Anthropic'in
cache_control: {type:'ephemeral'}'i OpenAI eşdeğerine sahip değil. OpenAI → Anthropic'te hayatta kalır (kaynak yok), ama Anthropic → OpenAI'de düşürülür. - Tool tanımları. Tool'larının şeması (request'in
toolsalanı) messages dizisinin dışında yaşar. Sağlayıcılar arasında format farklı — ayrı dönüştür.
Yaygın tuzaklar
- OpenAI argument escape'i. OpenAI'nin
arguments'ı JSON-encoded string, parse edilmiş nesne değil. Bozuksa (nadir, küçük modellerde olur), hata atmak yerine Anthropicinput'unda_rawaltına koyuyoruz. - Anthropic top-level system. OpenAI → Anthropic'te sonuç
{system, messages}. Sadece diziyi istiyorsan.messageskullan — amasystem'i API request'ine ayrı eklemeyi unutma. - Katı dönüşüm. Anthropic user/assistant katı dönüşümünü gerektirir (opsiyonel system'den sonra). Dönüştürücü genelde korur; OpenAI kaynağında ardışık iki user mesajı varsa, Anthropic çıktısında da olur — ve API reddeder. Önce merge et.
- OpenAI'de multi-modal. Görsellerle OpenAI user mesajı string yerine content array kullanır. Bunu hallediyoruz; sadece input'unun JSON olarak parse olduğundan emin ol.
- Gizlilik. Hiçbir şey sayfadan çıkmaz. Dönüştürme saf JS; API anahtarı yok, network çağrısı yok.