v0.12.0 — OpenAI-style client-executed tool calling
/openai/v1/chat/completions now honors the standard `tools` / `tool_choice`
body fields. The machine acts as a plain function-calling model: it responds
with `tool_calls` + finish_reason "tool_calls" when it wants a tool, the client
runs the tool and sends the `role:"tool"` result back, and the loop continues
(stateless — full history resent each round, exactly like OpenAI).
- tool_choice: auto / none / required / {type:"function",function:{name}}.
- Tolerant parsing of the agent's tool-call block (handles prose/fences).
- In tool mode the harness's own internal tools default OFF (pure
function-caller); x-aicodebox-no-tools: 0 re-enables the hybrid.
- tools + response_format/schema -> 400; tools + stream=true -> 400.
- Additive: non-tool requests unchanged; the old blanket 400 on tools is gone.
Ships psyb0t/aicodebox:v0.12.0.