Skip to content

Model Bakeoff

Gabri Elles edited this page Aug 21, 2026 · 4 revisions

Model Bake off

This is the full local model bake off history and verdicts, moved from MODELS.md.

It's a summary of every local candidate tried against DeepDelve's real multi agent roles (Planner, Searcher, Analyzer, Builder, FindingsWriter), evaluated against two live benchmarks, a 13 run Colombia B2B rubric (eval/colombia_b2b_benchmark.md) and a sales forecasting and heuristic algorithms rubric (eval/sales_forecasting_benchmark.md). The bar is the same throughout: passing an isolated tool call schema test isn't sufficient evidence a model behaves reliably in the real role, so every candidate below was run through the actual pipeline, not just a smoke test. The full evidence trail, live run detail, and ongoing trials live in the Changelog; this page is just the current state summary. Verdicts follow the project's own Model Evaluation Standard (see ROADMAP.md's top level section): a discard needs more than one run, and backend or serving layer bugs are named explicitly rather than blamed on the model.

This got moved out of README.md into its own file on 2026-07-29, because the per candidate detail had outgrown what a plain Markdown table can render legibly, each row's notes were paragraph length and wrapped badly in table cells. The format here is one section per candidate, grouped by verdict.

As of this writing, 21 candidates have been tried. gpt-oss:20b is still the only one with a full benchmark pass on both standing benchmarks.

Passed, the default

gpt-oss:20b. Around 13GB of VRAM. Best result: 7/10 on Colombia B2B, and a real grounded report on every sales forecasting re run. This is the default, and the only candidate with a full benchmark pass on both standing benchmarks. Run to run variance is high, but bad runs are honestly empty rather than fabricated, and a run takes about 15 to 20 minutes. Its own chain of thought can't be fully disabled either (see the Qwen3 family think mode note further down for the general issue), but Ollama keeps it in a separate reasoning field that DeepDelve's client never reads as the model's actual output, so it's harmless here.

There's a standing, still open content quality gap, reconfirmed live on 2026-07-31 after that session's completion pipeline starvation fixes shipped. On the multi facet sales forecasting benchmark, the model reliably abandons the harder half of a two facet query rather than fabricating or refusing, the same pattern first logged on 2026-07-14/18 (it dropped the Colombia cultural context half that session), and it was still happening after every structural pipeline bug found that night got fixed. The 2026-07-31 run's final_report.md was real, honestly caveated, and correctly grounded, no fabrication, but it delivered neither the query's own "top 5 heuristic algorithms" ask nor any Colombia cultural pattern integration. The Colombia and heuristic algorithm sources it had fetched just sat unused in the References list. check_report_underuses_findings/_evidence correctly flagged this on every attempt, and the model still hadn't fixed it by the time the wall clock ran out. This is a genuine model capability gap, not a pipeline bug: the completion check machinery is working exactly as designed (real convergence, no starvation, honest output), and the gap it keeps correctly flagging is the model's own unwillingness or inability to actually act on "cover every facet" feedback within a bounded retry budget. See the Pending section of ROADMAP.md for the literature research angle on multi facet task abandonment under iterative self correction.

A follow up live test the same night tried an explicit edit_workspace_file routing directive fix (commit 67e4b00, the smallest literature grounded attempt available). It changed Builder's tool choice correctly, but didn't fix the underlying gap: a subsequent re test's report went from answering roughly a third of the query to answering zero of the ML/heuristics half (100 percent Colombian festivals content, the deep learning facet dropped entirely), despite the directive explicitly saying not to touch any other part of the report. That confirms this is genuinely the self correction blind spot, or aggregator noise, that the literature describes, not a tool choice gap. Prompt level fixes have hit their ceiling here; a per facet Builder dispatch is the justified next attempt (see the Pending section of ROADMAP.md).

Disqualified

qwen3.6 (35b a3b). Around 23GB of VRAM. Best result: 1/10. It researches well but synthesizes disastrously at scale, reconstructing all 22 of its cited URLs from filenames rather than the real ones. (Marked with a dagger below, see the Qwen3 think mode note in the cross cutting section at the end.)

mistral-nemo:12b. About 7.1GB on Ollama, or roughly 8.3GiB on vLLM with bitsandbytes 4 bit. Best result: 2/10 on Ollama, and Report: NOT WRITTEN on vLLM (thin_coverage). Disqualified on both backends. The original Ollama score stood unconfirmed for a while after a real vLLM infrastructure block (chat_template_kwargs rejected by Mistral's native tokenizer, since fixed via settings.skip_chat_template_kwargs). Retested with that fix, the model showed genuine engagement this time (13 sources, 0/7 search failures, 8 findings), but it joins the thin_coverage non convergence family already seen in qwen3:4b/qwen3:8b: all 4 completion check attempts hit the identical problem, the retry budget ran out, and no report ever got written.

Gemma 4 12B, SetneufPT/Gemma4-12B-IT-QAT_Q4_64K_16GB-GPU. About 7.2GB. Best result: Report: NOT WRITTEN. Disqualified for a reasoning loop near the end and repeated delegate_tasks rejections.

Gemma 4 12B, yuxinlu1/gemma-4-12B-agentic-fable5-composer2.5-v2-3.5x-tau2-GGUF. About 7.4GB (Q4_K_M). Best result: Report: NOT WRITTEN, run twice, identical failure both times. Disqualified for a different and more severe failure than the other Gemma 4 12B candidate above: it repeatedly calls write_todos with byte for byte identical arguments, a literal repetition loop rather than incremental revision, and it kept going even after the tool explicitly errored with "you MUST summarize what you've done and stop." It was DeepDelve's own anti loop quota that ended the run, not the model recognizing completion. This was confirmed over two runs on different queries, one deliberately simple. It isn't a serving layer bug: nothink mode (which needs reasoning_effort:"none", not chat_template_kwargs.enable_thinking) and tool calling were both confirmed clean via a direct API test beforehand.

Bonsai 8B (PrismML, 1 bit). About 1.2GB. Best result: Report: NOT WRITTEN. Disqualified for a worse reason than the Gemma 4 candidates: it skipped write_workspace_file entirely in writer roles, even though research worked fine.

qwen3:4b. About 2.5GB. Best result: Report: NOT WRITTEN, all 8 retries exhausted on thin_coverage. Disqualified. Real research happens, but the model repeats a canned "research scope is complete" non response instead of acting on the completion check's corrective nudge, a non convergence pattern also seen elsewhere as 10 redundant identical write_workspace_file calls on a trivial query. (Dagger, see the Qwen3 think mode note below.)

qwen3:8b. About 8.8GB (fp8, vLLM). Best result: Report: NOT WRITTEN twice in a row, an identical thin_coverage attempt sequence both times. Disqualified, and double confirmed clean of every prior excuse: retested on vLLM instead of Ollama, with nothink mode and tool calling both verified clean via direct API tests beforehand. It's the same failure class as qwen3:4b: once thin_coverage fires, it repeats the same narrated summary verbatim across retries instead of acting on the corrective nudge. That's four total occurrences of this exact non convergence pattern now recorded across different backends and models.

llama3.2:3b. About 2.0GB on Ollama, or 6.0GB bf16 on vLLM. It fails at the schema stage on both backends. Disqualified, and double confirmed clean of the "maybe it's Ollama's fault" excuse: retested on vLLM with a real gated HF checkpoint, not the Ollama GGUF, using the llama3_json tool parser, and the exact same #6155 stringified array shape reproduced 4 out of 4 times on a completely different serving stack. This is confirmed directly in vLLM's own official docs, under "Known issues" for Llama Models: "The model can generate parameters in an incorrect format, such as generating an array serialized as string instead of an array." That's Llama 3.2's own limitation, not an Ollama specific bug. The original #6155 framing is disproven for this candidate specifically.

qwen2.5:3b-instruct. About 1.9GB on Ollama, or 6GB bf16 on vLLM. Best result: Report: NOT WRITTEN on Ollama (missing_findings), and malformed tool call JSON on vLLM at the schema stage. Disqualified on both backends, for different failure modes each time, not a single cause bug. On Ollama, it passed the schema test cleanly and researched fine, but FindingsWriter never successfully called write_workspace_file across 8 attempts, the same root cause as Bonsai 8B. On the vLLM retest, a nested array delegate_tasks shaped tool call consistently produced genuinely malformed JSON: it closes the arguments object but omits the final closing brace for the outer wrapper. That was confirmed via 5 or more reproductions and direct inspection of the parser's own extraction, the parser is correct, and the model's own JSON is broken at the source, not a token budget cutoff.

InternScience/Agents-A1-4B. About 5.2GB (Q8_0 GGUF, Ollama). Best result: Report: NOT WRITTEN, run twice, the same fabrication signature both times. Disqualified. Real research works fine here, 13 sources fetched, 0/12 search failures, but FindingsWriter repeatedly fabricates citations to real sounding but never fetched Wikipedia URLs pulled from its own training knowledge, and PeerReviewer approves the rewrite anyway both times, only the separate grounding check catches it. Testing this candidate on vLLM ended in a reproducible fixed size OOM bug independent of context length, likely the multimodal vision encoder profiling pass, so we switched to Ollama, where nothink mode isn't honored (harmless here, since reasoning stays isolated and doesn't pollute content) but tool calling is clean. (Dagger, see the Qwen3 think mode note below.)

qwen3:4b plus a GRPO fine tune (thin_coverage). About 4.3GB (Q8_0 GGUF). Best result: roughly 1 to 2 out of 10 both times, still not_grounded, retry budget exhausted. Disqualified, though the targeted fix did work: there were zero thin_coverage stalls in either run, the exact failure the fine tune targeted is gone, confirmed 8/8 on held out eval too. It fails instead on a second, untouched failure mode: citation fabrication combined with real content getting dropped from synthesis. A structural fix (a grounding check warning was being silently truncated before it ever reached findings.md) measurably improved this on re test, grounded citations went from 0/8 to 3/9, but didn't fully close the gap: the model still sometimes cites a URL that its own source material explicitly flags as unverified when it has no real alternative. Only the training pipeline's own enable_thinking=False (applied directly via HF's chat template, no Ollama involved) is unaffected by the dagger caveat; the live Ollama benchmark run itself is not.

qwen3-4b-combined-v2-lora, a 7 dimension combined GRPO from 2026-07-28. Disqualified, cleanly. About 4.3GB (Q8_0 GGUF, merged and redeployed on 2026-08-19 as deepdelve-qwen3-4b-combined-v2). Held out eval went from 0.615 to 0.781, real generalization, not a ceiling effect, but two separate live benchmarks were both disqualified. The first live benchmark, on 2026-07-28, was confounded by the Qwen3 think mode passthrough Ollama bug, which burned 2 to 3 times more tokens on reasoning than intended and tripped an unrelated DeepDelve bug too, both root caused and fixed the same day. A clean re test on 2026-08-19 merged the still on disk LoRA fresh and deployed it via api.backend: "ollama" with enable_thinking: true (confirmed via a direct curl that think: true correctly isolates reasoning into its own field on this exact tag; think: false reproduces the bug, dumping raw chain of thought into .content). The result: a score of 0.25, worse than the confounded run's 0.5. final_report.md was the deterministic salvage banner, the model narrated in chat instead of ever calling write_workspace_file across its full writer retry budget, and findings.md repeatedly failed grounding on the same fabricated URLs (rentremote.com, nomadsembassy.com) across consecutive rebuild attempts. This confirms disqualification, not confounding this time: the fine tune's targeted objectives held, the held out gains are real, but citation fabrication and writer dispatch convergence, both untouched failure modes, are still broken at 4B scale even with reasoning cleanly isolated. That closes the "not yet done" clean re test caveat that had stood since 2026-07-28.

Ornith-1.0-9B (deepreinforce ai, dense, Qwen3.5 architecture, MIT license), disqualified cleanly on 2026-08-19. About 9.5GB (Q8_0 GGUF, deepdelve-ornith-9b-jsonfmt). Best result: a score of 0.000, with final_report.md as the deterministic salvage banner. This closes a long standing INCONCLUSIVE status: every prior run had an independent, non model confound attached, see parts 4 and 5 of the Literature Review for the full trail, a chat template empty <think> injection defect, a native backend tool call corruption bug, and two DeepDelve architecture bugs. All of those are fixed now. This re test used the fully patched deepdelve-ornith-9b-jsonfmt tag (0/18 web_search failures in its own prior live verification) via api.backend: "ollama" with enable_thinking: false, confirmed via a direct curl that think: false is actually the clean setting for this model on the native endpoint even with tools present, the opposite of what qwen3-4b-combined-v2-lora needed, so this really does have to be verified per model rather than assumed. The result: real research happened cleanly, 17 sources fetched, 22 findings, no tool call corruption, no infinite loop, but at the delegation quota exhaustion point, the Planner narrated its wrap up as chat prose instead of ever calling write_workspace_file, exhausting the full writer retry budget, and findings.md never got accepted at all. This is the same narrate instead of call failure class this project has now seen across the large majority of sub 14B candidates tried (Bonsai 8B, qwen2.5:3b-instruct, mistral:7b-instruct, mistral-nemo:12b, hermes3:8b, and this candidate too), and it's independently corroborated for this specific model family by two Reddit threads (part 4 of the Literature Review) as a harness agnostic trait, not something a serving layer or template fix reaches. This is genuinely the strongest research quality candidate tested at this size, matching its own earlier INCONCLUSIVE runs' cold start synthesis strength. The ceiling here isn't research capability, it's converting research into a written artifact under real task completion pressure.

Ministral-8B-Instruct-2410, disqualified at the schema stage on 2026-08-19. About 4.9GB (community tag nchapman/ministral-8b-instruct-2410:8b). Best result: fail, on an isolated smoke test, no full live run spent. This is a general purpose model, not a narrow function calling finetune, Apache 2.0/Mistral Research License, with a native long context of 128k. It isn't in Ollama's core library, so we used the community GGUF tag. The first smoke test, on the OpenAI compat endpoint with a simple single string arg web_search tool, failed even with tool_choice: "required", narrating a fake JSON schema as plain text. A native /api/chat endpoint smoke test with the same simple tool passed cleanly, real structured tool_calls, confirming an OpenAI compat translation layer issue for the simple case, the same class as this project's other Mistral family findings. But the real disqualifier was testing against DeepDelve's own actual delegate_tasks schema, an array of task objects rather than a single string: it failed 3 out of 3 times on the native endpoint too, narrating valid looking JSON as markdown text instead of a real tool call, every single time. The model can call a trivial single arg tool but breaks down specifically on the array of objects shape that is the Planner's first and most critical call in this project's whole pipeline. Disqualified at the smoke test stage per this project's own established practice, the same as llama3.2:3b and qwen2.5:3b-instruct, no full live run needed when the schema stage failure is this clear and reproducible.

Falcon3-10B-Instruct, disqualified at the smoke test stage on 2026-08-19. About 6.3GB (falcon3:10b, then bilel_cherif/falcon3-tools). Best result: 3 out of 9 real tool calls on an isolated smoke test, no full live run needed. TII's own model card confirms real function call training data (1.2 million posttraining samples including "function call data"), so this is genuinely a serving layer or packaging gap, not something assumed to be one. Ollama's core falcon3:10b tag flatly rejects tool requests ("does not support tools"), its TEMPLATE never references .Tools/.ToolCalls at all, confirmed via ollama show --modelfile, a packaging gap rather than a capability one. falcon3:7b isn't even a real Ollama tag. We found and pulled a community tag built specifically for this, bilel_cherif/falcon3-tools, "Falcon 3 10b for tool usage and function call," and its template does occasionally produce a real, correctly shaped tool_calls response matching this project's actual delegate_tasks array of objects schema exactly. But unreliably: 3 successes out of 9 identical isolated smoke test reps, about 33 percent, with the rest returning completely empty content and no tool call at all despite generating 77 to 82 tokens each time (something is generated and then silently dropped, not a clean template rejection). A pipeline that makes dozens of delegate_tasks shaped calls per run at roughly 33 percent per call success compounds to near certain full run failure, so this was disqualified on reliability grounds without spending a full live run, the same practice as the schema stage disqualifications above. This was re verified live too: we re pulled the tag and re ran all 9 reps a second time with raw, unedited curl output shown directly rather than summarized, after an earlier internal reporting mistake (noted below), and got the same result, 3/9 real tool_calls, one of those three malformed (tasks sent as a JSON string, not an array).

We actually researched the root cause of the silent empty response failure through GitHub rather than guessing. ollama/ollama#14958, "Tool calls silently drop with large system prompts," looked like a prompt length bug on the surface, but its real root cause, confirmed by the reporter after debugging with a maintainer, was a tool name mismatch: the model attempted to call a function name that didn't exactly match any registered tool (kebab case versus the real PascalCase name), and Ollama's server response for that mismatch is a silent empty response, content: "", no tool_calls, no error, even though the completion token count proves the model generated real output. It isn't specific to prompt length, that was just this particular reporter's own trigger shape. A second, still open issue, ollama/ollama#15539 on the gemma4 parser, shows the sibling failure mode from the other side: a validly generated tool call sometimes leaks as raw JSON text into content instead of getting extracted into tool_calls. Put together, Ollama's tool call extraction is fragile to any deviation between what the model actually generates and what the declared parser strictly expects, and its failure mode for that mismatch is silent, not an error. That directly explains both of Falcon3's observed failure shapes here, 6/9 silent empty and 1/9 leaked malformed JSON. It isn't that Falcon3 can't do tool calling, TII's own training data contradicts that, it's generation sample variance (temperature 0.8, non zero) meeting a parser too strict to tolerate it, with Ollama swallowing the mismatch instead of surfacing it.

Worth keeping on the record: midway through this investigation, an early observed "None" result after one earlier "True" result was reported to the user as "my extraction script had a bug," a cause stated before it was actually verified. That was wrong; the script was fine, and the underlying 3/9 result was real. It got corrected by re running live with raw, unedited output shown directly rather than summarized, so the finding didn't depend on trusting a prior claim. See the feedback_verify_before_stating_cause memory.

granite3.1-dense:8b and phi4-mini:3.8b. About 5.0GB and 2.5GB respectively. Both fail. Disqualified at the tool call smoke test itself: both narrate the call as literal text despite each model card explicitly claiming function calling support.

Phi-4 14B (Microsoft, MIT license), disqualified at the smoke test stage on 2026-08-19. About 9.1GB (jacob-ebey/phi4-tools). Best result: 0 out of 9 real tool calls on an isolated smoke test, no full live run needed. We researched this before pulling anything: Phi-4 (14B) and Phi-4-mini (3.8B, the candidate already disqualified above) are different models, not two sizes of the same one. Microsoft's own function calling support is documented for phi4-mini specifically; the 14B phi4 has no official tool calling support on Ollama at all, confirmed via ollama/ollama#9647, closed as "not planned" by the maintainers. The one community fix, jacob-ebey/phi4-tools, referenced directly in that same GitHub issue as "the only phi4 with tool calling support," was pulled and smoke tested against the real delegate_tasks schema, 9 reps, raw output shown live. The result was 0/9: every single response explained the correct JSON as prose ("Here's how you can format it: json {...}") instead of ever emitting a real tool_calls field. That's worse than Falcon3's intermittent 3/9, this is fully deterministic narration, not a parser extraction reliability problem. Either the community template doesn't actually wire tool call output at all, or the base 14B model, unlike phi4-mini, was simply never trained to invoke tools rather than describe them. Disqualified without a full live run, the same practice as the other schema and reliability stage disqualifications above.

llama3-groq-tool-use:8b. Best result: fail. Rejected at the tool call schema stage.

hermes3:8b. About 5GB 4 bit (vLLM, bitsandbytes). Best result: not_delegated, on two runs with different queries. Disqualified. It passed the isolated tool call smoke test cleanly, 3/3, a real structured array, no #6155 class bug, but under DeepDelve's real system prompt it narrates fake system text instead of ever calling a tool. The most severe case fabricated an entirely fictional "context length exceeded" error message and a fake retry narrative, confirmed invented, since vLLM's own server log shows no such error and KV cache usage was only 1 to 13 percent at the time, then repeated a similar fabrication pattern in a second, independent run on a different query.

mistral:7b-instruct. About 14GB bf16 cache, or roughly 5GB 4 bit at runtime (vLLM, bitsandbytes). Best result: not_delegated, on two runs with different queries, an identical failure both times. Disqualified, but the original "rejected at schema stage" reason is now wrong and superseded: retested on vLLM with settings.skip_chat_template_kwargs (a new fix that unblocks every Mistral family candidate from a permanent, by design vLLM restriction on Mistral tokenizer requests), the isolated tool call smoke test passed cleanly 3/3, a real structured array, no #6155 class bug. The real benchmark run reveals a genuine, different capability gap instead: the model consistently narrates its planned delegate_tasks call as literal markdown text instead of emitting a real tool call, even with --enable-auto-tool-choice, the same narrate instead of call failure class as Bonsai 8B and qwen2.5:3b-instruct, here happening at the Planner's very first dispatch.

MiniCPM5 1B, tried both as a single model replacement and as a paired specialist. The paired specialist run was confounded (a VRAM forced Planner/Builder swap off gpt-oss:20b), but the full single model replacement run was doubly corroborated: 0 delegate_tasks calls across two independent runs, Report: NOT WRITTEN both times. Disqualified in both forms tested, and the disqualification is final and doubly corroborated. The paired form is confounded per the project's own Model Evaluation Standard (point 2, isolate the candidate as the only variable) and we're not re litigating it per the user's own decision. The clean, isolated single model form reproduced the identical core failure on an independent re run, 63 events, zero real delegate_tasks calls. No further MiniCPM5 1B testing is planned.

Inconclusive, blocked, or not yet viable

These aren't disqualifications. Each one hit a real infrastructure or evaluation fairness blocker before the model's actual capability was ever cleanly tested, per Model Evaluation Standard point 1.

qwen2.5-coder:14b-instruct. About 9.9GiB weights (vLLM, bitsandbytes 4 bit). Result: inconclusive, not a pass and not a disqualification. An intermittent crash on first launch turned out to be transient rather than deterministic, a clean retry got past it. The first smoke test used the wrong parser (hermes), since this model was never trained on that convention, it uses <tools> tags and needs a community parser plugin (hanXen/vllm-qwen2.5-coder-tool-parser, reviewed and installed). With the correct parser, the isolated smoke test showed roughly 50 percent unreliable extraction, 2 out of 4 clean structured calls, and 2 out of 4 returned empty arguments: "{}" despite a normal completion token count. Real capability was never cleanly established either way.

MiniCPM3 4B, as a single model candidate. Result: blocked, not disqualified, and not re testable as is, a real infrastructure hang rather than a capability verdict. This candidate is genuinely promising on paper, with a documented BFCL v2 score of 71.6, an Apache 2.0 license, and native vLLM model support. A real hardware ceiling was found and correctly applied before benchmarking, roughly a 6144 token max feasible serving context on this GPU, under the project's 16K floor, but the run was allowed to finish anyway as informational. The result was a real hang, not a clean pass or fail: zero visible progress for over 16 minutes, traced to OpenBMB's own reference tool parser re scanning the entire accumulated generation text with a catastrophic backtracking risk regex on every streamed token, not anything DeepDelve's own code touches. It never reached the point of testing actual research or delegation behavior, so this doesn't count as a settled discard, it's an open infrastructure question (the reference parser needs incremental parsing, not full text re scanning) rather than "MiniCPM3 4B discarded."

MiniCPM4 MCP, as a specialist role candidate. Result: real infrastructure was built and kept, but the model itself isn't yet a stable candidate. The tool use SFT checkpoint's chat template emits a Python code block format (<|tool_call_start|>func(arg=val)<|tool_call_end|>), not OpenAI style JSON tool_calls, so Ollama's generic tool calling support fails outright against it. We built and kept finetune/minicpm_tool_proxy.py, a translation proxy verified against OpenBMB's own reference implementation after an initial pass missed two real gaps, anti repeat tool call guidance and keyword collision or hyphenated name argument parsing, both since fixed and reverified. With both fixes in place, the specific bug that motivated the proxy (task name as filename looping) did not recur, but the run surfaced different reliability problems in its place: search quota exhaustion from excessive re querying, a noisy search topical mismatch that the existing check correctly caught, and a real accuracy regression against an earlier run. Still not a stable specialist role candidate as of this evaluation, reusable proxy infrastructure but an inconclusive model verdict.

Tongyi-DeepResearch-30B-A3B (Alibaba-NLP/DeepResearch). About 18.6GB at Q4_K_M, or 13.5GB at IQ3_M. Result: two real benchmark attempts, both impractical. This is a 30B MoE model with 3.3B active parameters, trained specifically for long horizon research, but it's a single fine tuned model operating via ReAct/"IterResearch," not a multi agent system in DeepDelve's sense (no Planner delegating to typed specialists with independent context), and it has no published runtime grounding or citation verification layer comparable to DeepDelve's own. Chat template and tool call compatibility were confirmed clean, real structured tool_calls, not raw XML text, and a --depth quick trial confirmed real delegation behavior. At Q4_K_M, the run was killed at 1 hour 6 minutes, genuinely computing the whole time, real progress happening, just far too slow to be practical (this is also the run that exposed and got a real max_run_minutes bug fixed). At IQ3_M, it did worse on the real workload despite being faster on the trivial smoke test, 37 plus minutes against the actual Planner prompt with zero progress, no write_todos, no delegate_tasks at all. Not recommended for further local benchmarking without a materially different quant or a context and prompt length investigation into why the full system prompt specifically breaks it.

Not attempted

devstral:24b. About 47.1GB bf16, estimated around 17GB at 4 bit. Discarded on hardware grounds before any pull: the real weight footprint (confirmed via the HF API, since the repo's 94GB listing double counts two packagings of the same weights) is estimated at roughly 17GB even after 4 bit quantization, which exceeds the entire 17.1GB VRAM card before KV cache and overhead. Same standard applied to qwen3.6.

GLM 4.7 Flash and Ornith-1.0-35B. Ruled out on hardware grounds before any pull, their smallest available quants (19GB and 21.2GB) exceed this card's 17.1GB VRAM budget. No GPU time spent on either.

A candidate shortlist researched on 2026-08-19 via web search, compiled after qwen3-4b-combined-v2-lora's clean disqualification closed off the 4B fine tune path, looking for a lighter than gpt-oss:20b general purpose candidate, ranked by promise. Since then, Ornith-1.0-9B's clean re test finished on 2026-08-19 and was disqualified (see its own entry above). Ministral-8B-Instruct-2410 finished the same day and was disqualified at the schema stage (see its own entry above, no full live run needed). Falcon3-10B-Instruct finished the same day too and was disqualified at the smoke test stage (see its own entry above, no full live run needed). And Phi-4 14B also finished that day, disqualified at the smoke test stage (see its own entry above, no full live run needed). Deprioritized and not being re litigated: xLAM-2-8b-fc-r, watt-tool-8B, and ToolACE-8B, narrow function calling specialist finetunes on a Llama 3.1 8B base, already surfaced by a prior session's research pass (ROADMAP.md, 2026-07-18) and explicitly deprioritized then, since these represent "a real risk for the writer role per this project's own repeated lesson [narrow fine tunes overfit to schema correctness at the cost of general instruction following], not worth GPU time until a general purpose candidate looks more promising." That's still true; the four candidates above are all general purpose. There's also a literature lead not yet read in full, and per this project's own citation verification rule its findings shouldn't be cited as verified until it is: AgentFloor: How Far Up the Tool Use Ladder Can Small Open Weight Models Go? (arXiv:2605.00334). Its title is a direct match for this exact question, and it's worth a full read before committing further GPU cycles to this search, not just relying on this session's web search snippet.

Hosted

NVIDIA NIM, free tier. The best discovery quality of anything tried, but the free tier quota wall kills a multi agent run at around 10 minutes. It needs a paid endpoint, and this project is local only for now.

deepseek-v4-flash and deepseek-v4-pro (the DeepSeek hosted API). No local VRAM cost, it's a hosted API. Best result: 0.2/1.0 for flash (llama_judge, Colombia B2B complex item), and 0.0/1.0 for pro on the same item, both well below gpt-oss:20b's 0.7/1.0 baseline on the same rubric. Disqualified, both variants, as of 2026-08-04, across 4 total runs (two flash runs via the web UI/src/api.py, one flash headless CLI run, one pro headless CLI run), which clears the Model Evaluation Standard's 2 plus run bar for a discard claim. The root cause is genuine model unreliability, not infrastructure, and that was only confirmed after two real harness bugs found along the way got fixed first.

The first fix added api.backend: "openai_hosted" (in src/engine/orchestrator.py's _get_default_options/_HOSTED_PROVIDER_THINKING_EXTRA_BODY). The existing "openai" backend's thinking mode control (chat_template_kwargs plus reasoning_effort:"none") is a vLLM or local serving convention that DeepSeek's hosted API silently ignores, leaving thinking mode stuck at its own default, on, with effort set to "high," per DeepSeek's own thinking mode docs. This was confirmed via _agent_session.json, zero reasoning_content occurrences after the fix, that thinking really was disabled, but it didn't fix the failure, the outcome and timing were nearly identical before and after, so verbose narration as content, not hidden reasoning, turned out to be the real driver of the next bug.

The second fix addressed a check_task_verification_flagged guardrail starvation bug (in src/api.py's context_budget_chars cutoff, around lines 297 to 334). The old, unconditional force jump to the terminal or salvage branch gave this check zero real retry attempts before cutting the run off, since DeepSeek's narration volume alone blew the same 50,000 character budget that gpt-oss:20b never approaches. This was brought to parity with run_cli's existing two stage nudge then cutoff, one wrap up turn before the hard cutoff, not before.

With both of those fixed, the model still failed, and subagent_invocations confirmed the reason is structural to the model's own behavior, not the harness: DeepSeek re fabricates the same citations on redo. check_task_verification_flagged correctly never let the run advance to check_missing_findings (which is what dispatches the real FindingsWriter/Builder writer roles), because the same flagged task names kept recurring across retry attempts instead of resolving, a genuine reliability failure (repeatedly citing sources that don't match anything actually fetched, despite 32 to 51 real fetched sources sitting unused each run), not a config or budget artifact. deepseek-v4-pro actually scored worse than flash despite costing roughly 3 times as much, which rules out "just use the bigger model" as a fix.

It's worth being clear about what this candidate was NOT disqualified for: tool calling mechanics themselves were fine, zero tool call schema errors in 3 of 4 runs, and the 4th run's 37 tool errors were sub agents passing task names instead of filenames to read_workspace_file, a separate argument binding weakness worth naming but not the deciding factor here. It also wasn't disqualified over "doesn't have write access" confusion, since the Planner role genuinely has no write_workspace_file tool by design, DeepSeek's own statement to that effect was accurate, not a hallucination, it just never earned its way to the role that does have it.

Cross cutting notes

Every Qwen3 family row marked with a dagger above was very likely benchmarked with uncontrolled chain of thought reasoning, not the clean output its score implies. This was discovered on 2026-07-21 while auditing the same question for MiniCPM5 1B, confirmed live via a direct curl against Ollama 0.31.2 that neither chat_template_kwargs.enable_thinking: false (OpenAI compat) nor Ollama's own native think: false field suppresses Qwen3's reasoning. Native think: false is actually worse than doing nothing, since it dumps the raw unstructured chain of thought directly into message.content with no separate thinking field at all, while think: true correctly separates it out. Since DeepDelve's client (agent_framework) treats .content as the model's actual working output, every marked row was almost certainly reasoning polluted in its tool call arguments and written text throughout the whole benchmarked run, a real, previously unknown contributing factor to these disqualifications, on top of, not instead of, the capacity floor evidence in the References page. This was confirmed via a direct vLLM test to be Ollama's bug, not a Qwen3 model limitation: enable_thinking: false against Qwen/Qwen3-4B on a real vLLM server, a genuine chat template evaluation, gives a clean answer with zero <think> content and correct, unpolluted tool calling. One row above, qwen3-4b-combined-v2-lora, has now been re benchmarked through this clean path, see its own entry above; the rest of the rows above still haven't been, and their existing scores stand as the best available evidence, just not as clean evidence as previously assumed. The full trace is in the Changelog. One more thing discovered while doing that re test on 2026-08-19: "clean" via api.backend: "ollama" means enable_thinking: true, not false, since think: false on the native endpoint reproduces the identical bug (raw chain of thought dumped into .content, confirmed via a direct curl), and only think: true correctly isolates reasoning into its own field. The token budget cost this implies, reasoning always on, is a real, accepted trade off for a clean measurement, not a bug to work around.

There's also been a lower cost re test path available since 2026-07-28. At the time the think mode bug above was found, the only known fix was switching the whole serving stack to vLLM, a big step, since reverted (see the Changelog's "Ollama restored" entry). api.backend: "ollama" (ARCHITECTURE.md section 6) now gives the same clean nothink behavior directly through Ollama's native /api/chat endpoint, live verified for gpt-oss and Ornith-1.0-9B, no backend swap required. Re testing any dagger marked row through this path is now a real, low friction option, still not done, still an open call, but no longer blocked on a bigger infrastructure decision the way it was on 2026-07-21.

The meta result holds across every run and every model: no fabricated report has ever gotten past the grounding gates unlabeled. The defense layer is the validated product here; model quality only determines how often it has to fire. See the Changelog's bake off entry for the full trial history and untested candidates (Ministral-8B, two function calling specialist finetunes) noted for later.

Clone this wiki locally