<?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: frank chu</title>
    <description>The latest articles on DEV Community by frank chu (@frankchu).</description>
    <link>https://dev.to/frankchu</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%2F4039145%2F88cac5e7-d445-4b8b-b95a-9c9131ec6eb8.png</url>
      <title>DEV Community: frank chu</title>
      <link>https://dev.to/frankchu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frankchu"/>
    <language>en</language>
    <item>
      <title>Qwen3.8-Max says it beats GPT-5.6 and Fable 5 at computer use. Here's my checklist before I believe any open-weights release</title>
      <dc:creator>frank chu</dc:creator>
      <pubDate>Wed, 12 Aug 2026 06:14:16 +0000</pubDate>
      <link>https://dev.to/frankchu/qwen38-max-says-it-beats-gpt-56-and-fable-5-at-computer-use-heres-my-checklist-before-i-believe-48h0</link>
      <guid>https://dev.to/frankchu/qwen38-max-says-it-beats-gpt-56-and-fable-5-at-computer-use-heres-my-checklist-before-i-believe-48h0</guid>
      <description>&lt;p&gt;Alibaba released Qwen3.8-Max on August 3: a 2.4-trillion-parameter MoE with a 1M-token context window, priced at $2/$6 per million tokens. The claim that got everyone's attention: &lt;strong&gt;86.1 on OSWorld-Verified&lt;/strong&gt;, ahead of GPT-5.6 Sol Max (83.2) and Claude Fable 5 (85.0) at agentic computer use. Open weights are promised "next week," alongside a 27B sibling.&lt;/p&gt;

&lt;p&gt;I want this to be true. Frontier-class open weights would be the best thing to happen to indie builders since Llama. But I've been burned by launch-day benchmark euphoria before, so here's the checklist I actually run before moving any workload — using Qwen3.8-Max as the worked example.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Read the license before the model card
&lt;/h2&gt;

&lt;p&gt;"Open weights" is doing a lot of work in that headline, because as I write this, &lt;strong&gt;the license hasn't been disclosed&lt;/strong&gt;. Apache 2.0 and "custom license with a commercial-use clause that names your revenue threshold" are both routinely called open. Until there's a license file, there is no release — there's a press release.&lt;/p&gt;

&lt;p&gt;If the weights ship under something restrictive, the 2.4T headline model matters less than whether the 27B sibling gets the permissive license. Which brings me to:&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Ask which model you'd actually run
&lt;/h2&gt;

&lt;p&gt;A 2.4T MoE is not a thing you self-host. Even with MoE sparsity, serving it means a GPU cluster and serious inference engineering — realistically you'll consume it through Alibaba's API, which makes it "open weights" in a mostly ceremonial sense for a solo builder.&lt;/p&gt;

&lt;p&gt;The release that changes &lt;em&gt;my&lt;/em&gt; life is &lt;strong&gt;Qwen3.8-27B&lt;/strong&gt;. A 27B that inherits even most of the flagship's agentic training fits on hardware normal people rent. When the weights drop, that's the file I'm downloading first.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Separate self-reported from independent numbers
&lt;/h2&gt;

&lt;p&gt;Every number above is from Qwen's own release material. That's not an accusation — everyone launches this way — but self-reported benchmarks have a specific failure mode: the vendor picks the benchmarks, the effort settings, and the comparison models' configs.&lt;/p&gt;

&lt;p&gt;Things I wait for: independent runs on Terminal-Bench and OSWorld leaderboards, the first "I reproduced X, got X-minus-something" posts, and — most honest signal of all — what the model does on tasks nobody optimized for. Qwen's own reported Terminal-Bench 2.1 score (86.6) already sits &lt;em&gt;below&lt;/em&gt; GPT-5.6 Sol's 88.8, which I actually find reassuring: uniformly-winning launch decks are the suspicious ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Check the cached-input price, not the sticker
&lt;/h2&gt;

&lt;p&gt;$2/$6 is competitive but not disruptive — Sonnet 5 costs the same on input this month. The disruptive number is &lt;strong&gt;$0.25 per million cached input tokens&lt;/strong&gt;. Agent workloads re-read context obsessively; if your cache-hit rate is decent, this prices the flagship near budget-tier territory. When comparing models for agent use, cached-input price is the number I put in the spreadsheet first.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Give it a week of other people's traffic
&lt;/h2&gt;

