генерация текста — основная задача языковых моделей: на вход подаётся диалог, на выходе получается следующее сообщение. через эндпоинт /v1/chat/completions доступна любая текстовая модель каталога, независимо от того, кто её создал.
сообщения и роли
диалог передаётся списком messages. у каждого сообщения есть роль и содержимое:
| роль | кто говорит | зачем нужна |
|---|---|---|
system | инструкция для модели | задаёт правила: тон, язык, формат ответа, ограничения |
user | человек | вопрос или задание |
assistant | модель | её предыдущие ответы |
tool | результат функции | ответ приложения на tool_calls |
системное сообщение необязательно, но именно оно управляет поведением модели надёжнее, чем просьба внутри пользовательского сообщения. ставится первым в списке.
модель не помнит переписку
каждый запрос обрабатывается независимо: предыдущие обращения модели недоступны. чтобы диалог продолжался, всю историю нужно отправлять заново — вместе с ответами модели в роли assistant.
{
"model": "openai/gpt-5-mini",
"messages": [
{"role": "system", "content": "Отвечай одним предложением."},
{"role": "user", "content": "Назови столицу Австралии."},
{"role": "assistant", "content": "Столица Австралии — Канберра."},
{"role": "user", "content": "А сколько там жителей?"}
]
}
без третьего сообщения модель не поняла бы, о каком городе идёт речь в четвёртом.
длина истории ограничена размером контекста модели. когда переписка перестаёт помещаться, старые сообщения обычно отбрасывают или заменяют кратким пересказом.
параметры
кроме model и messages запрос принимает параметры, управляющие ответом:
| параметр | что делает |
|---|---|
temperature | разброс ответов. ближе к 0 — предсказуемо и однообразно, выше — свободнее и неожиданнее |
top_p | альтернативный способ управления разбросом. меняют либо его, либо temperature, но не оба сразу |
max_tokens / max_completion_tokens | верхний предел длины ответа в токенах |
stop | строка или список строк, на которых генерация обрывается |
stream | если true, ответ приходит по частям. см. стриминг |
набор поддерживаемых параметров у моделей разный. незнакомый параметр конечный сервис либо игнорирует, либо отвечает ошибкой 400 — поведение задаёт он, а не airakurs.
пример запроса с системным сообщением и параметрами:
curl "https://api.airakurs.ru/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <КЛЮЧ>" \
-d '{
"model": "openai/gpt-5-mini",
"messages": [
{"role": "system", "content": "Ты редактор. Отвечай кратко."},
{"role": "user", "content": "Сократи: длинное предложение о погоде."}
],
"temperature": 0.3,
"max_tokens": 200
}'
ответ
текст лежит в choices[0].message.content. рядом приходят finish_reason и usage:
{
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Завтра тепло."},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 24,
"completion_tokens": 3,
"total_tokens": 27
}
}
finish_reason объясняет, почему модель остановилась:
| значение | что произошло |
|---|---|
stop | ответ завершён полностью |
length | упёрлись в max_tokens или в предел модели, ответ оборван |
tool_calls | модель просит вызвать функцию |
content_filter | ответ заблокирован фильтром конечного сервиса |
usage показывает расход токенов: prompt_tokens — то, что ушло на вход вместе со всей историей, completion_tokens — сгенерированный ответ. по этим числам считается стоимость запроса.
что дальше
- стриминг — как получать ответ по частям.
- вызов функций — как модель обращается к внешнему коду.
- модели — как устроены идентификаторы.
частые вопросы
помнит ли модель предыдущие сообщения?
нет. каждый запрос обрабатывается отдельно, состояние между обращениями не сохраняется. чтобы модель видела контекст разговора, всю историю нужно передавать в поле messages при каждом запросе.
почему ответ обрывается на полуслове?
скорее всего, сработало ограничение длины: в поле finish_reason будет значение length. помогает увеличить max_tokens или попросить модель отвечать короче.
что менять — temperature или top_p?
что-то одно. оба параметра управляют разбросом ответов, и если задать их вместе, результат становится непредсказуемым. обычно достаточно temperature.
одинаково ли работают модели разных вендоров на этом эндпоинте?
структура запроса и ответа одинаковая для всех моделей каталога. различия остаются в наборе поддерживаемых параметров и в том, как модель реагирует на системное сообщение.