AnyMindДокументация

API

Chat Completions

Основной метод для чата — обычный ответ, streaming, изображения и tools.

Главный способ вызвать модель. Формат совпадает с OpenAI Chat Completions.

POST/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.

text
{
  "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 задаёт тон, дальше идёт история.

text
{
  "model": "gpt-5.6-terra",
  "messages": [
    { "role": "system", "content": "Отвечай коротко, на русском." },
    { "role": "user", "content": "Чем заменить сливки в пасте?" },
    { "role": "assistant", "content": "Молоко и кусочек сливочного масла." },
    { "role": "user", "content": "А если совсем без молочного?" }
  ]
}

Параметры

Если поле не передать, модель использует своё значение по умолчанию. Явно послать temperature: 1 и не слать поле — не одно и то же.

ПолеТипЗачем
temperature0–2Ниже — спокойнее и предсказуемее, выше — разнообразнее
top_p0–1Ядро вероятностей. Обычно меняют либо его, либо temperature
max_tokens / max_completion_tokensчислоМаксимальная длина ответа
stopстрока или массивГде оборвать генерацию
seedцелоеПовтор с тем же seed ближе к одному и тому же результату, но не гарантия
n1–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
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
  }'
text
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.

text
{
  "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:

text
data:image/jpeg;base64,/9j/4AAQ...

Отдельной загрузки файлов в наше хранилище сейчас нет, изображение передавайте прямо в сообщении. URL должен открываться без авторизации, иначе используйте data URI. Если модель не умеет смотреть картинки, вернётся 400.

Tools

Модель сама функцию не вызывает. Она предлагает вызов, вы исполняете его у себя и возвращаете результат сообщением с role: "tool".

text
{
  "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".

text
{
  "role": "tool",
  "tool_call_id": "call_abc",
  "content": "{\"temp_c\": 19}"
}

Поля tool_choice и parallel_tool_calls поддерживаются. Если модель их не принимает, вернётся 400.

Структурированный JSON

Чтобы ответ пришёл по схеме, а не свободным текстом:

text
{
  "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.