Перейти к содержимому

Чат и стриминг

POST /v1/chat/completions — основной эндпоинт. Формат запроса и ответа повторяет OpenAI, поэтому работает любой совместимый SDK.

Поле Тип Описание
model string, обязательное Идентификатор из GET /models или псевдоним (gpt-4o, claude-opus)
messages array, обязательное История диалога; последнее сообщение пользователя — это промпт
stream boolean true — ответ приходит по SSE
stream_options object {"include_usage": true} добавит финальный чанк с расходом токенов
temperature number Как у OpenAI
max_tokens integer Потолок длины ответа
max_completion_tokens integer Синоним max_tokens для новых SDK
reasoning_effort string Глубина рассуждения у моделей, которые это умеют
stream = client.chat.completions.create(
model="gpt-5.6-luna",
messages=[{"role": "user", "content": "Напиши хайку про дедлайн"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)

Поток идёт как text/event-stream и завершается строкой data: [DONE]. С include_usage перед ней придёт чанк с usage — по нему удобно логировать расход.

Модели с capabilities.vision: true принимают картинку в составе сообщения:

resp = client.chat.completions.create(
model="gpt-5.6-terra",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Что не так на этом графике?"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORw0KG..."}},
],
}],
)

Принимаются data:-URL и обычные HTTPS-ссылки на изображение.

Модели с capabilities.file: true читают PDF целиком — включая сканы и таблицы, без внешнего OCR:

{
"role": "user",
"content": [
{"type": "text", "text": "Сделай выжимку по разделу «Риски»"},
{"type": "file", "file": {"filename": "report.pdf", "file_data": "data:application/pdf;base64,JVBERi0..."}}
]
}

Если модель не умеет читать файлы, запрос вернёт 400 — проверяйте флаг в каталоге заранее.

У части моделей есть управляемая глубина рассуждения. Допустимые значения приходят в capabilities.reasoning_efforts — обычно это low, medium, high, xhigh, max.

{"model": "claude-opus-4.8", "reasoning_effort": "high", "messages": [...]}

Два подводных камня:

  • Рассуждение съедает бюджет max_tokens. Если ждёте длинный JSON от модели с включённым рассуждением, ставьте потолок с запасом — иначе ответ обрежется на середине.
  • Отключить рассуждение можно не везде: смотрите capabilities.can_disable_reasoning. Если там false, модель думает всегда, и это отражено в цене.

Модели с type: search (семейство Perplexity Sonar) ходят в интернет сами — отдельного эндпоинта или инструмента не нужно, просто укажите такую модель:

Окно терминала
curl https://api.mixen.ai/v1/chat/completions \
-H "Authorization: Bearer $MIXEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"sonar-pro","messages":[{"role":"user","content":"Что нового вышло у Anthropic за неделю?"}]}'

Для ключа с ограниченными областями доступа такие модели требуют область search, а не chat.