Models can call multiple functions in a single turn. This is the default behavior — the model may determine that answering requires data from several tools simultaneously.
Note: gpt-4.1-nano may return duplicate tool calls — disable parallel calling when using it. In the Responses API, parallel tool calling is the default and there's no parameter to disable it.
The model batches independent calls; you should run them parallel
When the model returns three tool_calls in a single response, it's saying 'these three calls are independent and you can run them in any order'. Sequential execution wastes 2/3 of the wall time for no reason. asyncio.gather (or threading for sync handlers) returns all three results in the time of the slowest one.
If your tools have ordering requirements (call B depends on A's result), set parallel_tool_calls=False. The model will then emit one tool_call per turn, you handle it, send the result back, the model emits the next. Slower but explicit.