v0.13.0 — compose tools + response_format (agentic flow ending in structured JSON) /openai/v1/chat/completions now accepts `tools` and `response_format` in the same request. They describe different turn types, like OpenAI: - tool-call turn -> tool_calls / finish_reason "tool_calls" (never schema-checked); - final answer turn -> schema-validated (with retry) canonical JSON / finish_reason "stop". The tools directive carries the final-answer schema so both exits are stated coherently. Enabled by a new early_accept escape in shared/runner.py:run_with_json_retry that short-circuits a tool-call turn instead of retrying it as a schema failure. tools + stream=true still -> 400 (planned follow-up). Additive: the v0.12.0 400 on tools+response_format is removed; non-combined requests unchanged. 190 tests passing. Ships psyb0t/aicodebox:v0.13.0.