Глава 27

Точная карта различий важнее одинаковых имен

Все три API поддерживают client-side functions, но различаются контейнером ответа, способом продолжения, форматом результата и правилами хранения. Эти различия должны жить ТОЛЬКО в adapter и тестироваться отдельно - иначе они протекут в бизнес-логику и превратят "единый контракт" в фикцию.

Точная карта различий важнее одинаковых имён.

Контракт · OpenAI · Anthropic · Google

  • API для нового проекта - Responses API; Messages API; Interactions API
  • Сбалансированный пример - gpt-5.6; claude-sonnet-5; gemini-3.6-flash
  • Tool call - function_call output item; tool_use content block; function_call step
  • Call id - call_id; id; step id
  • Tool result - function_call_output; tool_result; function_result
  • Продолжение - previous_response_id или полный input; Полная Messages history; previous_interaction_id или полная history
  • Повторить tools - Передавайте явно для предсказуемости; Передавайте на каждом request; Обязательно на каждом interaction
  • Хранение по умолчанию - Да для Responses; Messages stateless; Да для Interactions
  • Agent framework - Agents SDK; Tool Runner beta, Managed Agents; ADK

Прочитайте её по строкам "tool call" и "tool result": у OpenAI это function_call output item и function_call_output, у Anthropic - tool_use content block и tool_result, у Google - function_call step и function_result. Смысл один, форма разная - и именно поэтому она изолирована в адаптере.

Увидеть один и тот же результат tool в трёх протоколах сразу помогает лаборатория.

Интерактивная лаборатория 4

Один результат tool в трех протоколах

Один и тот же результат order_read в трех форматах возврата.

{
  "type": "function_call_output",
  "call_id": "call_42",
  "output": "{\"ok\":true,\"value\":{...}}"
}

И правило про сравнение провайдеров, без которого eval врёт.

Не сравнивайте модели по одному диалогу. Сравнивайте adapters на одинаковом dataset, одинаковых tool outputs и одинаковом outcome rubric. Для каждого провайдера сохраняйте model id, SDK version, latency, usage и trajectory.

Различия сведены в адаптеры. Теперь, когда всё остальное готово, можно наконец написать финальный prompt - и его роль стала узкой.

Ссылки