&lt;p&gt;Launch-week models have a way of getting quietly patched, re-quantized, or rate-limited once real traffic arrives. Unless the model solves a problem you have &lt;em&gt;today&lt;/em&gt;, the cost of waiting seven days is near zero, and the information you get is enormous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I land
&lt;/h2&gt;

&lt;p&gt;Genuinely excited, provisionally skeptical. If the license is clean and the 27B holds up, this is the most important open release of the year for people like me. If the license is cute, it's an API with extra marketing.&lt;/p&gt;

&lt;p&gt;The checklist isn't cynicism — it's the difference between betting your stack on a model and betting an afternoon on it. Bet afternoons.&lt;/p&gt;

&lt;p&gt;What's on your open-model checklist that I'm missing?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>ai</category>
    </item>
    <item>
      <title>NVIDIA's NOOA turns an AI agent into one Python class</title>
      <dc:creator>frank chu</dc:creator>
      <pubDate>Mon, 10 Aug 2026 21:46:05 +0000</pubDate>
      <link>https://dev.to/frankchu/nvidias-nooa-turns-an-ai-agent-into-one-python-class-dm1</link>
      <guid>https://dev.to/frankchu/nvidias-nooa-turns-an-ai-agent-into-one-python-class-dm1</guid>
      <description>&lt;p&gt;NVIDIA Labs open-sourced &lt;a href="https://github.com/NVIDIA-NeMo/labs-OO-Agents" rel="noopener noreferrer"&gt;NOOA&lt;/a&gt; (NVIDIA Object-Oriented Agents) this week, and the pitch is unusually simple: an agent is a Python class. Not a graph, not a chain, not a YAML pipeline. A class.&lt;/p&gt;

&lt;p&gt;I cloned it and got it running the same day. Here's what it actually looks like, what broke, and why I think the core idea matters more than the framework itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole idea in one code block
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nooa&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InventoryAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are an agent that checks inventory using deterministic helper methods.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# Plain Python — automatically available as a tool for the LLM
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_stock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get current stock for an item.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# `...` body — the LLM implements this at runtime, calling the methods above
&lt;/span&gt;    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;can_fulfill_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Check if order can be fulfilled within budget.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's from the repo's quickstart, lightly trimmed. The mapping is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fields&lt;/strong&gt; are agent state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methods with real bodies&lt;/strong&gt; are deterministic tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methods with &lt;code&gt;...&lt;/code&gt; bodies&lt;/strong&gt; are implemented by an LLM loop at runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docstrings&lt;/strong&gt; are the prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type annotations&lt;/strong&gt; are contracts the runtime enforces, with auto-retry on mismatch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No separate tool-schema JSON. No registration step. The model acts by writing Python in a REPL with access to &lt;code&gt;self&lt;/code&gt;, so your method signatures &lt;em&gt;are&lt;/em&gt; the tool definitions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two install gotchas before you try it
&lt;/h2&gt;

&lt;p&gt;The README says &lt;code&gt;pip install nooa&lt;/code&gt;. Two things I hit on a clean machine:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It's not on PyPI yet.&lt;/strong&gt; As of today, &lt;code&gt;pip install nooa&lt;/code&gt; returns &lt;code&gt;No matching distribution found&lt;/code&gt;. Install from source instead:&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 https://github.com/NVIDIA-NeMo/labs-OO-Agents.git
uv venv &lt;span class="nt"&gt;--python&lt;/span&gt; 3.13 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; uv pip &lt;span class="nb"&gt;install&lt;/span&gt; ./labs-OO-Agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. No Python 3.14 support.&lt;/strong&gt; The package pins &lt;code&gt;&amp;gt;=3.12,&amp;lt;3.14&lt;/code&gt;. My default interpreter is 3.14, and the install fails with a version error. Use 3.12 or 3.13.&lt;/p&gt;

&lt;p&gt;After that, everything imported cleanly and defining an &lt;code&gt;Agent&lt;/code&gt; subclass with a generation method worked first try (version installed: &lt;code&gt;0.0.1.dev1&lt;/code&gt; — this is early software, and it behaves like it).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's genuinely different here
&lt;/h2&gt;

&lt;p&gt;Most agent frameworks make you maintain two parallel worlds: your code, and a shadow copy of your code described in schemas, prompt templates, and callback wiring. Every refactor has to happen twice.&lt;/p&gt;

