# BifrostTransform **Özet:** Anthropic Messages API formatı ile OpenAI Chat Completions formatı arasında çift yönlü dönüşüm yapan katman (`internal/transform/anthropic_bifrost.go:74`). "Bifrost" (İskandinav mitolojisindeki köprü) adı, two-way dönüşümü simgeler. **Kütüphaneler:** Go `encoding/json`, `strings` **Bağlantılar:** [[AnthropicHandler]], [[Index]] ## Struct'lar ### Anthropic Format (Giriş/Çıkış) | Struct | Alanlar | |---|---| | `AnthropicRequest` | `Model`, `MaxTokens`, `Messages []AnthropicMessage`, `System`, `Stream` | | `AnthropicMessage` | `Role`, `Content` | | `AnthropicResponse` | `ID`, `Type`, `Role`, `Content []AnthropicContent`, `Model`, `StopReason`, `StopSequence` | | `AnthropicContent` | `Type`, `Text` | ### OpenAI / Bifrost Format (Ara Katman) | Struct | Alanlar | |---|---| | `BifrostRequest` | `Model`, `Messages []BifrostMessage`, `MaxTokens`, `Stream` | | `BifrostMessage` | `Role`, `Content` | | `BifrostResponse` | `ID`, `Object`, `Created`, `Model`, `Choices[{Message{Role,Content}, FinishReason, Index}]` | ## Dönüşüm Detayları ### Anthropic → OpenAI (`AnthropicToBifrost()`) ``` Anthropic Request OpenAI Request ───────────────── ───────────── model: "claude-3-5-sonnet" → model: "Anthropic/claude-3-5-sonnet" system: "Be helpful" → messages: [{role:"system", ...}, ...] messages: [{role, content}] → messages: [{role, content}] max_tokens: 1024 → max_tokens: 1024 stream: true → stream: true ``` ### OpenAI → Anthropic (`BifrostToAnthropic()`) ``` OpenAI Response Anthropic Response ─────────────── ───────────────── id: "chatcmpl-xxx" → id: "chatcmpl-xxx" choices[].message.content → content: [{type:"text", text:"..."}] choices[].finish_reason → stop_reason: "stop"/"end_turn" model → model (same) ``` ## Model Prefix Tahmini (`guessProvider()`) | Model içerir | Prefix | Örnek | |---|---|---| | `deepseek` | `DeepSeek/` | `deepseek-v4` → `DeepSeek/deepseek-v4` | | `gpt`, `openai` | `OpenAI/` | `gpt-4` → `OpenAI/gpt-4` | | `claude`, `anthropic` | `Anthropic/` | `claude-3` → `Anthropic/claude-3` | | `gemini` | `Google/` | `gemini-pro` → `Google/gemini-pro` | | diğer | `DeepSeek/` (varsayılan) | — | ## SSE Streaming Transformer (`StreamTransformer`) OpenAI SSE chunk'larını Anthropic SSE event'lerine dönüştürür (`TransformChunk()`): ``` OpenAI SSE Chunk Anthropic SSE Events ───────────────── ───────────────────── id + model var → message_start (ilk chunk'ta) delta.content → content_block_start + content_block_delta finish_reason → content_block_stop + message_delta + message_stop [DONE] → (finish() zaten çağrıldıysa no-op) ``` **Buffer:** 4MB scanner buffer (`handlers/anthropic.go`) — Claude Code tool çağrılarında büyük chunk'lar için. **Hata yönetimi:** Scanner/write/flush hataları `[ANTHROPIC]` prefix'iyle loglanır.