Gateway آیراکد

پروکسی Anthropic Messages که از داخل ایران کار می‌کنه.

Gateway آیراکد یک سرویس FastAPI سبک‌ست که داخل API آیراچت زندگی می‌کنه و درخواست‌های Anthropic Messages API رو با احراز هویت JWT دریافت، تبدیل به فراخوانی موتور inference (با endpoint سازگار Anthropic) می‌کنه، و پاسخ stream رو ۱:۱ به CLI برمی‌گردونه.

Endpoint‌ها

POST /v1/messages

Anthropic Messages API استاندارد، با همون شکل request/response. SDK رسمی @anthropic-ai/sdk اگه baseURL رو روی Gateway تنظیم کنی، بدون تغییر کار می‌کنه.

curl -X POST \
     -H "Authorization: Bearer $TOKEN" \
     -H "Content-Type: application/json" \
     -H "anthropic-version: 2023-06-01" \
     -d '{
       "model": "aira-balanced",
       "max_tokens": 1024,
       "messages": [{"role": "user", "content": "سلام، کی هستی؟"}]
     }' \
     https://app.airachat.ir/api/airacode/gateway/v1/messages

Streaming با SSE (همون event: content_block_delta که Anthropic می‌فرسته):

curl -N -X POST \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"model":"aira-fast","stream":true,"max_tokens":64,"messages":[{"role":"user","content":"یه ping بگو"}]}' \
     https://app.airachat.ir/api/airacode/gateway/v1/messages

GET /v1/models

لیست مدل‌های قابل انتخاب، شامل alias‌ها و passthroughs.

curl -H "Authorization: Bearer $TOKEN" \
     https://app.airachat.ir/api/airacode/gateway/v1/models

پاسخ نمونه:

{
  "models": [
    {"id": "aira-balanced", "model_id": "deepseek/deepseek-v4-flash", "type": "alias"},
    {"id": "aira-fast",     "model_id": "openai/gpt-oss-20b",          "type": "alias"},
    {"id": "aira-pro",      "model_id": "openai/gpt-oss-120b",         "type": "alias"},
    ...
    {"id": "anthropic/claude-sonnet-4-6", "model_id": "anthropic/claude-sonnet-4-6", "type": "passthrough"}
  ],
  "default": "deepseek/deepseek-v4-flash",
  "allow_any": false
}

POST /v1/messages/count_tokens

برای مدل‌های Anthropic، forward به provider اصلی می‌کنه و عدد دقیق برمی‌گردونه. برای بقیه، یک تخمین بر اساس character count.

حل اسم مدل

Gateway اسم مدل ارسالی توی body رو با این ترتیب حل می‌کنه:

  • اگه alias باشه (مثل aira-pro) → نگاشت به ID مدل.
  • اگه «claude-X» بدون پیشوند provider باشه → anthropic/claude-X پیشوند می‌گیره.
  • در غیر این صورت، علیه allowlist چک می‌شه. اگه نبود، 400 با error: model_not_allowed.
  • اگه AIRACODE_GW_ALLOW_ALL=1 روی سرور ست شده باشه، allowlist دور زده می‌شه (dev mode).

احراز هویت

همهٔ endpointها Authorization: Bearer <JWT> می‌خوان. توکن رو از OAuth flow یا دستی از داشبورد آیراچت (به‌عنوان AIRA_API_KEY) بگیر.

خطاها

  • 401 — توکن منقضی یا نامعتبر.
  • 400 model_not_allowed — مدل توی allowlist نیست. GET /v1/models رو ببین.
  • 502 — مشکل ارتباط با provider مدل (egress موقتاً down). معمولاً ۳۰ ثانیه بعد retry حل می‌شه.
  • 503 — Gateway کلید provider نداره (مشکل تنظیمات سرور).