&lt;p&gt;NOOA's bet is that the language already has all the metadata an LLM needs — signatures, types, docstrings — so the shadow world can be deleted. Your agent diffs like code, tests like code, and refactors like code. &lt;code&gt;mypy&lt;/code&gt; and your IDE understand it because there's nothing else to understand.&lt;/p&gt;

&lt;p&gt;There's also a strategy layer worth knowing about: &lt;code&gt;PredictStrategy&lt;/code&gt; (single completion) vs &lt;code&gt;CodeActStrategy&lt;/code&gt; (iterative code execution, capped by &lt;code&gt;max_iterations&lt;/code&gt;), swappable per method via a decorator. That's a clean answer to "some steps need one LLM call, some need a loop" without restructuring the agent.&lt;/p&gt;

&lt;p&gt;NVIDIA's paper claims a 253-line NOOA agent hits 82.2% on SWE-bench Verified and 86.8% on CyberGym L1. I haven't reproduced those numbers, and you shouldn't take vendor benchmarks at face value — but the interesting claim isn't the score, it's the line count.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that should make you nervous
&lt;/h2&gt;

&lt;p&gt;A NOOA agent acts by executing LLM-generated Python. With access to &lt;code&gt;self&lt;/code&gt;, imports, and whatever your process can reach. NVIDIA's own docs tell you to run agents in a sandbox, and they mean it — this is &lt;code&gt;exec()&lt;/code&gt; with extra steps, by design. If you wouldn't run &lt;code&gt;curl | sh&lt;/code&gt; from a model, don't run NOOA agents outside a container either.&lt;/p&gt;

&lt;p&gt;My own bias here: I build AI products, and the biggest lesson from my last one was that quality came from composing many small, checkable steps — not from trusting one big end-to-end model call. Most agent frameworks fight that instinct: they want the composition described in &lt;em&gt;their&lt;/em&gt; vocabulary of chains and graphs instead of the language I already work in. NOOA is the first design I've seen where the composition just &lt;em&gt;is&lt;/em&gt; Python. Which is also why the sandbox warning matters double — when wiring agents into real systems gets this frictionless, you'll ship one faster than you audit it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you use it?
&lt;/h2&gt;

&lt;p&gt;Today: probably not in production. It's a &lt;code&gt;0.0.1.dev1&lt;/code&gt; that isn't on PyPI yet.&lt;/p&gt;

&lt;p&gt;But I'd bet on the direction. We spent two years building agent frameworks that look like workflow engines, and the results are brittle in ways every practitioner knows. "The programming language is the agent definition language" is the first framing I've seen that gets &lt;em&gt;simpler&lt;/em&gt; as your agent gets bigger. Worst case, NOOA becomes the CoffeeScript of agents: the thing itself fades, but every framework after it steals the idea.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/NVIDIA-NeMo/labs-OO-Agents/blob/main/examples/README.md" rel="noopener noreferrer"&gt;examples directory&lt;/a&gt; is a genuinely good progressive tutorial — 11 numbered files from first generation method to MCP tools. Start with &lt;code&gt;03_codeact_tools.py&lt;/code&gt;; it's the one that made the design click for me.&lt;/p&gt;

&lt;p&gt;Have you tried collapsing your agent stack into plain code? I'd like to hear where it broke.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>agents</category>
    </item>
    <item>
      <title>The AI API price war, in actual numbers: what I'd run my agents on this month</title>
      <dc:creator>frank chu</dc:creator>
      <pubDate>Sat, 08 Aug 2026 16:30:59 +0000</pubDate>
      <link>https://dev.to/frankchu/the-ai-api-price-war-in-actual-numbers-what-id-run-my-agents-on-this-month-2nno</link>
      <guid>https://dev.to/frankchu/the-ai-api-price-war-in-actual-numbers-what-id-run-my-agents-on-this-month-2nno</guid>
      <description>&lt;p&gt;On July 30, OpenAI cut the price of GPT-5.6 Luna by 80%. Not a typo: $1.00/$6.00 per million tokens became &lt;strong&gt;$0.20/$1.20&lt;/strong&gt;. Terra dropped 20% to $2/$12. The flagship Sol didn't move.&lt;/p&gt;

