Быстрый старт
OdiRouter предлагает удобный путь к мультимодальным AI-возможностям. Это руководство поможет за несколько минут выполнить первый вызов OdiRouter API.
Шаг 1: Войдите в OdiRouter
Заголовок раздела «Шаг 1: Войдите в OdiRouter»Откройте OdiRouter и войдите на платформу. Сейчас поддерживаются вход через Google, GitHub и электронную почту. Новые пользователи могут зарегистрироваться по адресу электронной почты и пройти подтверждение.
Шаг 2: Получите API-ключ
Заголовок раздела «Шаг 2: Получите API-ключ»OdiRouter использует единый API-ключ для аутентификации доступа ко всем мультимодальным возможностям. После входа ключи можно создавать и управлять ими на странице управления API-ключами ; они используются для последующего доступа к моделям и подключения рабочих процессов.
Authorization: Bearer YOUR_API_KEYШаг 3: Пополните баланс аккаунта
Заголовок раздела «Шаг 3: Пополните баланс аккаунта»Чтобы пользоваться моделями и выполнять задачи без перерывов, убедитесь, что на аккаунте достаточно средств. Перед промышленным использованием пополните баланс на странице кредитов .
Шаг 4: Выполните первый API-вызов
Заголовок раздела «Шаг 4: Выполните первый API-вызов»После входа, создания API-ключа и пополнения баланса выполните LLM-вызов или отправьте мультимодальную задачу, чтобы проверить подключение.
LLM-вызов
Заголовок раздела «LLM-вызов»LLM-вызовы используют https://api.odirouter.ai/v1 и поддерживают три пути интерфейса: /chat/completions, /messages и /responses. В примере ниже используется /chat/completions.
export BASE_URL="https://api.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-5.5", "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://api.odirouter.ai/v1",)
response = client.chat.completions.create( model="gpt-5.5", messages=[ { "role": "user", "content": "Introduce OdiRouter LLM API in one sentence", } ],)
print(response.choices[0].message.content)API синхронно возвращает объект сообщения, например:
{ "id": "resp_01hxyz...", "object": "chat.completion", "created": 1784552736, "model": "gpt-5.5", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "OdiRouter provides a unified API for accessing LLM and multimodal AI models." }, "finish_reason": "stop" } ]}Мультимодальная задача
Заголовок раздела «Мультимодальная задача»Мультимодальные задачи используют https://api.odirouter.ai/model, а путь интерфейса — /v1/queue/{endpoint}; они работают через асинхронный queue-протокол. На примере генерации изображения сначала отправьте задачу генерации изображения, затем опрашивайте статус задачи и после завершения получите результат.
Например, создайте задачу генерации изображения с nano-banana-2:
curl -X POST "https://api.odirouter.ai/model/v1/queue/nano-banana-2" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "a cinematic photo of a cat astronaut" }'При успешном создании API вернет объект задачи. Сохраните request_id; он используется для дальнейшего опроса статуса и получения результата:
{ "request_id": "mmsu_01hxyz...", "response_url": "https://api.odirouter.ai/model/v1/queue/nano-banana-2/requests/mmsu_01hxyz.../response", "status_url": "https://api.odirouter.ai/model/v1/queue/nano-banana-2/requests/mmsu_01hxyz.../status", "cancel_url": "https://api.odirouter.ai/model/v1/queue/nano-banana-2/requests/mmsu_01hxyz.../cancel", "queue_position": 0}Чтобы проверить статус задачи, вызовите endpoint статуса с request_id:
curl "https://api.odirouter.ai/model/v1/queue/nano-banana-2/requests/mmsu_01hxyz.../status" \ -H "Authorization: Bearer YOUR_API_KEY"Пока задача выполняется, статус будет IN_QUEUE или IN_PROGRESS. Когда задача перейдет в конечное состояние, статус будет COMPLETED:
{ "status": "COMPLETED", "request_id": "mmsu_01hxyz...", "response_url": "https://api.odirouter.ai/model/v1/queue/nano-banana-2/requests/mmsu_01hxyz.../response", "metrics": { "inference_time": 12.34 }}После завершения задачи вызовите endpoint результата с request_id:
curl "https://api.odirouter.ai/model/v1/queue/nano-banana-2/requests/mmsu_01hxyz.../response" \ -H "Authorization: Bearer YOUR_API_KEY"URL сгенерированного изображения находится в массиве output[].content[]:
{ "created_at": 1784032815291, "id": "mmsu_01hxyz...", "metadata": { "completed_at": 8.14733, "in_queue_at": 0, "upload_at": 0 }, "model": "nano-banana-2", "output": [ { "content": [ { "type": "image", "url": "https://example.com/generated-image.png" } ] } ], "status": "completed", "request_id": "mmsu_01hxyz..."}В следующем примере показан полный процесс: отправка задачи изображения, опрос статуса и чтение результата:
export BASE_URL="https://api.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')"
while true; do STATUS_RESPONSE="$(curl -sS "${BASE_URL}/v1/queue/${ENDPOINT}/requests/${REQUEST_ID}/status" \ "${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 "${BASE_URL}/v1/queue/${ENDPOINT}/requests/${REQUEST_ID}/response" \ "${COMMON_HEADERS[@]}" | jq .import timeimport requests
BASE_URL = "https://api.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"]
while True: status_resp = requests.get( f"{BASE_URL}/v1/queue/{ENDPOINT}/requests/{request_id}/status", 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( f"{BASE_URL}/v1/queue/{ENDPOINT}/requests/{request_id}/response", headers=headers, timeout=30,)result_resp.raise_for_status()result_body = result_resp.json()
print("request_id:", request_id)print("result:", result_body)Ограничения частоты запросов
Заголовок раздела «Ограничения частоты запросов»Для пользователей без пополнения баланса:
- Бесплатные модели: суммарно до 50 вызовов в день (лимит сбрасывается в 00:00 UTC), RPM для LLM — 5, лимит параллельных мультимодальных запросов — 2.
- Платные модели: без ограничения по количеству вызовов, RPM для LLM — 5, лимит параллельных мультимодальных запросов — 2.
Для пользователей, пополнивших баланс:
- Бесплатные модели: суммарно до 100 вызовов в день (лимит сбрасывается в 00:00 UTC), RPM для LLM — 100, лимит параллельных мультимодальных запросов — 10.
- Платные модели: без ограничения по количеству вызовов, RPM для LLM — 100, лимит параллельных мультимодальных запросов — 10.