Chapter 27

A Precise Map of Differences Beats Identical Names

All three APIs support client-side functions, but they differ in the response container, the continuation method, the result format, and the storage rules. These differences must live ONLY in the adapter and be tested separately - otherwise they leak into business logic and turn the "unified contract" into a fiction.

A precise map of differences beats identical names.

Contract · OpenAI · Anthropic · Google

  • API for a new project - Responses API; Messages API; Interactions API
  • A balanced example - 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
  • Continuation - previous_response_id or full input; Full Messages history; previous_interaction_id or full history
  • Repeat tools - Pass explicitly for predictability; Pass on every request; Mandatory on every interaction
  • Storage by default - Yes for Responses; Messages stateless; Yes for Interactions
  • Agent framework - Agents SDK; Tool Runner beta, Managed Agents; ADK

Read it along the "tool call" and "tool result" rows: for OpenAI it's a function_call output item and function_call_output, for Anthropic a tool_use content block and tool_result, for Google a function_call step and function_result. The meaning is one, the shape different - and that's exactly why it's isolated in the adapter.

To see the same tool result in three protocols at once, use the lab.

Interactive lab 4

One tool result in three protocols

The same order_read result in three return formats.

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

And the rule about comparing providers, without which an eval lies.

Don't compare models on one dialogue. Compare adapters on the same dataset, the same tool outputs, and the same outcome rubric. For each provider record the model id, SDK version, latency, usage, and trajectory.

The differences are reduced to the adapters. Now, with everything else ready, you can finally write the final prompt - and its role has become narrow.

Links