API
Chat Completions
Основной метод для чата — обычный ответ, streaming, изображения и tools.
Главный способ вызвать модель. Формат совпадает с OpenAI Chat Completions.
/v1/chat/completionsОбычный запрос
Обязательны model и messages.
curl https://api.anymind.app/v1/chat/completions \
-H "Authorization: Bearer $ANYMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-terra",
"messages": [
{ "role": "user", "content": "Ответь одним словом: корица" }
]
}'Что приходит в ответе
Текст — в choices[0].message.content. Сколько токенов потрачено — в usage.
{
"id": "chatcmpl-...",
"model": "gpt-5.6-terra",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Корица"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 1,
"total_tokens": 13
}
}finish_reason чаще всего stop (модель закончила), length (достигнут лимит токенов) или tool_calls (нужно выполнить функцию).
Если пришёл length, ответ обрезан: увеличьте max_tokens / max_completion_tokens или попросите модель быть короче. Не склеивайте два обрезанных ответа — сделайте новый запрос с историей.
Несколько сообщений
Роль system задаёт тон, дальше идёт история.
{
"model": "gpt-5.6-terra",
"messages": [
{ "role": "system", "content": "Отвечай коротко, на русском." },
{ "role": "user", "content": "Чем заменить сливки в пасте?" },
{ "role": "assistant", "content": "Молоко и кусочек сливочного масла." },
{ "role": "user", "content": "А если совсем без молочного?" }
]
}Параметры
Если поле не передать, модель использует своё значение по умолчанию. Явно послать temperature: 1 и не слать поле — не одно и то же.
| Поле | Тип | Зачем |
|---|---|---|
temperature | 0–2 | Ниже — спокойнее и предсказуемее, выше — разнообразнее |
top_p | 0–1 | Ядро вероятностей. Обычно меняют либо его, либо temperature |
max_tokens / max_completion_tokens | число | Максимальная длина ответа |
stop | строка или массив | Где оборвать генерацию |
seed | целое | Повтор с тем же seed ближе к одному и тому же результату, но не гарантия |
n | 1–128 | Сколько вариантов ответа |
frequency_penalty / presence_penalty | −2…2 | Меньше повторов |
user | строка | Ваш идентификатор конечного пользователя |
Не все модели принимают каждый параметр. Если поле не подходит, вернётся 400 — см. Ошибки. Не включайте сразу и temperature, и top_p: для части моделей эти параметры конфликтуют.
Streaming
Добавьте "stream": true. Ответ пойдёт кусками в Server-Sent Events: строки data: {...}, в конце сервер вернет data: [DONE].
Текст дельты — в choices[0].delta.content. В последнем чанке обычно приходит usage.
curl -N https://api.anymind.app/v1/chat/completions \
-H "Authorization: Bearer $ANYMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-terra",
"messages": [
{ "role": "user", "content": "Напиши короткий тост на день рождения сестры" }
],
"stream": true
}'stream = client.chat.completions.create(
model="gpt-5.6-terra",
messages=[{"role": "user", "content": "Напиши короткий тост на день рождения сестры"}],
stream=True,
)
for chunk in stream:
piece = chunk.choices[0].delta.content
if piece:
print(piece, end="", flush=True)В SDK достаточно того же stream: true в chat.completions.create.
Изображения во входе
Некоторые модели могут принять картинку внутри content в формате URL или data URI.
{
"model": "gpt-5.6-terra",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Какая это птица? Коротко." },
{
"type": "image_url",
"image_url": { "url": "https://example.com/cat.jpg" }
}
]
}
]
}Локальный файл — как data URI:
data:image/jpeg;base64,/9j/4AAQ...Отдельной загрузки файлов в наше хранилище сейчас нет, изображение передавайте прямо в сообщении. URL должен открываться без авторизации, иначе используйте data URI. Если модель не умеет смотреть картинки, вернётся 400.
Tools
Модель сама функцию не вызывает. Она предлагает вызов, вы исполняете его у себя и возвращаете результат сообщением с role: "tool".
{
"model": "gpt-5.6-terra",
"messages": [
{ "role": "user", "content": "Какая погода в Казани?" }
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Текущая погода по городу",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string" }
},
"required": ["city"]
}
}
}
]
}Если в ответе finish_reason: "tool_calls", возьмите message.tool_calls, выполните функцию и пришлите следующий запрос. В истории должны быть исходные сообщения, ответ ассистента с tool_calls, затем ваши role: "tool".
{
"role": "tool",
"tool_call_id": "call_abc",
"content": "{\"temp_c\": 19}"
}Поля tool_choice и parallel_tool_calls поддерживаются. Если модель их не принимает, вернётся 400.
Структурированный JSON
Чтобы ответ пришёл по схеме, а не свободным текстом:
{
"model": "gpt-5.6-terra",
"messages": [
{ "role": "user", "content": "Верни, сколько минут варить гречку." }
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "porridge",
"strict": true,
"schema": {
"type": "object",
"properties": {
"minutes": { "type": "number" }
},
"required": ["minutes"],
"additionalProperties": false
}
}
}
}Если модель не может принять схему, будет возвращен код HTTP 400. В этом случае попробуйте другую модель, с полем response_format: { "type": "json_object" } — с просьбой модели вернуть JSON в промпте или обычный текст.
Reasoning
У моделей, поддерживающих рассуждение, можно передать параметр reasoning_effort (low, medium, high — что поддерживает конкретная модель). Токены рассуждения не тарифицируются, а в тексте ответа их может не быть.
Completions
Работает и POST /v1/completions с полем prompt вместо messages. Для нового кода лучше chat.