Files
opantoantro/docs/wiki/BifrostTransform.md
T

78 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.