# API Reference (हिन्दी) 🌐 **Languages:** 🇺🇸 [English](../../../../reference/API_REFERENCE.md) · 🇪🇹 [am](../../../am/docs/reference/API_REFERENCE.md) · 🇸🇦 [ar](../../../ar/docs/reference/API_REFERENCE.md) · 🇦🇿 [az](../../../az/docs/reference/API_REFERENCE.md) · 🇧🇬 [bg](../../../bg/docs/reference/API_REFERENCE.md) · 🇧🇩 [bn](../../../bn/docs/reference/API_REFERENCE.md) · 🇧🇦 [bs](../../../bs/docs/reference/API_REFERENCE.md) · 🇨🇿 [cs](../../../cs/docs/reference/API_REFERENCE.md) · 🇩🇰 [da](../../../da/docs/reference/API_REFERENCE.md) · 🇩🇪 [de](../../../de/docs/reference/API_REFERENCE.md) · 🇬🇷 [el](../../../el/docs/reference/API_REFERENCE.md) · 🇪🇸 [es](../../../es/docs/reference/API_REFERENCE.md) · 🇪🇪 [et](../../../et/docs/reference/API_REFERENCE.md) · 🇮🇷 [fa](../../../fa/docs/reference/API_REFERENCE.md) · 🇫🇮 [fi](../../../fi/docs/reference/API_REFERENCE.md) · 🇫🇷 [fr](../../../fr/docs/reference/API_REFERENCE.md) · 🇮🇪 [ga](../../../ga/docs/reference/API_REFERENCE.md) · 🇮🇳 [gu](../../../gu/docs/reference/API_REFERENCE.md) · 🇳🇬 [ha](../../../ha/docs/reference/API_REFERENCE.md) · 🇮🇱 [he](../../../he/docs/reference/API_REFERENCE.md) · 🇭🇷 [hr](../../../hr/docs/reference/API_REFERENCE.md) · 🇭🇺 [hu](../../../hu/docs/reference/API_REFERENCE.md) · 🇦🇲 [hy](../../../hy/docs/reference/API_REFERENCE.md) · 🇮🇩 [id](../../../id/docs/reference/API_REFERENCE.md) · 🇳🇬 [ig](../../../ig/docs/reference/API_REFERENCE.md) · 🇮🇹 [it](../../../it/docs/reference/API_REFERENCE.md) · 🇯🇵 [ja](../../../ja/docs/reference/API_REFERENCE.md) · 🇬🇪 [ka](../../../ka/docs/reference/API_REFERENCE.md) · 🇰🇭 [km](../../../km/docs/reference/API_REFERENCE.md) · 🇮🇳 [kn](../../../kn/docs/reference/API_REFERENCE.md) · 🇰🇷 [ko](../../../ko/docs/reference/API_REFERENCE.md) · 🇱🇹 [lt](../../../lt/docs/reference/API_REFERENCE.md) · 🇱🇻 [lv](../../../lv/docs/reference/API_REFERENCE.md) · 🇮🇳 [ml](../../../ml/docs/reference/API_REFERENCE.md) · 🇮🇳 [mr](../../../mr/docs/reference/API_REFERENCE.md) · 🇲🇾 [ms](../../../ms/docs/reference/API_REFERENCE.md) · 🇲🇹 [mt](../../../mt/docs/reference/API_REFERENCE.md) · 🇲🇲 [my](../../../my/docs/reference/API_REFERENCE.md) · 🇳🇵 [ne](../../../ne/docs/reference/API_REFERENCE.md) · 🇳🇱 [nl](../../../nl/docs/reference/API_REFERENCE.md) · 🇳🇴 [no](../../../no/docs/reference/API_REFERENCE.md) · 🇮🇳 [or](../../../or/docs/reference/API_REFERENCE.md) · 🇮🇳 [pa](../../../pa/docs/reference/API_REFERENCE.md) · 🇵🇭 [phi](../../../phi/docs/reference/API_REFERENCE.md) · 🇵🇱 [pl](../../../pl/docs/reference/API_REFERENCE.md) · 🇵🇹 [pt](../../../pt/docs/reference/API_REFERENCE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/API_REFERENCE.md) · 🇷🇴 [ro](../../../ro/docs/reference/API_REFERENCE.md) · 🇷🇺 [ru](../../../ru/docs/reference/API_REFERENCE.md) · 🇱🇰 [si](../../../si/docs/reference/API_REFERENCE.md) · 🇸🇰 [sk](../../../sk/docs/reference/API_REFERENCE.md) · 🇸🇮 [sl](../../../sl/docs/reference/API_REFERENCE.md) · 🇷🇸 [sr](../../../sr/docs/reference/API_REFERENCE.md) · 🇸🇪 [sv](../../../sv/docs/reference/API_REFERENCE.md) · 🇰🇪 [sw](../../../sw/docs/reference/API_REFERENCE.md) · 🇮🇳 [ta](../../../ta/docs/reference/API_REFERENCE.md) · 🇮🇳 [te](../../../te/docs/reference/API_REFERENCE.md) · 🇹🇭 [th](../../../th/docs/reference/API_REFERENCE.md) · 🇹🇷 [tr](../../../tr/docs/reference/API_REFERENCE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/API_REFERENCE.md) · 🇵🇰 [ur](../../../ur/docs/reference/API_REFERENCE.md) · 🇺🇿 [uz](../../../uz/docs/reference/API_REFERENCE.md) · 🇻🇳 [vi](../../../vi/docs/reference/API_REFERENCE.md) · 🇳🇬 [yo](../../../yo/docs/reference/API_REFERENCE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/API_REFERENCE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/API_REFERENCE.md) --- 🌐 **भाषाएँ:** 🇺🇸 [English](./API_REFERENCE.md) | 🇪🇹 [አማርኛ](../i18n/am/docs/reference/API_REFERENCE.md) | 🇸🇦 [العربية](../i18n/ar/docs/reference/API_REFERENCE.md) | 🇦🇿 [Azərbaycan dili](../i18n/az/docs/reference/API_REFERENCE.md) | 🇧🇬 [Български](../i18n/bg/docs/reference/API_REFERENCE.md) | 🇧🇩 [বাংলা](../i18n/bn/docs/reference/API_REFERENCE.md) | 🇧🇦 [Bosanski](../i18n/bs/docs/reference/API_REFERENCE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/reference/API_REFERENCE.md) | 🇩🇰 [Dansk](../i18n/da/docs/reference/API_REFERENCE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/reference/API_REFERENCE.md) | 🇬🇷 [Ελληνικά](../i18n/el/docs/reference/API_REFERENCE.md) | 🇪🇸 [Español](../i18n/es/docs/reference/API_REFERENCE.md) | 🇪🇪 [Eesti](../i18n/et/docs/reference/API_REFERENCE.md) | 🇮🇷 [فارسی](../i18n/fa/docs/reference/API_REFERENCE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/reference/API_REFERENCE.md) | 🇫🇷 [Français](../i18n/fr/docs/reference/API_REFERENCE.md) | 🇮🇪 [Gaeilge](../i18n/ga/docs/reference/API_REFERENCE.md) | 🇮🇳 [ગુજરાતી](../i18n/gu/docs/reference/API_REFERENCE.md) | 🇳🇬 [Hausa](../i18n/ha/docs/reference/API_REFERENCE.md) | 🇮🇱 [עברית](../i18n/he/docs/reference/API_REFERENCE.md) | 🇮🇳 [हिन्दी](../i18n/hi/docs/reference/API_REFERENCE.md) | 🇭🇷 [Hrvatski](../i18n/hr/docs/reference/API_REFERENCE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/reference/API_REFERENCE.md) | 🇦🇲 [Հայերեն](../i18n/hy/docs/reference/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/reference/API_REFERENCE.md) | 🇳🇬 [Igbo](../i18n/ig/docs/reference/API_REFERENCE.md) | 🇮🇹 [Italiano](../i18n/it/docs/reference/API_REFERENCE.md) | 🇯🇵 [日本語](../i18n/ja/docs/reference/API_REFERENCE.md) | 🇬🇪 [ქართული](../i18n/ka/docs/reference/API_REFERENCE.md) | 🇰🇭 [ខ្មែរ](../i18n/km/docs/reference/API_REFERENCE.md) | 🇮🇳 [ಕನ್ನಡ](../i18n/kn/docs/reference/API_REFERENCE.md) | 🇰🇷 [한국어](../i18n/ko/docs/reference/API_REFERENCE.md) | 🇱🇹 [Lietuvių](../i18n/lt/docs/reference/API_REFERENCE.md) | 🇱🇻 [Latviešu](../i18n/lv/docs/reference/API_REFERENCE.md) | 🇮🇳 [മലയാളം](../i18n/ml/docs/reference/API_REFERENCE.md) | 🇮🇳 [मराठी](../i18n/mr/docs/reference/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/reference/API_REFERENCE.md) | 🇲🇹 [Malti](../i18n/mt/docs/reference/API_REFERENCE.md) | 🇲🇲 [မြန်မာ](../i18n/my/docs/reference/API_REFERENCE.md) | 🇳🇵 [नेपाली](../i18n/ne/docs/reference/API_REFERENCE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/reference/API_REFERENCE.md) | 🇳🇴 [Norsk](../i18n/no/docs/reference/API_REFERENCE.md) | 🇮🇳 [ଓଡ଼ିଆ](../i18n/or/docs/reference/API_REFERENCE.md) | 🇮🇳 [ਪੰਜਾਬੀ](../i18n/pa/docs/reference/API_REFERENCE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/reference/API_REFERENCE.md) | 🇵🇱 [Polski](../i18n/pl/docs/reference/API_REFERENCE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/reference/API_REFERENCE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/reference/API_REFERENCE.md) | 🇷🇴 [Română](../i18n/ro/docs/reference/API_REFERENCE.md) | 🇷🇺 [Русский](../i18n/ru/docs/reference/API_REFERENCE.md) | 🇱🇰 [සිංහල](../i18n/si/docs/reference/API_REFERENCE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/reference/API_REFERENCE.md) | 🇸🇮 [Slovenščina](../i18n/sl/docs/reference/API_REFERENCE.md) | 🇷🇸 [Српски](../i18n/sr/docs/reference/API_REFERENCE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/reference/API_REFERENCE.md) | 🇰🇪 [Kiswahili](../i18n/sw/docs/reference/API_REFERENCE.md) | 🇮🇳 [தமிழ்](../i18n/ta/docs/reference/API_REFERENCE.md) | 🇮🇳 [తెలుగు](../i18n/te/docs/reference/API_REFERENCE.md) | 🇹🇭 [ไทย](../i18n/th/docs/reference/API_REFERENCE.md) | 🇹🇷 [Türkçe](../i18n/tr/docs/reference/API_REFERENCE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/reference/API_REFERENCE.md) | 🇵🇰 [اردو](../i18n/ur/docs/reference/API_REFERENCE.md) | 🇺🇿 [Oʻzbekcha](../i18n/uz/docs/reference/API_REFERENCE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/reference/API_REFERENCE.md) | 🇳🇬 [Yorùbá](../i18n/yo/docs/reference/API_REFERENCE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/reference/API_REFERENCE.md) | 🇹🇼 [中文 (繁體)](../i18n/zh-TW/docs/reference/API_REFERENCE.md) OmniRoute API के लिए मुख्य संदर्भ। इसमें सार्वजनिक `/v1` सतह और सर्वाधिक उपयोग किए जाने वाले प्रबंधन एंडपॉइंट शामिल हैं; मशीन-पठनीय [`docs/openapi.yaml`](../openapi.yaml) और `src/app/api/` के अंतर्गत रूट ट्री संपूर्ण स्रोत हैं। OpenAI-संगत प्रोटोकॉल और प्रदाता क्षमता मैट्रिक्स की विस्तृत जानकारी के लिए देखें: [`OPENAI_COMPATIBILITY.md`](./OPENAI_COMPATIBILITY.md)। --- ## विषय-सूची - [चैट पूर्णताएँ](#chat-completions) - [विशिष्ट प्रबंधित सत्र लीज़](#exclusive-managed-session-leases) - [एम्बेडिंग्स](#embeddings) - [छवि निर्माण](#image-generation) - [दस्तावेज़ OCR](#document-ocr) - [मॉडल सूचीबद्ध करें](#list-models) - [प्रदाता प्लगइन मैनिफ़ेस्ट](#provider-plugin-manifest) - [संगतता एंडपॉइंट्स](#compatibility-endpoints) - [फ़ाइल्स API](#files-api) - [बैचेस API](#batches-api) - [खोज API](#search-api) - [WebSocket स्ट्रीमिंग](#websocket-streaming) - [कोटा और समस्या रिपोर्टिंग](#quotas--issues-reporting) - [सिमेंटिक कैश](#semantic-cache) - [डैशबोर्ड और प्रबंधन](#dashboard--management) - [कॉम्बो प्रबंधन](#combo-management) - [वेबहुक्स](#webhooks) - [पंजीकृत कुंजियाँ (स्वतः-प्रबंधन)](#registered-keys-auto-management) - [एजेंट्स प्रोटोकॉल](#agents-protocol) - [प्रबंधन प्रॉक्सी](#management-proxies) - [रेज़िलिएंस (विस्तारित)](#resilience-extended) - [कौशल](#skills) - [मेमोरी](#memory) - [MCP सर्वर](#mcp-server) - [A2A सर्वर](#a2a-server) - [क्लाउड, मूल्यांकन और आकलन](#cloud-evals--assess) - [अनुरोध प्रसंस्करण](#request-processing) - [प्रमाणीकरण](#authentication) --- ## चैट पूर्णताएँ ```bash 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` | अनुरोध | इस अनुरोध के लिए मेमोरी + कौशल इंजेक्शन छोड़ने हेतु `true` पर सेट करें (no-cache के समान; प्रति-कॉल टोकन/लागत ओवरहेड से बचाता है) | | `X-OmniRoute-Progress` | अनुरोध | प्रगति इवेंट्स के लिए `true` पर सेट करें | | `X-Session-Id` | अनुरोध | बाहरी सत्र एफिनिटी के लिए स्टिकी सत्र कुंजी | | `x_session_id` | अनुरोध | अंडरस्कोर वाला प्रकार भी स्वीकार किया जाता है (प्रत्यक्ष HTTP) | | `X-OmniRoute-Session-Id` | अनुरोध | कॉलर द्वारा दिया गया सत्र/वार्तालाप टैग (मेमोरी को भी फ़ीड करता है)। मौजूद होने पर, प्रति-सत्र लागत एट्रिब्यूशन (#8249) के लिए इसे `call_logs.session_tag` में हूबहू सहेजा जाता है — अनुपस्थित होने पर इसे कभी संश्लेषित नहीं किया जाता | | `Idempotency-Key` | अनुरोध | डीडुप कुंजी (5s विंडो) | | `X-Request-Id` | अनुरोध | वैकल्पिक डीडुप कुंजी | | `X-OmniRoute-Cache` | प्रतिक्रिया | `HIT` या `MISS` (नॉन-स्ट्रीमिंग) | | `X-OmniRoute-Idempotent` | प्रतिक्रिया | डीडुप्लिकेट किए जाने पर `true` | | `X-OmniRoute-Progress` | प्रतिक्रिया | प्रगति ट्रैकिंग चालू होने पर `enabled` | | `X-OmniRoute-Session-Id` | प्रतिक्रिया | OmniRoute द्वारा उपयोग की गई प्रभावी सत्र ID | | `X-OmniRoute-Request-Id` | प्रतिक्रिया | अनुरोध सहसंबंध ID (जब ज्ञात हो) | | `X-OmniRoute-Version` | प्रतिक्रिया | OmniRoute बिल्ड संस्करण (हमेशा मौजूद) | | `X-OmniRoute-Cost-Saved` | प्रतिक्रिया | HIT पर कैश द्वारा बचाई गई USD राशि (केवल कैश हिट्स) | | `X-OmniRoute-Decision` | प्रतिक्रिया | रूटिंग ट्रेस: `strategy=; provider=; latency_ms=` (`` कॉम्बो रणनीति है, या गैर-कॉम्बो अनुरोध के लिए `single`) — पूर्णता प्रतिक्रियाओं में हमेशा मौजूद | > Nginx नोट: यदि आप अंडरस्कोर हेडर्स (उदाहरण के लिए `x_session_id`) पर निर्भर हैं, तो `underscores_in_headers on;` सक्षम करें। > **लागत टेलीमेट्री हेडर:** नॉन-स्ट्रीमिंग सफल प्रतिक्रियाओं में `X-OmniRoute-*` लागत-टेलीमेट्री सेट भी शामिल होता है — `X-OmniRoute-Response-Cost` (USD, निश्चित 10 दशमलव स्थान; मुफ़्त/बिना मूल्य-निर्धारण के लिए `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` (फेल-ओपन) होती है। > **कैश-हिट लागत अर्थविज्ञान:** सिमेंटिक-कैश HIT (`X-OmniRoute-Cache-Hit: true`) पर कोई अपस्ट्रीम कॉल नहीं की जाती, इसलिए `X-OmniRoute-Response-Cost` का मान `0.0000000000` होता है (हिट को सर्व करने की **वृद्धिशील** लागत)। मूल/संभावित लागत को अलग से `X-OmniRoute-Cost-Saved` में रिपोर्ट किया जाता है। बिलिंग उपभोक्ताओं को `X-OmniRoute-Response-Cost` का योग करना चाहिए (हिट की कोई लागत नहीं होती); कैश एनालिटिक्स `X-OmniRoute-Cost-Saved` को एग्रीगेट कर सकता है। ## एक्सक्लूसिव प्रबंधित सत्र लीज़ एक्सक्लूसिव प्रबंधित सत्र लीज़िंग एक ऑप्ट-इन, क्लाइंट-न्यूट्रल रूटिंग कॉन्ट्रैक्ट है: एक सक्रिय मालिक एक योग्य OmniRoute कनेक्शन रखता है। यह किसी मॉडल को लीज़ पर नहीं देता, OAuth की आवश्यकता नहीं होती, किसी विशेष क्लाइंट की पहचान नहीं करता, और न ही किसी विशेष प्रदाता की आवश्यकता होती है। प्रमाणीकरण करने वाली API कुंजी में `lease:exclusive` स्कोप और एक स्पष्ट गैर-रिक्त `allowedConnections` सूची होनी चाहिए। डेटाबेस म्यूटेशन बाउंड्री कुंजी निर्माण और आंशिक अपडेट पर दोनों फ़ील्ड को एक साथ लागू करती है। ```http POST /api/v1/session-leases Authorization: Bearer Content-Type: application/json X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters> {"action":"acquire","model":"glm/glm-4.6"} ``` सफल अधिग्रहण (acquire), नवीनीकरण (renew) और रिलीज़ (release) प्रतिक्रियाएँ टाइमस्टैम्प, `state`, और सटीक सकारात्मक `generation` को उजागर करती हैं, लेकिन कभी भी चयनित कनेक्शन या क्रेडेंशियल को नहीं। नवीनीकरण और रिलीज़ JSON बॉडी में जनरेशन प्रदान करते हैं: ```json { "action": "renew", "generation": 1 } ``` ```json { "action": "release", "generation": 1, "reason": "OWNER_EXIT" } ``` एक सक्रिय लीज़ मालिक अपने वर्तमान बाइंडिंग के लिए गोपनीयता-सुरक्षित डिस्प्ले मेटाडेटा का स्पष्ट रूप से अनुरोध कर सकता है: ```json { "action": "status", "generation": 1 } ``` ```json { "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 कुंजी, और एक डेटाबेस लेनदेन में सटीक सक्रिय जनरेशन द्वारा नियंत्रित होता है। `displayName` केवल ट्रिम किया गया कॉन्फ़िगर किया गया कनेक्शन नाम है; यदि कोई सुरक्षित कॉन्फ़िगर किया गया नाम मौजूद नहीं है तो यह `null` होता है। OmniRoute कभी भी ईमेल या जेनरेट की गई खाता पहचान को प्रतिस्थापित नहीं करता है। प्रदाता मान एक गैर-संवेदनशील डिस्प्ले लेबल है और कभी भी जेनरेट किया गया संगत-प्रदाता पहचानकर्ता नहीं होता है। क्रेडेंशियल, टोकन, कुकीज़, रॉ कनेक्शन या API कुंजी आईडी, मालिक हैश, फेंसिंग सीक्रेट्स, और आंतरिक रूटिंग डेटा को बाहर रखा गया है। गलत-कुंजी, गलत-मालिक, बासी-जनरेशन, गुम, समाप्त, जारी, और अमान्य लुकअप सभी कनेक्शन मेटाडेटा के बिना समान `409 LEASE_FENCE_STALE` त्रुटि लौटाते हैं। जिस क्लाइंट को क्षमता-प्रतीक्षा प्रतिक्रिया मिली है, उसके पास निरीक्षण करने के लिए कोई सक्रिय बाइंडिंग नहीं है। जब रूटिंग एक सक्रिय लीज़ को ट्रांज़िशन करता है, तो वही जनरेशन वैध रहती है और स्टेटस परमाणु रूप से नई बाइंडिंग लौटाता है, कभी भी पुरानी नहीं। मौजूदा क्लाइंट अपरिवर्तित रहते हैं क्योंकि अधिग्रहण, नवीनीकरण, रिलीज़ और प्रतीक्षा प्रतिक्रियाएँ अपने पिछले आकार को बनाए रखती हैं। यह सर्वर कॉन्ट्रैक्ट स्टॉक OpenAI Codex `/status` को नहीं बदलता है। स्टॉक Codex वर्तमान में अपने मॉडल प्रदाता और अंतर्निहित प्रमाणीकरण/खाता स्थिति की रिपोर्ट करता है लेकिन मनमाने कस्टम प्रदाता खाता मेटाडेटा को प्रस्तुत नहीं करता है; एक बाद के क्लाइंट एकीकरण को इस कार्रवाई को कॉल करना होगा और यह तय करना होगा कि `connection.displayName` को कैसे प्रदर्शित किया जाए। प्रत्येक प्रबंधित अनुमान अनुरोध तब दोनों नियंत्रण हेडर प्रदान करता है: ```http X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters> X-OmniRoute-Lease-Generation: 1 ``` सटीक मालिक, जनरेशन, सक्रिय कनेक्शन, और प्रमाणित API कुंजी को प्रत्येक समर्थित अपस्ट्रीम प्रयास से ठीक पहले नियंत्रित किया जाता है। किसी अन्य कुंजी के साथ मालिक और जनरेशन को फिर से चलाने से विफल हो जाता है, भले ही वह कुंजी उसी कनेक्शन की अनुमति देती हो। रॉ मालिकों को स्थायी नहीं किया जाता है, लॉग नहीं किया जाता है, अनुरोध स्नैपशॉट में बनाए नहीं रखा जाता है, या अपस्ट्रीम अग्रेषित नहीं किया जाता है। अस्थायी विवाद HTTP `429` को `Retry-After` और इसके साथ लौटाता है: ```json { "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:` | सक्षम होने पर एक एकल इंजन, उदा. `engine:rtk`। उस इंजन के लिए प्रति-अनुरोध ऑप्ट-इन। | | `` | एक नामित कॉम्बो, नाम से (केस-संवेदी नहीं) पहले, फिर आईडी से मिलान किया जाता है। | टिप्पणियाँ: - अज्ञात मानों को अनदेखा कर दिया जाता है (अनुरोध कभी अस्वीकृत नहीं होता है); समाधान सामान्य ऑपरेटर प्राथमिकता पर आता है। - यदि कई कॉम्बो एक नाम साझा करते हैं, तो एक नियतात्मक मिलान के लिए कॉम्बो **आईडी** पास करें। - एक कॉम्बो जिसका नाम `off` या `default` है, उसे नाम से नहीं चुना जा सकता है (उन कीवर्ड की व्याख्या पहले की जाती है); ऐसे कॉम्बो को उसकी आईडी से संदर्भित करें। - मास्टर संपीड़न स्विच एक हार्ड गेट है: जब संपीड़न वैश्विक स्तर पर अक्षम होता है, तो यह हेडर इसे सक्षम नहीं कर सकता है। लागू की गई योजना प्रतिक्रिया हेडर में वापस प्रतिध्वनित होती है: ``` X-OmniRoute-Compression: ; source= ``` जहाँ `` `request-header`, `routing-override`, `active-profile`, `auto-trigger`, `default`, या `off` में से एक है। --- ## एम्बेडिंग्स ```bash 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`) भी रिज़ॉल्व होते हैं। Jina embed/rerank/classify/segment पहले डैशबोर्ड के `jina-ai` क्रेडेंशियल्स का उपयोग करते हैं; `JINA_AI_API_KEY` का उपयोग फ़ॉलबैक के रूप में केवल तभी किया जाता है, जब कोई डैशबोर्ड कुंजी मौजूद न हो। `jina-reader` कार्ड केवल Reader / `r.jina.ai` के लिए है (`POST /v1/web/fetch`) और कभी भी एम्बेडिंग्स या रीरैंक उपलब्ध नहीं कराता। मल्टीमोडल समर्थन दर्शाने वाले रजिस्ट्री मॉडल अधिकतम 32 प्रदाता-निरपेक्ष संरचित आइटम भी स्वीकार करते हैं। मीडिया आइटम के प्रकार `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) Jina के नेटिव EmbeddingsV5Request दस्तावेज़ भी स्वीकार करता है और उन्हें **अपरिवर्तित फ़ॉरवर्ड करता है** `https://api.jina.ai/v1/embeddings` पर: ```json { "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 }` मान कोई सार्वजनिक HTTPS URL, `data:` URI, या रॉ base64 हो सकते हैं। OmniRoute उन ऑब्जेक्ट्स को स्ट्रिंग में नहीं बदलता या नेटिव इमेज URL फ़ेच नहीं करता — Jina सार्वजनिक मीडिया को स्वयं प्राप्त करता है। अतिरिक्त Jina फ़ील्ड (`task`, `normalized`, `truncate`, `embedding_type`) फ़ॉरवर्ड किए जाते हैं। केवल-टेक्स्ट Jina SKU अब भी गैर-टेक्स्ट दस्तावेज़ों को अस्वीकार करते हैं। सुरक्षा और ट्रांसपोर्ट सीमाएँ: - रिमोट मीडिया URL सार्वजनिक HTTPS होने चाहिए। कैनोनिकल `{type,source:url}` आइटम सर्वर-साइड फ़ेच किए जाते हैं (रीडायरेक्ट पुनः-सत्यापन, टाइमआउट, आकार सीमाएँ, सार्वजनिक DNS, कनेक्शन पिनिंग) और प्रदाता कॉल से पहले इनलाइन किए जाते हैं। Jina-नेटिव `{image:"https://..."}` आइटम उसी सार्वजनिक-HTTPS जाँच के बाद जैसे हैं वैसे ही फ़ॉरवर्ड किए जाते हैं; Jina URL को फ़ेच करता है। - इनलाइन base64 मीडिया प्रति आइटम 8 MiB डिकोडेड और पूरे अनुरोध में कुल 16 MiB डिकोडेड तक सीमित है। प्रदाता रूपांतरण (कैनोनिकल आइटम कभी भी अपरिवर्तित फ़ॉरवर्ड नहीं किए जाते): - Jina मल्टीमोडल मॉडल: प्रत्येक शीर्ष-स्तरीय आइटम एक मोडैलिटी-कुंजीयुक्त ऑब्जेक्ट (`text` / `image` / `audio` / `video` / `pdf`) बन जाता है, जिसमें इनलाइन मीडिया के लिए डेटा URI का उपयोग होता है; प्रत्येक शीर्ष-स्तरीय आइटम के लिए एक वेक्टर। - Gemini Embedding 2 फ़ैमिली: एक शीर्ष-स्तरीय ऐरे, `content.parts` (`text` या `inline_data`) के साथ एकल नेटिव `models/{model}:embedContent` अनुरोध बन जाता है। - llama.cpp (`llama-cpp/`, स्थानीय सर्वर द्वारा लोड किया गया कोई भी मॉडल): कैनोनिकल `text` आइटम साधारण स्ट्रिंग बन जाते हैं, और `image` / `audio` / `video` में से प्रत्येक एक `{"content": [part]}` ऑब्जेक्ट बन जाता है, जिसमें इनलाइन डेटा के साथ llama-server के चैट कंटेंट पार्ट्स (`image_url`, `input_audio` और फ़ॉर्मेट `wav` / `mp3` / `flac`, `input_video`) का उपयोग होता है; प्रत्येक शीर्ष-स्तरीय आइटम के लिए एक वेक्टर। सर्वर को `--embedding --mmproj …` के साथ चलना चाहिए; प्रोजेक्टर के बिना यह मीडिया को स्वयं अस्वीकार कर देता है। `document` समर्थित नहीं है। - स्पष्ट मोडैलिटी मेटाडेटा के बिना अज्ञात/डायनामिक मॉडल HTTP 400 के साथ संरचित इनपुट अस्वीकार करते हैं। ```json { "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 लौटाते हैं। पुराने स्ट्रिंग/टोकन अनुरोधों के गैर-इनपुट एक्सटेंशन फ़ील्ड पहले की तरह अपरिवर्तित पास होते रहते हैं। ```bash # सभी एम्बेडिंग मॉडल सूचीबद्ध करें GET /v1/embeddings ``` --- ## इमेज जनरेशन ```bash 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 (स्थानीय) शामिल हैं। `n`, `data[]` में `n` इमेज लौटाता है। जिन प्रदाताओं का अपस्ट्रीम API प्रति कॉल एक इमेज लौटाता है (Black Forest Labs, Stability AI, Leonardo, Ideogram, Haiper, Hyperbolic, Magnific/Freepik, NVIDIA NIM, Cloudflare Workers AI), उनके लिए अधिकतम 4 कॉल एक साथ चलाते हुए `n` अलग-अलग अपस्ट्रीम कॉल किए जाते हैं। एक निश्चित `seed` को कॉल इंडेक्स के अनुसार ऑफ़सेट किया जाता है (`seed`, `seed + 1`, …), ताकि इमेज अलग हों लेकिन पुनरुत्पादित की जा सकें। `n` की अधिकतम सीमा 10 है। यदि कोई भी कॉल विफल होती है, तो पूरा अनुरोध विफल हो जाता है। फ़ैन-आउट फ़ॉर्मैट की सूची `open-sse/handlers/imageGeneration/fanOut.ts` में `SINGLE_IMAGE_FANOUT_FORMATS` है। ZenMux मौजूदा API-कुंजी कनेक्शन का पुनः उपयोग करता है और `zenmux/` या `zm/` प्रीफ़िक्स स्वीकार करता है: - `zenmux/openai/gpt-image-2`, ZenMux के OpenAI Images API का उपयोग करता है। विकल्पों में `size`, `quality`, `n`, `output_format`, `output_compression`, `background`, और `response_format` शामिल हैं। - अन्य प्रकाशक, जैसे `zm/meta/muse-image-1.0`, ZenMux के Vertex AI `:predict` एंडपॉइंट का उपयोग करते हैं। `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"` एक अपस्ट्रीम HTTPS URL लौटाता है, या जब केवल इमेज बाइट्स उपलब्ध हों तो एक base64 डेटा URL लौटाता है। खाली/फ़िल्टर किए गए आउटपुट खाली सफलता के बजाय त्रुटि लौटाते हैं। मॉडल तक पहुँच ZenMux खाते पर निर्भर करती है। [ZenMux का Vertex API](https://docs.zenmux.ai/api/vertexai/generate-images) और [OpenAI Images API](https://docs.zenmux.ai/api/openai/generate-an-image) देखें। ```bash # सभी इमेज मॉडल सूचीबद्ध करें GET /v1/images/generations ``` --- ## दस्तावेज़ OCR ```bash 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`, `provider/model` प्रीफ़िक्स के माध्यम से OCR प्रदाता का चयन करता है; केवल मॉडल आईडी (उदा. `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` | सिंक्रोनस, Vertex AI के `openapi/chat/completions` पार्टनर एंडपॉइंट के माध्यम से — प्रमाणीकरण/URL के लिए नीचे देखें। | सभी तीन प्रदाता समान Mistral-स्वरूप वाली बॉडी में प्रतिक्रिया देते हैं: ```json { "pages": [{ "index": 0, "markdown": "# Extracted text..." }], "model": "mistral-ocr-latest", "usage_info": { "pages_processed": 1 } } ``` ### Azure Document Intelligence पोल प्रवाह Azure Document Intelligence का `analyze` API एसिंक्रोनस है: प्रारंभिक अनुरोध किसी बॉडी के बजाय एक `Operation-Location` हेडर लौटाता है, और परिणाम के लिए पोल करना आवश्यक होता है। हैंडलर (`open-sse/handlers/ocr.ts`) उस URL को प्रत्येक सेकंड में अधिकतम 30 प्रयासों तक पोल करता है, किसी गैर-`ok` पोल प्रतिक्रिया या `"failed"` स्थिति पर तुरंत विफल हो जाता है (पोलिंग जारी नहीं रखता), और यदि प्रयासों की सीमा समाप्त होने के बाद भी ऑपरेशन चल रहा हो, तो `504` लौटाता है। अंतिम Azure प्रतिक्रिया को कॉलर को लौटाने से पहले Mistral द्वारा उपयोग किए जाने वाले समान `pages`/`markdown` स्वरूप में सामान्यीकृत किया जाता है, इसलिए क्लाइंट कोड को प्रदाता के लिए विशेष स्थिति संभालने की आवश्यकता नहीं होती। ### Vertex AI DeepSeek OCR प्रमाणीकरण और एंडपॉइंट रिज़ॉल्यूशन `vertex-deepseek-ocr`, चैट/छवि ट्रैफ़िक के लिए OmniRoute द्वारा पहले से समर्थित समान Vertex AI प्रमाणीकरण का पुनः उपयोग करता है (`open-sse/executors/vertex.ts`): कनेक्शन की API कुंजी या तो Service Account JSON क्रेडेंशियल होती है (जिसे JWT-bearer प्रवाह के माध्यम से अल्पकालिक OAuth एक्सेस टोकन में बदला जाता है) या पहले से जारी किया गया OAuth एक्सेस टोकन होता है, जिसका यथावत उपयोग किया जाता है। अपस्ट्रीम एंडपॉइंट URL, Vertex का सामान्य `openapi/chat/completions` पार्टनर एंडपॉइंट है, जिसे कनेक्शन के प्रोजेक्ट और क्षेत्र से बनाया जाता है — स्पष्ट `providerSpecificData.project`/`providerSpecificData.region` को हमेशा प्राथमिकता मिलती है; अन्यथा प्रोजेक्ट Service Account JSON के `project_id` से प्राप्त किया जाता है और क्षेत्र डिफ़ॉल्ट रूप से `us-central1` होता है। दोनों रिज़ॉल्यूशन `open-sse/handlers/ocr.ts` (`resolveVertexOcrAccessToken`, `resolveVertexOcrBaseUrl`) में होते हैं, जिनका उपयोग `handleOcr` को डिस्पैच करने से पहले `src/app/api/v1/ocr/route.ts` द्वारा किया जाता है। --- ## मॉडल सूचीबद्ध करें ```bash GET /v1/models Authorization: Bearer your-api-key → OpenAI प्रारूप में सभी चैट, एम्बेडिंग और इमेज मॉडल + कॉम्बो लौटाता है ``` ### मॉडल id प्रीफ़िक्स (`?prefix=`) अधिकांश मॉडल एक **प्रोवाइडर प्रीफ़िक्स** के अंतर्गत प्रदर्शित किए जाते हैं। आपको कौन-सा प्रीफ़िक्स मिलेगा, यह `MODELS_CATALOG_PREFIX_MODE` फ़ीचर फ़्लैग द्वारा नियंत्रित होता है और इसे एक क्वेरी पैरामीटर के साथ **प्रति अनुरोध** ओवरराइड किया जा सकता है — यह ऐसे क्लाइंट के लिए उपयोगी है जो सभी के लिए सर्वर-व्यापी सेटिंग बदले बिना एक साफ़ सूची चाहता है: ```bash GET /v1/models?prefix=alias # प्रति मॉडल एक id — संक्षिप्त एलियस प्रीफ़िक्स GET /v1/models?prefix=dual # दोनों रूप (सर्वर डिफ़ॉल्ट) GET /v1/models?prefix=canonical # केवल पूर्ण provider-id प्रीफ़िक्स ``` | मोड | उत्सर्जित करता है | टिप्पणियाँ | | ----------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `dual` | `cc/claude-sonnet-4-6` **और** `claude/claude-sonnet-4-6` | **डिफ़ॉल्ट।** दोनों id एक ही मॉडल पर रूट होते हैं; इसे इसलिए रखा गया है ताकि किसी भी रूप को हार्डकोड करने वाले क्लाइंट कॉन्फ़िग काम करते रहें। यह कैटलॉग का आकार लगभग दोगुना कर देता है। | | `alias` | `cc/claude-sonnet-4-6` | प्रति मॉडल एक प्रविष्टि। अलग एलियस के बिना वाले प्रोवाइडर भी अपनी प्रविष्टि उत्सर्जित करते हैं, इसलिए कुछ भी छूटता नहीं है। | | `canonical` | `claude/claude-sonnet-4-6` | पूर्ण provider-id प्रीफ़िक्स के अंतर्गत प्रति मॉडल एक प्रविष्टि। अलग एलियस के बिना वाले प्रोवाइडर (जैसे `antigravity/…`, `agy/…`) भी यहाँ अपना एकल id उत्सर्जित करते हैं, इसलिए कुछ भी छूटता नहीं है। | क्वेरी पैरामीटर के बिना भी `dual`-मोड मिरर को पहचाना जा सकता है: इसमें प्राथमिक id की ओर संकेत करने वाला एक `parent` फ़ील्ड होता है। मॉडल पिकर रेंडर करने वाले क्लाइंट को `?prefix=alias` का अनुरोध करना चाहिए — [OmniCopilot VS Code एक्सटेंशन](../guides/VSCODE-COPILOT.md) भी यही करता है। ### व्यक्तिगत रूप से छिपाए गए चैट मॉडल अपने प्रोवाइडर पेज पर **Hidden** के रूप में चिह्नित मॉडल को कैटलॉग से बाहर रखा जाता है और स्पष्ट रूप से अनुरोध किए जाने पर HTTP `404` / `model_not_found` के साथ अस्वीकार कर दिया जाता है। जाँच में रिज़ॉल्व किए गए प्रोवाइडर और मॉडल का उपयोग होता है, जिसमें प्रोवाइडर एलियस, संगत-प्रोवाइडर नोड प्रीफ़िक्स और कनेक्शन डिफ़ॉल्ट शामिल हैं। कोई कॉम्बो छिपे हुए लक्ष्यों को छोड़ देता है और दृश्यमान सहोदर का उपयोग कर सकता है; जब कोई निष्पादन योग्य लक्ष्य शेष नहीं रहता, तो यह वही त्रुटि कोड लौटाता है। मॉडल को फिर से दृश्यमान करने का प्रभाव अगले अनुरोध पर लागू होता है। केवल-इमेज दृश्यता ओवरराइड समान ID वाले चैट मॉडल को नहीं छिपाते हैं। यह व्यक्तिगत मॉडल सेटिंग [मॉडल एक्सपोज़र अनुमति/अस्वीकृति सूचियों](../routing/MODEL_EXPOSURE_LIST.md) से अलग है, जो स्पष्ट डिस्पैच को बनाए रखते हुए कैटलॉग प्रदर्शन और ऑटो-रूटिंग उम्मीदवारों को फ़िल्टर करती हैं। API-key मॉडल अनुमतियाँ स्वतंत्र रूप से लागू होती रहती हैं। डिफ़ॉल्ट कैटलॉग प्रीफ़िक्स मोड `dual` ही रहता है। ### नो-थिंकिंग मॉडल वेरिएंट थिंकिंग-सक्षम Claude मॉडल के लिए, `/v1/models` एक **नो-थिंकिंग** वेरिएंट भी प्रदर्शित करता है, जिसकी id के आगे `claude-3-omniroute-no-thinking/` जुड़ा होता है: ``` claude-3-omniroute-no-thinking// ``` इस id को चुनने पर (जैसे ऐसे Claude Code कॉन्फ़िग में जो हमेशा `thinking` ब्लॉक जोड़ता है) यह रीजनिंग को दबाते हुए वास्तविक `/` पर वापस रिज़ॉल्व होता है — `/v1/messages` पथ पर `thinking:{type:"disabled"}`, या `/v1/chat/completions` पथ पर `reasoning`/`reasoning_effort` फ़ील्ड हटा दिए जाते हैं। यह वेरिएंट केवल उन Claude-परिवार मॉडल के लिए सूचीबद्ध होता है जो थिंकिंग का समर्थन करते हैं **और** `disabled` का पालन करते हैं (इसलिए, उदाहरण के लिए, `disabled` को अस्वीकार करने वाले केवल-अडैप्टिव मॉडल शामिल नहीं किए जाते)। ऑपरेटर `ModelSpec.noThinkingAlias` के माध्यम से प्रति मॉडल इस वेरिएंट को बलपूर्वक चालू या बंद कर सकते हैं। --- ## प्रदाता प्लगइन मैनिफ़ेस्ट ```bash GET /api/v1/provider-plugin-manifest ``` Bifrost, CLIProxyAPI और भविष्य के साइडकार राउटर द्वारा उपयोग किया जाने वाला JSON-सुरक्षित प्रदाता प्लगइन मैनिफ़ेस्ट लौटाता है। प्रतिक्रिया 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 (STT) | | 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 Moderations | | 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` + Zod द्वारा सत्यापित JSON बॉडी (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema`, आदि, `src/shared/validation/schemas.ts` देखें)। स्कीमा विफल होने पर 4xx लौटाया जाता है। जो क्लाइंट `Authorization: Bearer ...` संलग्न नहीं कर सकते, उनके लिए OmniRoute क्वेरी-स्ट्रिंग संगतता (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) या नीचे प्रलेखित समर्पित `/api/v1/vscode/{token}/...` एंडपॉइंट के माध्यम से URL में API कुंजियाँ भी स्वीकार करता है। ```bash # रीरैंक (क्लाउड रजिस्ट्री प्रदाता, या "/" के रूप में OpenAI-संगत प्रदाता नोड) 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" } # Soniox TTS के लिए भाषा और वॉइस आवश्यक हैं: `language` डिफ़ॉल्ट रूप से "en" होता है; अनुपस्थित # वॉइस या OpenAI के स्टॉक वॉइस नाम (alloy, nova, …) को "Adrian" में बदल दिया जाता है POST /v1/audio/speech { "model": "soniox/tts-rt-v1", "input": "Xin chào", "voice": "Adrian", "language": "vi" } # इमेज संपादन (मल्टीपार्ट) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png # वीडियो / संगीत जनरेशन (प्रदाता-प्रीफ़िक्स वाला मॉडल ID) 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, …) जिन्हें `/` के रूप में संबोधित किया जाता है। लूपबैक > नोड (`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`) को पास करता है। > मेमोरी इंजन का रीरैंक चरण इस रूट को > लूपबैक के माध्यम से कॉल करता है, इसलिए यही नियम Memory सेटिंग्स में `rerankProviderModel` को नियंत्रित करता है। > > **स्थानीय सर्वर संरचनाएँ:** नोड को `/v1/rerank` पर और 404 मिलने पर `/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` फिर भी प्राथमिकता रखता है। ### समर्पित प्रोवाइडर रूट ```bash POST /v1/providers/{provider}/chat/completions POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` यदि प्रोवाइडर प्रीफ़िक्स मौजूद नहीं है, तो वह स्वतः जोड़ दिया जाता है। मेल न खाने वाले मॉडल `400` लौटाते हैं। --- ## Files API बैच इनपुट/आउटपुट और फ़ाइल-उद्देश्य अपलोड के लिए OpenAI-संगत फ़ाइल एंडपॉइंट। | विधि | पाथ | विवरण | | ------ | ------------------------ | -------------------------------------------------------------------------------------------------------------------- | | POST | `/v1/files` | फ़ाइल अपलोड करें (मल्टीपार्ट: `file`, `purpose`, `expires_after[anchor]`, `expires_after[seconds]`) — अधिकतम 512 MiB | | GET | `/v1/files` | प्रमाणित API कुंजी की फ़ाइलें सूचीबद्ध करें | | GET | `/v1/files/[id]` | फ़ाइल का मेटाडेटा प्राप्त करें | | DELETE | `/v1/files/[id]` | फ़ाइल हटाएँ | | GET | `/v1/files/[id]/content` | अपरिष्कृत फ़ाइल बॉडी को वापस स्ट्रीम करें | **प्रमाणीकरण:** Bearer API कुंजी — फ़ाइलों का दायरा `getApiKeyRequestScope` के माध्यम से प्रत्येक API कुंजी के अनुसार निर्धारित किया जाता है। कोई कुंजी केवल अपनी फ़ाइलों को देख, डाउनलोड और हटा सकती है; कुंजी के बिना डैशबोर्ड सत्र पूरे इंस्टेंस को पढ़ सकता है; बिना स्वामी वाली फ़ाइल (अनाम या डैशबोर्ड-सत्र अपलोड) प्रत्येक गैर-सत्र कॉलर के लिए अस्वीकृत होती है। `GET /v1/files` किसी अनाम कॉलर — और ऐसी प्रस्तुत कुंजी जिसका समाधान नहीं होता — को `401` के साथ अस्वीकार करता है, भले ही `REQUIRE_API_KEY=false` हो, ताकि प्रत्येक टेनेंट की फ़ाइलें सूचीबद्ध न हों (GHSA-m3hp-hq9g-fpmv, GHSA-2jm2-mpx8-6523)। --- ## Batches 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` | प्रगतिरत बैच रद्द करें | **प्रमाणीकरण:** Bearer API कुंजी। बैचों का दायरा फ़ाइलों के समान त्रि-स्तरीय नियम के अंतर्गत प्रत्येक API कुंजी के अनुसार निर्धारित किया जाता है: केवल अपनी कुंजी, पूरे इंस्टेंस के लिए डैशबोर्ड सत्र, और बिना स्वामी वाले रिकॉर्ड प्रत्येक गैर-सत्र कॉलर के लिए अस्वीकृत (प्राप्त करना, हटाना, रद्द करना और बनाते समय `input_file_id` की जाँच)। `GET /v1/batches` किसी अनाम कॉलर को `401` के साथ अस्वीकार करता है, भले ही `REQUIRE_API_KEY=false` हो। --- ## Search API वेब/सर्च प्रदाता अमूर्तन (Tavily, Brave, Exa, Serper आदि)। | विधि | पथ | विवरण | | ---- | ---------------------- | ----------------------------------------------------------------------------------- | | GET | `/v1/search` | कॉन्फ़िगर किए गए सर्च प्रदाताओं और उनकी क्षमताओं की सूची | | POST | `/v1/search` | सर्च क्वेरी चलाएँ — बॉडी `v1SearchSchema` द्वारा सत्यापित, कैशिंग/कोएलिसिंग समर्थित | | GET | `/v1/search/analytics` | प्रति-प्रदाता हिट/लेटेंसी/कैश आँकड़े | **प्रमाणीकरण:** Bearer API कुंजी (`extractApiKey` + `isValidApiKey`)। सर्च नीति `enforceApiKeyPolicy` के माध्यम से लागू की जाती है। --- ## Web Fetch API कॉन्फ़िगर किए गए वेब-फ़ेच प्रदाता (Firecrawl, Jina Reader, Tavily Extract, TinyFish Fetch, Nimble Extract) के माध्यम से किसी URL से सामग्री निकालें। | विधि | पथ | विवरण | | ---- | --------------- | ----------------------------------------------------------------------- | | POST | `/v1/web/fetch` | किसी URL को फ़ेच/स्क्रैप करें — बॉडी `v1WebFetchSchema` द्वारा सत्यापित | **प्रमाणीकरण:** Bearer API कुंजी (`extractApiKey` + `isValidApiKey`)। नीति `enforceApiKeyPolicy` के माध्यम से लागू की जाती है। **कोटा-सजग फ़ॉलबैक (#8297):** जब कोई स्पष्ट `provider` नहीं दिया जाता, तो पूल (`firecrawl` → `jina-reader` → `tavily-search` → `tinyfish` → `nimble-search`) में निश्चित प्राथमिकता क्रम (पहले भरें) के अनुसार आगे बढ़ा जाता है — दर-सीमित लेकिन कॉन्फ़िगर किए गए प्रदाता को अनुरोध को तुरंत समाप्त करने के बजाय छोड़ दिया जाता है, और पुनः प्रयास योग्य/कोटा-संबंधी अपस्ट्रीम विफलता (HTTP 429 हमेशा; Firecrawl/Tavily/TinyFish की कोटा-शैली वाली मुफ़्त श्रेणियों के लिए 402/403 — Jina Reader के लिए नहीं, और साधारण 400 खराब अनुरोध के लिए कभी नहीं) अनुरोध के समय अगले ऐसे प्रदाता पर चली जाती है जिसे अभी आज़माया नहीं गया है और जिसके लिए क्रेडेंशियल उपलब्ध हैं। जब पूल के सभी प्रदाता समाप्त हो जाते हैं, तो एंडपॉइंट पहले के सामान्य `400` के बजाय एकल `429` (`Retry-After` हेडर के साथ) लौटाता है। जब कोई स्पष्ट `provider` अनुरोधित होता है, तो कोई मौन फ़ॉलबैक **नहीं** होता — दर-सीमित या विफल स्पष्ट प्रदाता अपनी ही त्रुटि प्रदर्शित करता है (दर-सीमित होने पर `429`, अन्यथा अपस्ट्रीम स्थिति)। --- ## WebSocket स्ट्रीमिंग ```bash GET /v1/ws?handshake=1 ``` WebSocket अपग्रेड हैंडशेक को सत्यापित करता है और वायर प्रोटोकॉल के उदाहरण संदेश (`request`, `cancel`) लौटाता है। वास्तविक WS फ़्रेम, Next.js रूट तालिका के बाहर बंडल किए गए WS सर्वर द्वारा संभाले जाते हैं। **प्रमाणीकरण:** हैंडशेक के दौरान Bearer API कुंजी। ### WebSocket के माध्यम से Responses API (केवल codex) ```bash # HTTP API के समान host:port (डिफ़ॉल्ट 20128); कनेक्शन अपग्रेड करें: wscat -c "ws://localhost:20128/v1/responses?api_key=" # (या: -H "Authorization: Bearer ") # पहला फ़्रेम 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` ब्रिज के माध्यम से प्रमाणीकरण और तैयारी करती है, एक codex OAuth कनेक्शन चुनती है, और `wreq-js` ट्रांसपोर्ट के माध्यम से `wss://chatgpt.com/backend-api/codex/responses` तक टनल करती है। **गैर-codex मॉडल अस्वीकार कर दिए जाते हैं** (`codex_ws_provider_required`)। कोटा-शेयर रूटिंग के लिए `model: "qtSd//codex/"` का उपयोग करें। कार्यान्वयन `app/server-ws.mjs` + `scripts/dev/responses-ws-proxy.mjs` + `src/app/api/internal/codex-responses-ws/route.ts` में है। **प्रमाणीकरण:** हैंडशेक के दौरान Bearer API कुंजी। बंडल किया गया HTTP सर्वर (`server-ws.mjs`) सक्रिय एंट्रीपॉइंट होना चाहिए (`app/server-ws.mjs` मौजूद होने पर डिफ़ॉल्ट रूप से यही होता है)। #### मॉडल आईडी: मूल ChatGPT आईडी का उपयोग करें (`codex/` उपसर्ग के बिना) जब `supports_websockets = true` होता है, तो OpenAI **Codex CLI** क्लाइंट-साइड पर मॉडल नाम सत्यापित करता है और `codex/gpt-5.5` जैसे **प्रदाता-उपसर्ग वाले आईडी अस्वीकार करता है** (`The 'codex/gpt-5.5' model is not supported when using Codex with a ChatGPT account`)। **मूल** आईडी भेजें (उदाहरण के लिए `gpt-5.5`)। OmniRoute का ब्रिज केवल codex के लिए है, इसलिए अपस्ट्रीम तक टनल करने से पहले यह मूल आईडी को codex मॉडल के रूप में (`resolveCodexWsModelInfo`) फिर से रिज़ॉल्व करता है — भले ही मूल `gpt-5.5` अन्यथा HTTP के माध्यम से किसी दूसरे प्रदाता पर रूट होता। #### OpenAI Codex CLI को कॉन्फ़िगर करना `~/.codex/config.toml` में WebSocket समर्थन वाला कस्टम प्रदाता जोड़कर Codex CLI को OmniRoute की ओर निर्देशित करें (मौजूदा कॉन्फ़िगरेशन को प्रभावित करने से बचने के लिए अलग `CODEX_HOME` का उपयोग करें): ```toml model = "gpt-5.5" # मूल आईडी — "codex/gpt-5.5" नहीं model_provider = "omniroute" [model_providers.omniroute] name = "OmniRoute (WS)" base_url = "http://localhost:20128/v1" # अंत में स्लैश नहीं; WS URL इससे व्युत्पन्न होता है (प्रोडक्शन में https/wss का उपयोग करें) wire_api = "responses" # Feb 2026 से एकमात्र समर्थित मान supports_websockets = true # Responses-over-WS ट्रांसपोर्ट सक्षम करता है env_key = "OMNIROUTE_API_KEY" # OmniRoute API कुंजी रखता है (Bearer) ``` ```bash export OMNIROUTE_API_KEY=sk-... # एक OmniRoute API कुंजी (यदि REQUIRE_API_KEY=false है, तो कोई भी कुंजी) codex exec "Responda apenas: PONG" ``` CLI, `base_url + /responses` को WebSocket में अपग्रेड करता है और OmniRoute इसे चयनित codex OAuth कनेक्शन तक टनल करता है। स्थानीय सर्वर के विरुद्ध शुरू से अंत तक सत्यापित: ChatGPT `codex.rate_limits` + `response.created` लौटाता है और पूर्णता को स्ट्रीम करता है। --- ## कोटा और समस्या रिपोर्टिंग | विधि | पथ | विवरण | | ---- | ------------------- | --------------------------------------------------------------------------------------------- | | GET | `/v1/quotas/check` | पंजीकृत कुंजी जारी करने से पहले `provider` + `accountId` के लिए कोटा पूर्व-सत्यापित करें | | POST | `/v1/issues/report` | कोटा/कुंजी जारी करने की विफलता की रिपोर्ट GitHub पर करें (`GITHUB_ISSUES_REPO` + टोकन आवश्यक) | **प्रमाणीकरण:** Bearer API कुंजी (`isAuthenticated`)। --- ## स्व-सेवा उपयोग (`/api/usage/om-usage`) कोई भी API कुंजी **अपने स्वयं के** उपयोग और कोटा को पढ़ सकती है — प्रबंधन प्रमाणीकरण की आवश्यकता नहीं है। यह वह एंडपॉइंट है जिसका उपयोग कोई क्लाइंट (CLI, OmniCopilot पैनल) किसी कुंजी धारक को उसका खर्च दिखाने के लिए करता है। ```bash # टेक्स्ट प्रारूप (ऐतिहासिक अनुबंध — टर्मिनल के लिए सादा टेक्स्ट) curl -H "Authorization: Bearer " \ http://localhost:20128/api/usage/om-usage # संरचित प्रारूप — जिसका उपयोग UI करता है curl -H "Authorization: Bearer " \ "http://localhost:20128/api/usage/om-usage?format=json" ``` कुंजी के लिए **`allowUsageCommand`** सक्षम होना चाहिए (डिफ़ॉल्ट रूप से बंद — डैशबोर्ड का API-कुंजी प्रबंधक इसे प्रत्येक कुंजी के लिए टॉगल करता है)। इसके बिना एंडपॉइंट `403` लौटाता है। `?format=json` एक विभेदित संरचना लौटाता है, ताकि कॉलर किसी अस्वीकृति से डेटा फ़ील्ड कभी न पढ़े। सफलता पर: ```jsonc { "allowed": true, // केवल तभी मौजूद होता है, जब कुंजी ने प्रति-कुंजी उपयोग सीमाएँ (दैनिक/साप्ताहिक USD) चुनी हों: "personal": { "dailySpentUsd": 1.25, "dailyLimitUsd": 5, "dailyResetAtIso": "…", "weeklySpentUsd": 8, "weeklyLimitUsd": 20, "weeklyResetAtIso": "…" /* … */, }, // चयनित प्रदाता कोटा स्नैपशॉट, या जब अभी तक कुछ भी कैश न हुआ हो तो null: "provider": { "connectionId": "…", "provider": "claude", "plan": "…", "quotas": {/* … */}, }, // प्रत्येक कनेक्शन का स्नैपशॉट, ताकि UI कई प्रदाताओं को साथ-साथ प्रस्तुत कर सके: "providers": [ { "connectionId": "…", "provider": "claude" /* … */ }, { "provider": "codex" /* … */ }, ], } ``` अस्वीकृति पर (`401` अमान्य कुंजी / `403` अनुमति नहीं) यही रूट `{ "allowed": false, "error": { "message": "…" } }` लौटाता है — मौजूद-लेकिन-रिक्त `personal`/`provider` (कुंजी अनुमत है, अभी तक कुछ ज्ञात नहीं हुआ) अस्वीकृति से अलग स्थिति है, और केवल JSON प्रारूप इनमें अंतर करता है। **प्रमाणीकरण:** कॉलर की अपनी Bearer API कुंजी, जिसे `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` का उपयोग करके क्लाइंट-साइड पर प्रभावी शेष सूत्र का मूल्यांकन कर सकता है। --- ## सिमेंटिक कैश ```bash # कैश के आँकड़े प्राप्त करें GET /api/cache/stats # सभी कैश साफ़ करें DELETE /api/cache/stats ``` प्रतिक्रिया का उदाहरण: ```json { "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]`) अपडेट करें: ```json { "cacheDefaultMode": "bypass" } ``` ### प्रति-अनुरोध बाइपास कोई भी अनुरोध कुंजी सेटिंग्स की परवाह किए बिना कैश को बाइपास कर सकता है: ``` X-OmniRoute-No-Cache: true ``` --- ## डैशबोर्ड और प्रबंधन प्रबंधन रूट (`/api/*`, सार्वजनिक auth/login को छोड़कर) सामान्य inference API कुंजियों द्वारा अधिकृत **नहीं** होते हैं। क्रेडेंशियल परिवारों, स्कोप और curl उदाहरणों के लिए देखें: [प्रबंधन प्रमाणीकरण](../guides/MANAGEMENT-AUTH.md)। ### प्रमाणीकरण | एंडपॉइंट | विधि | विवरण | | ----------------------------- | ------- | --------------------------- | | `/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 | प्रबंधन-प्रमाणीकृत, वैकल्पिक सख्त-कनेक्शन सत्यापन और परमाणु कस्टम-मॉडल पंजीकरण; [मॉडल सत्यापन](../guides/MODEL-VALIDATION.md) देखें | सिंक/आयात किए गए मॉडलों के लिए, `PUT /api/provider-models` में `provider`, `modelId` और `maxOutputTokenOverride` स्वीकार किए जाते हैं: एक धनात्मक पूर्णांक मैन्युअल आउटपुट-टोकन सीमा निर्धारित करता है और `null` इसे हटाकर डिफ़ॉल्ट पुनर्स्थापित करता है। `GET /api/provider-models?provider=` इन मानों को `modelOutputOverrides` में लौटाता है, जिसमें कस्टम-मॉडल पंक्ति के बिना वाले मॉडल भी शामिल होते हैं। यह ओवरराइड रनटाइम `max_output_tokens` क्षमता का उपयोग करता है और मॉडल के पुनः सिंक होने के बाद भी बना रहता है। OpenAI-संगत प्रदाता पृष्ठ समान संपादन/हटाने वाले नियंत्रण प्रदान करता है और स्पष्ट vision समर्थन वाले मॉडलों को चिह्नित करता है। कस्टम Chat Completions नोड स्पष्ट reasoning ऑप्ट-आउट को अपस्ट्रीम बैकएंड के अनुरूप ढालते हैं। एक सफल कनेक्शन परीक्षण प्रत्येक सटीक मॉडल ID के लिए अपने-आप chat-template नियंत्रण चुनता है, जिसकी `/models` प्रविष्टि किसी मान्यताप्राप्त `owned_by` मान को प्रमाणित करती है: `vllm`, `sglang`, या `llamacpp`। पारदर्शी OpenAI-संगत रैपर मूल मॉडल प्रविष्टि को नेस्टेड `openai` ऑब्जेक्ट के भीतर बनाए रख सकते हैं; पहचान अधिकतम तीन ऐसे एनवेलप तक की जाँच करती है। अनुपलब्ध, अज्ञात या परस्पर-विरोधी स्वामित्व वाले मॉडल सामान्य OpenAI व्यवहार बनाए रखते हैं। पहचान मौजूदा कैटलॉग अनुरोध का पुनः उपयोग करती है, कोई completion टोकन जनरेट नहीं करती और कनेक्शन एंडपॉइंट बदलने पर अमान्य हो जाती है। ऐसे बैकएंड के लिए व्यवहार को निश्चित करने हेतु, जो यह मेटाडेटा उजागर नहीं करता, मौजूदा आंशिक प्रदाता अपडेट API का उपयोग करें: ```json { "providerSpecificData": { "reasoningControl": "chat-template" } } ``` उस बॉडी को `PUT /api/providers/` के साथ भेजें। उस कनेक्शन पर, `none` का स्पष्ट reasoning effort `chat_template_kwargs.thinking=false` और `chat_template_kwargs.enable_thinking=false` के रूप में भेजा जाता है। स्पष्ट नेटिव टेम्पलेट मान प्रभावी बने रहते हैं, जब तक कि कोई सर्वर-साइड reasoning नियम किसी effort को बाध्य न करे। यह सेटिंग केवल तभी लागू होती है, जब कोई कस्टम OpenAI-संगत कनेक्शन Chat Completions बॉडी डिस्पैच करता है; Responses अनुरोध और सामान्य प्रदाता अपने नेटिव अनुरोध स्वरूप को बनाए रखते हैं। सामान्य OpenAI `reasoning_effort` पासथ्रू को बाध्य करने के लिए `reasoningControl` को `openai` पर सेट करें, या स्वचालित पहचान का उपयोग करने के लिए इसे छोड़ दें/`null` पर सेट करें। Claude Code ऑटो-मोड क्लासिफ़ायर अनुरोधों में, जब कोई स्पष्ट रीजनिंग नियंत्रण न हो, तो नेटिव थिंकिंग डिफ़ॉल्ट रूप से अक्षम रहती है। पहचान मॉडल नामों या कंप्लीशन सीमाओं के बजाय Claude-फ़ॉर्मैट अनुरोधों में क्लासिफ़ायर के सिस्टम मार्कर का उपयोग करती है। स्पष्ट बॉडी नियंत्रण, समर्थित प्रयास/थिंकिंग हेडर, रूटिंग नियम और निर्धारित मॉडल प्रयास अपनी मौजूदा प्राथमिकता बनाए रखते हैं। दोनों क्लासिफ़ायर चरण अपने प्रॉम्प्ट, कंप्लीशन सीमाएँ, स्टॉप सीक्वेंस और वास्तविक अपस्ट्रीम अनुमति निर्णय बनाए रखते हैं; दूसरा चरण अब भी अपने अनुरोधित दृश्यमान रीजनिंग को सामान्य टेक्स्ट के रूप में प्रस्तुत कर सकता है। ### 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 | प्रत्येक प्रदाता/मॉडल के लिए रोलिंग विलंबता समुच्चय (avg/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*` रूट की तरह, इसे प्रबंधन प्राधिकरण की आवश्यकता होती है ([प्रबंधन प्रमाणीकरण](../guides/MANAGEMENT-AUTH.md) देखें), न कि किसी इन्फ़रेंस कुंजी की। केवल वे फ़ील्ड भेजें जिन्हें आप बदलना चाहते हैं; इनमें से किसी भी फ़ील्ड के बिना अनुरोध को `No valid fields to update` के साथ अस्वीकार कर दिया जाता है। स्वीकृत फ़ील्ड `src/shared/validation/schemas/keys.ts` में `updateKeyPermissionsSchema` द्वारा परिभाषित हैं। | फ़ील्ड | प्रकार | टिप्पणियाँ | | ------------------------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | स्ट्रिंग, 1-200 वर्ण | | | `isActive` | बूलियन | | | `isBanned` | बूलियन | | | `expiresAt` | ISO 8601 डेटाटाइम या `null` | `null` समाप्ति को हटा देता है | | `modelAccessMode` | `all` \| `restricted` | मोड `all` होने पर `allowedModels` खाली होना चाहिए | | `allowedModels`, `blockedModels` | स्ट्रिंग की सरणी, अधिकतम 1000 | | | `allowedCombos` | स्ट्रिंग की सरणी, अधिकतम 500 | यह नियंत्रित करता है कि कुंजी किन कॉम्बो को कॉल कर सकती है; प्रत्यक्ष मॉडल `modelAccessMode` / `allowedModels` द्वारा नियंत्रित होते हैं | | `connectionAccessMode` | `all` \| `restricted` | `restricted` होने पर `allowedConnections` गैर-रिक्त और `all` होने पर खाली होना चाहिए | | `allowedConnections` | UUID की सरणी, अधिकतम 100 | | | `allowAutoCombos` | बूलियन | `false` होने पर इस कुंजी से `auto/*` मॉडल के अनुरोध अस्वीकार किए जाते हैं; जिन कुंजियों में इसे कभी सेट नहीं किया गया है, उन्हें अनुमति है | | `catalogScope` | `all` \| `combos` \| `models` | इस कुंजी के लिए `GET /v1/models` क्या सूचीबद्ध करता है (केवल कॉम्बो, केवल मॉडल या दोनों); यह इस बात को नहीं बदलता कि कुंजी किसे कॉल कर सकती है | | `noLog`, `autoResolve` | बूलियन | | | `throttleDelayMs` | पूर्णांक, 0-300000 | | | `maxSessions` | पूर्णांक, 0-10000 | | | `rateLimits` | `{ limit, window }` की सरणी (धनात्मक पूर्णांक, अधिकतम 50) या `null` | `null` सीमाओं को हटा देता है | | `accessSchedule` | शेड्यूल ऑब्जेक्ट या `null` | `null` शेड्यूल को हटा देता है | | `scopes` | स्ट्रिंग की सरणी, अधिकतम 32 | | | `allowedEndpoints` | स्ट्रिंग की सरणी, अधिकतम 20 | | | `streamDefaultMode` | `legacy` \| `json` | | | `cacheDefaultMode` | `legacy` \| `bypass` | [प्रति-कुंजी कैश बायपास](#per-key-cache-bypass) देखें | | `compressionEnabled` | बूलियन | | | `codexServiceMode` | Codex सेवा मोड में से एक | | | `disableNonPublicModels` | बूलियन | | | `allowUsageCommand` | boolean | | | `usageLimitEnabled` | boolean | | | `dailyUsageLimitUsd`, `weeklyUsageLimitUsd` | number >= 0 या `null` | | | `chaosModeEnabled` | boolean | | ```bash curl -X PATCH "$OMNIROUTE_URL/api/keys/$KEY_ID" \ -H "Authorization: Bearer " \ -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](../guides/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 | पॉइंटर id द्वारा बनाए रखा गया संशोधित रॉ आउटपुट पढ़ें | | `/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 | विवरण | | ------------------------------------ | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/api/sessions` | GET | सक्रिय सत्र ट्रैकिंग | | `/api/rate-limits` | GET | प्रति-अकाउंट दर सीमाएँ | | `/api/monitoring/health` | GET | स्वास्थ्य जाँच + प्रदाता सारांश (`catalogCount`, `configuredCount`, `activeCount`, `monitoredCount`)। प्रबंधन दृश्य में `credentialHealth` शामिल है: प्रोब-कैश स्केलर, `failed>0` होने पर `failedConnections`, और `staleDbNonOkCount` (SQLite का स्थायी `test_status`, गेज नहीं)। [MONITORING_GUIDE.md](../ops/MONITORING_GUIDE.md#credentialhealth-probe-cache-vs-sqlite-test_status) देखें। | | `/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 | विवरण | | --------------------------- | ------ | -------------------------------------------------------------------------------------- | | `/api/db-backups` | GET | उपलब्ध बैकअप सूचीबद्ध करें | | `/api/db-backups` | PUT | मैन्युअल बैकअप बनाएँ | | `/api/db-backups` | POST | किसी विशिष्ट बैकअप से पुनर्स्थापित करें | | `/api/db-backups/export` | GET | डेटाबेस को .sqlite फ़ाइल के रूप में डाउनलोड करें | | `/api/db-backups/import` | POST | डेटाबेस को बदलने के लिए .sqlite फ़ाइल अपलोड करें (`?dryRun=true` केवल सत्यापन करता है) | | `/api/db-backups/exportAll` | GET | पूर्ण बैकअप को .tar.gz आर्काइव के रूप में डाउनलोड करें | `/api/db-backups/export`, `/api/db-backups/exportAll` और `/api/settings/export-json` प्रत्येक संग्रहीत क्रेडेंशियल प्रदान करते हैं, इसलिए इनके लिए डैशबोर्ड सत्र या स्थानीय CLI (या अक्षम लॉगिन) आवश्यक है। किसी भी स्कोप की API कुंजियों और `oma_` एक्सेस टोकन को `403` मिलता है। `/api/db-backups/export`, `/api/db-backups/exportAll` and `/api/settings/export-json` hand out every stored credential, so they require the dashboard session or the local CLI (or login disabled). API keys of any scope and `oma_` access tokens get `403`. The restores hold the same boundary: `POST /api/db-backups/import` (`dryRun=true` included), `POST /api/db-backups` (restore by id) and `POST /api/settings/import-json` replace the live database or settings, so a machine credential gets `403` there too; `omniroute sync import` sends the local CLI credential. ### क्लाउड सिंक | Endpoint | Method | विवरण | | ---------------------- | ------- | ------------------ | | `/api/sync/cloud` | Various | क्लाउड सिंक संचालन | | `/api/sync/initialize` | POST | सिंक प्रारंभ करें | | `/api/cloud/*` | Various | क्लाउड प्रबंधन | ### टनलें | एंडपॉइंट | विधि | विवरण | | -------------------------- | ---- | ------------------------------------------------------------------------- | | `/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`) आवश्यक है। प्रदाता ब्रेकर बनाम कनेक्शन कूलडाउन बनाम मॉडल लॉकआउट के पूर्ण विवरण के लिए [लचीलापन (विस्तृत)](#resilience-extended) देखें। ### मूल्यांकन | एंडपॉइंट | विधि | विवरण | | ------------ | -------- | ---------------------------------------------- | | `/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 | Gemini `generateContent` एंडपॉइंट | ये एंडपॉइंट उन क्लाइंटों के लिए Gemini के API प्रारूप को प्रतिबिंबित करते हैं जिन्हें मूल Gemini SDK संगतता की आवश्यकता होती है। ### आंतरिक / सिस्टम 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+)_ ```bash POST /api/system/env/repair Content-Type: application/json { "provider": "claude-code" } ``` किसी विशिष्ट प्रदाता के लिए अनुपलब्ध या दूषित OAuth परिवेश चरों को सुधारता है। यह लौटाता है: ```json { "success": true, "repaired": ["CLAUDE_CODE_OAUTH_CLIENT_ID", "CLAUDE_CODE_OAUTH_CLIENT_SECRET"], "backupPath": "/home/user/.omniroute/backups/env-repair-2026-04-11.bak" } ``` ### संस्करण और रिलीज़ चैनल ```bash GET /api/system/version ``` केवल लूपबैक प्रबंधन रूट (एडमिन प्रमाणीकरण)। वर्तमान में चल रहा संस्करण, नवीनतम प्रकाशित संस्करण और स्वतः-अपडेट की स्थिति लौटाता है। `releaseChannel` और `channels` अतिरिक्त फ़ील्ड हैं (रेल 3.8.54); `channel` का अर्थ वही रहता है — वह डिप्लॉयमेंट मोड जिसका उपयोग डैशबोर्ड अपडेटर करता है (`npm`, `source` या `docker-compose`)। ```json { "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`, अन्य प्री-रिलीज़ (`-rc.*`, `-beta.*`, `-alpha.*`) के लिए `next`, `channels.latest` से पुराने मेजर के स्थिर संस्करण के लिए `lts`, अन्यथा `latest`। इसके नियम `scripts/release/dist-tag.mjs` के समान हैं, जो प्रकाशन के समय npm dist-tag चुनता है। - `channels` — `npm view omniroute dist-tags` से प्रत्येक dist-tag का प्रकाशित नवीनतम संस्करण (रजिस्ट्री HTTP फ़ॉलबैक), जिसे `latest` के समान 10-मिनट TTL के साथ कैश किया जाता है। `latest` हमेशा मौजूद रहता है (पहले `latest` फ़ील्ड और फिर `"unavailable"` का फ़ॉलबैक); `next`, `nightly` और `lts` केवल तभी दिखाई देते हैं जब वह dist-tag मौजूद हो। `Cache-Control: no-cache` अनुरोध दोनों लुकअप को रीफ़्रेश करता है। चैनल मॉडल (`latest` = 4.0 GA तक v3, `next` = rc, `nightly` = `develop` बिल्ड, `lts` = 4.0 GA के बाद v3 पैच) का वर्णन `docs/ops/RELEASE_STRATEGY.md` में किया गया है। --- ## ऑडियो ट्रांसक्रिप्शन ```bash POST /v1/audio/transcriptions Authorization: Bearer your-api-key Content-Type: multipart/form-data ``` किसी भी कॉन्फ़िगर किए गए STT प्रदाता का उपयोग करके ऑडियो फ़ाइलों को ट्रांसक्राइब करें। पहला पथ खंड मूल प्रदाता (`openai/…`, `deepgram/…`) का चयन करता है। किसी अन्य विक्रेता के मॉडल को पुनः निर्यात करने वाले गेटवे एक क्वालिफ़ाइड आईडी (`openrouter/deepgram/nova-3`) का उपयोग करते हैं। **अनुरोध:** ```bash curl -X POST http://localhost:20128/v1/audio/transcriptions \ -H "Authorization: Bearer your-api-key" \ -F "file=@recording.mp3" \ -F "model=openai/whisper-1" ``` **प्रतिक्रिया:** ```json { "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 संगतता Ollama के API प्रारूप का उपयोग करने वाले क्लाइंट के लिए: ```bash # चैट एंडपॉइंट (Ollama प्रारूप) POST /v1/api/chat # मॉडल सूची (Ollama प्रारूप) GET /api/tags ``` अनुरोधों को Ollama और आंतरिक प्रारूपों के बीच स्वचालित रूप से रूपांतरित किया जाता है। ## टोकनयुक्त VS Code / हेडर-रहित उपनाम जब कोई इंटीग्रेशन `Authorization` हेडर इंजेक्ट नहीं कर सकता और उसे API कुंजी को बेस URL में एम्बेड करना होता है, तब इन उपनामों का उपयोग करें। ```bash # 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 ``` उदाहरण: ```bash 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 के बाहर की टेलीमेट्री में दिखाई दे सकते हैं। इन्हें डिफ़ॉल्ट प्रमाणीकरण मोड के बजाय एक संगतता विकल्प मानें। --- ## टेलीमेट्री ```bash # विलंबता टेलीमेट्री सारांश प्राप्त करें (प्रति प्रदाता p50/p95/p99) GET /api/telemetry/summary ``` **प्रतिक्रिया:** ```json { "providers": { "claudeCode": { "p50": 245, "p95": 890, "p99": 1200, "count": 150 }, "github": { "p50": 180, "p95": 620, "p99": 950, "count": 320 } } } ``` --- ## बजट ```bash # सभी 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-कुंजी **टोकन** बजट (ऊपर दिए गए USD-आधारित बजट से अलग)। अनुरोध पथ पर ही लागू किए जाते हैं: जब किसी कुंजी की वर्तमान विंडो का उपयोग उसकी सीमा तक पहुँच जाता है, तो अनुरोधों को `429 Too Many Requests` के साथ अस्वीकार कर दिया जाता है। सीमाओं को किसी विशिष्ट `model`, किसी `provider` तक सीमित किया जा सकता है, या पूरी कुंजी पर `global` रूप से लागू किया जा सकता है; जब किसी अनुरोध पर कई सीमाएँ लागू होती हैं, तो सबसे अधिक प्रतिबंधात्मक सीमा प्रभावी होती है। ```bash # किसी कुंजी की टोकन सीमाएँ सूचीबद्ध करें (इसमें लाइव विंडो उपयोग शामिल है) 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 } # id द्वारा टोकन सीमा हटाएँ DELETE /api/usage/token-limits?id=tl-abc ``` > **स्कीमा संबंधी टिप्पणियाँ** (`setTokenLimitSchema`): `apiKeyId` और `scopeType` (`model` | `provider` | `global`) आवश्यक हैं। जब तक `scopeType`, `global` न हो, `scopeValue` आवश्यक है (उदा. `model` स्कोप के लिए मॉडल id, `provider` स्कोप के लिए प्रदाता id)। `tokenLimit` एक धनात्मक पूर्णांक होना चाहिए (स्ट्रिंग से रूपांतरित)। वैकल्पिक: `id` (बनाने के लिए छोड़ दें, अपडेट करने के लिए प्रदान करें), `resetInterval` (`daily` | `weekly` | `monthly`, डिफ़ॉल्ट `monthly`), `resetTime` (`HH:MM`), `enabled` (डिफ़ॉल्ट `true`)। `GET` प्रतिक्रियाएँ प्रत्येक सीमा को `tokensUsed`, `remaining`, `windowStart`, `periodStartAt`, और `nextResetAt` से समृद्ध करती हैं। यह एक प्रबंधन-श्रेणी का एंडपॉइंट है (प्रमाणीकरण authz पाइपलाइन द्वारा केंद्रीय रूप से लागू किया जाता है)। ## अनुरोध प्रसंस्करण 1. क्लाइंट `/v1/*` को अनुरोध भेजता है 2. रूट हैंडलर `handleChat`, `handleEmbedding`, `handleAudioTranscription`, या `handleImageGeneration` को कॉल करता है 3. मॉडल का निर्धारण किया जाता है (प्रत्यक्ष प्रदाता/मॉडल या उपनाम/कॉम्बो) 4. खाता उपलब्धता फ़िल्टरिंग के साथ स्थानीय DB से क्रेडेंशियल चुने जाते हैं 5. चैट के लिए: `handleChatCore` सिमेंटिक/सिग्नेचर कैश की जाँच करता है और कॉम्बो संपीड़न सेटिंग्स निर्धारित करता है 6. सक्षम होने पर प्रदाता अनुवाद से पहले सक्रिय संपीड़न चलता है (`lite`, Caveman, RTK, या स्टैक्ड) 7. प्रदाता एक्ज़ीक्यूटर अपस्ट्रीम अनुरोध भेजता है 8. प्रतिक्रिया को वापस क्लाइंट प्रारूप में अनुवादित किया जाता है (चैट) या जैसी है वैसी लौटाई जाती है (एम्बेडिंग/इमेज/ऑडियो) 9. उपयोग, संपीड़न विश्लेषण और अनुरोध लॉग रिकॉर्ड किए जाते हैं 10. त्रुटियाँ होने पर कॉम्बो नियमों के अनुसार फ़ॉलबैक लागू होता है पूर्ण आर्किटेक्चर संदर्भ: [`ARCHITECTURE.md`](../architecture/ARCHITECTURE.md) --- ## कॉम्बो प्रबंधन उच्च-स्तरीय रूटिंग कॉम्बो (जिनका सारांश पहले ही `/api/combos*` के अंतर्गत दिया गया है) को मॉडल id पैटर्न से 1:1 मैप भी किया जा सकता है, जिससे OpenAI-शैली मॉडल id को पारदर्शी रूप से किसी कॉम्बो पर रीडायरेक्ट किया जा सकता है। | विधि | पथ | विवरण | | ------ | -------------------------------- | ---------------------------------------------------------------------------- | | 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 कुंजी (`requireManagementAuth`)। --- ## वेबहुक्स OmniRoute इवेंट्स (अनुरोध पूर्ण होना, कोटा समाप्त होना, कुंजी रोटेशन आदि) के लिए आउटबाउंड वेबहुक सदस्यताएँ। | विधि | पथ | विवरण | | ------ | ------------------------- | ------------------------------------------------------------------------------ | | GET | `/api/webhooks` | वेबहुक्स की सूची दिखाएँ (सीक्रेट्स को `...` के रूप में छिपाया जाता है) | | 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 कुंजियाँ जारी और रोटेट करने हेतु स्वतः-कुंजी प्रबंधन उप-प्रणाली द्वारा उपयोग किया जाता है। | विधि | पथ | विवरण | | ------ | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 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 कुंजी (`requireManagementAuth`) — `/api/keys` वाला ही गार्ड: एक डैशबोर्ड सत्र, स्थानीय CLI टोकन, या `manage`/`admin` स्कोप वाली API कुंजी; केवल-इन्फ़रेंस API कुंजियों को `403` मिलता है। `/v1/quotas/check` और `/v1/issues/report` भी देखें। --- ## एजेंट्स प्रोटोकॉल OmniRoute उपयोगकर्ताओं की ओर से दूरस्थ रूप से निष्पादित क्लाउड एजेंट कार्य (Claude Code, Codex Cloud, OpenHands, आदि)। | विधि | पथ | विवरण | | ------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 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]` | id द्वारा कोई विशिष्ट कार्य हटाएँ | > **प्रमाणीकरण:** प्रत्येक विधि पर प्रबंधन प्रमाणीकरण आवश्यक है (`requireCloudAgentManagementAuth`)। v3.8.0 से पहले ये अप्रमाणीकृत थे — ब्रेकिंग बदलाव के लिए कमिट `588a0333` देखें। ```bash # 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=` पास करें | | 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` रूट द्वारा सर्व किए जाते हैं — कोडबेस में प्रति-id सबरूट नहीं हैं। --- ## लचीलापन (विस्तृत) 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` का समर्थन करती है; यही फ़ील्ड Dashboard → Settings → Resilience में भी उपलब्ध हैं। ```bash # किसी एक मॉडल लॉकआउट को साफ़ करें 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`](../../CLAUDE.md) → "लचीलापन रनटाइम स्थिति" देखें। --- ## कौशल कस्टम निष्पादन योग्य हैंडलरों और मार्केटप्लेस एकीकरण के साथ 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 से id द्वारा कौशल इंस्टॉल करें | | GET | `/api/skills/skillssh?q=&limit=` | skills.sh रजिस्ट्री खोजें | | POST | `/api/skills/skillssh/install` | skills.sh से id द्वारा कौशल इंस्टॉल करें | **प्रमाणीकरण:** प्रबंधन सत्र/API कुंजी। मार्केटप्लेस खोज रूट प्रबंधन प्रमाणीकरण या Bearer API कुंजी (`isAuthenticated`) में से किसी एक को स्वीकार करते हैं। --- ## मेमोरी स्थायी संवादात्मक/तथ्यात्मक मेमोरी स्टोर, जो प्रत्येक API key / session के अनुसार सीमित है। | विधि | पथ | विवरण | | ------ | -------------------- | -------------------------------------------------------------------------------------------------------------- | | 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` | मेमोरी सबसिस्टम की स्थिति (DB कनेक्टिविटी, embeddings बैकएंड, vector index स्थिति) | **प्रमाणीकरण:** प्रबंधन session/API key (`requireManagementAuth`)। `type` enum: `FACTUAL`, `EPISODIC`, `SEMANTIC`, `PROCEDURAL` (`src/lib/memory/types.ts` में `MemoryType` देखें)। --- ## MCP सर्वर OmniRoute में 3 ट्रांसपोर्ट (stdio, SSE, streamable-http) और सीमित-स्कोप वाले टूल्स के साथ एक अंतर्निहित Model Context Protocol सर्वर शामिल है। नीचे दिए गए डैशबोर्ड एंडपॉइंट स्थिति/ऑडिट डेटा पढ़ते हैं और HTTP ट्रांसपोर्ट को प्रॉक्सी करते हैं। | विधि | पथ | विवरण | | ------ | ---------------------- | ------------------------------------------------------------------------------------------------ | -------------------- | | GET | `/api/mcp/status` | हार्टबीट, ट्रांसपोर्ट, ऑनलाइन स्थिति, अंतिम कॉल, प्रमुख टूल्स, 24 घंटे की सफलता दर | | GET | `/api/mcp/tools` | `name`, `description`, `scopes`, `phase`, `auditLevel`, `sourceEndpoints` सहित MCP टूल्स की सूची | | GET | `/api/mcp/sse` | SSE ट्रांसपोर्ट के लिए SSE स्ट्रीम खोलें (MCP अक्षम होने या ट्रांसपोर्ट मेल न खाने पर `503` लौटाता है) | | POST | `/api/mcp/sse` | SSE ट्रांसपोर्ट पर JSON-RPC फ्रेम भेजें | | GET | `/api/mcp/stream` | Streamable HTTP ट्रांसपोर्ट का SSE पक्ष खोलें (सर्वर द्वारा आरंभ किए गए संदेश) | | POST | `/api/mcp/stream` | Streamable HTTP ट्रांसपोर्ट पर JSON-RPC फ्रेम भेजें | | DELETE | `/api/mcp/stream` | Streamable HTTP session समाप्त करें | | GET | `/api/mcp/audit` | ऑडिट लॉग क्वेरी करें — `?limit=`, `?offset=`, `?tool=`, `?success=true | false`, `?apiKeyId=` | | GET | `/api/mcp/audit/stats` | समेकित ऑडिट आँकड़े (कुल संख्या, सफलता दर, औसत अवधि, प्रमुख टूल्स) | **प्रमाणीकरण:** `sse`/`stream` ट्रांसपोर्ट MCP-विशिष्ट प्रमाणीकरण सतह (`mcp` स्कोप वाली Bearer API key) का पालन करते हैं; `status`/`tools`/`audit*` रूट डैशबोर्ड से पढ़े जा सकते हैं (डैशबोर्ड होस्ट तक पहुँचने के अतिरिक्त किसी प्रमाणीकरण की आवश्यकता नहीं है)। > दोनों HTTP ट्रांसपोर्ट `settings.mcpEnabled` और `settings.mcpTransport` द्वारा नियंत्रित होते हैं — ट्रांसपोर्ट मेल न खाने पर `400` और MCP अक्षम होने पर `503` लौटाया जाता है। --- ## A2A सर्वर OmniRoute निरीक्षण/डैशबोर्ड उपयोग के लिए एक A2A (एजेंट-से-एजेंट) JSON-RPC 2.0 एंडपॉइंट और एक REST रैपर उपलब्ध कराता है। ### JSON-RPC ```bash 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`। ### एजेंट कार्ड ```bash GET /.well-known/agent.json ``` सार्वजनिक A2A एजेंट कार्ड (नाम, विवरण, क्षमताएँ, कौशल कैटलॉग, प्रमाणीकरण योजना) लौटाता है — सार्वजनिक रूप से 1h के लिए कैश किया जाता है। प्रमाणीकरण आवश्यक नहीं है। ### REST सहायक | विधि | पथ | विवरण | | ---- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | GET | `/api/a2a/status` | A2A सक्षम स्थिति + कार्य आँकड़े + कैश किए गए एजेंट कार्ड का सारांश | | GET | `/api/a2a/tasks` | कार्य सूचीबद्ध करें — `?state=submitted\|working\|completed\|failed\|cancelled`, `?skill=`, `?limit=` (≤200), `?offset=` | | 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` का उपयोग करता है। --- ## क्लाउड, इवैल और आकलन | विधि | पथ | विवरण | | ------ | ------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------- | ----------------------------------- | | 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 कुंजी आवश्यक है। `/api/assess` POST, डिस्क्रिमिनेटेड-यूनियन स्कोप स्कीमा के साथ `validateBody` का उपयोग करता है। --- ## ACP (Agent Client Protocol) प्रबंधन चाइल्ड प्रोसेस के रूप में। ये एंडपॉइंट 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=` | **प्रतिक्रिया का उदाहरण** (`GET /api/acp/agents`): ```json { "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 फ़्रेमवर्क](../frameworks/ACP.md) देखें। --- ## एनालिटिक्स और ऑब्ज़र्वेबिलिटी रूटिंग, कंप्रेशन और प्रोवाइडर विविधता की निगरानी के लिए रियल-टाइम एनालिटिक्स एंडपॉइंट। ये `/dashboard/analytics/*` पेजों को संचालित करते हैं। ### ऑटो-रूटिंग एनालिटिक्स | विधि | पथ | विवरण | | ---- | ------------------------------------ | ---------------------------------------------------------------------------- | | GET | `/api/analytics/auto-routing` | समेकित ऑटो-रूटिंग आँकड़े: कुल कॉल, रणनीति वितरण, टियर वितरण, शीर्ष प्रोवाइडर | | GET | `/api/analytics/auto-routing?days=7` | समय-सीमा वाले आँकड़े (डिफ़ॉल्ट 24 घंटे) | **प्रतिक्रिया का उदाहरण**: ```json { "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` | समेकित कंप्रेशन आँकड़े: बचाए गए टोकन, बचत %, मोड वितरण, इंजन उपयोग | **प्रतिक्रिया का उदाहरण**: ```json { "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` | शैनन एंट्रॉपी-आधारित विविधता ट्रैकिंग: प्रोवाइडर प्रसार को मापकर विफलता के एकल बिंदुओं को रोकती है | **प्रतिक्रिया का उदाहरण**: ```json { "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": ["OpenAI accounts for 40% of traffic — consider diversifying"] } ``` **प्रमाणीकरण:** प्रबंधन सत्र या प्रबंधन-स्कोप वाली API कुंजी आवश्यक है। --- ## एडमिन संचालन परिचालन प्रबंधन के लिए केवल एडमिन हेतु उपलब्ध एंडपॉइंट। | विधि | पथ | विवरण | | ---- | ------------------------ | --------------------------------------------------------------------------------------------- | | GET | `/api/admin/concurrency` | वर्तमान समवर्तीता सीमाएँ पढ़ें (वैश्विक + प्रति-प्रदाता) | | POST | `/api/admin/concurrency` | समवर्तीता सीमाएँ अपडेट करें — बॉडी: `{global?: number, perProvider?: Record}` | **प्रमाणीकरण:** एडमिन स्कोप वाले प्रबंधन सत्र की आवश्यकता है। --- ## CLI टूल प्रबंधन OmniRoute के साथ एकीकृत होने वाले CLI टूल (antigravity, commandCode, devin-cli आदि) प्रबंधित करें। पूरी सूची के लिए [प्रदाता संदर्भ](./PROVIDER_REFERENCE.md) देखें। | विधि | पथ | विवरण | | ---- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 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` | Antigravity MITM प्रॉक्सी की स्थिति ("antigravity-mitm" CLI टूल) | | POST | `/api/cli-tools/antigravity-mitm/alias` | antigravity-mitm उपनाम कॉन्फ़िगर करें | **प्रमाणीकरण:** प्रबंधन सत्र आवश्यक है। --- ## एजेंट कौशल AI एजेंट कौशल प्रबंधित करें (OpenAI के कस्टम GPTs के समान, लेकिन एजेंटों के लिए)। | विधि | पथ | विवरण | | ------ | ---------------------------- | ---------------------------------------------------------------------------------- | | 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` | प्राकृतिक भाषा के विवरण से AI का उपयोग करके नया कौशल जनरेट करें | **प्रमाणीकरण:** प्रबंधन सत्र या प्रबंधन-स्कोप वाली API कुंजी की आवश्यकता है। --- ## कैश प्रबंधन सिमेंटिक कैश और रीजनिंग कैश प्रबंधित करें। | विधि | पथ | विवरण | | ------ | ---------------------- | ------------------------------------------------------------------------------------------------------------- | | GET | `/api/cache` | कैश अवलोकन: कुल प्रविष्टियाँ, हिट दर, डिस्क पर आकार | | GET | `/api/cache/entries` | कैश की गई प्रविष्टियाँ सूचीबद्ध करें (पृष्ठांकन सहित) | | DELETE | `/api/cache/entries` | कैश प्रविष्टियाँ हटाएँ (क्वेरी पैरामीटर के अनुसार फ़िल्टर करें) | | GET | `/api/cache/stats` | विस्तृत कैश आँकड़े (प्रति-प्रदाता, प्रति-मॉडल) | | GET | `/api/cache/reasoning` | रीजनिंग कैश की स्थिति (रीजनिंग रीप्ले के लिए) | | DELETE | `/api/cache/reasoning` | रीजनिंग कैश साफ़ करें — क्वेरी पैरामीटर: `?toolCallId=` (एकल), `?provider=

