OpenAI tool calls are output items
With the Responses API, function calling is a loop over response output items. You provide JSON Schema-backed function definitions. The model emits function_call items. Your application executes those calls and sends function_call_output items back with the matching call_id.
The modern detail that matters in real systems: preserve the response output items that are still part of the run. Do not throw away tool-call state and then wonder why the second call feels amnesiac. Tiny detail, huge bug farm.
Strict schemas reduce ambiguity
Use strict: true and additionalProperties: false when the tool has a known contract. This narrows the model's output space and makes executor validation simpler. Parameter descriptions are not decorative; they are part of the action surface the model sees.
Model choice is part of the run contract
Current OpenAI docs recommend gpt-5.5 as the default starting point for complex reasoning and coding, with smaller variants such as gpt-5.4-mini or gpt-5.4-nano when latency and cost dominate. Do not cargo-cult a model string from an old example. Write down why the run uses that model.
Outputs should be machine-readable
Return small JSON strings with stable fields. Avoid raw API dumps. If the model needs more detail, include a next-step hint like read_full_record or fetch_url instead of stuffing everything into one result.