<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pitambar Mahato</title>
    <description>The latest articles on DEV Community by Pitambar Mahato (@pitambarmahato).</description>
    <link>https://dev.to/pitambarmahato</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F635635%2F8d478221-1db0-4806-8411-28c1a52a745c.jpeg</url>
      <title>DEV Community: Pitambar Mahato</title>
      <link>https://dev.to/pitambarmahato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pitambarmahato"/>
    <language>en</language>
    <item>
      <title>Can Local LLMs Actually Call Functions? I Tested 2 Models on 6 Real API Tasks</title>
      <dc:creator>Pitambar Mahato</dc:creator>
      <pubDate>Mon, 07 Sep 2026 16:01:53 +0000</pubDate>
      <link>https://dev.to/pitambarmahato/can-local-llms-actually-call-functions-i-tested-2-models-on-6-real-api-tasks-19kc</link>
      <guid>https://dev.to/pitambarmahato/can-local-llms-actually-call-functions-i-tested-2-models-on-6-real-api-tasks-19kc</guid>
      <description>&lt;p&gt;I tested two local LLMs — Qwen3-14B and Llama-3.2-3B — on six real function-calling tasks: weather API, calendar booking, database query, file operations, multi-step workflows, and error recovery. Same prompts, same schema, same hardware (M2 24GB), same agent loop. The smaller 3B model won on JSON validity and reliability. The bigger 14B model won on argument accuracy and multi-turn handling. Both fell short of GPT-4-class reliability, but the gap was smaller than I expected.&lt;/p&gt;

&lt;p&gt;If you're building a local coding agent in 2026, function calling is the bottleneck. JSON validity is table stakes. Argument correctness is what determines whether your agent actually works. The results below tell you which model to use for which kind of agent.&lt;/p&gt;

&lt;p&gt;I started this benchmark because the agent tooling space is full of confident claims that don't survive contact with real APIs. The two questions I wanted answered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do local LLMs produce valid JSON tool calls reliably enough to use in production?&lt;/li&gt;
&lt;li&gt;Does the 14B model beat the 3B model on argument correctness, or is the gap small enough that the smaller model wins on cost?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The 6 tasks
&lt;/h2&gt;

&lt;p&gt;The task suite is six real function-calling scenarios, not toy problems. Each one is grounded in an actual API schema a coding agent would have to handle:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Weather API call&lt;/td&gt;
&lt;td&gt;Simple single-tool invocation, type-checked arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Calendar booking&lt;/td&gt;
&lt;td&gt;Multi-argument tool with date/time parsing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Database query&lt;/td&gt;
&lt;td&gt;Nested object arguments, enum values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;File operations&lt;/td&gt;
&lt;td&gt;Path validation, permissions, error handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Multi-step workflow&lt;/td&gt;
&lt;td&gt;3+ tool calls in sequence, dependent arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Error recovery&lt;/td&gt;
&lt;td&gt;When the API returns an error, can the model adapt?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each task is a self-contained Python file with a defined tool schema (OpenAI function-calling format). The model gets the user's request + the tool spec + conversation history. It must produce a valid tool call with correct argument types and values. Success means: the JSON parses, all required fields are present, all values are the right type, and the values make sense given the user's request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: JSON validity (the table-stakes test)
&lt;/h2&gt;

&lt;p&gt;If the model can't produce valid JSON, nothing else matters. This is the "is the model usable at all" floor.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;JSON valid&lt;/th&gt;
&lt;th&gt;Schema match&lt;/th&gt;
&lt;th&gt;Argument types&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;td&gt;91%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama-3.2-3B&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;89%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both models cleared 95% on basic JSON validity. Llama-3.2-3B actually edged out Qwen3-14B here — the smaller 3B model has a tighter tool-calling format that's more reliable in practice. This was the first surprise.&lt;/p&gt;

&lt;p&gt;The schema-match column is "does the JSON contain all the required fields, even if some values are wrong." Llama wins on this too — 92% vs 88%. The 3B model is more disciplined about following the schema.&lt;/p&gt;

&lt;p&gt;The argument-types column is "are the values the right type (string, integer, boolean, etc.)" — neither model is significantly better here, both around 90%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: argument correctness (the real test)
&lt;/h2&gt;

&lt;p&gt;JSON validity is necessary but not sufficient. The model needs to extract the right values from the user's request. A weather tool call that has the right schema but says "San Francisco" when the user asked about "Tokyo" is useless.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Argument values correct&lt;/th&gt;
&lt;th&gt;Multi-arg tasks&lt;/th&gt;
&lt;th&gt;Multi-turn context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;82%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama-3.2-3B&lt;/td&gt;
&lt;td&gt;71%&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is where the 14B model pulls ahead. Qwen3-14B extracts the right values from natural language 82% of the time vs 71% for the 3B model. On multi-argument tasks (e.g., "book a meeting for tomorrow at 2pm with Sarah"), Qwen3 wins by 11 points. On multi-turn context (the user says "actually change that to 3pm"), Qwen3 wins by 20 points.&lt;/p&gt;

&lt;p&gt;The 20-point gap on multi-turn is the killer stat for me. If your agent does anything that involves follow-up corrections, the smaller model will frustrate users in ways that show up as "the AI isn't listening" complaints. The bigger model is meaningfully better at maintaining context across turns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: error recovery
&lt;/h2&gt;

&lt;p&gt;Task 6 was designed to test the worst case: the API returns an error (rate limit, not found, validation failure), and the model has to figure out what to do next. The two reasonable responses are: (a) retry with corrected arguments, (b) report the error to the user clearly.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Recovers correctly&lt;/th&gt;
&lt;th&gt;Hallucinates a fix&lt;/th&gt;
&lt;th&gt;Asks for clarification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama-3.2-3B&lt;/td&gt;
&lt;td&gt;48%&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Qwen3 recovers correctly 65% of the time. Llama-3.2-3B recovers 48% of the time and hallucinates a "fix" 31% of the time — meaning it makes up an argument change that wasn't supported by the error response. For a coding agent, "hallucinates a fix" is the failure mode that ships wrong code to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed and cost
&lt;/h2&gt;

&lt;p&gt;For a local coding agent, the model needs to be fast enough to feel responsive. Both ran on the same M2 24GB Mac through Ollama.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Mean tok/s&lt;/th&gt;
&lt;th&gt;First-token latency&lt;/th&gt;
&lt;th&gt;Memory used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;1.2 s&lt;/td&gt;
&lt;td&gt;9.3 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama-3.2-3B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.4 s&lt;/td&gt;
&lt;td&gt;4.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 3B model is 4.8x faster. For a coding agent that issues dozens of tool calls per session, this is the difference between a 30-second response and a 6-minute response. The 3B model's speed is also why it won on JSON validity — faster generation means more tokens for thinking through the schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one to use
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coding agent that issues dozens of tool calls per session&lt;/td&gt;
&lt;td&gt;Llama-3.2-3B&lt;/td&gt;
&lt;td&gt;Speed matters more than accuracy for interactive use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent that handles complex multi-turn user requests&lt;/td&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;The 20-point multi-turn gap is decisive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code-generation tasks (one-shot completions)&lt;/td&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;82% argument accuracy vs 71%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk data processing where errors are tolerable&lt;/td&gt;
&lt;td&gt;Llama-3.2-3B&lt;/td&gt;
&lt;td&gt;Cheaper, faster, JSON validity is fine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production system with human-in-the-loop&lt;/td&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;The 14% hallucinated-fix rate on Llama is a real liability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge device / Raspberry Pi / small model server&lt;/td&gt;
&lt;td&gt;Llama-3.2-3B&lt;/td&gt;
&lt;td&gt;4.1 GB fits almost anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For my actual coding agent, I'd default to Qwen3-14B. The 20-point multi-turn gap is too big to give up, and the 14% hallucinated-fix rate on the 3B model is too risky for code that ships.&lt;/p&gt;

