Skip to content

Latest commit

 

History

History
424 lines (315 loc) · 18 KB

File metadata and controls

424 lines (315 loc) · 18 KB

CommandCode Bridge

English

CommandCode Bridge, CommandCode Go aboneliğiniz için OpenAI uyumlu ve Anthropic uyumlu HTTP endpointleri sunan bir Go reverse proxy uygulamasıdır.

Yerel client isteklerini kabul eder, OpenAI veya Anthropic payloadlarını CommandCode upstream request biçimine dönüştürür, CommandCode tarafına iletir ve upstream NDJSON yanıtlarını OpenAI veya Anthropic response biçimlerine çevirir.

Özellikler

  • OpenAI uyumlu POST /v1/chat/completions endpointi.
  • OpenAI Responses POST /v1/responses ve POST /v1/responses/compact endpointleri.
  • Anthropic uyumlu POST /v1/messages endpointi.
  • Upstream tarafına iletilen Anthropic token counting POST /v1/messages/count_tokens endpointi.
  • Provider API model listesine dayalı OpenAI uyumlu GET /v1/models endpointi.
  • Streaming ve non-streaming response desteği.
  • OpenAI ve Anthropic response biçimleri için tool calling desteği.
  • Anthropic URL ve base64 image source değerlerini OpenAI image_url blocklarına dönüştürme desteği.
  • Request header ile session reuse destekleyen per-key session management.
  • Upstream requestler için machine fingerprint ve CLI compatibility headerları.
  • Client erişimi için proxy_token ile local proxy authentication.
  • Her zaman config'den okunan cc_apiKey ile upstream CommandCode authentication.

Gereksinimler

  • Go 1.26.4 veya daha yeni bir sürüm.
  • Container deployment için Docker ve Docker Compose.
  • Upstream API erişimi için user_... biçiminde bir CommandCode API key.

Kurulum

  1. Node.js ve npm kurulu değilse kurun.

  2. Command Code CLI yazılımını kurun:

    npm i -g command-code@latest
  3. Command Code CLI ile giriş yapın:

    cmd login
  4. Örnek config dosyasını kopyalayın:

    git clone https://github.com/KilimcininKorOglu/CommandCodeBridge
    cd CommandCodeBridge/
    cp data/config.example.json data/config.json
  5. ~/.commandcode/auth.json dosyasındaki apiKey değerini data/config.json içindeki cc_apiKey alanına yazın. data/config.json dosyasını gizli tutun.

  6. data/config.json içindeki proxy_token değerini tahmin edilmesi zor bir local proxy token ile değiştirin. Clientlar proxy çağırırken bu tokenı kullanmalıdır.

  7. Sabit bir upstream project slug istiyorsanız projectSlug değerini ayarlayın. Session-derived fake slug kullanmak için boş bırakın.

  8. Logları data/logs/ altında tutun:

    {
      "logFile": "data/logs/proxy.log"
    }
  9. Docker Compose ile build edip başlatın:

    docker compose up -d --build
  10. Servisi doğrulayın:

    curl http://127.0.0.1:3050/health
  11. Proxy çağrılarında local proxy token değerini gönderin:

    curl http://127.0.0.1:3050/v1/models \
      -H 'Authorization: Bearer <proxy_token>'

Docker Compose servisi varsayılan olarak http://127.0.0.1:3050 adresinde dinler.

Local Binary Kullanımı

Proxy binary dosyasını build edin:

go build -o bin/proxy ./cmd/proxy

Local olarak çalıştırın:

./bin/proxy -config data/config.json

Yapılandırma

Proxy varsayılan olarak config.json dosyasını yükler ve ardından environment variable override değerlerini uygular. Docker image -config /app/config.json ile çalışır ve docker-compose.yml, ./data/config.json dosyasını /app/config.json yoluna mount eder.

Örnek yapılandırma:

{
  "port": 3050,
  "host": "0.0.0.0",
  "cc_apiKey": "user_xxxxxxxxx",
  "apiBase": "https://api.commandcode.ai",
  "projectSlug": "",
  "proxy_token": "test",
  "logFile": "data/logs/proxy.log",
  "logLevel": "info"
}
Alan Amaç
port Local listen port. PORT ile override edilir.
host Local listen address. HOST ile override edilir.
apiBase Upstream CommandCode API base URL. COMMANDCODE_API_BASE ile override edilir.
cc_apiKey Her zaman config'den okunan upstream CommandCode credential. user_ key içermelidir.
proxy_token Clientlar için local proxy authentication token. COMMANDCODE_PROXY_TOKEN ile override edilir.
projectSlug İsteğe bağlı explicit upstream project slug. Boş değer session-derived fake slug kullanır. PROJECT_SLUG ile override edilir.
logFile İsteğe bağlı log file path. LOG_FILE ile override edilir.
logLevel Log level. LOG_LEVEL ile override edilir.
useProviderModels Provider API üzerinden dynamic model fetching özelliğini etkinleştirir. COMMANDCODE_USE_PROVIDER_MODELS ile override edilir.
modelRefreshIntervalMs Provider model refresh interval değeridir, milliseconds cinsindendir.
fingerprint Yoksa ilk çalıştırmada üretilen persisted machine fingerprint değeridir.

Credential Modeli

cc_apiKey ve proxy_token farklı credential değerleridir ve karıştırılmamalıdır.

Credential Kullanan taraf Amaç
proxy_token Bu proxy’ye istek atan local clientlar Local proxy erişimini authenticate eder.
cc_apiKey CommandCode tarafına istek atan bu proxy Upstream CommandCode API requestlerini authenticate eder.

proxy_token yapılandırılmışsa clientlar aşağıdakilerden birini göndermelidir:

Authorization: Bearer <proxy_token>

veya:

X-Proxy-Token: <proxy_token>

Proxy upstream CommandCode requestleri için her zaman config dosyasındaki cc_apiKey değerini kullanır. cc_apiKey bir user_[a-zA-Z0-9_-]+ key içermelidir; sk-... keyleri geçerli CommandCode credential değildir.

proxy_token yapılandırılmamışsa proxy local client authentication'ı zorunlu kılmaz, ancak upstream authentication için config'de cc_apiKey yine de gereklidir.

Environment Variables

Değişken Override ettiği alan
PORT port
HOST host
COMMANDCODE_API_BASE apiBase
COMMANDCODE_PROXY_TOKEN proxy_token
PROJECT_SLUG projectSlug
LOG_FILE logFile
LOG_LEVEL logLevel
COMMANDCODE_USE_PROVIDER_MODELS useProviderModels

CommandCode özel environment variable değerleri için COMMANDCODE_ prefixini kullanın.

API Endpointleri

Endpoint Auth Açıklama
GET /health Hayır Health check.
GET /v1/models Evet OpenAI uyumlu model list data döndürür.
POST /v1/chat/completions Evet OpenAI Chat Completions uyumlu endpoint.
POST /v1/responses Evet OpenAI Responses uyumlu endpoint.
POST /v1/responses/compact Evet OpenAI Responses konuşma sıkıştırması.
POST /v1/messages Evet Anthropic Messages uyumlu endpoint.
POST /v1/messages/count_tokens Evet Upstream'e iletilen Anthropic token counting.

Protected route değerleri upstream tarafına forward edilmeden önce invalid authentication formatlarını reddeder.

OpenAI Uyumlu Kullanım

Non-streaming örneği:

curl http://127.0.0.1:3050/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer test' \
  -d '{
    "model": "deepseek/deepseek-v4-flash",
    "messages": [
      {"role": "user", "content": "selamun aleykum"}
    ]
  }'

Streaming örneği:

curl http://127.0.0.1:3050/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer test' \
  -d '{
    "model": "deepseek/deepseek-v4-flash",
    "stream": true,
    "messages": [
      {"role": "user", "content": "Write a short greeting."}
    ]
  }'

Anthropic Uyumlu Kullanım

Non-streaming örneği:

