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.
- OpenAI uyumlu
POST /v1/chat/completionsendpointi. - OpenAI Responses
POST /v1/responsesvePOST /v1/responses/compactendpointleri. - Anthropic uyumlu
POST /v1/messagesendpointi. - Upstream tarafına iletilen Anthropic token counting
POST /v1/messages/count_tokensendpointi. - Provider API model listesine dayalı OpenAI uyumlu
GET /v1/modelsendpointi. - 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_urlblockları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_tokenile local proxy authentication. - Her zaman config'den okunan
cc_apiKeyile upstream CommandCode authentication.
- Go
1.26.4veya 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.
-
Node.js ve npm kurulu değilse kurun.
-
Command Code CLI yazılımını kurun:
npm i -g command-code@latest
-
Command Code CLI ile giriş yapın:
cmd login
-
Örnek config dosyasını kopyalayın:
git clone https://github.com/KilimcininKorOglu/CommandCodeBridge cd CommandCodeBridge/ cp data/config.example.json data/config.json -
~/.commandcode/auth.jsondosyasındakiapiKeydeğerinidata/config.jsoniçindekicc_apiKeyalanına yazın.data/config.jsondosyasını gizli tutun. -
data/config.jsoniçindekiproxy_tokendeğerini tahmin edilmesi zor bir local proxy token ile değiştirin. Clientlar proxy çağırırken bu tokenı kullanmalıdır. -
Sabit bir upstream project slug istiyorsanız
projectSlugdeğerini ayarlayın. Session-derived fake slug kullanmak için boş bırakın. -
Logları
data/logs/altında tutun:{ "logFile": "data/logs/proxy.log" } -
Docker Compose ile build edip başlatın:
docker compose up -d --build
-
Servisi doğrulayın:
curl http://127.0.0.1:3050/health
-
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.
Proxy binary dosyasını build edin:
go build -o bin/proxy ./cmd/proxyLocal olarak çalıştırın:
./bin/proxy -config data/config.jsonProxy 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. |
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.
| 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.
| 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.
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."}
]
}'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."}
]
}'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.
İ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 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>'Protocol conversion şunları destekler:
- OpenAI
image_urlcontent blockları. - Anthropic URL image source değerleri.
source.datavesource.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-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 -dKod değişikliklerinden sonra yeniden build edin:
docker compose up -d --buildHealth check:
curl http://127.0.0.1:3050/health| 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.
High-level request flow:
cmd/proxy/main.goconfig 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.internal/http/server.gochi router oluşturur ve CORS, request size limit, request timeout, logging ve authentication middleware ekler.internal/http/handlers.goendpoint 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.internal/protocolOpenAI, Anthropic ve CommandCode request/response conversion işlemlerinden sorumludur.internal/streamingupstream NDJSON stream eventlerini OpenAI SSE veya Anthropic SSE eventlerine dönüştürür ve stream idle timeout uygular.internal/clientupstream HTTP boundary katmanıdır. Chat requestlerini/alpha/generateyoluna forward eder, Provider API modellerini fetch eder, fingerprint ve lifecycle eventleri gönderir ve upstream headerları yönetir.internal/modelsProvider API model data değerlerini cache eder ve dynamic model fetching etkinse yeniler.internal/sessionAPI keyleri ve incoming session headerlarını expiry ve jitter içeren stable session ID değerlerine map eder.internal/fingerprintveinternal/configruntime environment data ve persisted fingerprint değerlerini oluşturur.pkg/versionCommand Code CLI version değerini yönetir ve npm registry üzerinden yeniler.
- Chat requestleri upstream
/alpha/generateyoluna forward edilir. - Upstream chat response değerleri non-streaming client requestleri için bile NDJSON stream olarak işlenir.
- Upstream
permissionModedeğeristandardolur. - OpenAI
max_tokenseksikse veya pozitif değilse varsayılan değer64000olur. - OpenAI
max_tokensdeğeri200000üstündeyse200000ile sınırlandırılır. - Boş
projectSlug, session-derived fake slug kullanır; configuredprojectSlugexplicit 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
429response döner.
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_apiKeyveyaproxy_tokendeğ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.
Yalnızca Araştırma