&lt;p&gt;Meanwhile Anthropic's Sonnet 5 is sitting at an introductory $2/$10 that reverts to $3/$15 on &lt;strong&gt;September 1&lt;/strong&gt; — three weeks from now. And Alibaba priced Qwen3.8-Max at $2/$6 with $0.25 cached input.&lt;/p&gt;

&lt;p&gt;Price is now a strategy weapon, and if you run agents, your bill is suddenly negotiable. Let's do the arithmetic nobody's announcement includes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The board as of this week
&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;Input /1M&lt;/th&gt;
&lt;th&gt;Output /1M&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Luna&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;td&gt;$1.20&lt;/td&gt;
&lt;td&gt;was $1/$6 until Jul 30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Terra&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;$12.00&lt;/td&gt;
&lt;td&gt;was $2.50/$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Sol&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;$30.00&lt;/td&gt;
&lt;td&gt;unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;$10.00&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$3/$15 after Sep 1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 5&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;$25.00&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.8-Max&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;$6.00&lt;/td&gt;
&lt;td&gt;$0.25 cached input&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What that means for a real workload
&lt;/h2&gt;

&lt;p&gt;Take a workload I think is representative of a solo builder running a coding/ops agent daily: &lt;strong&gt;3M input + 300K output tokens per day&lt;/strong&gt; (agents are input-heavy — context re-reads dominate). Over 30 days that's 90M in / 9M out:&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;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Luna&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$28.80&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.8-Max&lt;/td&gt;
&lt;td&gt;$234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5 (intro)&lt;/td&gt;
&lt;td&gt;$270&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terra&lt;/td&gt;
&lt;td&gt;$288&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5 (from Sep 1)&lt;/td&gt;
&lt;td&gt;$405&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5&lt;/td&gt;
&lt;td&gt;$675&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sol&lt;/td&gt;
&lt;td&gt;$720&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things jump out of that table.&lt;/p&gt;

&lt;p&gt;First, the spread between cheapest and priciest is now &lt;strong&gt;25x&lt;/strong&gt; for the same token volume. A year ago the tiers were maybe 5x apart. The vendors are telling you, loudly, that most agent traffic doesn't need a flagship.&lt;/p&gt;

&lt;p&gt;Second, caching changes the ranking. Qwen's $0.25 cached input means that same workload at a realistic 70% cache-hit rate lands around &lt;strong&gt;$124/month&lt;/strong&gt; — agents re-read the same context constantly, so cached-input pricing is worth more to agent builders than headline price. Check your provider's caching discount before comparing base rates; it's where the real money is.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I'd actually route
&lt;/h2&gt;

&lt;p&gt;The mistake is picking one model. The move is routing by task risk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High-volume, low-stakes&lt;/strong&gt; (classification, extraction, summarizing logs, first-pass triage): Luna at $0.20/$1.20 is close to free. If you're doing this on a flagship, you're donating money.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent's main loop&lt;/strong&gt; (code edits, multi-step tool use): Sonnet 5 or Terra tier. This is where quality drops actually cost you time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalation only&lt;/strong&gt; (gnarly debugging, architecture decisions, final review): Sol or Opus 5, invoked by the cheaper model when it's stuck, not by default.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The catch nobody prints
&lt;/h2&gt;

&lt;p&gt;An 80% price cut on last quarter's mid-tier is also a signal about where that model sits in the lineup now. Vendors cut prices on tiers they've already beaten internally. You're not getting a discount on the frontier; you're getting the previous frontier at clearance. That's still a great deal — just don't confuse it with generosity.&lt;/p&gt;

&lt;p&gt;And mind the reversion dates. Sonnet 5's intro pricing expiring Sep 1 is a 50% jump on both sides of the meter. If your margins depend on intro pricing, you don't have a margin — you have a countdown.&lt;/p&gt;

