Формат ответа
Поле 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.id ↔ tool_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 = модель не видит истории.