8.4 KiB
8.4 KiB
LLM Gateway / Proxy Projesi - Geliştirici İş Emri (Türkçe)
Bu doküman, bir geliştiriciye veya yapay zeka asistanına verilip projeyi tamamen uygulattıracak detaylı iş emridir. Hedef: Go + Fiber v3 tabanlı bir servis geliştirmek; OpenAI-compat ve Anthropic-compat proxy/gateway, Bifrost mapping, PostgreSQL (GORM) entegrasyonu, Swagger dokümanları ve Docker destekli dağıtım.
Özet Hedefler
- OpenAI-uyumlu istekleri alın, hedef backend:
https://api.deepseek.com. - Anthropic-uyumlu istekleri alın, hedef backend:
https://api.deepseek.com/anthropicveya (konfigürasyona bağlı olarak) Bifrost (http://10.80.80.70:8080/v1). - Lokalde Anthropic endpoint'i:
http://localhost:8000/anthropic(Bifrost mapping). - Kullanılacak kütüphaneler:
github.com/gofiber/fiber/v3gorm.io/gormgorm.io/driver/postgres
Çalışma Ortamı / Gereksinimler
- Go modül yapısı (go1.20+ önerilir).
- PostgreSQL veritabanı (docker-compose ile sağlanabilir).
- Docker & docker-compose (opsiyonel ama önerilir).
- İstenen
go getkomutları (README'de gösterilecek):go mod download(tüm bağımlılıklar go.mod'da tanımlı)go get -u gorm.io/gormgo get -u gorm.io/driver/postgres
Konfigürasyon (Environment Variables)
PORT(default:8000)OPENAI_BACKEND(default:https://api.deepseek.com) ##ÖrnekANTHROPIC_BACKEND(default:https://api.deepseek.com/anthropic)##ÖrnekUSE_BIFROST_FOR_ANTHROPIC(true/false) —trueise Anthropic çağrılarıBIFROST_URL'e yönlendirilirBIFROST_URL(örnek:http://10.80.80.70:8080/v1)##ÖrnekPOSTGRES_DSN(örnek:host=localhost user=app password=pass dbname=app port=5432 sslmode=disable TimeZone=UTC)##ÖrnekREQUEST_TIMEOUT_SECONDS(ör:30)##Örnek
Örnek .env.example:
PORT=8000
OPENAI_BACKEND=https://api.deepseek.com
ANTHROPIC_BACKEND=https://api.deepseek.com/anthropic
BIFROST_URL=http://10.80.80.70:8080/v1
USE_BIFROST_FOR_ANTHROPIC=true
POSTGRES_DSN=host=postgres user=app password=pass dbname=app port=5432 sslmode=disable TimeZone=UTC
REQUEST_TIMEOUT_SECONDS=30
API Endpoint Gereksinimleri
OpenAI-uyumlu
POST /v1/chat/completions-> forward to${OPENAI_BACKEND}/v1/chat/completionsPOST /v1/completions-> forward to${OPENAI_BACKEND}/v1/completions- Tüm
/v1/*OpenAI endpoint'leri generic olarak hedef backend'e yönlendirilmeli (method korunacak).
Kurallar:
- Authorization header (Bearer ...) ve diğer önemli header'lar hedefe iletilecek.
- Body genelde olduğu gibi POST edilecek.
- Hedeften gelen status code ve body olduğu gibi client'a iletilecek.
- Hedefe ulaşılamazsa 502 döndürülecek.
Anthropic-uyumlu
POST /anthropic/*(ör./anthropic/complete) -> eğerUSE_BIFROST_FOR_ANTHROPIC=falseise${ANTHROPIC_BACKEND}'e,trueise${BIFROST_URL}'e yönlendir.- Eğer Bifrost formatı ile Anthropic formatı farklıysa, minimal bir dönüşüm fonksiyonu yazılmalı (request/response mapping).
Hata durumları:
- Hedefe ulaşılamaz veya hata alınırsa uygun HTTP kodu döndürülecek (502/504/500 gibi).
Sağlık ve Dokümantasyon
GET /health-> servis, DB ve opsiyonel hedef backendlere temel sağlık bilgisi dönecek.- Swagger UI:
/swagger/*(Fiber v3 native HTML + CDN Swagger UI ile sunulacak).
İstek / Yanıt İşleme
- Timeout yönetimi (env'den):
REQUEST_TIMEOUT_SECONDS. - Retries (opsiyonel): tercih halinde
github.com/hashicorp/go-retryablehttpveya benzeri kullanılabilir. - İsteklerin DB'ye loglanması (Postgres + GORM) — minimal kayıt:
- timestamp, endpoint, method, client IP, model (varsa), tokens estimate (opsiyonel), response status, latency
- Büyük request body'leri truncation ile kaydedilecek (ör. 2000 karakter).
- Sensitive veriler (Authorization vb.) maskelenmeli, düz kaydedilmemeli.
Veri Modeli (Minimal)
RequestLog:- ID (UUID / auto increment)
- CreatedAt
- Endpoint (string)
- Method (string)
- ClientIP (string)
- RequestBody (text, truncate)
- ResponseStatus (int)
- LatencyMs (int)
- GORM AutoMigrate ile migration sağlanacak.
Proje Yapısı (Öneri)
main.go(Fiber app, config yükleme, route register)handlers/openai.gohandlers/anthropic.gointernal/proxy/proxy.go(generic forwarder)internal/transform/anthropic_bifrost.go(dönüşüm fonksiyonları)models/request_log.goconfig/config.go(env yükleme)docker/Dockerfiledocker/docker-compose.ymlREADME.mdtests/*(unit test örnekleri)go.mod,go.sum
Swagger
- Fiber v3 native HTML handler + CDN Swagger UI ile
/swagger/*altında UI sunulacak. - En az OpenAI-compatible
chat/completionsve Anthropic endpoint'leri için örnek request/response gösterilecek.
Docker & docker-compose
- Multi-stage
Dockerfile(build + runtime). docker-compose.yml:appservisi (build)postgresservisi (resmi image, örnek env)
docker-composeile test sağlanabilecek (izole ortam).
Testler
- Unit test: OpenAI proxy handler için en az iki test:
- başarılı forward (mock backend ile)
- hedef hata verdiğinde uygun hata dönüşü
- Integration test (opsiyonel): docker-compose altında mocked backend'e karşı örnek.
Komutlar / Kurulum (README'de belirtilecek)
go mod init github.com/<you>/<repo>go mod download(fiber v3 ve diğer bağımlılıklar go.mod'da)go get -u gorm.io/gormgo get -u gorm.io/driver/postgresgo build ./...docker build -t llm-gateway:latest .docker-compose up -d
Örnek curl Çağrıları
OpenAI compatible:
curl -X POST "http://localhost:8000/v1/chat/completions" \
-H "Authorization: Bearer $OPENAI_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4","messages":[{"role":"user","content":"Hello"}]}'
Anthropic (lokal mapped to Bifrost veya deepseek):
curl -X POST "http://localhost:8000/anthropic/complete" \
-H "Authorization: Bearer $ANTHROPIC_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt":"Say hello", "max_tokens": 64}'
Teslim Edilecekler (Repository içinde)
main.gohandlers/openai.gohandlers/anthropic.gointernal/proxy/proxy.gointernal/transform/anthropic_bifrost.gomodels/request_log.goconfig/config.godocker/Dockerfiledocker/docker-compose.ymlREADME.md(kurulum, env örnekleri, docker-compose, curl örnekleri)tests/*(unit testler)go.mod,go.sum
Kabul Kriterleri (Acceptance Criteria)
/v1/*istekleriOPENAI_BACKEND'e başarılı yönleniyor./anthropic/*istekleriUSE_BIFROST_FOR_ANTHROPICkonfigürasyonuna göreBIFROST_URLveyaANTHROPIC_BACKEND'e gidiyor.- İstekler DB'ye loglanıyor (Postgres çalışırken).
- Swagger UI erişilebilir (
/swagger/*). - README yönergelerine göre proje çalıştırılabiliyor.
- En az 1 birim testi geçiyor (
go test ./...).
Teknik Notlar / İpuçları
- HTTP client:
net/http+context(timeout) veya tercih edilirse fiber'ın client'ı. - Retries: isteğe bağlı;
go-retryablehttpönerilir. - Büyük body'leri DB'ye kaydederken truncate et (ör. 2000 char).
- Sensitive alanlar maskelenmeli.
- Anthropic <-> Bifrost dönüşümleri karmaşıksa, minimal mapping uygula ve README'de açıkla.
- Environment swap ile Deepseek <-> Bifrost kolayca değiştirilebilmeli.
Geliştirme Adımları (Öneri Sırayla)
- Repo skeleton oluştur (go mod init, klasör yapısı).
config/config.go: env yükleme ve default ayarlar.main.go: Fiber app init, DB bağlantısı (GORM), AutoMigrate, route register.internal/proxy/proxy.go: generic forwarder implementasyonu (timeout, header forwarding).handlers/openai.go&handlers/anthropic.go: handler'ları yaz, DB logging çağrılarını ekle.- Basit Swagger dokümantasyonu ekle.
- Dockerfile & docker-compose ekle.
- Unit testleri yaz ve çalıştır.
- README güncelle, örnek env ve curl'leri ekle.
İletişim / Teslim
- Repo URL veya zip ile teslim.
- README ile çalıştırma adımları.
- Örnek curl komutları ve
.env.example. - (Opsiyonel) Dönüşümlere dair kısa açıklama ve input/output örnekleri.
Eğer bu prompt'u doğrudan bir geliştiriciye/assistant'e vereceksen bu dosyayı kullan. İstersen ben bu prompt'u kullanarak ilk adımda repository skeleton'ını ve main.go + temel proxy handler'ı oluşturmaya başlayabilirim — başlamak istersen sadece "başla" de.