curl http://127.0.0.1:3050/v1/messages \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer test' \
  -d '{
    "model": "deepseek/deepseek-v4-flash",
    "max_tokens": 256,
    "messages": [
      {"role": "user", "content": "Write a short greeting."}
    ]
  }'

Streaming örneği:

curl http://127.0.0.1:3050/v1/messages \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer test' \
  -d '{
    "model": "deepseek/deepseek-v4-flash",
    "max_tokens": 256,
    "stream": true,
    "messages": [
      {"role": "user", "content": "Write a short greeting."}
    ]
  }'

OpenAI Responses Kullanımı

Non-streaming örneği:

curl http://127.0.0.1:3050/v1/responses \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer test' \
  -d '{
    "model": "deepseek/deepseek-v4-flash",
    "input": "Write a short greeting."
  }'

Streaming, Responses eventlerini (response.created, response.output_text.delta, response.completed) ve son bir data: [DONE] satırını yayar:

curl http://127.0.0.1:3050/v1/responses \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer test' \
  -d '{
    "model": "deepseek/deepseek-v4-flash",
    "stream": true,
    "input": "Write a short greeting."
  }'

POST /v1/responses/compact endpointi aynı model ve input alanlarını kabul eder ve sıkıştırılmış bir konuşma context değeri döndürür.

Tool Calling

İki uyumlu endpoint de streaming ve non-streaming response değerlerinde tool calling destekler.

OpenAI requestleri type: "function" içeren tools ve OpenAI style tool_choice kullanır. Anthropic requestleri input_schema içeren tools ve Anthropic style tool_choice kullanır.

Anthropic /v1/messages sunulurken OpenAI response tool_calls değerleri Anthropic tool_use content blocklarına dönüştürülür.

Claude Code CLI Entegrasyonu

Claude Code CLI kimlik doğrulaması için x-api-key header'ını kullanır (Anthropic SDK kuralı). CommandCode Bridge proxy_token değerini X-Proxy-Token, Authorization: Bearer ve x-api-key header'larından kabul eder.

Claude Code CLI'yi proxy üzerinden Anthropic uyumlu sağlayıcı olarak yapılandırma:

Claude Code CLI başlatılmadan önce environment variable tanımlama:

export ANTHROPIC_BASE_URL=http://127.0.0.1:3050
export ANTHROPIC_API_KEY=<proxy_token>
export ANTHROPIC_MODEL=deepseek/deepseek-v4-pro[1m]
export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek/deepseek-v4-flash[1m]
export CLAUDE_CODE_SUBAGENT_MODEL=deepseek/deepseek-v4-pro[1m]
export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek/deepseek-v4-pro[1m]
export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek/deepseek-v4-pro[1m]
claude

<proxy_token> değerini data/config.json içindeki proxy_token ile değiştirin. Proxy upstream CommandCode istekleri için config'deki cc_apiKey değerini kullanır.

Kullanılabilir modeller:

curl http://127.0.0.1:3050/v1/models \
  -H 'x-api-key: <proxy_token>'

Image Inputs

Protocol conversion şunları destekler:

  • OpenAI image_url content blockları.
  • Anthropic URL image source değerleri.
  • source.data ve source.media_type üzerinden Anthropic base64 image source değerleri, OpenAI data URL değerlerine dönüştürülür.

Image input desteği seçilen upstream modele bağlıdır.

Docker Deployment

docker-compose.yml şunları tanımlar:

Ayar Değer
Compose project name commandcode-bridge
Service proxy
Container name commandcode-bridge-proxy
Host port 3050
Container port 3050
Runtime config mount ./data/config.json:/app/config.json:Z
Runtime logs mount ./data/logs:/app/data/logs:Z

Servisi başlatın:

docker compose up -d

Kod değişikliklerinden sonra yeniden build edin:

docker compose up -d --build

Health check:

curl http://127.0.0.1:3050/health

Build ve Development Komutları

