OdiRouter Model API
Model API предоставляет разные протоколы вызова для разных типов моделей. Мультимодальные модели обычно используют асинхронный протокол задач: создание задачи, polling статуса и получение результата. Большие языковые модели обычно используют синхронный или потоковый протоколы, возвращая текст или инкрементальный вывод в рамках одного запроса.
Подтвержденные маршруты
Заголовок раздела «Подтвержденные маршруты»| Возможность | Метод | Путь | Примечания |
|---|---|---|---|
| Список моделей | GET | /v1/models | Список доступных моделей |
| Chat Completions | POST | /v1/chat/completions | OpenAI-совместимые сообщения |
| Responses | POST | /v1/responses | Унифицированный Responses API |
| Мультимодальный submit | POST | /model/v1/queue/{endpoint} | Создает queue request для выбранной модели |
| Статус задачи | GET | /model/v1/queue/{endpoint}/requests/{request_id}/status | Возвращает текущий статус |
| Получение результата | GET | /model/v1/queue/{endpoint}/requests/{request_id}/response | Возвращает результат после завершения |
| Отмена задачи | PUT | /model/v1/queue/{endpoint}/requests/{request_id}/cancel | Отменяет задачу, если endpoint поддерживает cancel |
| Видео Sora-style | POST | /v1/videos | Отдельный multipart video endpoint |
OdiRouter LLM API предназначен для вызовов Chat Completions и Responses API. Endpoints используют единый префикс /v1, а платформа берет на себя аутентификацию по API-ключу, проверку баланса и трассировку запросов.
Документы
Заголовок раздела «Документы»Быстрый вызов
Заголовок раздела «Быстрый вызов»export BASE_URL="https://odirouter.ai/v1"export API_KEY="YOUR_API_KEY"
curl -sS "${BASE_URL}/chat/completions" \ -H "Authorization: Bearer ${API_KEY}" \ -H "Content-Type: application/json" \ -H "X-Request-Id: demo-$(date +%s)" \ -d '{ "model": "gpt-4.1", "messages": [ { "role": "user", "content": "Introduce OdiRouter LLM API in one sentence" } ], "temperature": 0.7 }'from openai import OpenAI
client = OpenAI( api_key="YOUR_API_KEY", base_url="https://odirouter.ai/v1",)
response = client.chat.completions.create( model="gpt-4.1", messages=[ { "role": "user", "content": "Introduce OdiRouter LLM API in one sentence", } ],)
print(response.choices[0].message.content)Мультимодальные модели
Заголовок раздела «Мультимодальные модели»Мультимодальные модели используют асинхронный queue-протокол: создайте задачу, опрашивайте статус и получите результат после завершения. Чтобы остановить выполнение, отправьте запрос на отмену. endpoint в URL — это непосредственно ID модели OdiRouter, а тело запроса содержит объект параметров модели.
Документы жизненного цикла
Заголовок раздела «Документы жизненного цикла»Полный пример кода
Заголовок раздела «Полный пример кода»export BASE_URL="https://odirouter.ai/model"export ENDPOINT="nano_banana_2"export API_KEY="YOUR_API_KEY"
COMMON_HEADERS=( -H "Authorization: Bearer ${API_KEY}" -H "Content-Type: application/json")
SUBMIT_RESPONSE="$(curl -sS -X POST "${BASE_URL}/v1/queue/${ENDPOINT}" \ "${COMMON_HEADERS[@]}" \ -d '{ "prompt": "a cinematic photo of a cat astronaut" }')"
echo "${SUBMIT_RESPONSE}" | jq .
REQUEST_ID="$(echo "${SUBMIT_RESPONSE}" | jq -r '.request_id')"STATUS_URL="$(echo "${SUBMIT_RESPONSE}" | jq -r '.status_url')"RESPONSE_URL="$(echo "${SUBMIT_RESPONSE}" | jq -r '.response_url')"
while true; do STATUS_RESPONSE="$(curl -sS "${STATUS_URL}" "${COMMON_HEADERS[@]}")" echo "${STATUS_RESPONSE}" | jq .
STATUS="$(echo "${STATUS_RESPONSE}" | jq -r '.status')" ERROR="$(echo "${STATUS_RESPONSE}" | jq -r '.error // empty')"
if [ "${STATUS}" = "COMPLETED" ]; then if [ -n "${ERROR}" ]; then echo "task failed: ${ERROR}" exit 1 fi break fi
sleep 3done
curl -sS "${RESPONSE_URL}" "${COMMON_HEADERS[@]}" | jq .import timeimport requests
BASE_URL = "https://odirouter.ai/model"ENDPOINT = "nano_banana_2"API_KEY = "YOUR_API_KEY"
headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json",}
submit_resp = requests.post( f"{BASE_URL}/v1/queue/{ENDPOINT}", headers=headers, json={ "prompt": "a cinematic photo of a cat astronaut", }, timeout=30,)submit_resp.raise_for_status()submit_body = submit_resp.json()
request_id = submit_body["request_id"]status_url = submit_body["status_url"]response_url = submit_body["response_url"]
while True: status_resp = requests.get(status_url, headers=headers, timeout=30) status_resp.raise_for_status() status_body = status_resp.json()
status = status_body["status"] if status == "COMPLETED": if "error" in status_body: raise RuntimeError(f"{status_body.get('error_type')}: {status_body['error']}") break
time.sleep(3)
result_resp = requests.get(response_url, headers=headers, timeout=30)result_resp.raise_for_status()result_body = result_resp.json()
print("request_id:", request_id)print("result:", result_body)