Previously tool results were injected as role:user messages which
confuses some models. Now the live agent loop uses proper OpenAI
function-calling format:
- Assistant messages include tool_calls array with IDs
- Tool results use role:tool with matching tool_call_id
History replay in router.py is unchanged (no tool_call_ids in DB).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>