What broke when we ran agents on small local models The team behind Bees, a system that runs a team of AI agents locally, documented five failures encountered while getting agents to work on 3-4B parameter models via llama.cpp, including a parser lock that silently dropped second tool calls and a prompt that contradicted its own tool list. The team found that most failures were harness bugs rather than model weakness, and switched its local agent model to Qwen3 4B Instruct while moving core tools into the always-visible set. Bees runs a team of AI agents on your own computer. You can point it at Claude Code, Codex or an API key, but we also ship a local model so you can run it without paying for an API. That model runs through llama.cpp on a laptop, and it is small: 3 to 4 billion parameters. Getting agents to do real work on a model that size took us most of August and September. Almost none of the failures were "the model is too dumb". Most of them were our code, or a mismatch between our code and the model, and they looked exactly like a dumb model from the outside. Here are the five that cost us the most time. The first local model we tried was Nanbeige 4.2 3B. On the first turn it called tools perfectly. Then the run would just end. No error. The agent said it was done, and no file was written, no search was run. We first read this as "a 3B model is too weak for agents" and started planning around it: one tool call per agent, a bigger model for some roles. That was the wrong fix for the wrong problem. The real cause took a two-turn request to reproduce. Nanbeige sends its first tool call as JSON. Once a tool result is in the history, it switches to an XML style: