Формат ответа

Поле messages

messages — сырые LLM-сообщения (role/content) с ID вызовов инструментов, результатами и thinking. Именно они, а не output, являются реальным контекстом для модели.

Простой ход без инструментов

[
  { "role": "user", "content": [{ "type": "text", "text": "Привет!" }] },
  {
    "role": "assistant",
    "content": [{ "type": "text", "text": "Привет! Чем могу помочь?" }],
    "usage": { "input_tokens": 25, "output_tokens": 8, "cached_tokens": 0 },
    "finish_reason": "stop"
  }
]

Ход с вызовом инструмента

Вызов и его результат связаны идентификатором (tool_call.idtool_result.tool_call_id):

[
  { "role": "user", "content": [{ "type": "text", "text": "Погода в Москве?" }] },
  {
    "role": "assistant",
    "content": [{
      "type": "tool_call",
      "tool_call": { "id": "toolu_01XYZ", "name": "get_current_weather", "arguments": {  } }
    }],
    "finish_reason": "tool_calls"
  },
  {
    "role": "tool",
    "content": [{
      "type": "tool_result",
      "tool_result": { "tool_call_id": "toolu_01XYZ", "content": [{ "type": "text", "text": "{\"temp\":12}" }] }
    }]
  },
  {
    "role": "assistant",
    "content": [{ "type": "text", "text": "В Москве +12°C, облачно." }],
    "finish_reason": "stop"
  }
]

Extended thinking

{
  "role": "assistant",
  "content": [
    { "type": "thinking", "thinking": "Разберём по шагам…" },
    { "type": "text", "text": "Ответ: 42" }
  ],
  "finish_reason": "stop"
}

Почему нельзя восстановить messages вручную

  • tool_call.id и tool_result.tool_call_id — уникальные идентификаторы, связывающие запрос инструмента с ответом. Без них протокол ломается.
  • signature в tool_call — провайдер-специфичные данные.
  • Порядок thinking-блоков относительно текста важен для некоторых моделей.
Для мультихода передавайте messages как есть
Чтобы продолжить диалог, передайте messages предыдущего хода без изменений в turns[] следующего запроса. См. Мультиходовые разговоры. Пустой или отсутствующий messages = модель не видит истории.