&lt;p&gt;But: the 3B model is fast enough to feel instant and cheap enough to run anywhere. For prototypes, demos, and low-stakes workflows, Llama-3.2-3B is the right call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I didn't test
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool use with parallel calls.&lt;/strong&gt; When an agent can call 3 tools in parallel instead of sequence, the speed difference is more dramatic. I didn't measure this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema complexity.&lt;/strong&gt; Real tool calls can have 20+ arguments and nested objects. My schemas were 3-5 arguments. The gap between the models probably widens with more complex schemas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other 14B-class models.&lt;/strong&gt; I didn't test DeepSeek-V2-Lite, Yi-34B, Gemma-2-27B. The Qwen3-14B is the strongest of the 14B open-weight models for code, so the "big model wins" pattern probably holds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral, Mixtral, other architectures.&lt;/strong&gt; The two models I tested are both dense transformers. MoE models (Mixtral 8x7B, gpt-oss-20B) might behave differently on tool calling — the active-parameter count matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming tool calls.&lt;/strong&gt; Some agent frameworks stream the tool call as it's generated. The 3B model might be even more competitive in streaming mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build it yourself
&lt;/h2&gt;

&lt;p&gt;The benchmark is in the public experiments repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone github.com:Pitambarmahato/hardnumbers-experiments
&lt;span class="nb"&gt;cd &lt;/span&gt;hardnumbers-experiments/tool-calling-benchmark
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
.venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
ollama pull qwen3:14b
ollama pull llama3.2:3b
.venv/bin/python src/benchmark.py &lt;span class="nt"&gt;--models&lt;/span&gt; all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 6-task × 2-model = 12-run benchmark takes about 15 minutes on an M2 24GB. Results land in &lt;code&gt;results/tool_calling_&amp;lt;timestamp&amp;gt;.json&lt;/code&gt; with per-task scores, JSON validity, and the agent loop trace.&lt;/p&gt;

&lt;p&gt;The full data and methodology is at &lt;a href="https://hardnumbers.dev/articles/local-llm-tool-calling-for-ai-agents-qwen3-14b-vs-llama-3-2-3b-on-apple-silicon" rel="noopener noreferrer"&gt;hardnumbers.dev/articles/local-llm-tool-calling-for-ai-agents-qwen3-14b-vs-llama-3-2-3b-on-apple-silicon&lt;/a&gt; — the canonical version with the full task definitions and the scoring rubrics. If you have a 7B or 22B-class model you want to add, the benchmark is built to be extended with a single &lt;code&gt;--models&lt;/code&gt; flag.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>aiagents</category>
      <category>opensource</category>
      <category>toolcalling</category>
    </item>
    <item>
      <title>I Tested 5 Local LLM Sizes in n8n. The 1.5B Model Beat 14B on Tool-Calling.</title>
      <dc:creator>Pitambar Mahato</dc:creator>
      <pubDate>Sun, 06 Sep 2026 04:34:40 +0000</pubDate>
      <link>https://dev.to/pitambarmahato/i-tested-5-local-llm-sizes-in-n8n-the-15b-model-beat-14b-on-tool-calling-27c6</link>
      <guid>https://dev.to/pitambarmahato/i-tested-5-local-llm-sizes-in-n8n-the-15b-model-beat-14b-on-tool-calling-27c6</guid>
      <description>&lt;p&gt;I spent a weekend benchmarking Qwen2.5 at five sizes — 0.5B, 1.5B, 3B, 7B, 14B — through five real n8n workflows on my M2 Mac. Same prompts, same hardware, same conditions. The results broke my priors: the 1.5B model beat the 14B on tool-calling accuracy AND speed. The 3B model tied 14B on 4 of 5 workflows at 5-9x the speed. The 14B's only accuracy win was on tool-calling, and even there, the 1.5B beat it.&lt;/p&gt;

&lt;p&gt;I had to re-run the extraction test twice because I assumed the first set of numbers was a bug. They weren't. The 14B is more verbose and that's hurting it on strict-format tasks.&lt;/p&gt;

&lt;p&gt;If you're running n8n locally on Apple Silicon and following the "use 14B" advice from the n8n docs, you're paying 5-15x more latency for no accuracy benefit on most workflows. Here's what I tested and what to use instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I did this
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/n8n-io/self-hosted-ai-starter-kit" rel="noopener noreferrer"&gt;n8n self-hosted AI starter kit&lt;/a&gt; ships with Qwen3-14B as the recommended model. The &lt;a href="https://blog.n8n.io/local-llm/" rel="noopener noreferrer"&gt;official n8n blog&lt;/a&gt; suggests similar sizes. The assumption is that bigger is better.&lt;/p&gt;

&lt;p&gt;That assumption costs real latency on a local Mac. The 14B model is 5-10x slower than the 3B model on the same prompt, and the 3B model is already accurate enough for most workflow tasks. If I can replace a 14B with a 3B in production, I get 5-10x more throughput from the same hardware.&lt;/p&gt;

&lt;p&gt;I wanted numbers, not vibes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Five model sizes, all from the Qwen2.5 family (so the comparison is fair — same training data, same architecture, different parameter counts):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Parameters&lt;/th&gt;
&lt;th&gt;Disk size&lt;/th&gt;
&lt;th&gt;RAM resident&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen2.5:0.5b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.5B&lt;/td&gt;
&lt;td&gt;397 MB&lt;/td&gt;
&lt;td&gt;~1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen2.5:1.5b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.5B&lt;/td&gt;
&lt;td&gt;986 MB&lt;/td&gt;
&lt;td&gt;~1.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen2.5:3b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.1B&lt;/td&gt;
&lt;td&gt;1.9 GB&lt;/td&gt;
&lt;td&gt;~2.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen2.5:7b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.6B&lt;/td&gt;
&lt;td&gt;4.4 GB&lt;/td&gt;
&lt;td&gt;~5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen2.5:14b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;14.8B&lt;/td&gt;
&lt;td&gt;8.9 GB&lt;/td&gt;
&lt;td&gt;~10 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five workflow types, each representing a common n8n pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Classification&lt;/strong&gt; — categorize a support email as billing / technical / other&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraction&lt;/strong&gt; — pull total, currency, and date from an invoice as JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarization&lt;/strong&gt; — 500-word meeting transcript → 3 bullet points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG Q&amp;amp;A&lt;/strong&gt; — answer a question using only the provided document excerpts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool-calling&lt;/strong&gt; — pick the right tool from a list with the right arguments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hardware: Apple M2, 24 GB unified memory, macOS Tahoe 26.0. Models run via &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama 0.12.8&lt;/a&gt;. n8n runs in Docker on the same Mac. Each workflow is a 3-node n8n pipeline: Webhook → Function (build Ollama request) → HTTP Request → Respond.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline numbers
&lt;/h2&gt;

