Точная карта различий важнее одинаковых имен
Все три 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_calloutput item;tool_usecontent block;function_callstep - Call id -
call_id;id; stepid - 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 в трёх протоколах сразу помогает лаборатория.
Один результат tool в трех протоколах
{
"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 - и его роль стала узкой.