Возврат результатов модели
Форматируйте вывод инструментов как сообщения с ролью инструмента, чтобы модель могла прочитать их и продолжить диалог.
«Возврат результатов модели» — бесплатный урок AI Agents на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Сообщение с результатом инструмента
После выполнения инструмента сообщите модели результат с помощью сообщения инструмента:
messages.append({
'role': 'tool',
'tool_call_id': tool_call.id, # MUST match the assistant's tool_call.id
'content': json.dumps(result)
})Содержимое должно быть строкой
OpenAI ожидает, что content будет строкой. Сериализуйте объекты с помощью json.dumps:
# Bad — will error
messages.append({'role': 'tool', 'tool_call_id': id, 'content': {'temp': 18}})
# Good
messages.append({'role': 'tool', 'tool_call_id': id, 'content': '{"temp": 18}'})Формат Anthropic
Anthropic использует блок содержимого внутри сообщения пользователя:
messages.append({
'role': 'user',
'content': [{
'type': 'tool_result',
'tool_use_id': 'toolu_abc',
'content': json.dumps(result)
}]
})Возврат ошибок
Если инструмент завершился с ошибкой, верните ошибку — не притворяйтесь, что всё прошло успешно. Модель может восстановиться после ошибки:
try:
result = run_tool(...)
content = json.dumps({'ok': True, 'data': result})
except Exception as e:
content = json.dumps({'ok': False, 'error': str(e)})
messages.append({'role': 'tool', 'tool_call_id': id, 'content': content})Принцип нескольких результатов
Для параллельных вызовов инструментов добавляйте каждый результат с соответствующим ID:
for tc in message.tool_calls:
result = dispatch(tc)
messages.append({
'role': 'tool',
'tool_call_id': tc.id,
'content': json.dumps(result)
})Большие выводы: суммирование
Если инструмент возвращает 100 КБ HTML, отправка всего содержимого модели расходует токены и рассеивает её внимание. Сначала суммируйте или усеките результат:
def truncate(text, max_chars=4000):
if len(text) <= max_chars:
return text
return text[:max_chars] + f'\n...[truncated, {len(text)-max_chars} more chars]'
sample = "x" * 4500
result = truncate(sample, max_chars=50)
print(result)
Стабильная схема
Даже если результаты различаются (успех / ошибка / не найдено), сохраняйте стабильную схему вывода. При согласованной структуре модель работает надёжнее:
from typing import TypedDict, Literal, Optional, Any
class ToolResult(TypedDict):
status: Literal['ok', 'not_found', 'error']
data: Optional[Any]
error: Optional[str]
def make_result(status, data=None, error=None) -> ToolResult:
return {'status': status, 'data': data, 'error': error}
print(make_result('ok', data={'temp': 72}))
print(make_result('not_found', error='city not found'))Добавление подсказок в метаданные
Помогите модели интерпретировать результаты, добавив подсказки в содержимое:
content = json.dumps({
'data': rows,
'note': 'Returned 50 rows (most recent first). There may be more matches.'
})Двоичные данные
Не встраивайте большие двоичные данные в сообщения инструментов в формате base64. Вместо этого сохраните их в хранилище и верните URL или ID:
result = {
'image_path': '/tmp/chart-abc.png',
'thumbnail_url': 'https://...',
'caption': 'Sales by quarter, 2024'
}
for k, v in result.items():
print(f"{k}: {v}")
Повторный вызов модели
После добавления всех результатов инструментов снова вызовите модель — она либо создаст окончательный ответ, либо вызовет дополнительные инструменты:
class Msg:
def __init__(self, tool_calls=None, content=None):
self.tool_calls = tool_calls or []
self.content = content
class ToolCall:
def __init__(self, name, args):
self.name = name
self.args = args
def call_model(messages, tools):
if len(messages) < 4:
return Msg(tool_calls=[ToolCall('get_weather', {'city': 'Paris'})])
return Msg(content='It is sunny in Paris.')
messages = [{'role': 'user', 'content': 'Weather in Paris?'}]
tools = ['get_weather']
message = call_model(messages, tools)
while message.tool_calls:
for tc in message.tool_calls:
result = f'Result of {tc.name}({tc.args})'
messages.append({'role': 'tool', 'name': tc.name, 'content': result})
print('Tool call:', tc.name, '->', result)
message = call_model(messages, tools)
print('Final answer:', message.content)
Аудит выводов инструментов
Записывайте каждый набор (tool_call_id, args, result) для отладки. Если агент делает что-то странное, журнал результатов инструментов — первое место, которое следует проверить.
Формат результата инструмента
На что указывает tool_call_id в сообщении инструмента?
Итоги
Теперь Вы полностью владеете циклом вызова инструмента. Следующий курс: память — третья основа агентов.
Часто задаваемые вопросы
Урок «Возврат результатов модели» бесплатный?
Да — полный текст урока «Возврат результатов модели» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Возврат результатов модели»?
Форматируйте вывод инструментов как сообщения с ролью инструмента, чтобы модель могла прочитать их и продолжить диалог. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Возврат результатов модели»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Как работает вызов функций
- Определение схем инструментов (JSON Schema)
- Выбор инструментов во время выполнения
- Возврат результатов модели