&lt;p&gt;What's your actual monthly spend and split? Genuinely curious what routing setups people have landed on — drop your numbers in the comments&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>api</category>
      <category>llm</category>
    </item>
    <item>
      <title>Making an AI-maintained wiki run on a free local model: what actually worked</title>
      <dc:creator>frank chu</dc:creator>
      <pubDate>Sat, 08 Aug 2026 02:52:01 +0000</pubDate>
      <link>https://dev.to/frankchu/making-an-ai-maintained-wiki-run-on-a-free-local-model-what-actually-worked-3n7n</link>
      <guid>https://dev.to/frankchu/making-an-ai-maintained-wiki-run-on-a-free-local-model-what-actually-worked-3n7n</guid>
      <description>&lt;p&gt;I've been building &lt;a href="https://github.com/frankchu91/mindbase" rel="noopener noreferrer"&gt;MindBase&lt;/a&gt; — Karpathy's "LLM-maintained wiki" pattern as an app. You write notes and drop in sources; the AI maintains a persistent wiki (writes and updates actual markdown pages, not RAG).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/frankchu/i-built-an-implementation-of-karpathys-llm-wiki-idea-mcp-server-open-source-3l3b"&gt;When I launched in July&lt;/a&gt;, you needed an AI editor and an API key to use it. The last three weeks were about removing both. Here's what I learned making the whole thing run on a free local model, with a real UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Small models can't chain tool calls — so stop asking them to
&lt;/h2&gt;

&lt;p&gt;My first server-side pipeline was agentic: the model would call search, read pages, then write. With qwen3:14b on Ollama, it fell apart constantly — wrong tool, malformed arguments, loops that never terminated.&lt;/p&gt;

&lt;p&gt;The fix was to remove the agency. Every wiki operation — ingest a note, rebuild the context, health-check, research — is now &lt;strong&gt;one completion against one strict JSON schema&lt;/strong&gt;, with everything the model needs gathered into the prompt beforehand. Parse failure retries once with the error appended. That's the entire error handling.&lt;/p&gt;

&lt;p&gt;Local models turn out to be &lt;em&gt;very&lt;/em&gt; reliable at filling one schema. They're shaky at deciding what to do next. Design accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The 88-second blank screen: thinking-mode models
&lt;/h2&gt;

&lt;p&gt;qwen3 and deepseek-r1 stream their reasoning into a hidden &lt;code&gt;thinking&lt;/code&gt; field. My chat UI collected &lt;code&gt;content&lt;/code&gt; — which stayed empty for 88 seconds while the model happily reasoned into a field nobody was reading.&lt;/p&gt;

&lt;p&gt;One line (&lt;code&gt;think: false&lt;/code&gt; on the Ollama API) took replies from 88.7s to 1.1s. If your local-model UI ever shows "nothing happening for a minute" — check this first.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Trust comes from one checkbox
&lt;/h2&gt;

&lt;p&gt;The biggest complaint about v1 wasn't quality — it was that ingestion felt like a black box. The AI read your note and &lt;em&gt;something&lt;/em&gt; changed in your wiki.&lt;/p&gt;

&lt;p&gt;Karpathy's original spec actually has a step my v1 skipped: the LLM &lt;strong&gt;discusses takeaways with you&lt;/strong&gt; before writing. So now every ingest returns takeaways + a plan of proposed updates, each with a checkbox. Nothing is written until you hit Apply.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcdyngsy5rjr915rbjh63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcdyngsy5rjr915rbjh63.png" alt="The approval step — takeaways and a checkbox plan, generated by qwen3:14b locally" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same model, same output — but showing the plan before writing fixed the trust problem almost entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Make the two layers visible
&lt;/h2&gt;

&lt;p&gt;The pattern has two layers: your raw notes (append-only, yours) and the wiki (AI-maintained). In v1 this existed only in the folder structure, and new users never got it.&lt;/p&gt;

&lt;p&gt;Now every note carries a status chip: &lt;strong&gt;✨ Add to wiki&lt;/strong&gt; while the note is newer than the last build, &lt;strong&gt;✓ In wiki · 2 pages&lt;/strong&gt; after digestion. Edit the note and it lights up again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ie5fi3q9qqh2i7fooqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ie5fi3q9qqh2i7fooqb.png" alt="Writing a note with the wiki-status chip, qwen3:14b running locally" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The implementation detail I like: the chip's state is just "file mtime newer than context.md" — the &lt;strong&gt;exact rule the build pipeline uses&lt;/strong&gt; to find undigested sources. No new state, so the UI and the pipeline can't disagree.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Hardware detection beats a model dropdown
&lt;/h2&gt;

&lt;p&gt;Asking users to pick an Ollama model is asking them to already be an expert. The setup wizard now reads your RAM/CPU and recommends what actually fits: 8GB → llama3.2:3b, 16GB → qwen3:8b, 32GB+ → qwen3:14b. Then it installs, pulls with a progress bar, and verifies with a real one-token generation (checking that the API answers is not the same as checking the model works — I learned that one the embarrassing way).&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's at
&lt;/h2&gt;