Komut Amaç
go build -o bin/proxy ./cmd/proxy Local binary build eder.
go run ./cmd/proxy Varsayılan config resolution ile source üzerinden çalıştırır.
go run ./cmd/proxy -config data/config.json Explicit config path ile source üzerinden çalıştırır.
go test ./... Full Go test suite çalıştırır.
go test ./internal/protocol -run TestName Tek bir protocol testini çalıştırır.
go test ./internal/http -run TestName Tek bir HTTP handler veya middleware testini çalıştırır.
go test ./internal/streaming -run TestName Tek bir streaming translator testini çalıştırır.
go vet ./... Go static checks çalıştırır.
gofmt -w <files> Değiştirilen Go dosyalarını formatlar.

Bu repository’de Makefile veya package manager manifest yoktur.

Mimari

High-level request flow:

  1. cmd/proxy/main.go config yükler, logging başlatır, fingerprint yükler veya oluşturur, HTTP client, session store, init manager ve model manager oluşturur, Command Code CLI version değerini yeniler ve ardından server başlatır.
  2. internal/http/server.go chi router oluşturur ve CORS, request size limit, request timeout, logging ve authentication middleware ekler.
  3. internal/http/handlers.go endpoint orchestration işlemini yürütür: request body decode eder, upstream fingerprint ve lifecycle state başlatır, session ID resolve eder, payload dönüştürür, upstream tarafına forward eder ve response çevirir.
  4. internal/protocol OpenAI, Anthropic ve CommandCode request/response conversion işlemlerinden sorumludur.
  5. internal/streaming upstream NDJSON stream eventlerini OpenAI SSE veya Anthropic SSE eventlerine dönüştürür ve stream idle timeout uygular.
  6. internal/client upstream HTTP boundary katmanıdır. Chat requestlerini /alpha/generate yoluna forward eder, Provider API modellerini fetch eder, fingerprint ve lifecycle eventleri gönderir ve upstream headerları yönetir.
  7. internal/models Provider API model data değerlerini cache eder ve dynamic model fetching etkinse yeniler.
  8. internal/session API keyleri ve incoming session headerlarını expiry ve jitter içeren stable session ID değerlerine map eder.
  9. internal/fingerprint ve internal/config runtime environment data ve persisted fingerprint değerlerini oluşturur.
  10. pkg/version Command Code CLI version değerini yönetir ve npm registry üzerinden yeniler.

Upstream Compatibility Notları

  • Chat requestleri upstream /alpha/generate yoluna forward edilir.
  • Upstream chat response değerleri non-streaming client requestleri için bile NDJSON stream olarak işlenir.
  • Upstream permissionMode değeri standard olur.
  • OpenAI max_tokens eksikse veya pozitif değilse varsayılan değer 64000 olur.
  • OpenAI max_tokens değeri 200000 üstündeyse 200000 ile sınırlandırılır.
  • Boş projectSlug, session-derived fake slug kullanır; configured projectSlug explicit override olarak davranır.
  • Command Code CLI version, request servis edilmeden önce npm üzerinden yenilenir.
  • Client disconnect durumunda upstream requestler iptal edilir.
  • Streaming idle timeout 30 saniyedir.
  • Non-streaming idle timeout 90 saniyedir.
  • Zero output token durumunda retryable 429 response döner.

Logging ve Güvenlik

Runtime logları logFile üzerinden data/logs/ altına yazılabilir.

Şunları loglamayın veya açığa çıkarmayın:

  • API keyler veya bearer token parçaları.
  • cc_apiKey veya proxy_token değerleri.
  • Raw upstream error body değerleri.
  • Stack trace değerleri.
  • User prompt, tool payload, image URL veya başka user data içeren request body değerleri.

Servis user-controlled payload kabul eder ve upstream tarafına forward eder. HTTP, protocol veya streaming kodu değiştirirken request size limit, timeout, upstream error handling ve header filtering davranışlarını koruyun.

SQL, shell execution, template rendering, file access veya yeni outbound HTTP behavior eklerken ilgili OWASP Top 10 risklerini implementation öncesinde değerlendirin.

Lisans

Yalnızca Araştırma