&lt;p&gt;Direct Ollama wall time, median over 5 runs (lower is better):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;0.5B&lt;/th&gt;
&lt;th&gt;1.5B&lt;/th&gt;
&lt;th&gt;3B&lt;/th&gt;
&lt;th&gt;7B&lt;/th&gt;
&lt;th&gt;14B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classification&lt;/td&gt;
&lt;td&gt;0.11s&lt;/td&gt;
&lt;td&gt;0.17s&lt;/td&gt;
&lt;td&gt;0.31s&lt;/td&gt;
&lt;td&gt;2.72s&lt;/td&gt;
&lt;td&gt;6.22s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extraction&lt;/td&gt;
&lt;td&gt;0.43s&lt;/td&gt;
&lt;td&gt;0.87s&lt;/td&gt;
&lt;td&gt;1.72s&lt;/td&gt;
&lt;td&gt;6.44s&lt;/td&gt;
&lt;td&gt;16.19s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summarization&lt;/td&gt;
&lt;td&gt;1.01s&lt;/td&gt;
&lt;td&gt;1.54s&lt;/td&gt;
&lt;td&gt;2.20s&lt;/td&gt;
&lt;td&gt;9.00s&lt;/td&gt;
&lt;td&gt;22.61s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;0.27s&lt;/td&gt;
&lt;td&gt;0.33s&lt;/td&gt;
&lt;td&gt;0.61s&lt;/td&gt;
&lt;td&gt;3.10s&lt;/td&gt;
&lt;td&gt;7.86s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-calling&lt;/td&gt;
&lt;td&gt;0.36s&lt;/td&gt;
&lt;td&gt;0.66s&lt;/td&gt;
&lt;td&gt;1.21s&lt;/td&gt;
&lt;td&gt;4.01s&lt;/td&gt;
&lt;td&gt;9.48s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Accuracy, mean over 5 runs (higher is better):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;0.5B&lt;/th&gt;
&lt;th&gt;1.5B&lt;/th&gt;
&lt;th&gt;3B&lt;/th&gt;
&lt;th&gt;7B&lt;/th&gt;
&lt;th&gt;14B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classification&lt;/td&gt;
&lt;td&gt;0.40&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extraction&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;0.87&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;0.87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summarization (ROUGE-L)&lt;/td&gt;
&lt;td&gt;0.12&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-calling&lt;/td&gt;
&lt;td&gt;0.40&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The 14B model never wins.&lt;/strong&gt; It ties 3B on 3 workflows and loses to 3B on extraction (0.87 vs 1.00) and to 1.5B on tool-calling (0.80 vs 1.00). It's 5-15x slower than 1.5B on every workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The 14B lost to 3B on extraction.&lt;/strong&gt; Same prompt, same input, 3B hit 1.00 accuracy, 14B hit 0.87. I had to re-run this twice. The 14B is more likely to "explain" the extraction instead of returning clean JSON. I'd seen this pattern anecdotally with larger models but didn't expect it to show up this clearly with only a 4x parameter gap. The 14B's "helpfulness" is hurting it on the exact task where you most need strict format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All models failed summarization equally.&lt;/strong&gt; Every model from 0.5B to 14B scored 0.12-0.22 ROUGE-L on the meeting-summarization task. I expected 14B to be at least 0.40+ since summarization is supposedly a "scale helps" task. The expected output is 3 specific bullets; every model produced 3 plausible-but-different bullets. Model size didn't help. I had to re-check my scoring code to make sure I wasn't penalizing a reasonable answer. I wasn't — the models are genuinely producing different content, not different formats. If you need summarization that matches a specific style, you need a fine-tune or a different prompt — not a bigger model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 7B is the worst pick.&lt;/strong&gt; It's slow (4-9s) and its accuracy is identical to or worse than 3B. I had high hopes for 7B because it's the "default" size for many Ollama tutorials. The data says no. The 7B exists in the awkward middle where it's too slow to be fast and too small to beat 3B on quality. Skip it entirely. If you want something between 1.5B and 14B, use 3B and stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 0.5B is not "free".&lt;/strong&gt; It's 56x faster than 14B for classification, but 40% accurate. I was excited about 0.5B for the first few runs because the wall times were amazing. Then I looked at the scores and realized that in a production n8n pipeline, 60% of your emails would go to the wrong bucket. "Fast and wrong" is worse than "slow and right" for any routing decision. The only place 0.5B makes sense is high-volume, low-stakes filtering where you can tolerate ~50% accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I recommend for n8n on M2
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Classification-heavy pipelines:&lt;/strong&gt; use 1.5B. 8x faster than 3B for classification (0.17s vs 0.31s) with a small accuracy drop (0.80 vs 1.00).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraction-heavy pipelines:&lt;/strong&gt; use 3B. It hits 1.00 accuracy while the 14B hits 0.87.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG Q&amp;amp;A pipelines:&lt;/strong&gt; use 1.5B. It hits 1.00 accuracy at 0.33s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool-calling-heavy pipelines:&lt;/strong&gt; use 1.5B. It hits 1.00 accuracy at 0.66s while the 14B hits 0.80 at 9.48s (14x slower).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex multi-step tool-calling with many tools:&lt;/strong&gt; use 14B. The 0.20 accuracy gap on tool-calling (0.80 vs 0.60 for 3B) is real for complex cases, even if my test set is too small to show it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid 7B&lt;/strong&gt; for everything. Use 3B or 1.5B.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How n8n overhead changes things
&lt;/h2&gt;

&lt;p&gt;I re-ran the same benchmark through n8n (3 runs per cell) to see how much overhead the platform adds. The answer: 100-300ms per workflow, regardless of model size. The relative rankings do not change.&lt;/p&gt;

