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/messagesStreaming با 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/messagesGET /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 نداره (مشکل تنظیمات سرور).