177 KiB
API Reference (فارسی)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
🌐 زبانها: 🇺🇸 English | 🇪🇹 አማርኛ | 🇸🇦 العربية | 🇦🇿 Azərbaycan dili | 🇧🇬 Български | 🇧🇩 বাংলা | 🇧🇦 Bosanski | 🇨🇿 Čeština | 🇩🇰 Dansk | 🇩🇪 Deutsch | 🇬🇷 Ελληνικά | 🇪🇸 Español | 🇪🇪 Eesti | 🇮🇷 فارسی | 🇫🇮 Suomi | 🇫🇷 Français | 🇮🇪 Gaeilge | 🇮🇳 ગુજરાતી | 🇳🇬 Hausa | 🇮🇱 עברית | 🇮🇳 हिन्दी | 🇭🇷 Hrvatski | 🇭🇺 Magyar | 🇦🇲 Հայերեն | 🇮🇩 Bahasa Indonesia | 🇳🇬 Igbo | 🇮🇹 Italiano | 🇯🇵 日本語 | 🇬🇪 ქართული | 🇰🇭 ខ្មែរ | 🇮🇳 ಕನ್ನಡ | 🇰🇷 한국어 | 🇱🇹 Lietuvių | 🇱🇻 Latviešu | 🇮🇳 മലയാളം | 🇮🇳 मराठी | 🇲🇾 Bahasa Melayu | 🇲🇹 Malti | 🇲🇲 မြန်မာ | 🇳🇵 नेपाली | 🇳🇱 Nederlands | 🇳🇴 Norsk | 🇮🇳 ଓଡ଼ିଆ | 🇮🇳 ਪੰਜਾਬੀ | 🇵🇭 Filipino | 🇵🇱 Polski | 🇵🇹 Português (Portugal) | 🇧🇷 Português (Brasil) | 🇷🇴 Română | 🇷🇺 Русский | 🇱🇰 සිංහල | 🇸🇰 Slovenčina | 🇸🇮 Slovenščina | 🇷🇸 Српски | 🇸🇪 Svenska | 🇰🇪 Kiswahili | 🇮🇳 தமிழ் | 🇮🇳 తెలుగు | 🇹🇭 ไทย | 🇹🇷 Türkçe | 🇺🇦 Українська | 🇵🇰 اردو | 🇺🇿 Oʻzbekcha | 🇻🇳 Tiếng Việt | 🇳🇬 Yorùbá | 🇨🇳 中文 (简体) | 🇹🇼 中文 (繁體)
مرجع اصلی API مربوط به OmniRoute. این مرجع سطح عمومی /v1 و پرکاربردترین نقاط پایانی مدیریتی را پوشش میدهد؛ فایل ماشینخوان docs/openapi.yaml و درخت مسیر زیر src/app/api/ منابع جامع هستند.
برای پروتکل متمرکز سازگار با OpenAI و ماتریس قابلیتهای ارائهدهندگان، به
OPENAI_COMPATIBILITY.md مراجعه کنید.
فهرست مطالب
- تکمیل چت
- اجارههای انحصاری نشست مدیریتشده
- تعبیهها
- تولید تصویر
- OCR سند
- لیست مدلها
- مانیفست افزونه ارائهدهنده
- نقاط پایانی سازگاری
- API فایلها
- API دستهها
- API جستجو
- استریمینگ WebSocket
- گزارشدهی سهمیهها و مشکلات
- کش معنایی
- داشبورد و مدیریت
- مدیریت ترکیبی
- وبهوکها
- کلیدهای ثبتشده (مدیریت خودکار)
- پروتکل عاملها
- پراکسیهای مدیریت
- تابآوری (توسعهیافته)
- مهارتها
- حافظه
- سرور MCP
- سرور A2A
- ابر، ارزیابیها و سنجش
- پردازش درخواست
- احراز هویت
تکمیل چت
POST /v1/chat/completions
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "cc/claude-opus-4-6",
"messages": [
{"role": "user", "content": "Write a function to..."}
],
"stream": true
}
هدرهای سفارشی
| هدر | جهت | توضیحات |
|---|---|---|
X-OmniRoute-No-Cache |
درخواست | برای دور زدن کش، روی true تنظیم شود |
x-omniroute-no-memory |
درخواست | برای این درخواست، تزریق حافظه + مهارتها را نادیده میگیرد (مشابه no-cache؛ از سربار توکن/هزینه به ازای هر فراخوانی جلوگیری میکند) |
X-OmniRoute-Progress |
درخواست | برای رویدادهای پیشرفت، روی true تنظیم شود |
X-Session-Id |
درخواست | کلید نشست چسبنده برای وابستگی نشست خارجی |
x_session_id |
درخواست | نوع آندرسکور نیز پذیرفته میشود (HTTP مستقیم) |
X-OmniRoute-Session-Id |
درخواست | برچسب نشست/مکالمه ارائهشده توسط تماسگیرنده (همچنین حافظه را تغذیه میکند). در صورت وجود، به صورت کلمهبهکلمه در call_logs.session_tag برای تخصیص هزینه به ازای هر نشست (8249#) ذخیره میشود — هرگز در صورت عدم وجود، سنتز نمیشود |
Idempotency-Key |
درخواست | کلید حذف تکرار (پنجره 5 ثانیه) |
X-Request-Id |
درخواست | کلید جایگزین حذف تکرار |
X-OmniRoute-Cache |
پاسخ | HIT یا MISS (غیر استریمینگ) |
X-OmniRoute-Idempotent |
پاسخ | true اگر تکرار حذف شده باشد |
X-OmniRoute-Progress |
پاسخ | enabled اگر ردیابی پیشرفت فعال باشد |
X-OmniRoute-Session-Id |
پاسخ | شناسه نشست مؤثر مورد استفاده OmniRoute |
X-OmniRoute-Request-Id |
پاسخ | شناسه همبستگی درخواست (در صورت معلوم بودن) |
X-OmniRoute-Version |
پاسخ | نسخه ساخت OmniRoute (همیشه موجود است) |
X-OmniRoute-Cost-Saved |
پاسخ | دلار آمریکا که کش در یک HIT از آن جلوگیری کرده است (فقط در صورت HIT کش) |
X-OmniRoute-Decision |
پاسخ | ردیابی مسیریابی: strategy=<name>; provider=<alias>; latency_ms=<n> (<name> استراتژی ترکیبی است، یا single برای یک درخواست غیر ترکیبی) — همیشه در پاسخهای تکمیل موجود است |
نکته Nginx: اگر به هدرهای آندرسکور (به عنوان مثال
x_session_id) تکیه میکنید،underscores_in_headers on;را فعال کنید.
هدرهای تلهمتری هزینه: پاسخهای موفق غیرجریانی نیز مجموعه تلهمتری هزینه
X-OmniRoute-*را حمل میکنند —X-OmniRoute-Response-Cost(دلار آمریکا، ثابت ۱۰ رقم اعشار؛0.0000000000برای رایگان/بدون قیمتگذاری)،X-OmniRoute-Tokens-In/X-OmniRoute-Tokens-Out،X-OmniRoute-Model،X-OmniRoute-Provider،X-OmniRoute-Latency-Ms،X-OmniRoute-Cache-Hit، وX-OmniRoute-Fallback-Attempts(فقط زمانی که > 0)، به علاوهX-OmniRoute-Request-IdوX-OmniRoute-Version. اینها توسط تکمیل چت،/v1/responses،/v1/messages، و نقاط پایانی رسانه —/v1/embeddings،/v1/images/generations،/v1/audio/speech،/v1/audio/transcriptions،/v1/rerank،/v1/videos/generations،/v1/music/generations، و/v1/moderations(همیشه هزینه0) منتشر میشوند. هزینه رسانه بر اساس هر حالت (به ازای هر تصویر، به ازای هر ثانیه، به ازای هر کاراکتر، به ازای هر واحد جستجو) محاسبه میشود، در صورتی که قیمتگذاری موجود باشد، در غیر این صورت0(fail-open).
معناشناسی هزینه Cache-hit: در یک HIT کش معنایی (
X-OmniRoute-Cache-Hit: true) هیچ فراخوانی بالادستی انجام نمیشود، بنابراینX-OmniRoute-Response-Costبرابر با0.0000000000است (هزینه افزایشی ارائه hit). هزینه اصلی/که میتوانست باشد به طور جداگانه درX-OmniRoute-Cost-Savedگزارش میشود. مصرفکنندگان صورتحساب بایدX-OmniRoute-Response-Costرا جمع کنند (hitها هزینهای ندارند)؛ تحلیلگران کش میتوانندX-OmniRoute-Cost-Savedرا تجمیع کنند.
اجارههای انحصاری نشست مدیریتشده
اجاره انحصاری نشست مدیریتشده یک قرارداد مسیریابی اختیاری و مستقل از کلاینت است: یک مالک فعال یک اتصال OmniRoute واجد شرایط را در اختیار دارد. این قرارداد یک مدل را اجاره نمیدهد، به OAuth نیاز ندارد، یک کلاینت خاص را شناسایی نمیکند، یا به یک ارائهدهنده خاص نیاز ندارد.
کلید API احراز هویت باید دارای دامنه lease:exclusive و یک لیست allowedConnections صریح و غیرخالی باشد.
مرز تغییر پایگاه داده هر دو فیلد را هنگام ایجاد کلید و بهروزرسانیهای جزئی با هم اعمال میکند.
POST /api/v1/session-leases
Authorization: Bearer <managed-api-key>
Content-Type: application/json
X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters>
{"action":"acquire","model":"glm/glm-4.6"}
پاسخهای موفقیتآمیز برای کسب، تمدید و آزادسازی، مهرهای زمانی، state و generation مثبت دقیق را
نمایش میدهند، اما هرگز اتصال یا اعتبارنامه انتخابشده را نمایش نمیدهند. تمدید و آزادسازی
generation را در بدنه JSON ارائه میدهند:
{ "action": "renew", "generation": 1 }
{ "action": "release", "generation": 1, "reason": "OWNER_EXIT" }
یک مالک اجاره فعال میتواند به صراحت متادیتای نمایش ایمن حریم خصوصی را برای اتصال فعلی خود درخواست کند:
{ "action": "status", "generation": 1 }
{
"state": "ACTIVE",
"generation": 1,
"acquiredAt": "2026-08-28T12:00:00.000Z",
"renewedAt": "2026-08-28T12:00:30.000Z",
"expiresAt": "2026-08-28T12:02:30.000Z",
"connection": {
"displayName": "Primary Codex",
"provider": "codex"
}
}
این عمل وضعیت اختیاری توسط مالک مبهم، کلید API مدیریتشده احراز هویتشده، و generation فعال دقیق
در یک تراکنش پایگاه داده محافظت میشود. displayName فقط نام اتصال پیکربندیشده و کوتاه شده است؛
اگر نام پیکربندیشده ایمنی وجود نداشته باشد، null است. OmniRoute هرگز یک ایمیل یا هویت حساب تولیدشده را جایگزین نمیکند.
مقدار ارائهدهنده یک برچسب نمایش غیرحساس است و هرگز یک شناسه ارائهدهنده سازگار تولیدشده نیست.
اعتبارنامهها، توکنها، کوکیها، شناسههای اتصال خام یا کلید API، هشهای مالک، اسرار محافظت،
و دادههای مسیریابی داخلی حذف میشوند.
جستجوهای کلید اشتباه، مالک اشتباه، generation منقضیشده، گمشده، منقضیشده، آزادشده و نامعتبر
همگی همان خطای 409 LEASE_FENCE_STALE را بدون متادیتای اتصال برمیگردانند.
یک کلاینت که پاسخ انتظار ظرفیت را دریافت کرده است، هیچ اتصال فعالی برای بررسی ندارد.
هنگامی که مسیریابی یک اجاره فعال را تغییر میدهد، همان generation معتبر باقی میماند و وضعیت
به صورت اتمی اتصال جدید را برمیگرداند، هرگز اتصال قدیمی را برنمیگرداند.
کلاینتهای موجود بدون تغییر باقی میمانند زیرا پاسخهای کسب، تمدید، آزادسازی و انتظار
شکلهای قبلی خود را حفظ میکنند.
این قرارداد سرور، /status استاندارد OpenAI Codex را تغییر نمیدهد. Codex استاندارد در حال حاضر
ارائهدهنده مدل و وضعیت احراز هویت/حساب داخلی خود را گزارش میدهد اما متادیتای حساب ارائهدهنده سفارشی
دلخواه را نمایش نمیدهد؛ یک ادغام کلاینت بعدی باید این عمل را فراخوانی کند و تصمیم بگیرد که چگونه
connection.displayName را نمایش دهد.
سپس هر درخواست استنتاج مدیریتشده هر دو هدر کنترل را ارائه میدهد:
X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters>
X-OmniRoute-Lease-Generation: 1
مالک دقیق، generation، اتصال فعال و کلید API احراز هویتشده بلافاصله قبل از هر تلاش پشتیبانیشده بالادستی محافظت میشوند. تکرار مالک و generation با کلید دیگر حتی زمانی که آن کلید همان اتصال را مجاز میداند، با شکست مواجه میشود. مالکان خام پایدار نمیشوند، ثبت نمیشوند، در snapshot درخواست نگهداری نمیشوند، یا به بالادست ارسال نمیشوند.
رقابت موقت HTTP 429 را با Retry-After و:
{
"state": "WAITING_FOR_CAPACITY",
"error": { "type": "lease_error", "code": "LEASE_CAPACITY_UNAVAILABLE" },
"reason": "NO_FREE_ELIGIBLE_CONNECTION",
"retryAfter": 30
}
این پاسخ فقط به این معنی است که مجموعه واجد شرایط عادی غیرخالی بوده و هر کاندیدای آزاد توسط یک اجاره فعال خارجی نگهداری میشده است. مدلها/ارائهدهندگان پشتیبانینشده، عدم تطابق سیاست، دوره خنکسازی، سهمیه، سلامت و سایر خطاهای عادی واجد شرایط بودن، پاسخهای موجود OmniRoute خود را حفظ میکنند.
x-omniroute-compression
بازنویسی فشردهسازی برای هر درخواست. بالاترین اولویت — بر بازنویسی ترکیب مسیریابی، پروفایل فعال، فعالسازی خودکار و پیشفرض پنل غلبه میکند. مقادیر:
| مقدار | اثر |
|---|---|
off |
عدم فشردهسازی برای این درخواست. |
default |
پروفایل پیشفرض مشتقشده از پنل (پروفایل فعال را نادیده میگیرد). موتورهای از دستدهنده خاموش میمانند. |
safe |
فقط حذف تکرار و تاشو فضای خالی. |
allow-lossy |
طرح اپراتور را برای این درخواست حفظ میکند، شامل خلاصهها و بازنویسیهای سبک. |
engine:<id> |
یک موتور واحد در صورت فعال بودن، مثلاً engine:rtk. فعالسازی اختیاری برای آن موتور در هر درخواست. |
<combo> |
یک ترکیب نامگذاری شده، ابتدا بر اساس نام (بدون حساسیت به حروف کوچک و بزرگ) و سپس بر اساس شناسه مطابقت داده میشود. |
نکات:
- مقادیر ناشناخته نادیده گرفته میشوند (درخواست هرگز رد نمیشود)؛ وضوح به اولویت عادی اپراتور میرسد.
- اگر چندین ترکیب نام مشترکی دارند، برای تطابق قطعی، شناسه ترکیب را ارسال کنید.
- ترکیبی که نام آن
offیاdefaultاست نمیتواند با نام انتخاب شود (این کلمات کلیدی ابتدا تفسیر میشوند)؛ چنین ترکیبی را با شناسه آن ارجاع دهید. - سوئیچ اصلی فشردهسازی یک دروازه سخت است: وقتی فشردهسازی به صورت جهانی غیرفعال است، این هدر نمیتواند آن را فعال کند.
طرح اعمالشده در هدر پاسخ بازتاب داده میشود:
X-OmniRoute-Compression: <mode>; source=<source>
که در آن <source> یکی از request-header, routing-override, active-profile, auto-trigger, default, یا off است.
تعبیهها
POST /v1/embeddings
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "nebius/Qwen/Qwen3-Embedding-8B",
"input": "The food was delicious"
}
ارائهدهندگان موجود: Nebius، OpenAI، Mistral، Together AI، Fireworks، NVIDIA، OpenRouter، Jina AI.
شناسههای کاتالوگ بهشکل provider/model هستند (مثال: jina-ai/jina-embeddings-v5-omni-small). شناسههای مدل Jina بدون پیشوند که در رجیستری وجود دارند (برای مثال jina-embeddings-v5-text-small و jina-reranker-v3.5) نیز شناسایی میشوند. عملیات embed/rerank/classify/segment در Jina ابتدا از اطلاعات احراز هویت jina-ai در داشبورد استفاده میکنند؛ JINA_AI_API_KEY فقط زمانی بهعنوان گزینهٔ جایگزین استفاده میشود که هیچ کلیدی در داشبورد وجود نداشته باشد. کارت jina-reader فقط برای Reader / r.jina.ai است (POST /v1/web/fetch) و هرگز تعبیه یا رتبهبندی مجدد ارائه نمیکند.
مدلهای رجیستری که پشتیبانی چندوجهی را اعلام میکنند، حداکثر ۳۲ آیتم ساختاریافته و مستقل از ارائهدهنده را نیز میپذیرند.
انواع آیتم رسانهای عبارتاند از text، image، audio، video و document. مقدار source
برای رسانه یا {"type":"url","url":"https://..."} است یا
{"type":"base64","data":"...","media_type":"..."}.
Jina v5 Omni (jina-ai/jina-embeddings-v5-omni-small، jina-ai/jina-embeddings-v5-omni-nano،
و نام مستعار خانوادهٔ jina-ai/jina-embeddings-v5-omni → omni-small) همچنین مستندات بومی
EmbeddingsV5Request متعلق به Jina را میپذیرد و آنها را بدون تغییر ارسال میکند به https://api.jina.ai/v1/embeddings:
{
"model": "jina-ai/jina-embeddings-v5-omni-small",
"task": "retrieval.query",
"normalized": true,
"input": [
{ "text": "a red bicycle" },
{ "image": "https://example.com/bike.png" },
{
"content": [{ "text": "caption" }, { "image": "data:image/png;base64,..." }]
}
]
}
مقادیر بومی { image | audio | video | pdf } میتوانند یک URL عمومی HTTPS، یک URI از نوع data: یا
base64 خام باشند. OmniRoute این اشیا را به رشته تبدیل نمیکند و URLهای بومی تصویر را واکشی نمیکند — خود Jina
رسانهٔ عمومی را دریافت میکند. فیلدهای اضافی Jina (task، normalized، truncate، embedding_type)
ارسال میشوند. SKUهای فقطمتنی Jina همچنان اسناد غیرمتنی را رد میکنند.
محدودیتهای امنیتی و انتقال:
- URLهای رسانهای راهدور باید عمومی و مبتنی بر HTTPS باشند. آیتمهای استاندارد
{type,source:url}در سمت سرور واکشی میشوند (اعتبارسنجی مجدد تغییر مسیر، مهلت زمانی، محدودیت اندازه، DNS عمومی و پینکردن اتصال) و پیش از فراخوانی ارائهدهنده بهصورت درونخطی درج میشوند. آیتمهای بومی Jina بهشکل{image:"https://..."}پس از همان بررسی عمومیبودن HTTPS بدون تغییر ارسال میشوند؛ Jina آن URL را واکشی میکند. - رسانهٔ base64 درونخطی پس از رمزگشایی به ۸ MiB برای هر آیتم و در مجموع به ۱۶ MiB در کل درخواست محدود است.
تبدیل ویژهٔ ارائهدهنده (آیتمهای استاندارد هرگز بدون تغییر ارسال نمیشوند):
- مدلهای چندوجهی Jina: هر آیتم سطحبالا به یک شیء با کلید مربوط به وجه
(
text/image/audio/video/pdf) تبدیل میشود؛ برای رسانههای درونخطی از URIهای داده استفاده میشود؛ برای هر آیتم سطحبالا یک بردار تولید میشود. - خانوادهٔ Gemini Embedding 2: یک آرایهٔ سطحبالا به یک درخواست بومی
models/{model}:embedContentباcontent.parts(textیاinline_data) تبدیل میشود. - llama.cpp (
llama-cpp/<model>، هر مدلی که سرور محلی بارگذاری کرده است): آیتمهای استانداردtextبه رشتههای ساده تبدیل میشوند وimage/audio/videoهرکدام به یک شیء{"content": [part]}تبدیل میشوند؛ در این حالت از بخشهای محتوای چت llama-server (image_url،input_audioبا قالبwav/mp3/flac، وinput_video) همراه با دادهٔ درونخطی استفاده میشود؛ برای هر آیتم سطحبالا یک بردار تولید میشود. سرور باید با--embedding --mmproj …اجرا شود؛ بدون پروژکتور، خود سرور رسانه را رد میکند.documentپشتیبانی نمیشود. - مدلهای ناشناخته/پویا که فرادادهٔ صریح وجهها را ندارند، ورودی ساختاریافته را با HTTP 400 رد میکنند.
{
"model": "jina-ai/jina-embeddings-v5-omni-small",
"input": [
{ "type": "text", "text": "A red bicycle" },
{
"type": "image",
"source": { "type": "url", "url": "https://example.com/bicycle.png" }
}
],
"dimensions": 512,
"encoding_format": "float"
}
ترکیبهای پشتیبانینشدهٔ مدل/وجه، بهجای تبدیل اجباری آیتم، HTTP 400 برمیگردانند. فیلدهای توسعهای غیرورودی در درخواستهای قدیمی رشتهای/توکنی همچنان بدون تغییر عبور داده میشوند.
# فهرست همهٔ مدلهای تعبیه
GET /v1/embeddings
تولید تصویر
POST /v1/images/generations
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "openai/gpt-image-2",
"prompt": "غروب زیبای خورشید بر فراز کوهها",
"size": "1024x1024"
}
ارائهدهندگان موجود شامل OpenAI (GPT Image 2)، xAI (Grok Image)، Together AI (FLUX)، Fireworks AI، Nebius (FLUX)، Hyperbolic، NanoBanana، OpenRouter، ZenMux، SD WebUI (محلی) و ComfyUI (محلی) هستند.
ZenMux از اتصال موجودِ کلید API دوباره استفاده میکند و پیشوندهای zenmux/ یا zm/ را میپذیرد:
zenmux/openai/gpt-image-2از API تصاویر OpenAI در ZenMux استفاده میکند. گزینهها شاملsize،quality،n،output_format،output_compression،backgroundوresponse_formatهستند.- ناشران دیگر، مانند
zm/meta/muse-image-1.0، از نقطه پایانی:predictدر Vertex AI متعلق به ZenMux استفاده میکنند.nبهsampleCount،aspect_ratioبهaspectRatioوimage_size(1K،2K،4K) بهsampleImageSizeنگاشت میشود. یکsizeپیکسلی فقط نسبت ابعاد را تعیین میکند، نه ابعاد پیکسلی تضمینشده را. نسبتها، وضوحها و تعدادهای پشتیبانیشده بسته به مدل متفاوتاند. zm/inclusionai/ming-image-0.1-designابعاد خود را انتخاب میکند.size،aspect_ratioوimage_sizeرا حذف کنید؛ مقادیر صریح خطای HTTP 400 برمیگردانند. میتوان PNG، JPEG و WebP را باoutput_formatدرخواست کرد.
این یکپارچهسازی از تولید تصویر از متن پشتیبانی میکند، نه ویرایش تصویر مرجع. خروجی Vertex
به data[].b64_json نرمالسازی میشود؛ response_format: "url" یک URL بالادستی
HTTPS یا، هنگامی که فقط بایتهای تصویر در دسترس باشند، یک URL دادهٔ base64 برمیگرداند. خروجیهای خالی/فیلترشده
بهجای موفقیت خالی، خطا برمیگردانند. دسترسی به مدل به حساب ZenMux بستگی دارد.
به API مربوط به Vertex در ZenMux و
API تصاویر OpenAI مراجعه کنید.
# فهرستکردن همه مدلهای تصویر
GET /v1/images/generations
تشخیص متن اسناد (OCR)
POST /v1/ocr
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "mistral/mistral-ocr-latest",
"document": {
"type": "document_url",
"document_url": "https://example.com/invoice.pdf"
}
}
model ارائهدهنده OCR را از طریق پیشوند provider/model انتخاب میکند؛ یک شناسه مدل خالی (مانند
mistral-ocr-latest) به ارائهدهنده ثبتشده خود ارجاع داده میشود، و در صورت حذف model، به طور پیشفرض
Mistral (mistral-ocr-latest) انتخاب میشود. ارائهدهندگان ثبتشده (open-sse/config/ocrRegistry.ts):
| شناسه ارائهدهنده | شناسه مدل | مقدار model |
توضیحات |
|---|---|---|---|
mistral |
mistral-ocr-latest |
mistral/mistral-ocr-latest (یا mistral-ocr-latest خالی) |
همگام — پاسخ مستقیماً از یک فراخوانی بالادستی واحد بازگردانده میشود. |
azure-document-intelligence |
prebuilt-read |
azure-document-intelligence/prebuilt-read |
بالادستی ناهمگام (analyze + نظرسنجی) — به پایین مراجعه کنید. |
vertex-deepseek-ocr |
deepseek-ocr-maas |
vertex-deepseek-ocr/deepseek-ocr-maas |
همگام، از طریق نقطه پایانی شریک openapi/chat/completions در Vertex AI — برای احراز هویت/URL به پایین مراجعه کنید. |
هر سه ارائهدهنده در همان بدنه با فرمت Mistral پاسخ میدهند:
{
"pages": [{ "index": 0, "markdown": "# Extracted text..." }],
"model": "mistral-ocr-latest",
"usage_info": { "pages_processed": 1 }
}
جریان نظرسنجی Azure Document Intelligence
API analyze در Azure Document Intelligence ناهمگام است: درخواست اولیه به جای بدنه، یک هدر
Operation-Location برمیگرداند و نتیجه باید نظرسنجی شود. هندلر
(open-sse/handlers/ocr.ts) هر ثانیه تا 30 بار آن URL را نظرسنجی میکند، در صورت دریافت پاسخ
نظرسنجی غیر-ok یا وضعیت "failed" به سرعت شکست میخورد (نظرسنجی را ادامه نمیدهد)، و اگر
عملیات پس از اتمام بودجه تلاش هنوز در حال اجرا باشد، 504 را برمیگرداند. پاسخ نهایی Azure به
همان شکل pages/markdown که توسط Mistral استفاده میشود، نرمالسازی شده و سپس به فراخواننده
بازگردانده میشود، بنابراین کد کلاینت نیازی به رسیدگی ویژه به ارائهدهنده ندارد.
احراز هویت و حل نقطه پایانی Vertex AI DeepSeek OCR
vertex-deepseek-ocr از همان احراز هویت Vertex AI که OmniRoute قبلاً برای ترافیک چت/تصویر پشتیبانی میکند
(open-sse/executors/vertex.ts) استفاده مجدد میکند: کلید API اتصال یا یک اعتبارنامه JSON حساب سرویس
(که از طریق جریان JWT-bearer با یک توکن دسترسی OAuth کوتاهمدت مبادله میشود) یا یک توکن دسترسی OAuth
از قبل صادر شده است که به همان شکل استفاده میشود. URL نقطه پایانی بالادستی، نقطه پایانی شریک عمومی
openapi/chat/completions در Vertex است که از پروژه و منطقه اتصال ساخته شده است — یک
providerSpecificData.project/providerSpecificData.region صریح همیشه اولویت دارد؛ در غیر این صورت
پروژه از project_id JSON حساب سرویس استخراج میشود و منطقه به طور پیشفرض us-central1 است. هر دو
حل و فصل در open-sse/handlers/ocr.ts (resolveVertexOcrAccessToken, resolveVertexOcrBaseUrl)
اتفاق میافتند که توسط src/app/api/v1/ocr/route.ts قبل از ارسال به handleOcr مصرف میشوند.
فهرست مدلها
GET /v1/models
Authorization: Bearer your-api-key
→ همه مدلهای چت، تعبیهسازی و تصویر + ترکیبها را با قالب OpenAI برمیگرداند
پیشوندهای شناسه مدل (?prefix=)
بیشتر مدلها با یک پیشوند ارائهدهنده معرفی میشوند. پیشوندی که دریافت میکنید توسط
پرچم قابلیت MODELS_CATALOG_PREFIX_MODE کنترل میشود و میتوان آن را با یک پارامتر
پرسوجو برای هر درخواست بازنویسی کرد — این برای کلاینتی مفید است که بدون تغییر تنظیم
سراسری سرور برای دیگران، فهرستی مرتب میخواهد:
GET /v1/models?prefix=alias # یک شناسه برای هر مدل — پیشوند کوتاه نام مستعار
GET /v1/models?prefix=dual # هر دو شکل (پیشفرض سرور)
GET /v1/models?prefix=canonical # فقط پیشوند کامل شناسه ارائهدهنده
| حالت | خروجی | توضیحات |
|---|---|---|
dual |
cc/claude-sonnet-4-6 و claude/claude-sonnet-4-6 |
پیشفرض. هر دو شناسه به یک مدل هدایت میشوند؛ این حالت حفظ شده تا پیکربندیهای کلاینتی که یکی از این دو شکل را بهصورت ثابت تعریف کردهاند همچنان کار کنند. اندازه کاتالوگ را تقریباً دو برابر میکند. |
alias |
cc/claude-sonnet-4-6 |
یک ورودی برای هر مدل. ارائهدهندگانی که نام مستعار متمایزی ندارند همچنان ورودی خود را ارائه میکنند، بنابراین چیزی از دست نمیرود. |
canonical |
claude/claude-sonnet-4-6 |
یک ورودی برای هر مدل تحت پیشوند کامل شناسه ارائهدهنده. ارائهدهندگانی که نام مستعار متمایزی ندارند (برای مثال antigravity/…، agy/…) نیز شناسه واحد خود را در اینجا ارائه میکنند، بنابراین چیزی از دست نمیرود. |
یک نمونه آینهای در حالت dual را میتوان بدون پارامتر پرسوجو نیز تشخیص داد: این نمونه دارای یک فیلد parent
است که به شناسه اصلی اشاره میکند.
کلاینتهایی که انتخابگر مدل را نمایش میدهند باید ?prefix=alias را درخواست کنند — این همان کاری است که
افزونه OmniCopilot برای VS Code انجام میدهد.
مدلهای چت پنهانشده بهصورت مجزا
مدلی که در صفحه ارائهدهنده خود با عنوان پنهان علامتگذاری شده باشد، از کاتالوگ حذف میشود و در صورت
درخواست صریح، با HTTP 404 / model_not_found رد میشود. این بررسی از ارائهدهنده و مدل نهاییشده
استفاده میکند و نامهای مستعار ارائهدهنده، پیشوندهای گره ارائهدهنده سازگار و پیشفرضهای
اتصال را نیز در نظر میگیرد. یک ترکیب، مقصدهای پنهان را نادیده میگیرد و میتواند از یک مدل همخانواده قابلمشاهده استفاده کند؛ وقتی هیچ
مقصد قابلاجرایی باقی نماند، همان کد خطا را برمیگرداند. لغو حالت پنهان از درخواست بعدی
اعمال میشود. بازنویسیهای قابلیت مشاهده مختص تصویر، مدل چت با همان شناسه را پنهان نمیکنند.
این تنظیم مجزای مدل از
فهرستهای مجاز/غیرمجاز نمایش مدل مستقل است؛ آن فهرستها نمایش در کاتالوگ
و نامزدهای مسیریابی خودکار را فیلتر میکنند، در حالی که ارسال صریح را حفظ میکنند. مجوزهای مدل
برای کلید API نیز همچنان بهطور مستقل اعمال میشوند. حالت پیشفرض پیشوند کاتالوگ همچنان dual است.
گونههای بدون تفکر مدل
برای مدلهای Claude دارای قابلیت تفکر، /v1/models یک گونه بدون تفکر را نیز معرفی میکند که شناسه آن با claude-3-omniroute-no-thinking/ آغاز میشود:
claude-3-omniroute-no-thinking/<provider>/<model>
انتخاب این شناسه (برای مثال در پیکربندی Claude Code که همیشه یک بلوک thinking اضافه میکند) دوباره به <provider>/<model> واقعی نگاشت میشود، در حالی که استدلال غیرفعال شده است — thinking:{type:"disabled"} در مسیر /v1/messages، یا حذف فیلدهای reasoning/reasoning_effort در مسیر /v1/chat/completions. این گونه فقط برای مدلهای خانواده Claude فهرست میشود که از تفکر پشتیبانی میکنند و مقدار disabled را میپذیرند (بنابراین، برای مثال، مدلهای صرفاً تطبیقی که disabled را رد میکنند، مستثنا میشوند). اپراتورها میتوانند این گونه را برای هر مدل از طریق ModelSpec.noThinkingAlias بهاجبار فعال یا غیرفعال کنند.
مانیفست پلاگین ارائهدهنده
GET /api/v1/provider-plugin-manifest
مانیفست پلاگین ارائهدهنده ایمن JSON را که توسط Bifrost، CLIProxyAPI و روترهای سایدکار آینده استفاده میشود، برمیگرداند. پاسخ از رجیستری ارائهدهنده TypeScript تولید میشود و عمداً اسرار کلاینت OAuth، حل و فصل محیط زمان اجرا، توابع اجرایی، هدرهای درخواست و دادههای حساب را مستثنی میکند.
هنگامی که یک سایدکار خارج از فرآیند اجرا میشود و نمیتواند open-sse/config/providerPluginManifestRegistry.ts را مستقیماً وارد کند، از این نقطه پایانی استفاده کنید.
نقاط پایانی سازگاری
| متد | مسیر | قالب |
|---|---|---|
| POST | /v1/chat/completions |
OpenAI |
| POST | /v1/messages |
Anthropic |
| POST | /v1/responses |
OpenAI Responses |
| POST | /v1/embeddings |
OpenAI |
| POST | /v1/images/generations |
OpenAI Images |
| POST | /v1/images/edits |
OpenAI Images (ویرایش/ترمیم) |
| POST | /v1/videos/generations |
تولید ویدئو به سبک OpenAI |
| POST | /v1/music/generations |
تولید موسیقی به سبک OpenAI |
| POST | /v1/audio/transcriptions |
OpenAI Audio (تبدیل گفتار به متن) |
| POST | /v1/audio/speech |
OpenAI TTS (بدنهٔ صوتی را برمیگرداند) |
| POST | /v1/rerank |
بازرتبهبندی به سبک Cohere/Voyage |
| POST | /v1/classify |
دستهبندی Jina (api.jina.ai) |
| POST | /v1/segment |
قطعهبند Jina (segment.jina.ai) |
| POST | /v1/moderations |
تعدیل محتوای OpenAI |
| GET | /v1/models |
OpenAI |
| POST | /v1/messages/count_tokens |
Anthropic |
| GET | /v1beta/models |
Gemini |
| POST | /v1beta/models/{...path} |
Gemini generateContent |
| POST | /v1/api/chat |
Ollama |
| GET | /api/v1/vscode/{token}/ |
نام مستعار کاتالوگ OpenAI |
| GET | /api/v1/vscode/{token}/models |
نام مستعار مدلهای OpenAI |
| POST | /api/v1/vscode/{token}/chat/completions |
نام مستعار توکندار OpenAI |
| POST | /api/v1/vscode/{token}/responses |
نام مستعار توکندار OpenAI Responses |
| POST | /api/v1/vscode/{token}/api/chat |
نام مستعار توکندار Ollama |
| GET | /api/v1/vscode/{token}/api/tags |
نام مستعار توکندار برچسبهای Ollama |
همهٔ مسیرهای POST از ساختار یکسانی پیروی میکنند: Bearer your-api-key بههمراه بدنهٔ JSON اعتبارسنجیشده با Zod (v1RerankSchema، v1ModerationSchema، v1AudioSpeechSchema و غیره؛ به src/shared/validation/schemas.ts مراجعه کنید). در صورت شکست اعتبارسنجی طرحواره، 4xx برگردانده میشود.
برای کلاینتهایی که نمیتوانند Authorization: Bearer ... را پیوست کنند، OmniRoute همچنین کلیدهای API را در URL، یا از طریق سازگاری رشتهٔ پرسوجو (?token=...، ?apiKey=...، ?api_key=...، ?key=...) یا از طریق نقاط پایانی اختصاصی /api/v1/vscode/{token}/... که در ادامه مستند شدهاند، میپذیرد.
# بازرتبهبندی (ارائهدهندهٔ رجیستری ابری، یا یک گرهٔ ارائهدهندهٔ سازگار با OpenAI بهصورت "<prefix>/<model>")
POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] }
# دستهبندی Jina (اعتبارنامههای Foundation API)
POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] }
# قطعهبند Jina
POST /v1/segment { "content": "...", "return_chunks": true }
# جستوجوی Jina (s.jina.ai؛ نامهای مستعار ارائهدهنده: jina-search، jina-ai، jina)
POST /v1/search { "query": "...", "provider": "jina-search" }
# تعدیل محتوا
POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." }
# TTS — بدنهٔ audio/mpeg (یا قالب درخواستی) را برمیگرداند
POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" }
# TTS در Soniox به یک زبان و یک صدا نیاز دارد: مقدار پیشفرض `language` برابر "en" است؛ صدای
# مشخصنشده یا نام یکی از صداهای استاندارد OpenAI (alloy، nova، …) به "Adrian" تبدیل میشود
POST /v1/audio/speech { "model": "soniox/tts-rt-v1", "input": "Xin chào", "voice": "Adrian", "language": "vi" }
# ویرایش تصویر (multipart)
POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png
# تولید ویدئو / موسیقی (شناسهٔ مدل با پیشوند ارائهدهنده)
POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." }
POST /v1/music/generations { "model": "kie/suno-v4.0", "prompt": "..." }
گرههای ارائهدهندهٔ بازرتبهبندی: مسیر
POST /v1/rerankهمچنین درخواستها را به گرههای ارائهدهندهٔ سازگار با OpenAI (oMLX، vLLM، Infinity، TEI پشت یک دروازه و …) که بهصورت<node-prefix>/<model>آدرسدهی شدهاند، هدایت میکند. گرههای loopback (localhost،127.0.0.1،172.16.0.0/12) همیشه واجد شرایط هستند؛ همین موضوع دربارهٔ نامهای میزبانی که اپراتور درOMNIROUTE_LOCAL_PROVIDER_NODE_HOSTSفهرست میکند نیز صدق میکند (برای مثال، نام یک سرویس Docker/Compose مانندhttp://reranker:8080/v1؛ این موارد مستقیماً فراخوانی میشوند و هرگز از طریقHTTP(S)_PROXYیا پروکسی پینشدهٔ یک اتصال عبور نمیکنند). گرههای مستقر روی هر میزبان دیگری — یک دستگاه در LAN یا همتای Tailscale — تنها زمانی واجد شرایط هستند که اپراتور پرچم قابلیتRERANK_REMOTE_PROVIDER_NODESرا فعال کند و URL پایهٔ گره از سیاست URL خروجی ارائهدهنده (OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS/OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS) عبور کند. مرحلهٔ بازرتبهبندی موتور حافظه، این مسیر را از طریق loopback فراخوانی میکند؛ بنابراین همین قاعده برrerankProviderModelدر تنظیمات حافظه حاکم است.ساختارهای سرور محلی: گره ابتدا در
<base>/v1/rerankو در صورت دریافت 404، در<base>/rerank(Infinity، TEI) فراخوانی میشود. بدنهٔ ارسالی به بالادست، هم نامگذاری Cohere/OpenAI (documents،return_documents) و هم نامگذاری TEI (texts،return_text) را شامل میشود و پاسخ بالادست به پوش Cohere نرمالسازی میشود: آرایهٔ خام TEI یعنی[{index, score, text}]، ساختار{results: [{index, score}]}از دروازههای سبک، و ساختار به سبک Voyage یعنی{data: [...]}همگی بهشکل{results: [{index, relevance_score, document?}]}به کلاینت بازگردانده میشوند، بر اساس امتیاز مرتب میشوند و بهtop_nمحدود میگردند.
کشف گره ارائهدهنده: مدلهای موجود در یک گره ارائهدهنده سازگار با OpenAI، در
GET /v1/modelsزیر پیشوند گره نمایش داده میشوند. ردیفهایی که فاقد فراداده نقطه پایانی هستند (که برای فهرستهای محلی/v1/modelsمتداول است)،apiTypeگره را به ارث میبرند؛ بنابراین مدلهای یک گرهembeddingsدارایtype: "embedding"و مدلهای یک گرهrerankدارایtype: "rerank"هستند، بهجای آنکه بهطور پیشفرض از نوع چت در نظر گرفته شوند؛ با این حال، یکsupportedEndpointsصریح در ردیفی همگامسازیشده یا افزودهشده بهصورت دستی همچنان اولویت دارد.
مسیرهای اختصاصی ارائهدهنده
POST /v1/providers/{provider}/chat/completions
POST /v1/providers/{provider}/embeddings
POST /v1/providers/{provider}/images/generations
اگر پیشوند ارائهدهنده وجود نداشته باشد، بهطور خودکار افزوده میشود. مدلهای ناسازگار پاسخ 400 برمیگردانند.
API فایلها
نقطه پایانی فایلهای سازگار با OpenAI برای ورودی/خروجی دستهای و آپلود فایل با هدف مشخص.
| متد | مسیر | توضیحات |
|---|---|---|
| POST | /v1/files |
آپلود یک فایل (چند قسمتی: file, purpose, expires_after[anchor], expires_after[seconds]) — حداکثر ۵۱۲ مگابایت |
| GET | /v1/files |
لیست کردن فایلها برای کلید API احراز هویت شده |
| GET | /v1/files/[id] |
بازیابی فراداده (metadata) یک فایل |
| DELETE | /v1/files/[id] |
حذف یک فایل |
| GET | /v1/files/[id]/content |
بازگرداندن بدنه خام فایل به صورت جریانی (stream) |
احراز هویت: کلید API Bearer — فایلها از طریق getApiKeyRequestScope به ازای هر کلید API محدود میشوند. یک کلید فقط فایلهای خود را میبیند، دانلود میکند و حذف میکند؛ یک نشست داشبورد بدون کلید، کل نمونه را میخواند؛ دسترسی به فایلی که مالکی ندارد (آپلود شده توسط کاربر ناشناس یا نشست داشبورد) برای هر تماسگیرنده غیر-نشست ممنوع است. GET /v1/files یک تماسگیرنده ناشناس — و یک کلید ارائه شده که حل نمیشود — را با کد 401 رد میکند، حتی زمانی که REQUIRE_API_KEY=false باشد، به جای لیست کردن فایلهای هر مستأجر (GHSA-m3hp-hq9g-fpmv, GHSA-2jm2-mpx8-6523).
API دستهها
پردازش دستهای سازگار با OpenAI.
| متد | مسیر | توضیحات |
|---|---|---|
| POST | /v1/batches |
ایجاد دسته — بدنه توسط v1BatchCreateSchema اعتبارسنجی میشود (input_file_id, endpoint, completion_window) |
| GET | /v1/batches |
لیست کردن دستهها |
| GET | /v1/batches/[id] |
بازیابی وضعیت دسته + request_counts |
| DELETE | /v1/batches/[id] |
حذف یک دسته تکمیل شده/ناموفق |
| POST | /v1/batches/[id]/cancel |
لغو یک دسته در حال انجام |
احراز هویت: کلید API Bearer. دستهها تحت همان قانون سهگانه فایلها، به ازای هر کلید API محدود میشوند: فقط کلید خود، نشست داشبورد در سطح نمونه، رکوردهای بدون مالک برای هر تماسگیرنده غیر-نشست ممنوع است (بازیابی، حذف، لغو، و بررسی input_file_id هنگام ایجاد). GET /v1/batches یک تماسگیرنده ناشناس را با کد 401 رد میکند، حتی زمانی که REQUIRE_API_KEY=false باشد.
API جستجو
انتزاع ارائهدهنده وب/جستجو (Tavily, Brave, Exa, Serper و غیره).
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /v1/search |
لیست ارائهدهندگان جستجوی پیکربندی شده + قابلیتها |
| POST | /v1/search |
اجرای یک کوئری جستجو — بدنه توسط v1SearchSchema اعتبارسنجی میشود، از کشینگ/ادغام پشتیبانی میکند |
| GET | /v1/search/analytics |
آمار بازدید/تأخیر/کش به ازای هر ارائهدهنده |
احراز هویت: کلید API Bearer (extractApiKey + isValidApiKey). سیاست جستجو از طریق enforceApiKeyPolicy اعمال میشود.
API واکشی وب
استخراج محتوا از یک URL از طریق یک ارائهدهنده واکشی وب پیکربندی شده (Firecrawl, Jina Reader, Tavily Extract, TinyFish Fetch, Nimble Extract).
| متد | مسیر | توضیحات |
|---|---|---|
| POST | /v1/web/fetch |
واکشی/اسکرپ کردن یک URL — بدنه توسط v1WebFetchSchema اعتبارسنجی میشود |
احراز هویت: کلید API Bearer (extractApiKey + isValidApiKey). سیاست از طریق enforceApiKeyPolicy اعمال میشود.
بازگشت به عقب آگاه از سهمیه (#8297): هنگامی که provider صریحی داده نمیشود، پول
(firecrawl → jina-reader → tavily-search → tinyfish → nimble-search)
به ترتیب اولویت ثابت (پر کردن اول) پیمایش میشود — یک ارائهدهنده با محدودیت نرخ اما پیکربندی شده
به جای قطع درخواست، نادیده گرفته میشود، و یک خطای بالادستی قابل تکرار/سهمیه (HTTP 429 همیشه؛
402/403 برای Firecrawl/Tavily/TinyFish در سطوح رایگان سهمیهای — نه برای Jina Reader،
و هرگز برای یک درخواست نامعتبر 400) به ارائهدهنده معتبر بعدی که امتحان نشده است
در زمان درخواست منتقل میشود. هنگامی که هر ارائهدهنده در پول تمام شود،
نقطه پایانی به جای 400 عمومی قبلی، یک 429 واحد (با هدر Retry-After) برمیگرداند.
هنگامی که یک provider صریح درخواست میشود، هیچ بازگشت به عقب پنهانی وجود ندارد —
یک ارائهدهنده صریح با محدودیت نرخ یا ناموفق، خطای خود را نشان میدهد (429 اگر محدودیت نرخ داشته باشد،
در غیر این صورت وضعیت بالادستی).
استریمینگ WebSocket
GET /v1/ws?handshake=1
یک دستدهی ارتقاء WebSocket را اعتبارسنجی میکند و پیامهای نمونه پروتکل وایر (request, cancel) را برمیگرداند. فریمهای WS واقعی توسط سرور WS بستهبندی شده در خارج از جدول مسیر Next.js مدیریت میشوند.
احراز هویت: کلید API Bearer در طول دستدهی.
API پاسخها از طریق WebSocket (فقط codex)
# Same host:port as the HTTP API (default 20128); upgrade the connection:
wscat -c "ws://localhost:20128/v1/responses?api_key=<OMNIROUTE_API_KEY>"
# (or: -H "Authorization: Bearer <OMNIROUTE_API_KEY>")
# First frame MUST be response.create:
{ "type": "response.create", "model": "gpt-5.5", "input": [ { "role": "user", "content": "hi" } ] }
یک پروکسی Responses-API-over-WebSocket منحصراً به codex (بکاند ChatGPT) متصل است.
این پروکسی در همان پورت API/داشبورد در مسیرهای /v1/responses، /responses و /api/v1/responses گوش میدهد.
در اولین فریم response.create، احراز هویت را انجام داده + از طریق پل داخلی codex-responses-ws آماده میشود،
یک اتصال OAuth codex را انتخاب میکند و از طریق ترانسپورت wreq-js به wss://chatgpt.com/backend-api/codex/responses تونل میزند.
مدلهای غیر-codex رد میشوند (codex_ws_provider_required).
برای مسیریابی سهمیه-اشتراکی از model: "qtSd/<group>/codex/<model>" استفاده کنید.
در app/server-ws.mjs + scripts/dev/responses-ws-proxy.mjs + src/app/api/internal/codex-responses-ws/route.ts پیادهسازی شده است.
احراز هویت: کلید API Bearer در طول دستدهی. سرور HTTP بستهبندی شده (server-ws.mjs)
باید نقطه ورودی فعال باشد (که به طور پیشفرض، زمانی که app/server-ws.mjs وجود دارد، همینطور است).
شناسه مدل: از شناسه خام ChatGPT استفاده کنید (بدون پیشوند codex/)
CLI کدکس OpenAI نام مدل را در سمت کلاینت زمانی که supports_websockets = true است اعتبارسنجی میکند و
شناسههای دارای پیشوند ارائهدهنده مانند codex/gpt-5.5 را رد میکند
(The 'codex/gpt-5.5' model is not supported when using Codex with a ChatGPT account).
شناسه خام را ارسال کنید (مثلاً gpt-5.5). پل OmniRoute فقط برای کدکس است،
بنابراین یک شناسه خام را به عنوان یک مدل کدکس (resolveCodexWsModelInfo) قبل از تونلزنی به بالادست مجدداً حل میکند —
حتی اگر یک gpt-5.5 خام در غیر این صورت از طریق HTTP به ارائهدهنده دیگری مسیریابی شود.
پیکربندی OpenAI Codex CLI
CLI کدکس را با افزودن یک ارائهدهنده سفارشی با پشتیبانی WebSocket به ~/.codex/config.toml به OmniRoute اشاره دهید
(از یک CODEX_HOME جداگانه برای جلوگیری از دستکاری یک پیکربندی موجود استفاده کنید):
model = "gpt-5.5" # bare id — NOT "codex/gpt-5.5"
model_provider = "omniroute"
[model_providers.omniroute]
name = "OmniRoute (WS)"
base_url = "http://localhost:20128/v1" # no trailing slash; the WS URL is derived (use https/wss in production)
wire_api = "responses" # only supported value since Feb 2026
supports_websockets = true # enables the Responses-over-WS transport
env_key = "OMNIROUTE_API_KEY" # holds the OmniRoute API key (Bearer)
export OMNIROUTE_API_KEY=sk-... # an OmniRoute API key (any key if REQUIRE_API_KEY=false)
codex exec "Responda apenas: PONG"
CLI، base_url + /responses را به یک WebSocket ارتقا میدهد و OmniRoute آن را به اتصال OAuth کدکس انتخاب شده تونل میزند.
اعتبارسنجی سرتاسری در برابر سرور محلی: ChatGPT، codex.rate_limits + response.created را برمیگرداند و تکمیل را استریم میکند.
گزارش سهمیهها و مشکلات
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /v1/quotas/check |
اعتبارسنجی اولیه سهمیه برای یک provider + accountId قبل از صدور یک کلید ثبتشده |
| POST | /v1/issues/report |
گزارش خرابی صدور سهمیه/کلید به گیتهاب (نیاز به GITHUB_ISSUES_REPO + توکن دارد) |
احراز هویت: کلید API از نوع Bearer (isAuthenticated).
استفادهٔ سلفسرویس (/api/usage/om-usage)
هر کلید API میتواند میزان استفاده و سهمیههای خودش را بخواند — بدون نیاز به احراز هویت مدیریتی. این همان نقطهٔ پایانیای است که یک کلاینت (CLI، پنل OmniCopilot) برای نمایش هزینهکرد دارندهٔ کلید استفاده میکند.
# قالب متنی (قرارداد قدیمی — متن ساده برای ترمینال)
curl -H "Authorization: Bearer <your-api-key>" \
http://localhost:20128/api/usage/om-usage
# قالب ساختیافته — آنچه یک رابط کاربری مصرف میکند
curl -H "Authorization: Bearer <your-api-key>" \
"http://localhost:20128/api/usage/om-usage?format=json"
کلید باید گزینهٔ allowUsageCommand را فعال کرده باشد (بهطور پیشفرض غیرفعال است — مدیر کلید API در داشبورد
آن را برای هر کلید تغییر میدهد). بدون آن، نقطهٔ پایانی با 403 پاسخ میدهد.
?format=json ساختاری متمایزکننده برمیگرداند تا فراخواننده هرگز فیلد دادهای را از یک
پاسخ رد درخواست نخواند. در صورت موفقیت:
{
"allowed": true,
// فقط زمانی وجود دارد که محدودیتهای استفادهٔ مختص هر کلید (روزانه/هفتگی بر حسب USD) فعال شده باشند:
"personal": {
"dailySpentUsd": 1.25,
"dailyLimitUsd": 5,
"dailyResetAtIso": "…",
"weeklySpentUsd": 8,
"weeklyLimitUsd": 20,
"weeklyResetAtIso": "…" /* … */,
},
// تصویر لحظهای سهمیهٔ ارائهدهندهٔ انتخابشده، یا در صورتی که هنوز چیزی کش نشده باشد null:
"provider": {
"connectionId": "…",
"provider": "claude",
"plan": "…",
"quotas": {/* … */},
},
// تصویر لحظهای همهٔ اتصالها، تا رابط کاربری بتواند چند ارائهدهنده را کنار یکدیگر نمایش دهد:
"providers": [
{ "connectionId": "…", "provider": "claude" /* … */ },
{ "provider": "codex" /* … */ },
],
}
در صورت رد درخواست (401 برای کلید نامعتبر / 403 برای نداشتن مجوز)، همان مسیر
{ "allowed": false, "error": { "message": "…" } } را برمیگرداند — وجود personal/provider خالی
(کلید مجاز است، اما هنوز دادهای به دست نیامده) وضعیتی متفاوت از رد درخواست است و فقط قالب JSON
این دو را از هم متمایز میکند.
احراز هویت: کلید API از نوع Bearer متعلق به خود فراخواننده که با isValidApiKey اعتبارسنجی میشود — این سطح
مدیریتی (/api/keys/…) نیست؛ سطح مدیریتی همچنان پشت requireManagementAuth باقی میماند.
درصدهای خام در برابر درصدهای سهمیهٔ تعدیلشده بر اساس نقطهٔ قطع
هنگام استفاده از /api/usage/om-usage، فراخوانندگان باید به تفاوت میان
درصدهای ارائهشده در خروجی متن ساده و خروجی JSON ساختیافته توجه کنند:
| جنبه | قالب متن ساده (/api/usage/om-usage / @@om-usage) |
قالب JSON (?format=json) |
|---|---|---|
| فیلد خروجی | NN% left (برای مثال، 20% left) |
provider.quotas / providers[].quotas |
| معیار اندازهگیری | مقدار قابلاستفادهٔ تعدیلشده بر اساس نقطهٔ قطع: ظرفیت باقیمانده بالاتر از آستانهٔ قطع | سهمیهٔ خام بالادستی: معیار تعدیلنشدهٔ ارائهدهنده |
| مقیاسبندی نقطهٔ قطع | با effectiveRemainingPercent() مقیاس میشود تا ذخیرهٔ محافظتشده بهصورت 0% left نمایش یابد |
هیچکدام (مقادیر خام تصویر لحظهای، همانطور که ارائهدهنده گزارش کرده است) |
| دادهٔ آستانه | در درصد نمایشدادهشده لحاظ میشود | در quotaWindowThresholds برای هر اتصال (یا مقادیر پیشفرض سرور) ذخیره میشود |
| مصرفکنندهٔ اصلی | CLIهای تعاملی، اعلانهای ترمینال، اپراتورهای انسانی | یکپارچهسازیهای برنامهنویسی، داشبوردها، تحلیلها، ردیابهای صورتحساب |
فرمول تعدیل نقطهٔ قطع
OmniRoute از نقاط قطع پیشگیرانهٔ سهمیه پشتیبانی میکند تا از تمامشدن منابع بالادستی جلوگیری شود (که از طریق
quotaWindowThresholds اتصال، مقادیر پیشفرض ارائهدهنده یا تنظیمات سراسری تابآوری پیکربندی میشوند). هنگامی که یک آستانهٔ قطع
(برای مثال، cutoff = 25%) در یک بازهٔ سهمیه فعال باشد، رندرکنندهٔ متن مقدار باقیمانده را به این شکل محاسبه میکند:
- اگر
remaining <= cutoffباشد:0%را برمیگرداند. - اگر
remaining > cutoffباشد: مقدار((remaining - cutoff) / (100 - cutoff)) * 100را برمیگرداند.
خروجی متنی قالببندیشده این مقدار را به نزدیکترین عدد صحیح گرد میکند (Math.round(...)).
مثال توضیحی
یک بازهٔ ارائهدهنده با 60% استفادهٔ خام (در نتیجه 40% سهمیهٔ خام باقیمانده) و آستانهٔ 25% نقطهٔ قطع سهمیهٔ باقیمانده را در نظر بگیرید:
| نمایش | محاسبه | باقیمانده | استفادهٔ ضمنی |
|---|---|---|---|
JSON خام (?format=json) |
تصویر لحظهای بالادستی (quotas[window]) |
40% | 60% |
قالب متنی (NN% left) |
((40 - 25) / (100 - 25)) * 100 = (15 / 75) * 100 |
20% | 80% (در صورت محاسبهٔ 100 - remaining) |
- چرا متن 20% باقیمانده نشان میدهد: از 40% سهمیهٔ فیزیکی باقیمانده در حساب، 25% توسط
سیاست نقطهٔ قطع رزرو شده است. فراخواننده از مجموع 75% فضای قابلاستفاده، تنها 15% ظرفیت باقیمانده دارد تا زمانی که مسیریاب
هدایت درخواستها به این اتصال را متوقف کند. مقیاسبندی تضمین میکند که اتصال دقیقاً در زمان توقف
مسیریابی، اتمام ظرفیت (
0% left) را اعلام کند. - چرا JSON مقادیر خام را حفظ میکند: محمولهٔ JSON تصویر لحظهای دقیق ارائهدهنده (
UsageSnapshot) را برمیگرداند تا ابزارهای خارجی به میزان استفادهٔ واقعی و معتبر بالادستی وquotaWindowThresholdsدر سطح اتصال، بدون مقیاسبندی اتلافی سمت سرور، دسترسی داشته باشند.
راهنمای مهاجرت برای مصرفکنندگان
اگر یک یکپارچهسازی خارجی (مانند افزونهٔ ویرایشگر یا افزونهٔ عامل) قبلاً نقطهٔ پایانی متنی
(NN% left) را استخراج میکرد و درصد استفادهشده را بهصورت 100 - NN محاسبه میکرد، مهاجرت به ?format=json به این معناست:
- خواندن مقادیر خام JSON، مصرف واقعی بالادستی را منعکس خواهد کرد (در مثال بالا 60% استفادهشده).
- اگر یکپارچهسازی بخواهد معنای مقدار قابلاستفادهٔ نقطهٔ پایانی متنی را حفظ کند، میتواند
فرمول مؤثر مقدار باقیمانده را در سمت کلاینت و با استفاده از
quotaWindowThresholdsبرای بازنویسیهای سطح اتصال ارزیابی کند.
کش معنایی
# دریافت آمار کش
GET /api/cache/stats
# پاک کردن تمام کشها
DELETE /api/cache/stats
مثال پاسخ:
{
"semanticCache": {
"memorySize": 42,
"memoryMaxSize": 500,
"dbSize": 128,
"hitRate": 0.65
},
"idempotency": {
"activeKeys": 3,
"windowMs": 5000
}
}
تأثیر تأخیر
یک HIT کش معنایی، پاسخ را از کش بدون فراخوانی بالادستی ارائه میدهد، بنابراین X-OmniRoute-Response-Latency گزارششده نزدیک به صفر است (صرفنظر از تأخیر اصلی بالادستی). کلاینتهای حساس به تأخیر (بنچمارکینگ، نظارت p50/p99) باید هدر پاسخ X-OmniRoute-Cache-Latency را بررسی کنند:
| مقدار | معنی |
|---|---|
synthetic |
پاسخ از کش ارائه شده است؛ تأخیر زمان واقعی بالادستی نیست |
| (غایب) | پاسخ از فراخوانی واقعی بالادستی |
دور زدن کش به ازای هر کلید
کلیدهای API میتوانند از خواندن کش معنایی از طریق cacheDefaultMode انصراف دهند:
| مقدار | رفتار |
|---|---|
legacy |
رفتار عادی کش (پیشفرض) |
bypass |
بهطور کامل از جستجوی کش صرفنظر کنید؛ همیشه به بالادست مراجعه کنید |
در زمان ایجاد کلید (POST /api/keys) یا بهروزرسانی (PATCH /api/keys/[id]) تنظیم میشود:
{ "cacheDefaultMode": "bypass" }
دور زدن به ازای هر درخواست
هر درخواستی میتواند کش را صرفنظر از تنظیمات کلید دور بزند:
X-OmniRoute-No-Cache: true
داشبورد و مدیریت
مسیرهای مدیریتی (/api/* بهجز احراز هویت/ورود عمومی) با کلیدهای API معمولیِ استنتاجی مجاز نمیشوند. برای خانوادههای اعتبارنامه، دامنههای دسترسی و نمونههای curl، به این بخش مراجعه کنید:
احراز هویت مدیریتی.
احراز هویت
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/auth/login |
POST | ورود |
/api/auth/logout |
POST | خروج |
/api/settings/require-login |
GET/PUT | فعال یا غیرفعال کردن الزام ورود |
مدیریت ارائهدهندگان
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/providers |
GET/POST | فهرست کردن / ایجاد ارائهدهندگان |
/api/providers/[id] |
GET/PUT/DELETE | مدیریت یک ارائهدهنده |
/api/providers/[id]/test |
POST | آزمایش اتصال ارائهدهنده |
/api/providers/[id]/models |
GET | فهرست کردن مدلهای ارائهدهنده |
/api/providers/validate |
POST | اعتبارسنجی پیکربندی ارائهدهنده |
/api/providers/bulk |
POST | افزودن گروهی کلیدهای API برای یک ارائهدهنده |
/api/providers/import |
POST | وارد کردن یک فهرست ناهمگون از ارائهدهندگان از فایل CSV/JSON تجزیهشده (#6836)؛ همراه با نتایج شکست جزئی برای هر ردیف |
/api/provider-nodes* |
مختلف | مدیریت گره ارائهدهنده |
/api/provider-models |
GET/POST/PUT/PATCH/DELETE | مدلهای سفارشی و بازنویسیهای مخصوص هر مدل (افزودن، بهروزرسانی، پنهان/نمایان کردن، حذف) |
/api/provider-models/validate-and-add |
POST | اعتبارسنجی اختیاری و سختگیرانه اتصال با احراز هویت مدیریتی و ثبت اتمی مدل سفارشی؛ رجوع کنید به اعتبارسنجی مدل |
برای مدلهای همگامسازیشده/واردشده، PUT /api/provider-models مقادیر provider، modelId و
maxOutputTokenOverride را میپذیرد: یک عدد صحیح مثبت، سقف دستی توکن خروجی را تعیین میکند و null
آن را پاک میکند تا مقدار پیشفرض بازیابی شود. GET /api/provider-models?provider=<provider> این
مقادیر را در modelOutputOverrides برمیگرداند، از جمله برای مدلهایی که ردیف مدل سفارشی ندارند. این بازنویسی
از قابلیت زمان اجرای max_output_tokens استفاده میکند و پس از همگامسازی مجدد مدل نیز باقی میماند. صفحه ارائهدهنده سازگار با OpenAI
همین کنترلهای ویرایش/پاکسازی را ارائه میدهد و مدلهای دارای پشتیبانی صریح از قابلیت بینایی را علامتگذاری میکند.
گرههای سفارشی Chat Completions انصرافهای صریح از استدلال را برای بکاند بالادستی تطبیق میدهند. یک
آزمایش اتصال موفق، کنترلهای الگوی چت را بهطور خودکار برای هر شناسه دقیق مدل انتخاب میکند
که ورودی /models آن یکی از مقادیر شناختهشده owned_by را اثبات کند: vllm، sglang یا llamacpp.
پوششدهندههای شفاف سازگار با OpenAI ممکن است ورودی اصلی مدل را درون یک شیء تودرتوی
openai حفظ کنند؛ تشخیص، حداکثر تا سه مورد از این پوششها را دنبال میکند. مدلهایی با مالکیت مفقود، ناشناخته یا
متناقض، رفتار معمول OpenAI را حفظ میکنند. تشخیص از درخواست کاتالوگ موجود مجدداً استفاده میکند،
هیچ توکن تکمیلی تولید نمیکند و با تغییر نقطه پایانی اتصال، نامعتبر میشود.
برای تثبیت این رفتار در بکاندی که این فراداده را ارائه نمیکند، از API موجود برای بهروزرسانی جزئی ارائهدهنده استفاده کنید:
{
"providerSpecificData": {
"reasoningControl": "chat-template"
}
}
این بدنه را همراه با PUT /api/providers/<connection-id> ارسال کنید. در آن اتصال، تلاش استدلالی صریح
با مقدار none بهشکل chat_template_kwargs.thinking=false و
chat_template_kwargs.enable_thinking=false ارسال میشود. مقادیر صریح بومی الگو همچنان مرجع نهایی هستند،
مگر اینکه یک قاعده استدلال سمت سرور، سطح تلاشی را تحمیل کند. این تنظیم فقط زمانی اعمال میشود که یک اتصال سفارشی
سازگار با OpenAI، بدنه Chat Completions را ارسال کند؛ درخواستهای Responses و ارائهدهندگان معمولی
شکل بومی درخواست خود را حفظ میکنند. برای اجبار به عبور مستقیم reasoning_effort معمول OpenAI،
reasoningControl را روی openai تنظیم کنید؛ یا برای استفاده از تشخیص خودکار، آن را حذف کنید/روی null تنظیم کنید.
درخواستهای طبقهبند حالت خودکار Claude Code، در صورتی که شامل هیچ کنترل صریحی برای استدلال نباشند، بهطور پیشفرض تفکر بومی را غیرفعال میکنند. تشخیص از نشانگر سیستمی طبقهبند در درخواستهای با قالب Claude استفاده میکند، نه از نام مدلها یا محدودیتهای تکمیل. کنترلهای صریح بدنه، هدرهای پشتیبانیشده effort/thinking، قواعد مسیریابی و میزان effort نهایی مدل، اولویت فعلی خود را حفظ میکنند. هر دو مرحله طبقهبند، پرامپتها، محدودیتهای تکمیل، توالیهای توقف و احکام واقعی مجوز بالادستی خود را حفظ میکنند؛ مرحله دوم همچنان میتواند استدلال قابلمشاهده درخواستی خود را بهصورت متن عادی تولید کند.
جریانهای OAuth
| نقطه پایانی | روش | توضیحات |
|---|---|---|
/api/oauth/[provider]/[action] |
گوناگون | OAuth مختص ارائهدهنده |
مسیریابی و پیکربندی
| نقطه پایانی | روش | توضیحات |
|---|---|---|
/api/models/alias |
GET/POST | نامهای مستعار مدل |
/api/models/catalog |
GET | همه مدلها بر اساس ارائهدهنده و نوع |
/api/combos* |
گوناگون | مدیریت ترکیبها |
/api/keys* |
گوناگون | مدیریت کلیدهای API |
/api/pricing |
GET | قیمتگذاری مدل |
استفاده و تحلیل
| نقطه پایانی | روش | توضیحات |
|---|---|---|
/api/usage/history |
GET | تاریخچه استفاده |
/api/usage/logs |
GET | گزارشهای استفاده |
/api/usage/request-logs |
GET | گزارشهای سطح درخواست |
/api/usage/[connectionId] |
GET | استفاده بهازای هر اتصال |
/api/usage/token-limits |
GET/POST/DELETE | بودجه محدودیت توکن بهازای هر کلید API |
/api/usage/model-latency-stats |
GET | آمار تجمیعی چرخشی تأخیر بهازای هر ارائهدهنده/مدل (میانگین/p50/p95/p99، نرخ موفقیت)؛ فیلترها: windowHours/minSamples/maxRows/provider/model (#6873) |
/api/usage/cache-health |
GET | خلاصه سلامت کش پرامپت در call_logs — نسبت نوشتن/خواندن، توزیع اندازه نوشتن p50/p90/p99، تمرکز نوشتنهای سنگین، تفکیک بهازای هر مدل و یک حکم healthy/degraded/thrash/no-data؛ پارامترهای کوئری range (1h|24h|7d|30d، پیشفرض 24h) و model اختیاری (#8827) |
مجوزهای کلید API
PATCH /api/keys/{id} مجوزهای یک کلید موجود را بهروزرسانی میکند. مانند هر مسیر /api/keys*، این مسیر به مجوز مدیریتی نیاز دارد (به احراز هویت مدیریتی مراجعه کنید)، نه یک کلید استنتاج. فقط فیلدهایی را ارسال کنید که میخواهید تغییر دهید؛ درخواستی که هیچیک از آنها را نداشته باشد، با پیام No valid fields to update رد میشود. فیلدهای پذیرفتهشده توسط updateKeyPermissionsSchema در src/shared/validation/schemas/keys.ts تعریف شدهاند.
| فیلد | نوع | توضیحات |
|---|---|---|
name |
رشته، ۱ تا ۲۰۰ نویسه | |
isActive |
بولی | |
isBanned |
بولی | |
expiresAt |
تاریخ و زمان ISO 8601 یا null |
null تاریخ انقضا را پاک میکند |
modelAccessMode |
all | restricted |
وقتی حالت all است، allowedModels باید خالی باشد |
allowedModels, blockedModels |
آرایهای از رشتهها، حداکثر ۱۰۰۰ مورد | |
allowedCombos |
آرایهای از رشتهها، حداکثر ۵۰۰ مورد | تعیین میکند کلید مجاز به فراخوانی کدام ترکیبها است؛ مدلهای مستقیم توسط modelAccessMode / allowedModels کنترل میشوند |
connectionAccessMode |
all | restricted |
در حالت restricted، allowedConnections باید غیرخالی و در حالت all باید خالی باشد |
allowedConnections |
آرایهای از UUIDها، حداکثر ۱۰۰ مورد | |
allowAutoCombos |
بولی | مقدار false درخواستهای مدلهای auto/* با این کلید را رد میکند؛ کلیدهایی که هرگز آن را تنظیم نکردهاند مجاز هستند |
catalogScope |
all | combos | models |
مشخص میکند GET /v1/models برای این کلید چه مواردی را فهرست کند (فقط ترکیبها، فقط مدلها یا هر دو)؛ این گزینه موارد قابل فراخوانی توسط کلید را تغییر نمیدهد |
noLog, autoResolve |
بولی | |
throttleDelayMs |
عدد صحیح، ۰ تا ۳۰۰۰۰۰ | |
maxSessions |
عدد صحیح، ۰ تا ۱۰۰۰۰ | |
rateLimits |
آرایهای از { limit, window } (اعداد صحیح مثبت، حداکثر ۵۰ مورد) یا null |
null محدودیتها را پاک میکند |
accessSchedule |
شیء زمانبندی یا null |
null زمانبندی را پاک میکند |
scopes |
آرایهای از رشتهها، حداکثر ۳۲ مورد | |
allowedEndpoints |
آرایهای از رشتهها، حداکثر ۲۰ مورد | |
streamDefaultMode |
legacy | json |
|
cacheDefaultMode |
legacy | bypass |
به نادیدهگرفتن کش برای هر کلید مراجعه کنید |
compressionEnabled |
بولی | |
codexServiceMode |
یکی از حالتهای سرویس Codex | |
disableNonPublicModels |
بولی | |
allowUsageCommand |
boolean | |
usageLimitEnabled |
boolean | |
dailyUsageLimitUsd, weeklyUsageLimitUsd |
number >= 0 یا null |
|
chaosModeEnabled |
boolean |
curl -X PATCH "$OMNIROUTE_URL/api/keys/$KEY_ID" \
-H "Authorization: Bearer <management-credential>" \
-H "Content-Type: application/json" \
-d '{ "allowAutoCombos": false, "catalogScope": "combos" }'
تنظیمات
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/settings |
GET/PUT/PATCH | تنظیمات عمومی |
/api/settings/proxy |
GET/PUT | پیکربندی پراکسی شبکه |
/api/settings/proxy/test |
POST | آزمایش اتصال پراکسی |
/api/settings/ip-filter |
GET/PUT | فهرست مجاز/مسدودسازی IP |
/api/settings/thinking-budget |
GET/PUT | حالت بازنویسی درخواست بودجه تفکر/استدلال (عبور بدون تغییر / حذف خودکار / سفارشی / تطبیقی). مستقل از فشردهسازی است. به THINKING_BUDGET.md مراجعه کنید. |
/api/settings/system-prompt |
GET/PUT | پرامپت سیستمی سراسری |
/api/settings/compression |
GET/PUT | پیکربندی فشردهسازی سراسری |
/api/settings/purge-request-history |
POST | پاککردن ردیفهای گزارش درخواست و مصنوعات محلی گزارش فراخوانی |
زمینه و فشردهسازی
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/compression/preview |
POST | پیشنمایش فشردهسازی off/lite/standard/aggressive/ultra/RTK/stacked |
/api/compression/language-packs |
GET | فهرست بستههای زبانی موجود Caveman |
/api/compression/rules |
GET | فهرست فراداده قوانین Caveman |
/api/context/caveman/config |
GET/PUT | نام مستعار تنظیمات مختص Caveman |
/api/context/rtk/config |
GET/PUT | تنظیمات مختص RTK، شامل فیلترهای سفارشی و نگهداری خروجی خام |
/api/context/rtk/filters |
GET | کاتالوگ فیلترهای RTK و اطلاعات عیبیابی فیلترهای سفارشی |
/api/context/rtk/test |
POST | اجرای پیشنمایش/آزمایش RTK روی یک بار داده متنی |
/api/context/rtk/raw-output/[id] |
GET | خواندن خروجی خام نگهداریشده و ویرایششده بر اساس شناسه اشارهگر |
/api/context/combos |
GET/POST | فهرست/ایجاد ترکیبهای فشردهسازی |
/api/context/combos/[id] |
GET/PUT/DELETE | جزئیات/بهروزرسانی/حذف ترکیب فشردهسازی |
/api/context/combos/[id]/assignments |
GET/PUT | تخصیص ترکیبهای فشردهسازی به ترکیبهای مسیریابی |
/api/context/analytics |
GET | نام مستعار تحلیلهای فشردهسازی |
پایش
| Endpoint | Method | Description |
|---|---|---|
/api/sessions |
GET | رهگیری نشستهای فعال |
/api/rate-limits |
GET | محدودیتهای نرخ درخواست برای هر حساب |
/api/monitoring/health |
GET | بررسی سلامت + خلاصه ارائهدهنده (catalogCount، configuredCount، activeCount، monitoredCount). نمای مدیریتی شامل credentialHealth است: مقادیر عددی کش کاوش، failedConnections هنگامی که failed>0 باشد، و staleDbNonOkCount (test_status ماندگار SQLite، نه سنجه). به MONITORING_GUIDE.md مراجعه کنید. |
/api/cache/stats |
GET/DELETE | آمار کش / پاکسازی |
/api/modality-bridge/stats |
GET | مقادیر درونحافظهای attempts، موفقیتها/bridged، شکستها، اصابتهای کش، totalLatencyMs، latencySamples، مقدار averageLatencyMs با مخرج تعداد نمونهها، و زمان آخرین استفاده (با راهاندازی مجدد بازنشانی میشود؛ نیازمند احراز هویت مدیریتی) |
/api/modality-bridge/video/runtime |
GET | بررسی سختگیرانه حلقه بازگشتیِ مورداعتماد پیش از احراز هویت/کاوش مدیریتی؛ وضعیت دسترسی و نسخههای پاکسازیشده FFmpeg/ffprobe (بدون ذخیرهسازی) |
/api/modality-bridge/video/extract |
POST | واسط داخلی و احراز هویتشده انتقال بایت از حلقه بازگشتیِ مورداعتماد؛ ورودی 50 MiB، صف محدود/خروجی 32 MiB، ظرفیت 503، قطع اتصال 499، مهلت زمانی 504؛ این یک API عمومی بارگذاری نیست |
پشتیبانگیری و خروجی/ورودی
| Endpoint | Method | Description |
|---|---|---|
/api/db-backups |
GET | فهرست پشتیبانهای موجود |
/api/db-backups |
PUT | ایجاد پشتیبان دستی |
/api/db-backups |
POST | بازیابی از یک پشتیبان مشخص |
/api/db-backups/export |
GET | دانلود پایگاه داده بهصورت فایل .sqlite |
/api/db-backups/import |
POST | بارگذاری فایل .sqlite برای جایگزینی پایگاه داده |
/api/db-backups/exportAll |
GET | دانلود پشتیبان کامل بهصورت آرشیو .tar.gz |
همگامسازی ابری
| Endpoint | Method | Description |
|---|---|---|
/api/sync/cloud |
متنوع | عملیات همگامسازی ابری |
/api/sync/initialize |
POST | مقداردهی اولیه همگامسازی |
/api/cloud/* |
متنوع | مدیریت فضای ابری |
تونلها
| Endpoint | Method | Description |
|---|---|---|
/api/tunnels/cloudflared |
GET | خواندن وضعیت نصب/اجرای Cloudflare Quick Tunnel برای داشبورد |
/api/tunnels/cloudflared |
POST | فعال یا غیرفعال کردن Cloudflare Quick Tunnel (action=enable/disable) |
/api/tunnels/ngrok |
GET | خواندن وضعیت اجرای ngrok Tunnel برای داشبورد |
/api/tunnels/ngrok |
POST | فعال یا غیرفعال کردن ngrok Tunnel (action=enable/disable) |
ابزارهای CLI
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/cli-tools/claude-settings |
GET | وضعیت Claude CLI |
/api/cli-tools/codex-settings |
GET | وضعیت Codex CLI |
/api/cli-tools/droid-settings |
GET | وضعیت Droid CLI |
/api/cli-tools/openclaw-settings |
GET | وضعیت OpenClaw CLI |
/api/cli-tools/runtime/[toolId] |
GET | محیط اجرای عمومی CLI |
پاسخهای CLI شامل این موارد هستند: installed، runnable، command، commandPath، runtimeMode، reason.
عاملهای ACP
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/acp/agents |
GET | فهرستکردن همه عاملهای شناساییشده (داخلی + سفارشی) بههمراه وضعیت |
/api/acp/agents |
POST | افزودن عامل سفارشی یا تازهسازی حافظه نهان شناسایی |
/api/acp/agents |
DELETE | حذف یک عامل سفارشی با پارامتر کوئری id |
پاسخ GET شامل agents[] (id، name، binary، version، installed، protocol، isCustom) و summary (total، installed، notFound، builtIn، custom) است.
تابآوری و محدودیتهای نرخ
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/resilience |
GET/PATCH | دریافت/بهروزرسانی صف درخواست، دوره انتظار اتصال، قطعکننده ارائهدهنده و تنظیمات انتظار |
/api/resilience/reset |
POST | بازنشانی قطعکنندههای مدار ارائهدهنده |
/api/resilience/model-cooldowns |
GET | فهرستکردن قفلهای فعال بهازای هر (ارائهدهنده، اتصال، مدل)، مرتبشده بر اساس زمان باقیمانده |
/api/resilience/model-cooldowns |
DELETE | پاککردن قفل مدل — بدنه {provider, model} یا {all: true} برای پاککردن همه موارد |
/api/rate-limits |
GET | وضعیت محدودیت نرخ بهازای هر حساب |
/api/rate-limit |
GET | پیکربندی سراسری محدودیت نرخ |
هر چهار مسیر
/api/resilience/*به احراز هویت مدیریتی (requireManagementAuth) نیاز دارند. برای شرح کامل تفاوت میان قطعکننده ارائهدهنده، دوره انتظار اتصال و قفل مدل، به تابآوری (گسترشیافته) مراجعه کنید.
ارزیابیها
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/evals |
GET/POST | فهرستکردن مجموعههای ارزیابی / اجرای ارزیابی |
سیاستها
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/policies |
GET/POST/DELETE | مدیریت سیاستهای مسیریابی |
انطباق
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/compliance/audit-log |
GET | گزارش ممیزی انطباق (آخرین N مورد) |
v1beta (سازگار با Gemini)
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/v1beta/models |
GET | فهرستکردن مدلها در قالب Gemini |
/v1beta/models/{...path} |
POST | نقطه پایانی generateContent در Gemini |
این نقاط پایانی برای کلاینتهایی که انتظار سازگاری بومی با Gemini SDK را دارند، قالب API متعلق به Gemini را بازتاب میدهند.
APIهای داخلی / سیستمی
| نقطه پایانی | متد | توضیحات |
|---|---|---|
/api/init |
GET | بررسی مقداردهی اولیه برنامه (مورد استفاده در نخستین اجرا) |
/api/tags |
GET | برچسبهای مدل سازگار با Ollama (برای کلاینتهای Ollama) |
/api/restart |
POST | راهاندازی مجدد کنترلشده سرور |
/api/shutdown |
POST | خاموشکردن کنترلشده سرور |
/api/system/env/repair |
POST | تعمیر متغیرهای محیطی ارائهدهنده OAuth |
/api/system/version |
GET | نسخه فعلی/جدیدترین، وضعیت بهروزرسانی، کانال انتشار |
/api/system/version |
POST | آغاز بهروزرسانی آگاه از استقرار به جدیدترین نسخه |
توجه: این نقاط پایانی بهصورت داخلی توسط سیستم یا برای سازگاری با کلاینت Ollama استفاده میشوند. معمولاً کاربران نهایی مستقیماً آنها را فراخوانی نمیکنند.
تعمیر محیط OAuth (v3.6.1+)
POST /api/system/env/repair
Content-Type: application/json
{
"provider": "claude-code"
}
متغیرهای محیطی OAuth مفقود یا خراب را برای یک ارائهدهنده مشخص تعمیر میکند. خروجی:
{
"success": true,
"repaired": ["CLAUDE_CODE_OAUTH_CLIENT_ID", "CLAUDE_CODE_OAUTH_CLIENT_SECRET"],
"backupPath": "/home/user/.omniroute/backups/env-repair-2026-04-11.bak"
}
نسخه و کانال انتشار
GET /api/system/version
مسیر مدیریتی مختص loopback (احراز هویت مدیر). نسخه در حال اجرا، جدیدترین
نسخه منتشرشده و وضعیت بهروزرسانی خودکار را برمیگرداند. releaseChannel و channels فیلدهای
افزایشی هستند (rail 3.8.54)؛ channel معنای خود را حفظ میکند — حالت استقراری که بهروزرسان داشبورد
از آن استفاده میکند (npm، source یا docker-compose).
{
"current": "3.8.52",
"latest": "3.8.52",
"updateAvailable": false,
"channel": "npm",
"autoUpdateSupported": true,
"autoUpdateError": null,
"news": null,
"releaseChannel": "latest",
"channels": { "latest": "3.8.52", "next": "3.8.53-rc.1" }
}
releaseChannel— کانال npm بیلد در حال اجرا:nightlyبرای نسخههای-nightly.*،nextبرای سایر پیشانتشارها (-rc.*،-beta.*،-alpha.*)،ltsبرای نسخهٔ پایداری که نسخهٔ اصلی آن ازchannels.latestقدیمیتر است، و در غیر این صورتlatest. اینها همان قواعدscripts/release/dist-tag.mjsهستند که هنگام انتشار، dist-tag مربوط به npm را انتخاب میکند.channels— آخرین نسخهٔ منتشرشدهٔ هر dist-tag، برگرفته ازnpm view omniroute dist-tags(با HTTP رجیستری بهعنوان راهکار جایگزین)، که با همان TTL دهدقیقهایlatestکش میشود.latestهمیشه وجود دارد (ابتدا به فیلدlatestو سپس به"unavailable"برمیگردد)؛next،nightlyوltsتنها زمانی نمایش داده میشوند که آن dist-tag وجود داشته باشد. یک درخواستCache-Control: no-cacheهر دو جستوجو را تازهسازی میکند.
مدل کانال (latest = v3 تا زمان عرضهٔ عمومی 4.0، next = rc، nightly = بیلدهای develop،
lts = وصلههای v3 پس از عرضهٔ عمومی 4.0) در docs/ops/RELEASE_STRATEGY.md توضیح داده شده است.
رونویسی صوتی
POST /v1/audio/transcriptions
Authorization: Bearer your-api-key
Content-Type: multipart/form-data
فایلهای صوتی را با استفاده از هر ارائهدهنده STT پیکربندیشده رونویسی کنید. اولین بخش مسیر، ارائهدهنده بومی را انتخاب میکند (openai/…, deepgram/…). دروازههایی که مدل ارائهدهنده دیگری را مجدداً صادر میکنند، از یک شناسه واجد شرایط استفاده میکنند (openrouter/deepgram/nova-3).
درخواست:
curl -X POST http://localhost:20128/v1/audio/transcriptions \
-H "Authorization: Bearer your-api-key" \
-F "file=@recording.mp3" \
-F "model=openai/whisper-1"
پاسخ:
{
"text": "Hello, this is the transcribed audio content.",
"task": "transcribe",
"language": "en",
"duration": 12.5
}
نمونه شناسههای مدل: openai/whisper-1 (نیاز به کلید OpenAI دارد)،
openrouter/deepgram/nova-3 (نیاز به کلید OpenRouter دارد)،
deepgram/nova-3 (نیاز به کلید بومی Deepgram دارد). یک درخواست deepgram/nova-3 بدون پیشوند از OpenRouter استفاده نمیکند.
فرمتهای پشتیبانیشده: mp3, wav, m4a, flac, ogg, webm.
سازگاری Ollama
برای کلاینتهایی که از فرمت API Ollama استفاده میکنند:
# نقطه پایانی چت (فرمت Ollama)
POST /v1/api/chat
# لیست مدل (فرمت Ollama)
GET /api/tags
درخواستها به طور خودکار بین فرمتهای Ollama و داخلی ترجمه میشوند.
نامهای مستعار توکندار VS Code / بدون هدر
از این نامهای مستعار زمانی استفاده کنید که یک ادغام نمیتواند هدر Authorization را تزریق کند و نیاز به کلید API تعبیهشده در URL پایه دارد.
# نام مستعار کاتالوگ به سبک OpenAI
GET /api/v1/vscode/{token}/
GET /api/v1/vscode/{token}/models
# نامهای مستعار چت به سبک OpenAI
POST /api/v1/vscode/{token}/chat/completions
POST /api/v1/vscode/{token}/responses
# نامهای مستعار به سبک Ollama
POST /api/v1/vscode/{token}/api/chat
GET /api/v1/vscode/{token}/api/tags
مثال:
curl https://your-host.example/api/v1/vscode/YOUR_API_KEY/models
curl -X POST https://your-host.example/api/v1/vscode/YOUR_API_KEY/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"auto","messages":[{"role":"user","content":"hello"}]}'
نکات:
- نامهای مستعار توکندار از همان هندلرهای
/v1/*و/api/tagsاستفاده مجدد میکنند؛ شکل پاسخها یکسان باقی میماند. - هر زمان که کلاینت از هدرهای سفارشی پشتیبانی میکند،
Authorization: Bearer ...را ترجیح دهید. - توکنهای مبتنی بر URL ممکن است در لاگهای پروکسی معکوس، تاریخچه مرورگر و تلهمتری خارج از OmniRoute ظاهر شوند. آنها را به عنوان یک گزینه سازگاری در نظر بگیرید، نه حالت احراز هویت پیشفرض.
تلهمتری
# خلاصه تلهمتری تأخیر را دریافت کنید (p50/p95/p99 برای هر ارائهدهنده)
GET /api/telemetry/summary
پاسخ:
{
"providers": {
"claudeCode": { "p50": 245, "p95": 890, "p99": 1200, "count": 150 },
"github": { "p50": 180, "p95": 620, "p99": 950, "count": 320 }
}
}
بودجه
# وضعیت بودجه را برای همه کلیدهای API دریافت کنید
GET /api/usage/budget
# بودجه را تنظیم یا بهروزرسانی کنید
POST /api/usage/budget
Content-Type: application/json
{
"apiKeyId": "key-123",
"dailyLimitUsd": 5.00,
"weeklyLimitUsd": 30.00,
"monthlyLimitUsd": 100.00,
"warningThreshold": 0.8,
"resetInterval": "monthly"
}
نکات طرحواره (
setBudgetSchema):apiKeyIdالزامی است؛ حداقل یکی ازdailyLimitUsd،weeklyLimitUsdیاmonthlyLimitUsdباید بزرگتر از صفر باشد. فیلدهای اختیاری:warningThreshold(0–1)،resetInterval(daily|weekly|monthly)،resetTime(HH:MM). شکل قدیمی{keyId, limit, period}400 Bad Requestرا برمیگرداند.
محدودیتهای توکن
بودجههای توکن به ازای هر API-key (متفاوت از بودجه دلاری ذکر شده در بالا). این محدودیتها به صورت درونخطی در مسیر درخواست اعمال میشوند: هنگامی که استفاده فعلی یک کلید در بازه زمانی خود به حد مجاز برسد، درخواستها با خطای 429 Too Many Requests رد میشوند. محدودیتها میتوانند برای یک model خاص، یک provider، یا به صورت global برای کل کلید اعمال شوند؛ هنگامی که چندین محدودیت با یک درخواست مطابقت داشته باشند، محدودکنندهترین آنها اعمال میشود.
# لیست کردن محدودیتهای توکن یک کلید (شامل میزان استفاده زنده در بازه زمانی)
GET /api/usage/token-limits?apiKeyId=key-123
# ایجاد یا بهروزرسانی یک محدودیت توکن
POST /api/usage/token-limits
Content-Type: application/json
{
"apiKeyId": "key-123",
"scopeType": "model",
"scopeValue": "openai/gpt-4o",
"tokenLimit": 1000000,
"resetInterval": "monthly",
"enabled": true
}
# حذف یک محدودیت توکن بر اساس شناسه
DELETE /api/usage/token-limits?id=tl-abc
نکات شماتیک (
setTokenLimitSchema):apiKeyIdوscopeType(model|provider|global) الزامی هستند.scopeValueالزامی است مگر اینکهscopeTypeبرابر باglobalباشد (مثلاً یک شناسه مدل برای دامنهmodel، یک شناسه ارائهدهنده برای دامنهprovider).tokenLimitباید یک عدد صحیح مثبت باشد (تبدیل شده از رشته). اختیاری:id(برای ایجاد حذف شود، برای بهروزرسانی ارائه شود)،resetInterval(daily|weekly|monthly، پیشفرضmonthly)،resetTime(HH:MM)،enabled(پیشفرضtrue). پاسخهایGETهر محدودیت را باtokensUsed،remaining،windowStart،periodStartAtوnextResetAtغنی میکنند. این یک نقطه پایانی از کلاس مدیریت است (احراز هویت به صورت مرکزی توسط خط لوله authz اعمال میشود).
پردازش درخواست
۱. کلاینت درخواست را به /v1/* ارسال میکند
۲. کنترلکننده مسیر، handleChat، handleEmbedding، handleAudioTranscription یا handleImageGeneration را فراخوانی میکند
۳. مدل حل میشود (ارائهدهنده/مدل مستقیم یا نام مستعار/ترکیب)
۴. اعتبارنامهها از پایگاه داده محلی با فیلتر در دسترس بودن حساب انتخاب میشوند
۵. برای چت: handleChatCore حافظه پنهان معنایی/امضا را بررسی میکند و تنظیمات فشردهسازی ترکیب را حل میکند
۶. فشردهسازی پیشگیرانه قبل از ترجمه ارائهدهنده در صورت فعال بودن اجرا میشود (lite، Caveman، RTK یا stacked)
۷. اجراکننده ارائهدهنده درخواست بالادستی را ارسال میکند
۸. پاسخ به فرمت کلاینت (چت) ترجمه میشود یا به همان صورت (embeddings/images/audio) بازگردانده میشود
۹. استفاده، تحلیلهای فشردهسازی و لاگهای درخواست ثبت میشوند
۱۰. بازگشت به حالت قبل در صورت بروز خطا طبق قوانین ترکیب اعمال میشود
مرجع کامل معماری: ARCHITECTURE.md
مدیریت ترکیبها
ترکیبهای مسیریابی سطح بالاتر (که قبلاً در /api/combos* خلاصه شدهاند) نیز میتوانند به صورت ۱:۱ از یک الگوی شناسه مدل نگاشت شوند، که امکان تغییر مسیر شفاف یک شناسه مدل به سبک OpenAI را به یک ترکیب فراهم میکند.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/model-combo-mappings |
لیست کردن تمام نگاشتهای مدل←ترکیب |
| POST | /api/model-combo-mappings |
ایجاد نگاشت — بدنه: {pattern, comboId, priority?, enabled?, description?} |
| GET | /api/model-combo-mappings/[id] |
بازیابی یک نگاشت واحد |
| PUT | /api/model-combo-mappings/[id] |
بهروزرسانی فیلدهای یک نگاشت موجود |
| DELETE | /api/model-combo-mappings/[id] |
حذف یک نگاشت |
احراز هویت: نشست مدیریت/API key (requireManagementAuth).
وبهوکها
اشتراکهای وبهوک خروجی برای رویدادهای OmniRoute (تکمیل درخواست، اتمام سهمیه، چرخش کلید و غیره).
| Method | Path | Description |
|---|---|---|
| GET | /api/webhooks |
فهرست وبهوکها (اسرار به <prefix>... پوشانده شدهاند) |
| POST | /api/webhooks |
ایجاد وبهوک — بدنه: {url, events?: ["*"], secret?, description?} |
| GET | /api/webhooks/[id] |
بازیابی یک وبهوک |
| PUT | /api/webhooks/[id] |
بهروزرسانی url/events/secret/description |
| DELETE | /api/webhooks/[id] |
حذف یک وبهوک |
| POST | /api/webhooks/[id]/test |
ارسال یک محموله آزمایشی به URL وبهوک و بازگرداندن وضعیت تحویل |
احراز هویت: نشست مدیریت/کلید API (requireManagementAuth).
کلیدهای ثبتشده (مدیریت خودکار)
توسط زیرسیستم مدیریت خودکار کلید برای صدور و چرخش کلیدهای API در برابر یک ارائهدهنده/حساب پشتیبان، با سهمیههای روزانه/ساعتی استفاده میشود.
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/registered-keys |
فهرست کلیدهای ثبتشده (فقط پیشوند پوشانده شده) |
| POST | /api/v1/registered-keys |
صدور یک کلید ثبتشده جدید — بدنه: {name, provider?, accountId?, idempotencyKey?, expiresAt?, dailyBudget?, hourlyBudget?}. کلید خام را فقط یک بار برمیگرداند. در صورت رد سهمیه، 429 را برمیگرداند. |
| GET | /api/v1/registered-keys/[id] |
بازیابی فراداده یک کلید ثبتشده (بدون محتوای خام) |
| DELETE | /api/v1/registered-keys/[id] |
لغو یک کلید ثبتشده |
| POST | /api/v1/registered-keys/[id]/revoke |
نقطه پایانی لغو صریح (همان اثر DELETE را دارد) |
احراز هویت: کلید API Bearer (isAuthenticated). همچنین به /v1/quotas/check و /v1/issues/report مراجعه کنید.
پروتکل عاملها
وظایف عامل ابری (Claude Code، Codex Cloud، OpenHands و غیره) که از راه دور به نمایندگی از کاربران OmniRoute اجرا میشوند.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/v1/agents/tasks |
لیست وظایف — اختیاری ?provider=, ?status=, ?limit= (1–500, پیشفرض 50) |
| POST | /api/v1/agents/tasks |
ایجاد وظیفه — بدنه توسط CreateCloudAgentTaskSchema (providerId, prompt, source, options?) اعتبارسنجی میشود. 201 را با پاکت وظیفه برمیگرداند |
| DELETE | /api/v1/agents/tasks?id=... |
حذف یک وظیفه |
| GET | /api/v1/agents/tasks/[id] |
خواندن وظیفه — وضعیت را به صورت همزمان از عامل ابری بالادستی زمانی که external_id تنظیم شده باشد، بهروزرسانی میکند |
| POST | /api/v1/agents/tasks/[id] |
عمل متمایز: {action: "approve"}, {action: "message", message}, یا {action: "cancel"} |
| DELETE | /api/v1/agents/tasks/[id] |
حذف یک وظیفه خاص بر اساس شناسه |
احراز هویت: احراز هویت مدیریتی در هر متد الزامی است (
requireCloudAgentManagementAuth). قبل از نسخه 3.8.0 اینها بدون احراز هویت بودند — برای تغییرات اساسی به commit588a0333مراجعه کنید.
# ایجاد یک وظیفه ابری Claude Code
curl -X POST http://localhost:20128/api/v1/agents/tasks \
-H "Authorization: Bearer your-management-key" \
-H "Content-Type: application/json" \
-d '{"providerId":"claude-code-cloud","prompt":"Fix the failing test","source":{"repo":"...","branch":"..."}}'
پروکسیهای مدیریتی
پروکسیهای خروجی HTTP(S)/SOCKS که میتوانند به ارائهدهندگان، حسابها یا به صورت جهانی اختصاص داده شوند.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/v1/management/proxies |
لیست پروکسیها (با ?id= یکی را برمیگرداند؛ با ?id=&where_used=1 نمودار تخصیص را برمیگرداند) |
| POST | /api/v1/management/proxies |
ایجاد پروکسی — بدنه توسط createProxyRegistrySchema اعتبارسنجی میشود |
| PATCH | /api/v1/management/proxies |
بهروزرسانی پروکسی — بدنه توسط updateProxyRegistrySchema اعتبارسنجی میشود (نیاز به id دارد) |
| DELETE | /api/v1/management/proxies?id=...&force=1 |
حذف پروکسی (از force=1 برای جدا کردن تخصیصها استفاده کنید) |
| GET | /api/v1/management/proxies/assignments |
لیست تخصیصها — قابل فیلتر بر اساس proxy_id, scope, scope_id؛ resolve_connection_id=<id> را برای حل پروکسی فعال برای یک اتصال ارسال کنید |
| PUT | /api/v1/management/proxies/assignments |
تخصیص — بدنه توسط proxyAssignmentSchema ({scope, scopeId?, proxyId?}) اعتبارسنجی میشود. کش دیسپچر را پاک میکند |
| PUT | /api/v1/management/proxies/bulk-assign |
تخصیص انبوه — بدنه توسط bulkProxyAssignmentSchema ({scope, scopeIds[], proxyId?}) اعتبارسنجی میشود |
| GET | /api/v1/management/proxies/health?hours=24 |
سلامت کلی پروکسی (تعداد موفقیت/شکست، تأخیر) در یک بازه زمانی |
احراز هویت: جلسه مدیریتی/کلید API در هر مسیر (requireManagementAuth).
POST /api/v1/management/proxies/[id]/assignmentsوPOST /api/v1/management/proxies/[id]/healthدر توضیحات وظیفه توسط مسیرهای مسطح/assignmentsو/healthکه در بالا نشان داده شدهاند، ارائه میشوند — هیچ زیرمسیر به ازای هر شناسه در کدبیس وجود ندارد.
تابآوری (توسعهیافته)
OmniRoute سه مکانیزم مستقل برای شکست موقت ارائه میدهد؛ نقاط پایانی مدیریتی زیر به اپراتورها اجازه میدهند تا آنها را بخوانند و لغو کنند:
| دامنه | ذخیرهسازی وضعیت | خواندن | بازنشانی / پاک کردن |
|---|---|---|---|
| شکننده ارائهدهنده | domain_circuit_breakers + در حافظه |
/api/monitoring/health |
POST /api/resilience/reset |
| خنکسازی اتصال | rateLimitedUntil در اتصالات ارائهدهنده |
/api/rate-limits, /api/providers/[id] |
(بهصورت تنبل دوباره فعال میشود؛ از طریق PUT ارائهدهنده پاک میشود) |
| قفل مدل | رجیستری در حافظه در دسترس بودن مدل | GET /api/resilience/model-cooldowns |
DELETE /api/resilience/model-cooldowns |
PATCH /api/resilience لغوهای شکننده ارائهدهنده را تحت providerBreaker.oauth و providerBreaker.apikey میپذیرد. هر پروفایل از degradationThreshold، failureThreshold و resetTimeoutMs پشتیبانی میکند؛ همین فیلدها در داشبورد ← تنظیمات ← تابآوری نیز نمایش داده میشوند.
# پاک کردن یک قفل مدل
curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \
-H "Cookie: auth_token=..." \
-H "Content-Type: application/json" \
-d '{"provider":"openai","model":"gpt-4o-mini"}'
# پاک کردن تمام قفلها
curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \
-H "Cookie: auth_token=..." \
-d '{"all":true}'
مرجع مفهومی کامل و پیشفرضهای شکننده: به CLAUDE.md ← "Resilience Runtime State" مراجعه کنید.
مهارتها
چارچوب مهارت برای توسعه OmniRoute با کنترلکنندههای اجرایی سفارشی، به علاوه ادغامهای بازار.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/skills |
لیست مهارتهای نصبشده — قابل فیلتر با ?q=, ?mode=on|off|auto, ?source=skillsmp|skillssh|local, صفحهبندیشده |
| GET | /api/skills/[id] |
بازیابی یک مهارت |
| PUT | /api/skills/[id] |
بهروزرسانی مهارت (نام، توضیحات، حالت، طرح، کنترلکننده، برچسبها) |
| DELETE | /api/skills/[id] |
حذف نصب یک مهارت |
| POST | /api/skills/install |
نصب یک مهارت از یک مانیفست خام — بدنه: {name, version, description, schema:{input, output}, handlerCode, apiKeyId?} |
| GET | /api/skills/executions |
لیست اجرای مهارتهای اخیر (ردیابی حسابرسی با ورودیها/خروجیها/مدت زمان) |
| GET | /api/skills/marketplace?q=... |
لیست جستجو/محبوب از بازار SkillsMP (نیاز به تنظیم skillsmpApiKey دارد) |
| POST | /api/skills/marketplace/install |
نصب یک مهارت با شناسه از SkillsMP |
| GET | /api/skills/skillssh?q=&limit= |
جستجو در رجیستری skills.sh |
| POST | /api/skills/skillssh/install |
نصب یک مهارت با شناسه از skills.sh |
احراز هویت: جلسه مدیریت/کلید API. مسیرهای جستجوی بازار هم احراز هویت مدیریت و هم یک کلید API Bearer (isAuthenticated) را میپذیرند.
حافظه
ذخیرهسازی حافظه مکالمهای/واقعی پایدار، با دامنه محدود به ازای هر کلید API / نشست.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/memory |
لیست حافظهها — ?apiKeyId=, ?type=, ?sessionId=, ?q=, با صفحهبندی offset/limit یا page/limit |
| POST | /api/memory |
ایجاد حافظه — بدنه توسط Zod اعتبارسنجی میشود: {content, key, type?, sessionId?, apiKeyId?, metadata?, expiresAt?} |
| GET | /api/memory/[id] |
بازیابی یک حافظه |
| DELETE | /api/memory/[id] |
حذف یک حافظه |
| GET | /api/memory/health |
وضعیت سلامت زیرسیستم حافظه (اتصال به پایگاه داده، بکاند جاسازیها، وضعیت شاخص برداری) |
احراز هویت: نشست مدیریتی/کلید API (requireManagementAuth). شمارشگر type: FACTUAL, EPISODIC, SEMANTIC, PROCEDURAL (به MemoryType در src/lib/memory/types.ts مراجعه کنید).
سرور MCP
OmniRoute یک سرور پروتکل زمینه مدل (Model Context Protocol) تعبیهشده با 3 انتقال (stdio, SSE, streamable-http) و ابزارهای محدود شده را ارائه میدهد. نقاط پایانی داشبورد زیر دادههای وضعیت/حسابرسی را میخوانند و انتقالهای HTTP را پروکسی میکنند.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/mcp/status |
ضربان قلب، انتقال، وضعیت آنلاین، آخرین تماس، ابزارهای برتر، نرخ موفقیت 24 ساعته |
| GET | /api/mcp/tools |
لیست ابزارهای MCP با name, description, scopes, phase, auditLevel, sourceEndpoints |
| GET | /api/mcp/sse |
باز کردن جریان SSE برای انتقال SSE (در صورت غیرفعال بودن MCP یا عدم تطابق انتقال، 503 برمیگرداند) |
| POST | /api/mcp/sse |
ارسال فریم JSON-RPC از طریق انتقال SSE |
| GET | /api/mcp/stream |
باز کردن سمت SSE از انتقال HTTP قابل جریان (پیامهای آغاز شده توسط سرور) |
| POST | /api/mcp/stream |
ارسال فریم JSON-RPC از طریق انتقال HTTP قابل جریان |
| DELETE | /api/mcp/stream |
پایان دادن به یک نشست HTTP قابل جریان |
| GET | /api/mcp/audit |
پرس و جو از گزارش حسابرسی — ?limit=, ?offset=, ?tool=, `?success=true |
| GET | /api/mcp/audit/stats |
آمار تجمیعی حسابرسی (مجموع، نرخ موفقیت، میانگین مدت زمان، ابزارهای برتر) |
احراز هویت: انتقالهای sse/stream از سطح احراز هویت خاص MCP (کلید API Bearer با دامنه mcp) پیروی میکنند؛ مسیرهای status/tools/audit* از داشبورد قابل خواندن هستند (هیچ احراز هویت اضافی فراتر از دسترسی به هاست داشبورد مورد نیاز نیست).
هر دو انتقال HTTP توسط
settings.mcpEnabledوsettings.mcpTransportکنترل میشوند — عدم تطابق انتقال400و وضعیت غیرفعال MCP503را برمیگرداند.
سرور A2A
OmniRoute یک نقطه پایانی JSON-RPC 2.0 A2A (Agent-to-Agent) به همراه یک پوشش REST برای استفاده در بازرسی/داشبورد ارائه میدهد.
JSON-RPC
POST /a2a
Authorization: Bearer your-api-key # اختیاری است مگر اینکه OMNIROUTE_API_KEY تنظیم شده باشد
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"skill": "smart-routing",
"messages": [{"role": "user", "content": "Route this coding task"}]
}
}
متدهای پشتیبانی شده (همه مشروط به settings.a2aEnabled):
| متد | توضیحات |
|---|---|
message/send |
اجرای همزمان مهارت؛ {task, artifacts, metadata} را برمیگرداند |
message/stream |
اجرای جریانی SSE از همان مجموعه مهارت |
tasks/get |
بازیابی یک وظیفه بر اساس taskId |
tasks/cancel |
لغو یک وظیفه بر اساس taskId |
مهارتهای داخلی: smart-routing, quota-management, provider-discovery, cost-analysis, health-report.
کارت عامل
GET /.well-known/agent.json
کارت عامل عمومی A2A (نام، توضیحات، قابلیتها، کاتالوگ مهارت، طرح احراز هویت) را برمیگرداند — به صورت عمومی برای ۱ ساعت کش میشود. احراز هویت لازم نیست.
کمککنندههای REST
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/a2a/status |
A2A فعال + آمار وظایف + خلاصه کارت عامل کش شده |
| GET | /api/a2a/tasks |
لیست وظایف — `?state=submitted |
| POST | /api/a2a/tasks |
(به عنوان کمککننده REST پیادهسازی نشده است — از طریق JSON-RPC message/send ایجاد کنید) |
| GET | /api/a2a/tasks/[id] |
بازیابی یک وظیفه |
| POST | /api/a2a/tasks/[id]/cancel |
لغو یک وظیفه |
احراز هویت: کمککنندههای REST بدون احراز هویت مدیریتی (قابل خواندن در داشبورد) اجرا میشوند؛ مسیر JSON-RPC /a2a در صورت پیکربندی از Bearer OMNIROUTE_API_KEY استفاده میکند.
Cloud، Evals و Assess
| متد | مسیر | توضیحات | ||
|---|---|---|---|---|
| POST | /api/cloud/auth |
یک کلید Bearer را تأیید میکند و اتصالهای ماسکشدهٔ ارائهدهندگان بههمراه نامهای مستعار مدل را برای کلاینتهای همگامسازی ابری بازمیگرداند | ||
| POST | /api/cloud/credentials/update |
اطلاعات احراز هویت رمزنگاریشدهٔ یک ارائهدهندهٔ همگامشده با ابر را بهروزرسانی میکند | ||
| POST | /api/cloud/model/resolve |
یک شناسهٔ منطقی مدل را با استفاده از جدول مسیریابی محلی به ارائهدهنده/مدل مشخص تبدیل میکند | ||
| GET | /api/cloud/models/alias |
نامهای مستعار مدل را همانگونه که برای همگامسازی ابری ارائه میشوند فهرست میکند | ||
| GET | /api/assess |
جدیدترین دستهبندیهای ارزیابی را بهتفکیک ارائهدهنده/مدل میخواند | ||
| POST | /api/assess |
یک ارزیابی را اجرا میکند — بدنه: `{scope: {type:"all"} | {type:"provider", providerId} | {type:"model", modelId}, trigger?}` |
| GET | /api/evals |
مجموعههای ارزیابی داخلی و جدیدترین اجراها را فهرست میکند | ||
| POST | /api/evals |
اجرای یک ارزیابی را آغاز میکند | ||
| POST | /api/evals/suites |
یک مجموعهٔ ارزیابی سفارشی ایجاد میکند — بدنه توسط evalSuiteSaveSchema اعتبارسنجی میشود |
||
| GET | /api/evals/suites/[id] |
یک مجموعهٔ ارزیابی سفارشی را بازیابی میکند |
احراز هویت: /api/cloud/auth یک کلید Bearer را مستقیماً اعتبارسنجی میکند و فقط برای کلیدی با دامنهٔ manage / admin، کلید ماسکشده و projectId هر اتصال را بازمیگرداند؛ سایر مسیرهای /api/cloud/*، /api/evals/* و /api/assess به نشست مدیریتی/کلید API نیاز دارند. درخواست POST به /api/assess از validateBody همراه با یک شِمای دامنهٔ اجتماع متمایزشده استفاده میکند.
مدیریت ACP (پروتکل کلاینت عامل)
به عنوان فرآیندهای فرزند. این نقاط پایانی، شناسایی عامل ACP و ثبت عامل سفارشی را مدیریت میکنند.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/acp/agents |
لیست تمام عوامل CLI شناخته شده (داخلی + سفارشی) به همراه وضعیت نصب، نسخه، و باینری |
| POST | /api/acp/agents |
ثبت یک عامل ACP سفارشی یا بازسازی کش — بدنه: {id, name, binary, versionCommand, providerAlias, spawnArgs, protocol} یا {action: "refresh"} |
| DELETE | /api/acp/agents |
حذف یک عامل ACP سفارشی — پارامتر کوئری: ?id=<agentId> |
نمونه پاسخ (GET /api/acp/agents):
{
"agents": [
{
"id": "claude",
"name": "Claude Code CLI",
"binary": "claude",
"version": "1.0.45",
"installed": true,
"protocol": "stdio",
"providerAlias": "claude",
"isCustom": false
},
{
"id": "my-custom-cli",
"name": "My Custom CLI",
"installed": false,
"protocol": "stdio",
"providerAlias": "my-provider",
"isCustom": true
}
],
"cacheTtlMs": 60000,
"cacheAge": 1234
}
احراز هویت: نیاز به نشست مدیریتی (کوکی auth_token داشبورد) یا یک کلید API با دامنه مدیریتی دارد.
برای جزئیات کامل به چارچوب ACP مراجعه کنید.
تجزیه و تحلیل و قابلیت مشاهده
نقاط پایانی تجزیه و تحلیل بلادرنگ برای نظارت بر مسیریابی، فشردهسازی و تنوع ارائهدهنده. اینها صفحات /dashboard/analytics/* را تغذیه میکنند.
تجزیه و تحلیل مسیریابی خودکار
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/analytics/auto-routing |
آمار تجمیعی مسیریابی خودکار: کل تماسها، توزیع استراتژی، توزیع رده، ارائهدهندگان برتر |
| GET | /api/analytics/auto-routing?days=7 |
آمار بر اساس بازه زمانی (پیشفرض ۲۴ ساعت) |
نمونه پاسخ:
{
"window": "24h",
"totalCalls": 1234,
"strategyBreakdown": {
"rules": 800,
"cost": 200,
"latency": 150,
"sla-aware": 50,
"lkgp": 34
},
"tierBreakdown": {
"ultra": 100,
"pro": 500,
"standard": 400,
"free": 234
},
"topProviders": [
{ "provider": "openai", "calls": 500, "avgLatencyMs": 850 },
{ "provider": "anthropic", "calls": 300, "avgLatencyMs": 1200 }
]
}
تجزیه و تحلیل فشردهسازی
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/analytics/compression |
آمار تجمیعی فشردهسازی: توکنهای ذخیره شده، درصد صرفهجویی، توزیع حالت، استفاده از موتور |
نمونه پاسخ:
{
"window": "24h",
"totalOriginalTokens": 5000000,
"totalCompressedTokens": 3500000,
"totalSavings": 1500000,
"savingsPct": 30.0,
"modeBreakdown": {
"lite": 400,
"standard": 600,
"aggressive": 100,
"ultra": 50,
"rtk": 84
},
"engineBreakdown": {
"caveman": 800,
"rtk": 434
}
}
ردیابی تنوع ارائهدهنده
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/analytics/diversity |
ردیابی تنوع مبتنی بر آنتروپی شانون: با اندازهگیری پراکندگی ارائهدهنده، از نقاط شکست واحد جلوگیری میکند. |
نمونه پاسخ:
{
"window": "24h",
"shannonEntropy": 2.45,
"maxEntropy": 3.17,
"diversityRatio": 0.77,
"providerUsage": {
"openai": 0.4,
"anthropic": 0.25,
"google": 0.2,
"kiro": 0.15
},
"warnings": ["اوپنایآی ۴۰٪ از ترافیک را به خود اختصاص داده است — تنوعبخشی را در نظر بگیرید"]
}
احراز هویت: نیاز به نشست مدیریتی یا کلید API با دامنه مدیریتی دارد.
عملیات مدیریتی
نقاط پایانی (endpoints) فقط برای مدیران جهت مدیریت عملیاتی.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/admin/concurrency |
خواندن محدودیتهای همزمانی فعلی (سراسری + به ازای هر ارائهدهنده) |
| POST | /api/admin/concurrency |
بهروزرسانی محدودیتهای همزمانی — بدنه: {global?: number, perProvider?: Record<string, number>} |
احراز هویت: نیازمند نشست مدیریتی با دامنه مدیر (admin scope) است.
مدیریت ابزارهای CLI
مدیریت ابزارهای CLI که با OmniRoute یکپارچه میشوند (antigravity, commandCode, devin-cli و غیره). برای مشاهده لیست کامل به مرجع ارائهدهنده مراجعه کنید.
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/cli-tools/all-statuses |
وضعیت تمام ابزارهای CLI (نصبشده، نسخه، آخرین مشاهده) |
| GET | /api/cli-tools/status |
جزئیات وضعیت برای یک ابزار CLI (پرسوجوی ?tool=) |
| POST | /api/cli-tools/apply |
نوشتن پیکربندی تولیدشده یک ابزار (پیشنمایشهای dryRun؛ 422 + containerEphemeralTarget در حالت کانتینری؛ migration به یک Codex YAML قدیمی اشاره دارد) |
| GET | /api/cli-tools/backups |
لیست پشتیبانگیریهای پیکربندی ابزار CLI |
| POST | /api/cli-tools/backups |
ایجاد یک پشتیبان از تمام پیکربندیهای ابزار CLI |
| POST | /api/cli-tools/backups |
بازیابی: همین نقطه پایانی با {tool, backupId} در بدنه، آن پشتیبان را بازیابی میکند |
| GET | /api/cli-tools/antigravity-mitm |
وضعیت پروکسی MITM آنتیگراویتی (ابزار CLI "antigravity-mitm") |
| POST | /api/cli-tools/antigravity-mitm/alias |
پیکربندی نامهای مستعار (aliases) antigravity-mitm |
احراز هویت: نیازمند نشست مدیریتی است.
مهارتهای عامل (Agent)
مدیریت مهارتهای عاملهای هوش مصنوعی (مشابه GPTهای سفارشی OpenAI اما برای عاملها).
| متد | مسیر | توضیحات |
|---|---|---|
| GET | /api/agent-skills |
لیست تمام مهارتهای عامل (داخلی + سفارشی) |
| GET | /api/agent-skills/[id] |
دریافت یک مهارت عامل خاص |
| POST | /api/agent-skills |
ایجاد یک مهارت عامل سفارشی — بدنه: {name, description, prompt, model?, temperature?} |
| PUT | /api/agent-skills/[id] |
بهروزرسانی یک مهارت عامل سفارشی |
| DELETE | /api/agent-skills/[id] |
حذف یک مهارت عامل سفارشی |
| GET | /api/agent-skills/[id]/raw |
دریافت پرامپت خام + فراداده (بدون اجرا) |
| POST | /api/agent-skills/generate |
تولید یک مهارت جدید توسط هوش مصنوعی از یک توصیف زبان طبیعی |
احراز هویت: نیازمند نشست مدیریتی یا کلید API با دامنه مدیریتی است.
مدیریت کش
کش معنایی و کش استدلال را مدیریت کنید.
| Method | Path | Description |
|---|---|---|
| GET | /api/cache |
نمای کلی کش: تعداد کل ورودیها، نرخ موفقیت، حجم روی دیسک |
| GET | /api/cache/entries |
لیست ورودیهای کش شده (با صفحهبندی) |
| DELETE | /api/cache/entries |
حذف ورودیهای کش (فیلتر بر اساس پارامترهای کوئری) |
| GET | /api/cache/stats |
آمار دقیق کش (به ازای هر ارائهدهنده، به ازای هر مدل) |
| GET | /api/cache/reasoning |
وضعیت کش استدلال (برای بازپخش استدلال) |
| DELETE | /api/cache/reasoning |
پاک کردن کش استدلال — پارامترهای کوئری: ?toolCallId=<id> (تکی) یا ?provider=<p> یا بدون پارامتر (همه) |
احراز هویت: نیاز به نشست مدیریتی دارد.
سیستم حافظه
حافظه پایدار (FTS5 + جاسازیهای برداری) را مدیریت کنید.
| Method | Path | Description |
|---|---|---|
| GET | /api/memory |
لیست ورودیهای حافظه (فیلتر بر اساس دامنه، نوع، کوئری جستجو) |
| POST | /api/memory |
ایجاد یک ورودی حافظه جدید — بدنه: {scope, type, content, metadata?} |
| GET | /api/memory/[id] |
دریافت یک ورودی حافظه خاص |
| PUT | /api/memory/[id] |
بهروزرسانی یک ورودی حافظه |
| DELETE | /api/memory/[id] |
حذف یک ورودی حافظه |
| GET | /api/memory?q= |
جستجوی حافظه (FTS5 + بردار) — آمار در همان پاسخ گنجانده شده است |
احراز هویت: نیاز به نشست مدیریتی یا کلید API با دامنه مدیریتی دارد.
وبهوکها
اشتراکهای وبهوک را برای رویدادها مدیریت کنید.
| Method | Path | Description |
|---|---|---|
| GET | /api/webhooks |
لیست تمام اشتراکهای وبهوک |
| POST | /api/webhooks |
ایجاد یک اشتراک وبهوک — بدنه: {url, events[], secret?, active?} |
| GET | /api/webhooks/[id] |
دریافت یک اشتراک وبهوک خاص |
| PUT | /api/webhooks/[id] |
بهروزرسانی یک اشتراک وبهوک |
| DELETE | /api/webhooks/[id] |
حذف یک اشتراک وبهوک |
| GET | /api/webhooks/[id]/deliveries |
لیست تاریخچه تحویل برای یک وبهوک (گزارش موفقیت/شکست) |
| POST | /api/webhooks/[id]/test |
ارسال یک رویداد آزمایشی به یک وبهوک |
احراز هویت: نیاز به نشست مدیریتی دارد.
برای انواع کامل رویدادها به چارچوب وبهوکها مراجعه کنید.
چارچوب مهارتها (Skills Framework)
مدیریت مهارتها (چارچوب افزونههای عاملمحور).
| Method | Path | Description |
|---|---|---|
| GET | /api/skills |
فهرست کردن تمام مهارتهای نصب شده (داخلی + سفارشی) |
| POST | /api/skills/install |
نصب یک مهارت از مسیر محلی یا URL |
| DELETE | /api/skills/[id] |
حذف نصب یک مهارت |
| PUT | /api/skills/[id] |
فعال یا غیرفعال کردن یک مهارت — body: {enabled?: boolean, mode?: "on" | "off" | "auto"} |
| POST | /api/skills/executions |
اجرای یک مهارت — body: {skillName, apiKeyId, input?, sessionId?} |
| GET | /api/skills/executions |
فهرست کردن تاریخچه اجرای تمام مهارتها (فیلتر بر اساس ?apiKeyId=) |
احراز هویت: نیازمند نشست مدیریتی یا کلید API با دامنه مدیریتی است.
برای جزئیات کامل به چارچوب مهارتها (Skills Framework) مراجعه کنید.
افزونهها (Plugins)
مدیریت افزونههای OmniRoute (افزونههای شخص ثالث).
| Method | Path | Description |
|---|---|---|
| GET | /api/plugins |
فهرست کردن افزونههای نصب شده |
| POST | /api/plugins/marketplace/install |
نصب یک افزونه از بازارچه |
| DELETE | /api/plugins/[name] |
حذف نصب یک افزونه |
| POST | /api/plugins/[name]/activate |
فعال کردن یک افزونه |
| POST | /api/plugins/[name]/deactivate |
غیرفعال کردن یک افزونه |
| GET | /api/plugins/[name]/config |
دریافت پیکربندی افزونه |
| PUT | /api/plugins/[name]/config |
بهروزرسانی پیکربندی افزونه |
احراز هویت: نیازمند نشست مدیریتی است.
برای جزئیات کامل به چارچوب افزونهها (Plugins Framework) مراجعه کنید.
مسیریابی سایه (Shadow Routing)
مقایسه سایه / A-B ارائهدهندگان یک سطح REST مستقل نیست — از طریق مسیریابی ترکیبی (combo routing) پیکربندی میشود (به ترکیب خودکار (Auto-Combo) مراجعه کنید). معیارهای مقایسه برای هر ترکیب توسط GET /api/combos/metrics ارائه میشوند.
محافظها (Guardrails)
بازرسی محافظهای زمان اجرا (شناسایی PII، شناسایی تزریق پرامپت، پلسازی بینایی). محافظها در هر درخواست اجرا میشوند؛ انصراف از هر فراخوانی از طریق هدر درخواست x-omniroute-disabled-guardrails انجام میشود — هیچ سطح فعال/غیرفعالسازی دائمی وجود ندارد.
| Method | Path | Description |
|---|---|---|
| GET | /api/guardrails |
فهرست کردن محافظهای ثبتشده و وضعیت آنها (نام / فعال / اولویت) |
| POST | /api/guardrails/test |
اجرای آزمایشی خط لوله پیش از فراخوانی بر روی یک ورودی نمونه — body: {input, disabledGuardrails?} |
احراز هویت: نیازمند نشست مدیریتی است.
برای جزئیات کامل به امنیت > محافظها (Security > Guardrails) مراجعه کنید.
احراز هویت
برای چهار خانواده اعتبارنامه (نشست داشبورد، توکن CLI محلی، توکن دسترسی oma_live_…، کلید API با دامنه مدیریت) و تفاوت آنها با کلیدهای استنتاج، به احراز هویت مدیریت مراجعه کنید.
- مسیرهای داشبورد (
/dashboard/*) از کوکیauth_tokenاستفاده میکنند. - ورود از هش رمز عبور ذخیره شده استفاده میکند؛ در صورت عدم وجود، به
INITIAL_PASSWORDبازمیگردد. requireLoginاز طریق/api/settings/require-loginقابل تغییر است.- مسیرهای
/v1/*در صورتREQUIRE_API_KEY=trueبه صورت اختیاری به کلید API از نوع Bearer نیاز دارند. - "توکن مدیریت" / "کلید API با دامنه مدیریت" در این مرجع به یکی از خانوادههای ذکر شده در آن راهنما اشاره دارد — نه یک نوع راز اضافی تعریف نشده.
تغییر اساسی (v3.8.0) — مسیرهای
/api/v1/agents/tasks/*و نقاط پایانی مدیریت زمانبندی (cooldown) اکنون به احراز هویت مدیریت (کوکیauth_tokenداشبورد یا یک کلید API با دامنه مدیریت) نیاز دارند. کلاینتهایی که قبلاً این مسیرها را بدون احراز هویت فراخوانی میکردند، اکنون401 Unauthorizedدریافت خواهند کرد. به کامیت588a0333(fix(auth): require management auth for agent and cooldown APIs) مراجعه کنید.