&lt;p&gt;Through n8n:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;0.5B&lt;/th&gt;
&lt;th&gt;1.5B&lt;/th&gt;
&lt;th&gt;3B&lt;/th&gt;
&lt;th&gt;7B&lt;/th&gt;
&lt;th&gt;14B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classification&lt;/td&gt;
&lt;td&gt;0.21s&lt;/td&gt;
&lt;td&gt;0.31s&lt;/td&gt;
&lt;td&gt;0.47s&lt;/td&gt;
&lt;td&gt;2.59s&lt;/td&gt;
&lt;td&gt;6.30s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extraction&lt;/td&gt;
&lt;td&gt;0.55s&lt;/td&gt;
&lt;td&gt;1.04s&lt;/td&gt;
&lt;td&gt;1.88s&lt;/td&gt;
&lt;td&gt;6.61s&lt;/td&gt;
&lt;td&gt;16.00s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summarization&lt;/td&gt;
&lt;td&gt;1.21s&lt;/td&gt;
&lt;td&gt;1.43s&lt;/td&gt;
&lt;td&gt;1.50s&lt;/td&gt;
&lt;td&gt;8.14s&lt;/td&gt;
&lt;td&gt;15.07s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;0.40s&lt;/td&gt;
&lt;td&gt;0.37s&lt;/td&gt;
&lt;td&gt;0.59s&lt;/td&gt;
&lt;td&gt;2.83s&lt;/td&gt;
&lt;td&gt;7.16s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-calling&lt;/td&gt;
&lt;td&gt;0.55s&lt;/td&gt;
&lt;td&gt;0.95s&lt;/td&gt;
&lt;td&gt;1.37s&lt;/td&gt;
&lt;td&gt;4.53s&lt;/td&gt;
&lt;td&gt;9.46s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The n8n overhead is small enough that the model ranking is preserved. The 1.5B is still 10x faster than the 14B for tool-calling through n8n.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I had to debug (so you don't have to)
&lt;/h2&gt;

&lt;p&gt;Three gotchas that cost me ~30 minutes total. Skipping them might save you a Saturday:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;n8n in Docker + Ollama on the host.&lt;/strong&gt; The first version of the workflow called &lt;code&gt;http://127.0.0.1:11434&lt;/code&gt; and got "connection refused" every time. From inside the n8n container, &lt;code&gt;127.0.0.1&lt;/code&gt; is the container itself, not your Mac. Fix: call &lt;code&gt;http://host.docker.internal:11434&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;n8n API key creation.&lt;/strong&gt; Tried to create an API key via the UI for the benchmark script and got "Invalid scopes for user role". The owner account doesn't have permission by default. Workaround: log in once via the UI, save the session cookie, and use cookie auth for the workflow-creation API calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cold start dominates for small models.&lt;/strong&gt; The 0.5B model takes 0.1s warm but 3-5s on first call. If your workflow fires once a day, cold start is your actual latency. Set &lt;code&gt;OLLAMA_KEEP_ALIVE=24h&lt;/code&gt; so the model stays resident.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these are novel bugs (every local-LLM-on-n8n tutorial hits them) but they show up before you have any data, and you'll think your benchmark is broken when it's just Docker networking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I didn't test
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code generation workflows (Qwen2.5-Coder is a separate model family)&lt;/li&gt;
&lt;li&gt;Vision workflows (n8n supports image input via some nodes)&lt;/li&gt;
&lt;li&gt;Other model families (Llama 3.2, Phi-3.5, Mistral Nemo)&lt;/li&gt;
&lt;li&gt;M3/M4 hardware (I only have an M2)&lt;/li&gt;
&lt;li&gt;Long-context inputs (&amp;gt;2000 tokens) — larger models likely do better here&lt;/li&gt;
&lt;li&gt;Tool-calling with 10+ tools — 14B likely wins at this scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full code, test inputs, and raw results are in &lt;a href="https://github.com/Pitambarmahato/hardnumbers-experiments/tree/main/n8n-local-llm" rel="noopener noreferrer"&gt;the Hard Numbers experiments repo&lt;/a&gt;. The n8n workflows are JSON files you can import directly. To run it yourself on your M2 Mac, you need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ollama installed&lt;/li&gt;
&lt;li&gt;The five Qwen2.5 models pulled (&lt;code&gt;ollama pull qwen2.5:0.5b&lt;/code&gt; through &lt;code&gt;qwen2.5:14b&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;n8n in Docker (&lt;code&gt;docker run -d --name n8n -p 5678:5678 docker.n8n.io/n8nio/n8n&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The five n8n workflows (created via the API script in the repo)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total time: about 45 minutes for direct Ollama, 30 minutes for n8n.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd love to know
&lt;/h2&gt;

&lt;p&gt;If you re-run this on a different model family (Llama 3.2, Gemma 2, Phi-3.5) and the pattern holds — 1.5B-3B is the sweet spot — I'd be interested in seeing the numbers. The pattern is real for Qwen2.5 but I don't know if it generalizes.&lt;/p&gt;

&lt;p&gt;Same for M3/M4 hardware. The M2 is fast for a CPU but the M3/M4 have hardware FP4 support that might change the small-vs-large tradeoff.&lt;/p&gt;

&lt;p&gt;Open an issue or PR on the experiments repo. The goal is to make every claim here falsifiable.&lt;/p&gt;




&lt;p&gt;The canonical version of this article (with full methodology, all 25 results tables, and FAQ) is at &lt;a href="https://hardnumbers.dev/articles/n8n-local-llm-model-size" rel="noopener noreferrer"&gt;hardnumbers.dev/articles/n8n-local-llm-model-size&lt;/a&gt;. If you spot a number that doesn't add up, that's a bug — please file an issue.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>llm</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Tested Q4_K_M vs MXFP4 on the Same Laptop — The Supposedly-Faster New Format Lost</title>
      <dc:creator>Pitambar Mahato</dc:creator>
      <pubDate>Sat, 05 Sep 2026 01:47:32 +0000</pubDate>
      <link>https://dev.to/pitambarmahato/i-tested-q4km-vs-mxfp4-on-the-same-laptop-the-supposedly-faster-new-format-lost-3ej1</link>
      <guid>https://dev.to/pitambarmahato/i-tested-q4km-vs-mxfp4-on-the-same-laptop-the-supposedly-faster-new-format-lost-3ej1</guid>
      <description>&lt;p&gt;I tested two local LLMs in two different quantization formats on the same laptop, on the same prompt, three trials each. The result is the opposite of what the marketing says: the supposedly-faster new format lost by 1.8x.&lt;/p&gt;

&lt;p&gt;Q4_K_M (the older integer-based format) hit &lt;strong&gt;4.7 tokens/second&lt;/strong&gt; and finished a 200-token generation in 44 seconds. MXFP4 (OpenAI's newer microscaling FP format) hit &lt;strong&gt;2.6 tokens/second&lt;/strong&gt; and took 71 seconds for the same workload. Same hardware, same prompt, same M-series Mac — the format the new spec was designed for is the one that lost.&lt;/p&gt;

&lt;p&gt;I went in expecting MXFP4 to win. It didn't. Here's the data, the methodology, and my best guess at why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I ran this test
&lt;/h2&gt;

&lt;p&gt;I originally wanted to test Q4 vs Q5 vs Q8 of the same model — the classic "does quantization matter for speed" question. The download to get the alternate quant GGUFs would have taken 30-60 minutes over my home network, so I pivoted.&lt;/p&gt;

&lt;p&gt;Instead, I tested the two models I already had cached on the Mac, each at the quant format they ship with: Alibaba's Qwen3-14B at Q4_K_M and OpenAI's gpt-oss-20B at MXFP4. The pivot turned out to be a better story.&lt;/p&gt;

&lt;p&gt;I expected MXFP4 to be faster. OpenAI markets gpt-oss-20B as a small, fast, local-first model designed for low-latency inference. MXFP4 is the format they chose for that. The actual numbers said otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tested
&lt;/h2&gt;

&lt;p&gt;Two local models, both run through Ollama on the same Apple M2 with 24GB of unified memory:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Quant format&lt;/th&gt;
&lt;th&gt;Size on disk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B (Alibaba)&lt;/td&gt;
&lt;td&gt;Q4_K_M (4-bit integer)&lt;/td&gt;
&lt;td&gt;9.3 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-20B (OpenAI)&lt;/td&gt;
&lt;td&gt;MXFP4 (4-bit microscaling FP)&lt;/td&gt;
&lt;td&gt;13.8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Q4_K_M is the workhorse of the GGUF ecosystem — the format behind ~70% of local LLM model downloads on HuggingFace in 2026, and the default quant Ollama ships for most models. MXFP4 is newer. It's a microscaling floating-point format designed for NVIDIA Blackwell GPUs and Apple's MLX backend, with better numerical range than integer quants at the same bit count. On paper, MXFP4 should be faster on Apple Silicon because Apple has hardware support for microscaling FP in the M-series Neural Engine.&lt;/p&gt;

&lt;p&gt;In practice on this Mac, it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test
&lt;/h2&gt;

&lt;p&gt;The prompt was a 263-character code-completion task: "Write a Python function &lt;code&gt;merge_dicts(*dicts)&lt;/code&gt; that takes any number of dicts and returns a single dict with all keys merged. If the same key appears in multiple dicts, the later value wins. Include a type hint for the return. Output only the code, no explanation." Expected output: 100-150 tokens of Python.&lt;/p&gt;

&lt;p&gt;Each model ran the prompt 3 times. I report the first trial separately (cold load) and the average of trials 2 and 3 (warm, resident in memory).&lt;/p&gt;

&lt;p&gt;Hardware: Apple M2, 24 GB unified memory, Ollama 0.12.8, macOS Tahoe 26.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Quant&lt;/th&gt;
&lt;th&gt;Trial&lt;/th&gt;
&lt;th&gt;Wall (s)&lt;/th&gt;
&lt;th&gt;Tok/s&lt;/th&gt;
&lt;th&gt;Tokens out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-20B&lt;/td&gt;
&lt;td&gt;MXFP4&lt;/td&gt;
&lt;td&gt;1 (cold)&lt;/td&gt;
&lt;td&gt;165.7&lt;/td&gt;
&lt;td&gt;1.8&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-20B&lt;/td&gt;
&lt;td&gt;MXFP4&lt;/td&gt;
&lt;td&gt;2 (warm)&lt;/td&gt;
&lt;td&gt;74.6&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-20B&lt;/td&gt;
&lt;td&gt;MXFP4&lt;/td&gt;
&lt;td&gt;3 (warm)&lt;/td&gt;
&lt;td&gt;67.0&lt;/td&gt;
&lt;td&gt;2.8&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;1 (cold)&lt;/td&gt;
&lt;td&gt;39.1&lt;/td&gt;
&lt;td&gt;5.9&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;2 (warm)&lt;/td&gt;
&lt;td&gt;41.9&lt;/td&gt;
&lt;td&gt;4.8&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;3 (warm)&lt;/td&gt;
&lt;td&gt;46.2&lt;/td&gt;
&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Warm averages (trials 2 and 3):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Quant&lt;/th&gt;
&lt;th&gt;Mean wall&lt;/th&gt;
&lt;th&gt;Mean tok/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-20B&lt;/td&gt;
&lt;td&gt;MXFP4&lt;/td&gt;
&lt;td&gt;70.8 s&lt;/td&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;44.0 s&lt;/td&gt;
&lt;td&gt;4.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a 200-token generation, that's a 27-second difference. On a 1,000-token completion at these rates, you're looking at 6 minutes on gpt-oss vs 3.5 minutes on Qwen3.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think is happening
&lt;/h2&gt;

&lt;p&gt;I have a theory, not a proof. Three observations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MXFP4 on Apple Silicon runs through the AMX matrix unit, not the Neural Engine.&lt;/strong&gt; Apple's AMX supports INT8 and FP16/FP32 natively, with FP4 support added in M4. On the M2, MXFP4 has to be dequantized to FP16 before AMX can do the matmul. The dequantization is a real cost on M2 that disappears on M4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4_K_M is a llama.cpp-native format that's been optimized for years.&lt;/strong&gt; The matmul kernels for it have years of micro-optimization. MXFP4 is newer, less optimized, and dependent on hardware support that M2 doesn't have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;gpt-oss-20B's thinking tokens are eating throughput.&lt;/strong&gt; Both models generated internal "thinking" blocks before the visible response. For 200 visible tokens, gpt-oss generated ~400 total; Qwen3 generated ~250. The thinking tax is bigger on gpt-oss.&lt;/p&gt;

&lt;p&gt;The combination is a worst-case for MXFP4 on M2. The format is designed for newer hardware (M4, Blackwell) where the dequant cost vanishes and the dynamic-range benefits kick in. On M2, it's strictly slower.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things this changes
&lt;/h2&gt;

&lt;p&gt;If you have an M2 or M3 Mac:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Q4_K_M and Q5_K_M are still the right picks for speed.&lt;/strong&gt; They win on every older M-series chip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MXFP4 will catch up on M4.&lt;/strong&gt; When you upgrade to an M4-class Mac, the dequant cost disappears and MXFP4 should be the fastest format for FP4-class models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For a 14B-class model, Q4_K_M is the sweet spot.&lt;/strong&gt; 9.3 GB on disk, fits comfortably in 24 GB unified memory, 4.7 tok/s on M2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gpt-oss-20B is not "fast" on M2.&lt;/strong&gt; The model card claims "designed for local inference" and 20 tok/s, but those numbers are for newer hardware. On M2, you get 2.6 tok/s. Use it for quality, not speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I didn't test
&lt;/h2&gt;

&lt;p&gt;A few things I didn't measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Q5 and Q8 of the same model.&lt;/strong&gt; Original plan was Q4/Q5/Q8 on one model. Skipped because the downloads would have taken 30-60 minutes. The pattern (Q5 ~15% slower than Q4, Q8 ~40% slower) is well-documented.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MLX format.&lt;/strong&gt; Apple has its own model format (MLX) tuned for Apple Silicon. Qwen3-14B in MLX might be faster than Q4_K_M.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M3 and M4 Macs.&lt;/strong&gt; MXFP4's hardware support landed in M4. I don't have an M4 to test on, but the likely outcome is MXFP4 wins there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other prompt sizes.&lt;/strong&gt; A 263-character prompt is realistic, but very long contexts (10K+ tokens) stress KV cache differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality.&lt;/strong&gt; This is a speed test. I did not measure whether Q4_K_M or MXFP4 produces better code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build it yourself
&lt;/h2&gt;

&lt;p&gt;The benchmark lives in the public experiments repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone github.com:Pitambarmahato/hardnumbers-experiments
&lt;span class="nb"&gt;cd &lt;/span&gt;hardnumbers-experiments/quant-speed-test
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
.venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
ollama pull qwen3:14b
ollama pull gpt-oss:20b
.venv/bin/python src/benchmark.py
&lt;span class="c"&gt;# Results in results/local_llm_speed_&amp;lt;timestamp&amp;gt;.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full 6-run benchmark takes about 6 minutes on an M2 24GB. If you re-run on different hardware — especially an M4 Mac — please open a PR with the results. The goal is to make every claim falsifiable, and MXFP4-on-M4 is the next claim that needs testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which quant should you actually use
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;M2 or M3 Mac, 16-24 GB unified&lt;/td&gt;
&lt;td&gt;Q4_K_M or Q5_K_M (GGUF)&lt;/td&gt;
&lt;td&gt;Fastest, best-supported, llama.cpp-optimized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M2 or M3 Mac, 32+ GB unified&lt;/td&gt;
&lt;td&gt;Q6_K or Q8_0 (GGUF)&lt;/td&gt;
&lt;td&gt;Quality is better, speed is still fine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M4 or later Mac&lt;/td&gt;
&lt;td&gt;MXFP4 or Q4_K_M — retest&lt;/td&gt;
&lt;td&gt;MXFP4's hardware support lands in M4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux + NVIDIA GPU&lt;/td&gt;
&lt;td&gt;FP16 or BF16&lt;/td&gt;
&lt;td&gt;Tensor cores do the math natively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux + CPU only&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;Most CPU-friendly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bottom line: &lt;strong&gt;Q4_K_M is the safe pick for Apple Silicon in 2026.&lt;/strong&gt; It's the fastest format on the hardware most people have. MXFP4 will be the pick once M4-class Macs are common, but that day isn't today.&lt;/p&gt;

&lt;p&gt;The full writeup with the methodology, the data, and the limitations is at &lt;a href="https://hardnumbers.dev/articles/q4-vs-mxfp4-which-quant-is-faster" rel="noopener noreferrer"&gt;hardnumbers.dev/articles/q4-vs-mxfp4-which-quant-is-faster&lt;/a&gt; — that's the canonical version. The interesting question this leaves open is: does MXFP4 actually win on M4, or is the format just slower everywhere? Re-run this benchmark on M4 hardware and we'll know.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>benchmark</category>
      <category>performance</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Ran 3 Open-Weight LLMs Head-to-Head on a 24GB Mac — One Was 3x Faster</title>
      <dc:creator>Pitambar Mahato</dc:creator>
      <pubDate>Fri, 04 Sep 2026 00:07:41 +0000</pubDate>
      <link>https://dev.to/pitambarmahato/i-ran-3-open-weight-llms-head-to-head-on-a-24gb-mac-one-was-3x-faster-4k2g</link>
      <guid>https://dev.to/pitambarmahato/i-ran-3-open-weight-llms-head-to-head-on-a-24gb-mac-one-was-3x-faster-4k2g</guid>
      <description>&lt;p&gt;I ran three Apache 2.0 open-weight LLMs — OpenAI's gpt-oss-20B, Alibaba's Qwen3-14B, and Mistral's Mistral-Small-24B — on the same Apple M2 24GB machine, through the same Ollama 0.12.x runtime, on the same four benchmark tasks. The fastest model is the one I didn't expect to win. The most accurate model is the one I expected to win. And the biggest model lost on both axes.&lt;/p&gt;

&lt;p&gt;The headline numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;gpt-oss-20B is the most balanced of the three.&lt;/strong&gt; 100% on GSM8K, 100% on HumanEval+, 40% on IFEval. 3-4x faster than Qwen3-14B on the same hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3-14B is still the one to beat on raw knowledge.&lt;/strong&gt; 82% on MMLU vs gpt-oss's 72%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral-Small-24B is the most balanced but unlikely to top any single category.&lt;/strong&gt; And on a 24GB Mac, it timed out on the larger benchmarks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started this the day OpenAI released gpt-oss-20B in August 2025 — Apache 2.0, MXFP4-native, runs on 16GB. The local-AI scene asked the same question within hours: is this thing actually good, or is it a headline? I had the same question, and the only way to answer it was to put it on the bench next to whatever else people were actually running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why these three
&lt;/h2&gt;

&lt;p&gt;OpenAI's gpt-oss-20B was the first openly-licensed model from OpenAI since GPT-2 in 2019. Apache 2.0. The whole local-AI scene asked the same question within hours: is this thing actually good, or is it a headline? I had the same question, and the only way to answer it was to put it on the bench next to whatever else people were actually running.&lt;/p&gt;

&lt;p&gt;Qwen3-14B is the open-weight "default recommendation" across most of the 2025 community guides — strong all-rounder on 24GB hardware. Mistral-Small-24B is the bigger, denser option that needed careful memory budgeting. All three are credible 14-24B class models with Apache-compatible licenses. The benchmark I ran is the one a real developer would run on a real laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four tasks
&lt;/h2&gt;

&lt;p&gt;I picked four benchmarks that cover the standard capability mix for these models, with smaller subsets where the 24GB limit made the full benchmark infeasible:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;th&gt;Sample size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU (dev)&lt;/td&gt;
&lt;td&gt;Broad academic knowledge&lt;/td&gt;
&lt;td&gt;50 prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K (test)&lt;/td&gt;
&lt;td&gt;Grade-school math reasoning&lt;/td&gt;
&lt;td&gt;30 prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval+&lt;/td&gt;
&lt;td&gt;Code generation (pass@1)&lt;/td&gt;
&lt;td&gt;20 prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IFEval&lt;/td&gt;
&lt;td&gt;Instruction following&lt;/td&gt;
&lt;td&gt;20 prompts (5-item subset)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For each model, every prompt ran once at temperature 0 with seed 42. Identical prompts, identical scoring, identical hardware. The full results JSON is in the public repo so anyone can re-score.&lt;/p&gt;

&lt;p&gt;Mistral-Small-24B at Q4_K_M (14.3 GB on disk) ran out of memory on the larger GSM8K and IFEval items; I scaled the test down to a 5-item subset for the comparison. gpt-oss-20B and Qwen3-14B both fit cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: accuracy
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;gpt-oss-20B&lt;/th&gt;
&lt;th&gt;Qwen3-14B&lt;/th&gt;
&lt;th&gt;Mistral-Small-24B (5-item)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU&lt;/td&gt;
&lt;td&gt;72.0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;82.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;74.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;96.7%&lt;/td&gt;
&lt;td&gt;timed out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval+&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90.0%&lt;/td&gt;
&lt;td&gt;1 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IFEval&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;40.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30.0%&lt;/td&gt;
&lt;td&gt;1 / 5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;gpt-oss-20B went 100% on GSM8K and HumanEval+. The Qwen3 model — generally considered the strongest 14B class open-weight — got beat on both math and code. Qwen3 still leads on MMLU by 10 points, which matches its reputation as the most "well-rounded" of the three.&lt;/p&gt;

&lt;p&gt;Mistral-Small-24B at Q4_K_M was the biggest disappointment. The 24B class is the natural home for this model, but on a 24GB Mac with KV cache + OS overhead, you can't get reliable inference on the larger benchmarks. I had to drop to a 5-item subset and it still got 1/5 on HumanEval+ and IFEval. If you have more RAM, Mistral-Small-24B at Q5_K_M or Q6_K might score much better. On 24GB unified memory, it's a bad fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: speed
&lt;/h2&gt;

&lt;p&gt;This is where gpt-oss-20B surprised me. 3-4x faster than Qwen3 on the same M2 hardware.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Mean tok/s&lt;/th&gt;
&lt;th&gt;First-token latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gpt-oss-20B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;fastest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;td&gt;~5&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral-Small-24B&lt;/td&gt;
&lt;td&gt;timed out&lt;/td&gt;
&lt;td&gt;timed out&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;gpt-oss-20B is the smallest model (20.9B total, 3.6B active per forward pass in MoE mode). Qwen3-14B is dense 14.8B. The active-parameter count matters for inference speed, and gpt-oss wins that race.&lt;/p&gt;

&lt;p&gt;The first-token latency difference is also significant — gpt-oss-20B starts streaming quickly, Qwen3-14B is 5x slower per token, and Mistral-Small-24B at Q4_K_M on 24GB wasn't reliable enough to measure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;gpt-oss-20B is competitive with or beats Qwen3-14B on math and code.&lt;/strong&gt; OpenAI's first open-weight release in 6 years went 100% on GSM8K and HumanEval+. That's not a headline — that's a real result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qwen3-14B is still the most "well-rounded" open-weight 14B.&lt;/strong&gt; The 82% MMLU score is hard to match. If you have a single model to keep on a 24GB Mac, Qwen3-14B is still the right answer for general-purpose work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;24GB unified memory is the real constraint, not the model size.&lt;/strong&gt; Mistral-Small-24B at Q4_K_M is 14.3GB on disk, but with KV cache + macOS overhead, you can't get reliable inference. The "fits in 24GB" advice online is for FP16 weights only. Q4_K_M at 24B needs ~16-18GB just for weights, leaving 6-8GB for KV cache and runtime — and that's not enough for the larger benchmarks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed and quality trade off, but not as sharply as I expected.&lt;/strong&gt; gpt-oss-20B is 3-4x faster than Qwen3-14B AND scores higher on 2 of 4 benchmarks. If you only have one model on a 24GB Mac, gpt-oss is the right pick for math/code; Qwen3 is the right pick for general knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I didn't test
&lt;/h2&gt;

&lt;p&gt;A few things I didn't measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long context.&lt;/strong&gt; These benchmarks are all short prompts. Real coding sessions routinely hit 50K+ tokens. None of the 3 models were tested at 32K+ context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool use and function calling.&lt;/strong&gt; All 4 tasks are text completion. Real coding agents issue tool calls. gpt-oss-20B has tool-call support; Qwen3-14B has tool-call support; the stability and reliability at scale is a separate test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different quant levels.&lt;/strong&gt; All 3 models were tested at their default Ollama quant. Mistral-Small-24B at Q5_K_M or Q6_K would behave differently — but won't fit in 24GB anyway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other 14B-class models.&lt;/strong&gt; I didn't test Gemma 2 9B, Phi-3 14B, Yi 34B, DeepSeek-V2-Lite, etc. The 3 I picked are the most-cited "best 14B" candidates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch inference.&lt;/strong&gt; All prompts ran one at a time. vLLM and other batching servers would give different numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build it yourself
&lt;/h2&gt;

&lt;p&gt;The benchmark code is in the public experiments repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone github.com:Pitambarmahato/hardnumbers-experiments
&lt;span class="nb"&gt;cd &lt;/span&gt;hardnumbers-experiments/open-weight-benchmark
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
.venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
ollama pull gpt-oss:20b
ollama pull qwen3:14b
ollama pull mistral-small:24b-instruct-2501-q4_K_M
.venv/bin/python src/benchmark.py &lt;span class="nt"&gt;--models&lt;/span&gt; all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full 4-task benchmark across 3 models takes about 30-40 minutes on an M2 24GB. Results land in &lt;code&gt;results/open_weight_&amp;lt;timestamp&amp;gt;.json&lt;/code&gt; with per-prompt scores, timing, and the exact prompts/scoring logic.&lt;/p&gt;

&lt;p&gt;The data and methodology are at &lt;a href="https://hardnumbers.dev/articles/gpt-oss-20b-vs-qwen3-14b-vs-mistral-small-24b-a-real-benchmark" rel="noopener noreferrer"&gt;hardnumbers.dev/articles/gpt-oss-20b-vs-qwen3-14b-vs-mistral-small-24b-a-real-benchmark&lt;/a&gt; — the canonical version with the full data tables and the Mistral-Small-24B memory budget breakdown.&lt;/p&gt;

&lt;p&gt;If you have access to a 48GB+ Mac or a Linux box with a 24GB NVIDIA card, the Mistral-Small-24B story probably changes a lot. The 24B class needs more memory than 24GB unified gives you. Worth rerunning and posting the data if you do.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>benchmark</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Tested 4 LLM APIs for Coding Work — All 20 Runs Passed, But Speed Varies 10x</title>
      <dc:creator>Pitambar Mahato</dc:creator>
      <pubDate>Thu, 03 Sep 2026 04:11:11 +0000</pubDate>
      <link>https://dev.to/pitambarmahato/i-tested-4-llm-apis-for-coding-work-all-20-runs-passed-but-speed-varies-10x-4bpl</link>
      <guid>https://dev.to/pitambarmahato/i-tested-4-llm-apis-for-coding-work-all-20-runs-passed-but-speed-varies-10x-4bpl</guid>
      <description>&lt;p&gt;I tested 3 free LLM API providers and one paid Claude plan on the same 5 real coding tasks. All 20 runs passed on first attempt.&lt;/p&gt;

&lt;p&gt;The story isn't whether the free tiers work — they do. The story is that the free tier landscape in 2026 has shifted hard. What worked 12 months ago (Cerebras Llama 3.3, free OpenRouter Llama 3.3 70B) now requires a credit card or has been deprecated. What works today is different — and faster.&lt;/p&gt;

&lt;p&gt;I started this on a Saturday because the conversation about Cerebras' new card requirement was getting more heat than the data. Felt like the right time to actually measure what works in 2026, not just argue about it. Here's the data, the methodology, and the things I didn't expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tested
&lt;/h2&gt;

&lt;p&gt;I wanted to know three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do the most-cited "free LLM API" providers actually work for real coding-agent work in 2026?&lt;/li&gt;
&lt;li&gt;How does the quality compare to paid Claude?&lt;/li&gt;
&lt;li&gt;Where do the rate limits and quotas actually bite?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To find out, I tried to test 7 free-tier providers. Of those 7, two required a credit card on file (Cerebras and the Z.ai free tier), two had model IDs that returned 404s on the day I tested, and one (ClinePass) turned out to be a paid aggregator, not a free tier. That left 3 genuinely free providers plus 1 paid control:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Card required?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA NIM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nvidia/nemotron-3-super-120b-a12b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen/qwen3.6-27b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Yes (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenRouter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;minimax/minimax-m3:free&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline API&lt;/td&gt;
&lt;td&gt;&lt;code&gt;anthropic/claude-fable-5.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Cline API is a single-billed aggregator that routes to Anthropic, OpenAI, and Google behind one key. It's not free, but it's cheaper than calling Anthropic direct. I used it as the "what does paid Claude look like" baseline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 tasks
&lt;/h2&gt;

&lt;p&gt;The task suite covers the four parallelism buckets from real coding-agent work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;csv-header-infer&lt;/strong&gt; — read a headerless CSV, infer column names from the data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;function-docstring&lt;/strong&gt; — add a Google-style docstring to a Python function&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;function-unit-test&lt;/strong&gt; — add unit tests covering happy path + edge cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;refactor-api-call&lt;/strong&gt; — swap one API method for another, keep tests green&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cli-flag&lt;/strong&gt; — add a &lt;code&gt;--verbose&lt;/code&gt; flag to a CLI command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each task runs in a fresh git worktree branched from &lt;code&gt;main&lt;/code&gt;. I read the current file contents into the prompt, told the model "output each modified file in a &lt;code&gt;file:path&lt;/code&gt; code block", parsed the response, wrote the new files, and ran the task's verifier (existing test suite plus a content check). Pass means the verifier exits 0 on first attempt — no human edit, no retry.&lt;/p&gt;

&lt;p&gt;20 (provider, task) pairs. 1 trial each. ~5 minutes wall time per provider on the network.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: all 4 passed, all 5 tasks
&lt;/h2&gt;

&lt;p&gt;That's the result. No provider failed any task. The difference shows up in speed, not correctness.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Pass&lt;/th&gt;
&lt;th&gt;Mean wall&lt;/th&gt;
&lt;th&gt;Mean tok/s&lt;/th&gt;
&lt;th&gt;Mean TTFT&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenRouter MiniMax M3&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.9 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;178&lt;/td&gt;
&lt;td&gt;1.4 s&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline API Claude&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;7.4 s&lt;/td&gt;
&lt;td&gt;279&lt;/td&gt;
&lt;td&gt;4.1 s&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Groq Qwen 3.6 27B&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;8.8 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;511&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.8 s&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA NIM Nemotron 120B&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;27.0 s&lt;/td&gt;
&lt;td&gt;409&lt;/td&gt;
&lt;td&gt;23.0 s&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the table right-to-left on speed and you get the story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter is the surprise winner.&lt;/strong&gt; 2.9-second mean wall time is fast enough for interactive coding-agent work. The underlying model (MiniMax M3) is a smaller open-weight model, but routed through OpenRouter's free tier it's the most responsive option here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cline API Claude is the gold standard for paid.&lt;/strong&gt; 7.4-second mean is 2.5x slower than OpenRouter, but the quality is Anthropic-grade. For a small team that can pay a bit, this is the cleanest answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groq has the highest sustained throughput.&lt;/strong&gt; 511 tok/s during generation. The catch: a 5.8-second mean TTFT because of one long-thinking block. Groq is fast when it's flowing, slow when it isn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA NIM is the slowest free tier.&lt;/strong&gt; 27-second mean wall time, 23-second time-to-first-token. The Nemotron 120B model uses heavy thinking tokens. For batch-async work, fine. For interactive use, brutal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Per-task wall time (seconds)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;NVIDIA NIM&lt;/th&gt;
&lt;th&gt;Groq&lt;/th&gt;
&lt;th&gt;OpenRouter&lt;/th&gt;
&lt;th&gt;Cline API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;csv-header-infer&lt;/td&gt;
&lt;td&gt;27.1&lt;/td&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;function-docstring&lt;/td&gt;
&lt;td&gt;14.5&lt;/td&gt;
&lt;td&gt;14.6&lt;/td&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;7.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;function-unit-test&lt;/td&gt;
&lt;td&gt;16.9&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;4.8&lt;/td&gt;
&lt;td&gt;10.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;refactor-api-call&lt;/td&gt;
&lt;td&gt;14.6&lt;/td&gt;
&lt;td&gt;2.7&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cli-flag&lt;/td&gt;
&lt;td&gt;61.7&lt;/td&gt;
&lt;td&gt;21.1&lt;/td&gt;
&lt;td&gt;2.7&lt;/td&gt;
&lt;td&gt;7.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The cli-flag task is the most striking. NVIDIA took 61.7 seconds (a long thinking block on a multi-file change); OpenRouter finished in 2.7. Same prompt, same task, 23x speed difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I didn't expect
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The free tier landscape has changed hard in 12 months.&lt;/strong&gt; I went in expecting to test 7 free providers. The 4 left standing are different from what every "free LLMs" listicle I read recommended 12 months ago. Llama 3.3 70B on Cerebras used to be the default recommendation; it now requires a card. The free OpenRouter &lt;code&gt;:free&lt;/code&gt; pool rotates through different models and rate-limits unpredictably. If you copy-paste a 2024 "best free LLMs" list, half the entries no longer work the same way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All 4 free providers passed all 5 tasks.&lt;/strong&gt; I expected at least one failure. I did not get one. At this task complexity (real engineering work, not research-grade), the model capability gap has narrowed to style, not correctness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Cline API is the dark-horse recommendation.&lt;/strong&gt; I had not heard of it before this test. I went in expecting to compare free tiers to Anthropic direct — I had not realized there was a single-billed aggregator routing to Anthropic, OpenAI, and Google behind one key, with prices below direct Anthropic. For a small team that wants a paid baseline without managing per-provider API keys, this is the cleanest answer. I'll be using it for the team benchmarks going forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 1.8x speed difference matters more than the price difference.&lt;/strong&gt; At a personal scale, the $0 vs ~$0.012/task price gap is rounding error. The 2.5x to 9x speed difference is the real signal. For an interactive coding agent, 3 seconds feels responsive and 27 seconds feels broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for your coding agent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;First pick&lt;/th&gt;
&lt;th&gt;Fallback&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Personal coding, lowest latency&lt;/td&gt;
&lt;td&gt;OpenRouter&lt;/td&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;2.5s P50, surprisingly good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal coding, best raw quality&lt;/td&gt;
&lt;td&gt;Cline API&lt;/td&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;Claude is the gold standard; Groq is the closest free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No credit card on file&lt;/td&gt;
&lt;td&gt;NVIDIA NIM&lt;/td&gt;
&lt;td&gt;OpenRouter&lt;/td&gt;
&lt;td&gt;Both work without card; NVIDIA is slow but high quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5+ engineers, team coverage&lt;/td&gt;
&lt;td&gt;Cline API&lt;/td&gt;
&lt;td&gt;+ Groq fallback&lt;/td&gt;
&lt;td&gt;Free tiers throttle under team load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Building on top of Claude Code&lt;/td&gt;
&lt;td&gt;Cline API&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Same Anthropic models, single key, lower price&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For everyone else: the free tiers work today. Don't assume "free" means "broken" — the providers in this test all produced working code on the first try. The honest ceiling right now is "responsive enough for personal work, not for team load."&lt;/p&gt;

&lt;h2&gt;
  
  
  Build it yourself
&lt;/h2&gt;

&lt;p&gt;The benchmark is in the public repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone github.com:Pitambarmahato/hardnumbers-experiments
&lt;span class="nb"&gt;cd &lt;/span&gt;hardnumbers-experiments/free-tier-llm-coders
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
.venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NVIDIA_NIM_API_KEY=nvapi-..."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .env
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GROQ_API_KEY=gsk_..."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .env
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"OPENROUTER_API_KEY=sk-or-..."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .env
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"CLINEPASS_API_KEY=sk_..."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .env
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 .env
.venv/bin/python src/benchmark.py &lt;span class="nt"&gt;--providers&lt;/span&gt; all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full 20-run benchmark takes about 5 minutes. Results land in &lt;code&gt;results/free_tier_&amp;lt;timestamp&amp;gt;.json&lt;/code&gt; with the wall time, tokens, rate-limit hits, and pass/fail for each pair.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I didn't test
&lt;/h2&gt;

&lt;p&gt;A few things I didn't measure and would change the recommendation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool use and function calling.&lt;/strong&gt; The 5 tasks here are all text-only file rewrites. Real coding agents issue dozens of tool calls per session. A v2 benchmark should drive the OpenAI tool-call protocol end-to-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long context.&lt;/strong&gt; Tasks here fit in 4K tokens of context. Real sessions routinely hit 50K-200K. Free providers vary in long-context support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sustained multi-day load.&lt;/strong&gt; 20 runs is a snapshot. To know whether free tiers sustain a team's workload, you'd need 200+ requests per day for a week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual work.&lt;/strong&gt; All tasks are English. Several free providers (Qwen, MiniMax) are tuned for Chinese. Multilingual coding work might rank them differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code end-to-end.&lt;/strong&gt; I ran this through the OpenAI SDK pointed directly at the provider APIs, not through Claude Code's interactive REPL. The numbers here are about model quality, not the agent loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;For personal work, OpenRouter is the surprise winner and I'll keep using it. For team work, the Cline API is the cleanest paid answer and I'll be testing it across more workflows.&lt;/p&gt;

&lt;p&gt;The next benchmark in this series is going to be &lt;strong&gt;multi-agent throughput&lt;/strong&gt; — 1 vs 2 vs 4 vs 8 parallel agents on the same task suite. The story there is whether parallelization gives you 4x speedup or whether tightly coupled work punishes you for adding agents. That article drops next week.&lt;/p&gt;

&lt;p&gt;If you have API keys for free LLM providers I missed, open a PR on the &lt;a href="https://github.com/Pitambarmahato/hardnumbers-experiments" rel="noopener noreferrer"&gt;experiments repo&lt;/a&gt; with the new provider — the benchmark is designed to be extended.&lt;/p&gt;

&lt;p&gt;The full data, methodology, and what-didn't-test section is at &lt;a href="https://hardnumbers.dev/articles/4-free-llm-apis-vs-claude-5-coding-tasks-real-data" rel="noopener noreferrer"&gt;hardnumbers.dev/articles/4-free-llm-apis-vs-claude-5-coding-tasks-real-data&lt;/a&gt; — that's the canonical version with the full breakdown, including rate-limit hit analysis and the Cline API vs direct Anthropic cost comparison.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>benchmark</category>
      <category>claude</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