&lt;p&gt;Everything is markdown on disk, MIT-licensed, works with Claude Code / Cursor / any MCP client — and now standalone in the browser with zero subscriptions.&lt;/p&gt;

&lt;p&gt;Repo: &lt;strong&gt;&lt;a href="https://github.com/frankchu91/mindbase" rel="noopener noreferrer"&gt;https://github.com/frankchu91/mindbase&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you run local models: what's the biggest model you'd realistically dedicate to background synthesis work? Trying to decide how far to push the recommendation table.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I built an implementation of Karpathy's LLM wiki idea (MCP server, open source)</title>
      <dc:creator>frank chu</dc:creator>
      <pubDate>Tue, 21 Jul 2026 05:36:00 +0000</pubDate>
      <link>https://dev.to/frankchu/i-built-an-implementation-of-karpathys-llm-wiki-idea-mcp-server-open-source-3l3b</link>
      <guid>https://dev.to/frankchu/i-built-an-implementation-of-karpathys-llm-wiki-idea-mcp-server-open-source-3l3b</guid>
      <description>&lt;p&gt;I built an implementation of Karpathy's "LLM wiki" idea: instead of&lt;br&gt;
doing RAG over your notes at query time, the model maintains a wiki as you add sources. It's an MCP server plus a small web UI. MIT licensed, everything is markdown on your own disk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/frankchu91/mindbase" rel="noopener noreferrer"&gt;https://github.com/frankchu91/mindbase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyusdtrl714csnkch1xwe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyusdtrl714csnkch1xwe.png" alt="the web UI" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;When you add a source (a thought, a PDF, a URL), the model updates the relevant wiki pages and rewrites &lt;code&gt;context.md&lt;/code&gt;, a page that summarizes your current position on the topics you're tracking. When you ask a question later, the answer is mostly already written — the model reads &lt;code&gt;context.md&lt;/code&gt; and the linked pages instead of re-deriving everything from raw chunks.&lt;/p&gt;

&lt;p&gt;The data layout has three parts with different owners:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sources/       you write, the model reads. Append-only.
context.md     the model writes, you read.
README.md      per-project rules. You write, the model follows.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The append-only guarantee is enforced by tooling, not prompts. Each&lt;br&gt;
operation runs as a sub-agent with a restricted tool list — the agent that rebuilds context.md has no general file-write tool, only one MCP call that does an atomic write with a snapshot of the previous version. I started with prompt-based rules and they held most of the time, which isn't good enough for a layer that's supposed to never be rewritten.&lt;/p&gt;

&lt;p&gt;Links between pages are typed (mentions, elaborates, supersedes,&lt;br&gt;
contradicts) and stored in a sqlite index derived from the markdown. The lint command uses this to report actual conflicts, e.g.: a post you saved yesterday claims prefix caching helps long conversations most, but your notes from March say the benefit concentrates in short agentic loops. It also reports orphan pages and stale claims.&lt;/p&gt;

&lt;p&gt;There are several other implementations of this pattern in the comments of Karpathy's gist. The main things mine does differently: it runs as an MCP server so it works inside Cursor, Windsurf, Cline, Claude Desktop, and Claude Code, and it has the typed link index for contradiction detection.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Any MCP client — one entry in the config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mindbase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mindbase-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code has a fuller version with slash commands and the&lt;br&gt;
sub-agents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add frankchu91/mindbase
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;mb@mindbase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Day to day I use three commands: &lt;code&gt;/mb:contribute&lt;/code&gt; to add something,&lt;br&gt;
&lt;code&gt;/mb:build&lt;/code&gt; to regenerate context.md, &lt;code&gt;/mb:ask&lt;/code&gt; to query. The data&lt;br&gt;
folder can be opened directly as an Obsidian vault.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current limitations
&lt;/h2&gt;

&lt;p&gt;The interactive ingest flow (model summarizes the source and waits for approval before writing) only works in Claude Code. Other editors get a simpler version. The web UI is for browsing and editing, not running operations. No mobile, no sync.&lt;/p&gt;

&lt;p&gt;It's early. I'm looking for around 30 initial users and will help with setup personally. If you try it and something breaks, open an issue — I'm fixing things daily right now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/frankchu91/mindbase" rel="noopener noreferrer"&gt;https://github.com/frankchu91/mindbase&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
