A tool-use turn that stops early is usually hitting one of four specific ceilings, and only one of them is an error: the rest are normal stop reasons that your...
A strict-mode rejection means your schema uses a JSON Schema feature that grammar-constrained sampling cannot compile, and the fix is almost always removing a constraint, not rewording the tool. Setting...
Parallel tool calls fail almost exclusively on the response side, not the request side: the model calling several tools at once works by default, but returning results for them is...
A model stuck calling the same tool repeatedly is almost always reacting correctly to a tool result that never changes, not malfunctioning on its own. From the model’s side, each...
A model that answers in plain text instead of calling your tool is behaving correctly by default; tool_choice: auto gives it the option to skip every tool you offered. This...
When the model picks the wrong tool, the cause is almost always that your tools look alike to it, not that it misunderstood the user. Models select tools by matching...
Your chat history is the least portable thing you own, and the moment you need it is usually the moment you cannot get it. Every major provider offers a data...
When a model “forgets” something you told it, the information almost always left the context window rather than being misunderstood. Conversations grow, older turns get dropped, and the model answers...
A rules file is a system prompt that ships with your repository, and it is charged on every single request. That framing settles most of the arguments about what belongs...
When an MCP server will not connect, the cause is nearly always one of four things: the command is not on the client’s PATH, the server writes to stdout, credentials...