` या कोई पैरामीटर नहीं (सभी) | **प्रमाणीकरण:** प्रबंधन सत्र आवश्यक है। --- ## मेमोरी सिस्टम स्थायी मेमोरी (FTS5 + वेक्टर एम्बेडिंग) प्रबंधित करें। | विधि | पथ | विवरण | | ------ | ------------------ | -------------------------------------------------------------------------------------- | | 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 कुंजी आवश्यक है। --- ## वेबहुक ईवेंट के लिए वेबहुक सदस्यताएँ प्रबंधित करें। | विधि | पथ | विवरण | | ------ | ------------------------------- | ---------------------------------------------------------------- | | 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` | किसी वेबहुक को परीक्षण ईवेंट भेजें | **प्रमाणीकरण:** प्रबंधन सत्र आवश्यक है। सभी ईवेंट प्रकारों के लिए [वेबहुक फ़्रेमवर्क](../frameworks/WEBHOOKS.md) देखें। --- ## स्किल्स फ़्रेमवर्क स्किल्स (एजेंटिक एक्सटेंशन फ़्रेमवर्क) प्रबंधित करें। | विधि | पथ | विवरण | | ------ | ------------------------ | ----------------------------------------------------------------------------------------------- | | GET | `/api/skills` | सभी इंस्टॉल की गई स्किल्स (बिल्ट-इन + कस्टम) सूचीबद्ध करें | | POST | `/api/skills/install` | किसी स्थानीय पथ या URL से स्किल इंस्टॉल करें | | DELETE | `/api/skills/[id]` | किसी स्किल को अनइंस्टॉल करें | | PUT | `/api/skills/[id]` | किसी स्किल को सक्षम या अक्षम करें — बॉडी: `{enabled?: boolean, mode?: "on" \| "off" \| "auto"}` | | POST | `/api/skills/executions` | किसी स्किल को निष्पादित करें — बॉडी: `{skillName, apiKeyId, input?, sessionId?}` | | GET | `/api/skills/executions` | सभी स्किल्स का निष्पादन इतिहास सूचीबद्ध करें (`?apiKeyId=` से फ़िल्टर करें) | **प्रमाणीकरण:** प्रबंधन सत्र या प्रबंधन-स्कोप वाली API कुंजी आवश्यक है। पूरी जानकारी के लिए [स्किल्स फ़्रेमवर्क](../frameworks/SKILLS.md) देखें। --- ## प्लगइन्स OmniRoute प्लगइन्स (तृतीय-पक्ष एक्सटेंशन) प्रबंधित करें। | विधि | पथ | विवरण | | ------ | ---------------------------------- | ------------------------------------- | | 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` | प्लगइन कॉन्फ़िगरेशन अपडेट करें | **प्रमाणीकरण:** प्रबंधन सत्र आवश्यक है। पूरी जानकारी के लिए [प्लगइन्स फ़्रेमवर्क](../frameworks/PLUGIN_SDK.md) देखें। --- ## शैडो रूटिंग प्रदाताओं की शैडो / A-B तुलना **एक स्वतंत्र REST सरफ़ेस नहीं है** — इसे कॉम्बो रूटिंग के माध्यम से कॉन्फ़िगर किया जाता है ([ऑटो-कॉम्बो](../routing/AUTO-COMBO.md) देखें)। प्रत्येक कॉम्बो के तुलना मेट्रिक्स `GET /api/combos/metrics` द्वारा उपलब्ध कराए जाते हैं। --- ## गार्डरेल्स रनटाइम गार्डरेल्स (PII पहचान, प्रॉम्प्ट इंजेक्शन पहचान, विज़न ब्रिजिंग) का निरीक्षण करें। गार्डरेल्स प्रत्येक अनुरोध पर चलते हैं; प्रति-कॉल ऑप्ट-आउट `x-omniroute-disabled-guardrails` अनुरोध हेडर के माध्यम से किया जाता है — सक्षम/अक्षम स्थिति को स्थायी रूप से सहेजने के लिए कोई सरफ़ेस नहीं है। | विधि | पथ | विवरण | | ---- | ---------------------- | ---------------------------------------------------------------------------------------- | | GET | `/api/guardrails` | पंजीकृत गार्डरेल्स और उनकी स्थिति (नाम / सक्षम / प्राथमिकता) सूचीबद्ध करें | | POST | `/api/guardrails/test` | नमूना इनपुट पर प्री-कॉल पाइपलाइन का ड्राई-रन करें — बॉडी: `{input, disabledGuardrails?}` | **प्रमाणीकरण:** प्रबंधन सत्र आवश्यक है। पूरी जानकारी के लिए [सुरक्षा > गार्डरेल्स](../security/GUARDRAILS.md) देखें। --- --- ## प्रमाणीकरण चार क्रेडेंशियल श्रेणियों (डैशबोर्ड सत्र, स्थानीय CLI टोकन, `oma_live_…` एक्सेस टोकन, प्रबंधन-स्कोप वाला API कुंजी) और वे इन्फ़रेंस कुंजियों से कैसे भिन्न हैं, इसकी जानकारी के लिए [प्रबंधन प्रमाणीकरण](../guides/MANAGEMENT-AUTH.md) देखें। - डैशबोर्ड रूट (`/dashboard/*`) `auth_token` कुकी का उपयोग करते हैं - लॉगिन सहेजे गए पासवर्ड हैश का उपयोग करता है; फ़ॉलबैक के रूप में `INITIAL_PASSWORD` का उपयोग होता है - `requireLogin` को `/api/settings/require-login` के माध्यम से टॉगल किया जा सकता है - `REQUIRE_API_KEY=true` होने पर `/v1/*` रूट वैकल्पिक रूप से Bearer API कुंजी की आवश्यकता रखते हैं - इस संदर्भ में "प्रबंधन टोकन" / "प्रबंधन-स्कोप वाला API कुंजी" का अर्थ उस गाइड में दी गई श्रेणियों में से एक है—कोई अपरिभाषित अतिरिक्त सीक्रेट प्रकार नहीं > **ब्रेकिंग बदलाव (v3.8.0)** — `/api/v1/agents/tasks/*` और कूलडाउन प्रबंधन एंडपॉइंट्स के लिए अब **प्रबंधन प्रमाणीकरण** (डैशबोर्ड `auth_token` कुकी या प्रबंधन-स्कोप वाला API कुंजी) आवश्यक है। जो क्लाइंट पहले इन रूट्स को बिना प्रमाणीकरण के कॉल करते थे, उन्हें अब `401 Unauthorized` प्राप्त होगा। कमिट `588a0333` (`fix(auth): require management auth for agent and cooldown APIs`) देखें।