Документация / Модели и роутинг
Алиасы и лестница отказов
В поле model стоит алиас, а не имя модели вендора. За алиасом — несколько маршрутов: тот же вес модели у разных провайдеров, в разных аккаунтах и регионах. Выбор делает шлюз.
Порядок маршрутов шлюз считает сам — по цене, задержке и здоровью провайдера. Первый маршрут пробуется, и если он отказал до первого байта ответа, запрос уходит на следующий: это и есть лестница отказов. Платите вы за ответ, а не за попытки.
Параметра маршрутизации в теле запроса нет и не будет: чем управлять — решает алиас на стороне шлюза, а не клиент. Оператор задаёт алиасу список маршрутов, наценку, потолок ответа и то, разрешено ли ему деградировать.
Что значит allow_degrade
Лестница по умолчанию держится одного класса модели: если у алиаса allow_degrade выключен, запрос скорее получит отказ, чем ответ от модели попроще. Когда оператор включает деградацию, шлюз вправе уйти на запасную ступень — и говорит об этом заголовком X-Degraded: true, чтобы «дешёвый ответ» не выдавался за дорогой.
Липкость диалога
Заголовок X-Conversation-Id закрепляет разговор за маршрутом, который ответил в прошлый раз: продолжение не должно перепрыгивать между моделями посреди диалога. Липкость действует, пока маршрут здоров, живёт ограниченное время и не пересекает границы проекта. Само значение шлюз не хранит — только его хэш.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://ai.globall.dev/v1",
api_key=os.environ["TOK_API_KEY"],
)
r = client.chat.completions.create(
model="anthropic/claude-haiku-5.5",
messages=[{"role": "user", "content": "Продолжим"}],
max_tokens=64,
extra_headers={"X-Conversation-Id": "order-42"},
)
print(r.model)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://ai.globall.dev/v1",
apiKey: process.env.TOK_API_KEY,
});
const r = await client.chat.completions.create(
{
model: "anthropic/claude-haiku-5.5",
messages: [{ role: "user", content: "Продолжим" }],
max_tokens: 64,
},
{ headers: { "X-Conversation-Id": "order-42" } },
);
console.log(r.model);
curl https://ai.globall.dev/v1/chat/completions \
-H "Authorization: Bearer $TOK_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Conversation-Id: order-42" \
-d '{
"model": "anthropic/claude-haiku-5.5",
"messages": [{"role": "user", "content": "Продолжим"}],
"max_tokens": 64
}'
В ответе — ваш алиас
Поле model в ответе повторяет алиас, который вы попросили, а не имя модели у вендора. Какая ступень ответила, видно по заголовкам X-Route, X-Attempts и X-Degraded. Идентификатор маршрута — наш внутренний и меняется без предупреждения: назовите его в поддержке, но не стройте на нём логику.
Когда лестница кончилась
Если ни один маршрут алиаса не здоров, приходит 503 no_healthy_route с Retry-After. Если маршрут в принципе не может выполнить запрос — например, вы прислали картинку модели без зрения, — это 400 no_route, и повтор не поможет.
- model
- string
- Алиас. Некоторые алиасы отвечают ещё и на имя модели вендора — синонимы видны в GET /v1/models.
- X-Conversation-Id
- header
- Идентификатор разговора. Любая строка, которую вы придумали сами.
- X-Degraded
- header
- Ответ пришёл с запасной ступени лестницы.
- X-Route, X-Attempts
- header
- Маршрут, который ответил, и номер попытки. Приходят вместе и только после того, как шлюз выбрал маршрут.