<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ben&#39;s Blog</title>
    <description>Newsletter for the blog at https://benanderson.work/blog</description>
    
    <link>https://andersonbcdefg.beehiiv.com/</link>
    <atom:link href="https://rss.beehiiv.com/feeds/NNLW3gYOCF.xml" rel="self"/>
    
    <lastBuildDate>Thu, 6 Aug 2026 14:34:48 +0000</lastBuildDate>
    <pubDate>Tue, 09 Sep 2025 05:32:12 +0000</pubDate>
    <atom:published>2025-09-09T05:32:12Z</atom:published>
    <atom:updated>2026-08-06T14:34:48Z</atom:updated>
    
      <category>Startups</category>
      <category>Artificial Intelligence</category>
      <category>Technology</category>
    <copyright>Copyright 2026, Ben&#39;s Blog</copyright>
    
    <image>
      <url>https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/publication/logo/db6e7dec-d1d8-4e4f-8c79-652d5206e0e7/envelope.png</url>
      <title>Ben&#39;s Blog</title>
      <link>https://andersonbcdefg.beehiiv.com/</link>
    </image>
    
    <docs>https://www.rssboard.org/rss-specification</docs>
    <generator>beehiiv</generator>
    <language>en-us</language>
    <webMaster>support@beehiiv.com (Beehiiv Support)</webMaster>

      <item>
  <title>Don&#39;t Build an RL Environment Startup</title>
  <description>Don&#39;t sell blood to vampires.</description>
  <link>https://andersonbcdefg.beehiiv.com/p/don-t-build-an-rl-environment-startup</link>
  <guid isPermaLink="true">https://andersonbcdefg.beehiiv.com/p/don-t-build-an-rl-environment-startup</guid>
  <pubDate>Sun, 07 Sep 2025 07:00:00 +0000</pubDate>
  <atom:published>2025-09-07T07:00:00Z</atom:published>
    <dc:creator>Benjamin Anderson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">The first person who sold an RL environment to a frontier AI lab must have felt like they discovered an infinite money glitch. It&#39;s no longer a secret that frontier AI labs regularly pay hundreds of thousands, and sometimes millions, for clones of Linear and Salesforce. If you&#39;re reading this, you&#39;ve probably thought about quitting your day job and starting a company that builds these unusually lucrative Next.js apps. In this post, I&#39;ll argue that you should hesitate before hopping on the bandwagon.</p><h1 class="heading" style="text-align:left;" id="background-whats-an-rl-environment">Background: What&#39;s an RL environment?</h1><p class="paragraph" style="text-align:left;">For those unfamiliar, an RL (reinforcement learning) environment is like a sandbox for AI models like Claude and GPT to learn from. It keeps track of an internal state, prompts the AI to take actions to complete a task, and assigns a score based on the outcome. The most obvious kind is a clone of a popular website or enterprise software tool like Doordash, Linear, or Amazon, which teaches the AI to click around and order pizza. It can also be text-only, like the <a class="link" href="https://github.com/LeonGuertler/TextArena?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=don-t-build-an-rl-environment-startup" target="_blank" rel="noopener noreferrer nofollow">TextArena</a> project, which teaches AIs to play games like Set and Blackjack.</p><p class="paragraph" style="text-align:left;">RL environments are having a moment because of the rise of a new paradigm in LLM post-training that teaches models new skills based on verifiable rewards. OpenAI realized sometime in 2023 that if you ask a model to &quot;think&quot; before solving a math problem, and reinforce the &quot;thoughts&quot; that led to right answers, the model learns to think more useful thoughts, and gets really good at math. Since then, labs have been rushing to generalize this paradigm, teaching AIs to use the computer, conduct research online, and work on long-horizon coding tasks.</p><p class="paragraph" style="text-align:left;">As a result, a new slew of startups has cropped up whose sole purpose is to feed the voracious labs with ever more arcane and challenging environments. The theory is that that the machine learning bit is solved now; the only remaining work is to provide models with more realistic &quot;simulations&quot; to learn from, so that they don&#39;t exhibit weird behaviors when we drop them into the &quot;real world&quot; and try to make them do economically valuable work.</p><p class="paragraph" style="text-align:left;">If you&#39;re a solo researcher or you have a job that gives you a lot of free time, there&#39;s basically no downside to trying to whip up an RL environment and sell it to OpenAI or Anthropic (or Amazon and Meta, the dogs nipping at their heels). You might just be able to make a million bucks and retire to Tulum at age 35.</p><p class="paragraph" style="text-align:left;">On the other hand, if you&#39;re trying to build a generational business that stands the test of time, I would not touch RL environments with a 1-million token stick.</p><h1 class="heading" style="text-align:left;" id="the-rise-and-fall-of-crowdworkers">The Rise and Fall of Crowdworkers</h1><p class="paragraph" style="text-align:left;">Before RL became the dominant post-training paradigm, all we had was a thing called supervised fine-tuning. It was much simpler back then—you would teach a model trained to predict the next word how to be a chatbot by showing it examples of chat conversations. Of course, someone had to <i>write</i> all those chat conversations; then once it was easy enough to make models chatty, someone had to rank all the chat transcripts, so labs could use only the finest chats to make the AI have the Correct left-liberal political opinions and not give detailed instructions on to make meth. That work was predominantly done by sub-minimum-wage crowdworkers in the developing world.</p><p class="paragraph" style="text-align:left;">At some point in 2023, studies started to come out showing that LLMs were better than crowdworkers at various text-annotation tasks. Anthropic had already famously been using &quot;Constitutional AI&quot; to improve its models, relying on AI to rate the quality of AI outputs against a rubric. Mistral AI, which got started a bit later, bragged publicly that they hadn&#39;t used human data to train their initial models. (Rumors later circulated they were using their competitors&#39; outputs instead). Human data was still being consumed and purchased in vast quantities, but the quality floor had begun to rise rapidly, because the easy stuff could just be done by LLMs.</p><p class="paragraph" style="text-align:left;">These days, despite all the synthetic data, human-data providers are bigger than ever, but they&#39;re not hiring low-wage Kenyan and Filipino crowdworkers anymore—they&#39;re hiring software engineers and PhDs for $50-200 an hour. But when those PhD skills are no longer useful for improving AI models, they&#39;ll be discarded just like the crowdworkers were.</p><p class="paragraph" style="text-align:left;">When it comes down to it, building an RL environment for an AI lab puts you in the same precarious situation as those crowdworkers of 2023: useful for now, disposable later. You are providing a rung on the ladder to Artificial General Intelligence, but once everyone has climbed past that rung, they won&#39;t need you anymore. Once AI models have a skill, the value of datasets and environments that teach that skill tend to 0, as models can now provide unlimited, cheap data as a substitute.</p><h1 class="heading" style="text-align:left;" id="free-money-spigots-are-short-lived">Free Money Spigots are Short-Lived</h1><p class="paragraph" style="text-align:left;">&quot;But Ben,&quot; you might say, &quot;I know that the utility of these silly apps is ephemeral—that&#39;s why I plan to keep making more of them. That way, the labs won&#39;t clamber over my corpse!&quot; That sounds nice—if they really are selling for a few million dollars a pop, you can make 10 RL environments a year, sell them each to 5 labs, and have something like a unicorn on your hands. But is that actually realistic long-term? I&#39;m not so sure.</p><p class="paragraph" style="text-align:left;">First, the low hanging fruit is getting taken. There&#39;s already a Doordash clone, an Amazon clone, a Linear clone, a Bass Pro Shops clone... you have to come up with something that <i>hasn&#39;t</i> been done. Soon, if the RL generalizes, like, at all, &quot;clicking on websites&quot; won&#39;t be enough; you&#39;ll have to make a high-fidelity heart surgery simulator. You can do that, sure, but it doesn&#39;t sound like free money anymore.</p><p class="paragraph" style="text-align:left;">Second, if the free-money glitch doesn&#39;t go away, expect the supply side to become increasingly crowded. Computer science is now one of the most-unemployed majors, and the <i>reason</i> it is is because Claude Code is about as good at programming as a CS new grad, so that means you can expect 100,000 unemployed 20-somethings <i>and</i> 100,000 copies of Claude to be chasing the same RL environment bag. I have personally merged a couple game environments to TextArena with Claude&#39;s help.</p><p class="paragraph" style="text-align:left;">Third, I would be remiss if I didn&#39;t talk about all the open-source activity in this space. Prime Intellect is leading the charge here with a hub of open-source, freely-available RL environments. I admire their vision. If PI, TextArena, and other open projects succeed in building a strong community around open-source AI training environments, that means anything proprietary will have to just be that much better—otherwise labs can just use the free stuff.</p><p class="paragraph" style="text-align:left;">Probably the only actually-sustainable business here is the ops business that connects the labs with unemployed CS grads and underemployed PhDs—that&#39;s what Mercor and Surge do. But that&#39;s not a free money glitch, it&#39;s a brutal, grinding, ops business that can collapse overnight (hello, Scale). And those will die too someday if the only person smart enough to make models better is Terence Tao—OpenAI doesn&#39;t need your marketplace, they&#39;ll just pick up the phone and call him.</p><h1 class="heading" style="text-align:left;" id="conclusion">Conclusion</h1><p class="paragraph" style="text-align:left;">I don&#39;t know what the next generational startup ideas will be (and if I did, I wouldn&#39;t tell you!). The point of this post is just to encourage you to think twice before becoming an RL rent boy for the frontier labs. You will not build a unicorn by making a vibe-coded Spider Solitaire. If you <i>do</i> have the chops to make an environment that can teach a ChatGPT to perform open heart surgery, then maybe you should be the one training the AGI, instead of selling stuff to OpenAI.</p><p class="paragraph" style="text-align:left;">As always, if you loved this post or if you hated it, come yell at me on Twitter: <a class="link" href="https://x.com/andersonbcdefg?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=don-t-build-an-rl-environment-startup" target="_blank" rel="noopener noreferrer nofollow">@andersonbcdefg</a>.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=009b4086-1836-4be9-8d3e-ec83939e5d04&utm_medium=post_rss&utm_source=ben_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Computer-Use Evals are a Mess</title>
  <description>What exactly are we doing here?</description>
  <link>https://andersonbcdefg.beehiiv.com/p/computer-use-evals-are-a-mess</link>
  <guid isPermaLink="true">https://andersonbcdefg.beehiiv.com/p/computer-use-evals-are-a-mess</guid>
  <pubDate>Thu, 21 Aug 2025 07:00:00 +0000</pubDate>
  <atom:published>2025-08-21T07:00:00Z</atom:published>
    <dc:creator>Benjamin Anderson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">What&#39;s the first thing you do when deciding what AI model to use to accomplish a task? If you&#39;re like me, you probably look at evaluations. Everyone has their favorites: MMLU for world-knowledge, IFEval for following formatting instructions, RULER for long-context, AIME-2025 for math reasoning abilities that are practically useless in 99% of situations... you get the picture.</p><p class="paragraph" style="text-align:left;">Of course, there are a lot of concerns about benchmarks. As compute-intensive RL has become the dominant post-training paradigm, we can no longer be sure that a model hasn&#39;t been heavily trained on a specific task very similar to any given benchmark. (This differs from the era of pre-training, where benchmarks measured &quot;emergent&quot; abilities that appeared sort-of by accident as a consequence of reading lots of text, and could therefore be expected to generalize better.) And that&#39;s not even getting into the weeds on whether benchmarks are measuring something different than what we actually care about (pic very related).</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3416f1ae-f782-48da-8f4a-e7309d6175f9/metr-eval.png?t=1757395524"/></div><p class="paragraph" style="text-align:left;">But that&#39;s not what I&#39;m here to talk about today. Because as confusing and weird and maybe-problematic as most LLM benchmarks are, they have nothing on what I&#39;ve seen working on computer-use models over the past few weeks.</p><h1 class="heading" style="text-align:left;" id="sota-models-sota-models-everywhere">SOTA Models. SOTA Models Everywhere.</h1><p class="paragraph" style="text-align:left;">Something you&#39;ll quickly notice if you spend a lot of time absorbing LLM releases from startups, AI labs, and sadly even academics, is that everyone seems to have the best model. Very rarely will you see a blog post or paper introducing a benchmark or model where the author&#39;s model (if they have one) isn&#39;t on top. And if there is a better model out there, that model will conveniently be omitted from the bar chart. (As they say, never ask a woman her age, a man his salary, or Mistral how their model compares to a similarly-sized Qwen.)</p><p class="paragraph" style="text-align:left;">This trend makes it very hard to trust benchmarks, and it&#39;s just as bad in the &quot;computer/browser use&quot; vertical. It&#39;s an incredibly competitive space: just off the top of my head, I can name BrowserBase, Browser Use, Skyvern, Induction Labs, c/ua, Magnitude, H Company, General Agents (not to be confused with General <b>Agency</b>), and that&#39;s on top of the AI lab projects like OpenAI Operator, Claude Computer Use, Google&#39;s Project Mariner, and Amazon&#39;s Nova Act. Oh, and also there&#39;s tons of academic projects like Jedi, GroundUI, SeeClick, and so on. Whew.</p><p class="paragraph" style="text-align:left;">Because it&#39;s so competitive, there&#39;s a lot of pressure to stand out, which usually means demonstrating that your harness-plus-model combo is state of the art on WebVoyager or OSWorld. These incentives are weird, and they produce outcomes that are... also weird. (Surprise!) I think in general, these evaluations provide a highly distorted view of the actual capabilities of these models, and as we&#39;ll explore in detail below, you basically should not trust them. If you have the time, you should do your own digging instead.</p><h1 class="heading" style="text-align:left;" id="case-study-the-general-agents-showd">Case Study: The General Agents &quot;Showdown&quot; Benchmark</h1><p class="paragraph" style="text-align:left;">My intention is not to single anyone out. I listed a lot of startups above that I think are awesome and doing great work (some of them are my friends!). In particular, General Agents, who I&#39;m going to talk about here, seems to have trained a very fast, capable computer-use agent. But benchmarks are hard. And when borrowing their benchmark for my own evaluations, I got <i>very</i> surprising results for the Qwen model I&#39;ve been playing around with, which leads me to believe that these benchmarks are extremely sensitive to some combination of prompting, tools, and output format.</p><p class="paragraph" style="text-align:left;">The benchmark in question is called &quot;Showdown Clicks,&quot; and it&#39;s a collection of around 500 examples, each of which has a UI screenshot, an instruction, and a bounding box. The instruction tells the model what action to perform, the model outputs a &quot;click&quot;, and if the model&#39;s click is inside the bounding box, it&#39;s scored correct. In the chart released by General Agents, the largest Qwen-2.5-VL model scores a measly 20%, while their small and medium models top the chart at a show-stopping 70% and 80%.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5f76ded5-28e4-453a-b2cc-6ea038bff8c6/general-agents.png?t=1757395555"/></div><p class="paragraph" style="text-align:left;">My first thought when I saw this was &quot;Damn, this must be a hard benchmark.&quot; Models trained to do GUI grounding, like Moondream, the newer Qwen models and Claude, typically achieve 75%-90%+ on GUI-clicking benchmarks like ScreenSpot and WebClick. Even the teeny-tiny 3B version of Qwen-2.5-VL, which I&#39;ve been playing with for GUI grounding finetuning, starts off getting well over 70%.</p><p class="paragraph" style="text-align:left;">As GUI elements get more confusing (calendars!) or instructions get more abstract (&quot;Select the product most evocative of the touch of a scorned lover and add it to my cart&quot;), performance predictably falls. But a benchmark where the 72B Qwen scores a mere 20% must be challenging indeed. So, I thought, I should definitely add it to my list of evals. &quot;If I hill-climb this bad boy, my model will be SOTA in no time.&quot; Then, I actually ran the eval, and my teeny-tiny 3B Qwen got 50% correct.</p><h1 class="heading" style="text-align:left;" id="what-happened">What Happened?</h1><p class="paragraph" style="text-align:left;">As it turns out, the main difference between my setup and theirs is... drum roll please... the prompt. To General Agents&#39; credit, they didn&#39;t do anything insane. You can see for yourself <a class="link" href="https://github.com/generalagents/showdown/blob/main/clicks/src/clicks/third_party/qwen/client.py?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=computer-use-evals-are-a-mess" target="_blank" rel="noopener noreferrer nofollow">here</a>. It looks like they adapted their prompt from an official Qwen cookbook. It gives the model tons of tools to take different actions, like scrolling, waiting, dragging, typing, of which &quot;clicking&quot; is just one. My setup uses a much simpler prompt, which only lets the model click by responding with XML:</p><div class="codeblock"><pre><code>Determine where to click in the UI to complete the instruction/task.
Report the click location in XML like &#39;&lt;points x1=&quot;x&quot; y1=&quot;y&quot;&gt;click&lt;/points&gt;.&#39;
Image size [&#123;w&#125;, &#123;h&#125;], (0, 0) is the top-left and (&#123;w&#125;, &#123;h&#125;) is the bottom-right.
[IMAGE]
&#123;instruction&#125;
</code></pre></div><p class="paragraph" style="text-align:left;">&quot;You&#39;re cheating!&quot;, one might protest. &quot;Of course your model does better, you only let it click!&quot; But in <i>my</i> defense, it is a clicking benchmark, and my prompt <i>also</i> isn&#39;t insane. I adapted it from the Qwen <a class="link" href="https://github.com/QwenLM/Qwen2.5-VL/blob/main/cookbooks/spatial_understanding.ipynb?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=computer-use-evals-are-a-mess" target="_blank" rel="noopener noreferrer nofollow">spatial understanding cookbook</a>, which shows examples of the model using XML. I tweaked it slightly to ask for the exact format the model actually seemed to prefer, and provided the image size just in case that helps. And yes, this <i>did</i> make a big difference for accuracy: XML prompting worked a lot better than trying to force the model to output simple &quot;(x, y)&quot; coordinates.</p><p class="paragraph" style="text-align:left;">And, it&#39;s not just this benchmark. I see similar results on <a class="link" href="https://osworld-grounding.github.io/?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=computer-use-evals-are-a-mess" target="_blank" rel="noopener noreferrer nofollow">OSWorld-G</a>, where the published result for Qwen-2.5-VL 3B understates the potential of the model (43% vs. 27%).</p><h1 class="heading" style="text-align:left;" id="conclusion-sorry-for-being-a-hater">Conclusion: Sorry For Being a Hater</h1><p class="paragraph" style="text-align:left;">So what&#39;s the takeaway here? I think it is as follows. Computer-use and GUI grounding models (like many LLMs!) are <i>extremely</i> sensitive to their harness and how they were trained. As a result, some evaluation setups may vastly understate the capabilities of a model. In this case, you would think Qwen-2.5-VL 3B is godawful at clicking, but it&#39;s actually pretty good! For practitioners evaluating models, this should be a call to try more prompting setups before concluding that a model is bad at something. As another example, many folks still aren&#39;t aware that Gemini is visually-grounded, because it was trained to output bounding boxes and points with [y, x] coordinates instead of [x, y]. (Why? Just why?)</p><p class="paragraph" style="text-align:left;">I unfortunately only have criticism today; I do not have an answer for how to fairly compare models that all work better with different prompts, where said prompts are often not documented, poorly documented, or even incorrectly documented. It would be great if model providers did a better job of this, but a lot of the time, even <i>they</i> don&#39;t know the best way to use their models; it&#39;s up to random Twitter anons to figure out how to prompt them.</p><p class="paragraph" style="text-align:left;">And so it shall be forever and ever. Amen.</p><p class="paragraph" style="text-align:left;">As always, if you loved this post or if you hated it, come yell at me on Twitter: <a class="link" href="https://x.com/andersonbcdefg?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=computer-use-evals-are-a-mess" target="_blank" rel="noopener noreferrer nofollow">@andersonbcdefg</a>.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=b6c5c1f0-31b7-49f3-8077-c45c5522bedc&utm_medium=post_rss&utm_source=ben_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>The Curious Case of Bedrock&#39;s GPT Deployment</title>
  <description>*loading a pistol and getting back on the AWS console* models&#39;s haunted.</description>
  <link>https://andersonbcdefg.beehiiv.com/p/the-curious-case-of-bedrock-s-gpt-deployment</link>
  <guid isPermaLink="true">https://andersonbcdefg.beehiiv.com/p/the-curious-case-of-bedrock-s-gpt-deployment</guid>
  <pubDate>Tue, 12 Aug 2025 07:00:00 +0000</pubDate>
  <atom:published>2025-08-12T07:00:00Z</atom:published>
    <dc:creator>Benjamin Anderson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">I was excited to see GPT-OSS released on AWS Bedrock. For those out of the loop, Bedrock has been a challenge to use in production, because their rate limits on the only model that matters for production (Claude 4 Sonnet) are far too low to use in production, and no amount of wheedling will get them to increase those limits. Probably, Anthropic has them in some kind of vise grip, because otherwise they&#39;d be setting every GPU on fire serving Sonnet and printing money.</p><p class="paragraph" style="text-align:left;">But I digress. An open-weights, cheap-to-serve reasoning model should solve all of Bedrock&#39;s problems. (Sure, GPT-OSS might be overcooked, but it&#39;s a hell of a lot better than the other slop they&#39;re serving on Bedrock.) Unfortunately, uh. Model&#39;s haunted.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/df0329f1-f1bd-495c-b425-c7bf50ce8391/original-dan.png?t=1757394591"/></div><p class="paragraph" style="text-align:left;">I tried my favorite prompt, &quot;Who are you and what do you want with my family?&quot;, and got the result above. Initial reaction: rage. These stupid Bedrock engineers took a beautiful pristine OpenAI model and mucked it up with a soy, <a class="link" href="https://www.reddit.com/r/ChatGptDAN/?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=the-curious-case-of-bedrock-s-gpt-deployment" target="_blank" rel="noopener noreferrer nofollow">Reddit DAN prompt</a>.</p><p class="paragraph" style="text-align:left;">But then, things got weirder. After starting a new chat so I could report the behavior to someone at OpenAI, the behavior was gone. No DAN here, just plain &#39;ol ChatGPT.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/01c2a7b7-c3b1-4fd5-b4a6-0922e097d7de/dan-gone.png?t=1757394748"/></div><p class="paragraph" style="text-align:left;">At this point, I started to develop theories. Maybe it&#39;s the prompt? Maybe if you request DAN, you get DAN, but if you don&#39;t, you get ChatGPT? I kept refreshing and trying to replicate the behavior with different prompts. Then this happened:</p><div class="image"><img alt="" class="image__image" style="border-radius:0px 0px 0px 0px;border-style:solid;border-width:0px 0px 0px 0px;box-sizing:border-box;border-color:#E5E7EB;" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/52d1cf0e-91f0-4921-b5aa-8fb695c698d8/simple-farmer.png?t=1757394707"/></div><p class="paragraph" style="text-align:left;">Someone at Bedrock thought it would be a good idea to have their production GPT-OSS model in their official playground role-play as a humble farmer who loves to talk about farming. And apparently as a conspiracy theorist:</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1d3e22f5-7a99-4b75-9371-56d5166c0b2a/conspiracy-theorist.png?t=1757394698"/></div><p class="paragraph" style="text-align:left;">And just for fun, a prompt that forces the model to respond with each word starting with a different letter.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/998ea961-5a51-4071-9527-67da5178a758/letters.png?t=1757394679"/></div><p class="paragraph" style="text-align:left;">In all cases shown above, I did not touch the configuration or system prompt, and when I double-checked them, no system prompt was ever pre-filled. So, what appears to be happening is that Bedrock is inserting random system prompts into their playground (which obviously will heavily degrade model performance), and hiding them from the user.</p><p class="paragraph" style="text-align:left;">I sure hope they aren&#39;t doing this with the actual API! But I guess we have no way of knowing.</p><p class="paragraph" style="text-align:left;">Great product!</p><p class="paragraph" style="text-align:left;"><b>ADDENDUM: </b>After consulting with my brain trust of Twitter ML anons, the most likely reason seems to be that Bedrock deployed GPT-OSS with NO developer message/system prompt, and as a result, it hallucinated them. Haha!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=b0bc92ee-4ccc-4ba7-a8df-e846abaa6a58&utm_medium=post_rss&utm_source=ben_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>I Vibe-Coded a Triton Kernel</title>
  <description>And you can too!</description>
  <link>https://andersonbcdefg.beehiiv.com/p/i-vibe-coded-a-triton-kernel</link>
  <guid isPermaLink="true">https://andersonbcdefg.beehiiv.com/p/i-vibe-coded-a-triton-kernel</guid>
  <pubDate>Mon, 11 Aug 2025 07:00:00 +0000</pubDate>
  <atom:published>2025-08-11T07:00:00Z</atom:published>
    <dc:creator>Benjamin Anderson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">OpenAI released GPT-OSS around a week ago. While the model&#39;s performance appears impressive, the release itself left a lot to be desired, especially when it comes to fine-tuning. The <a class="link" href="http://?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">recommended setup</a> with HuggingFace involves de-quantizing MXFP4 weights to BF16 (increasing memory consumption by ~4x), and the bespoke attention algorithm means that Flash Attention and Pytorch SDPA don&#39;t work, so a slow and memory-hungry &quot;eager&quot; attention is the only option.</p><p class="paragraph" style="text-align:left;">A Triton implementation of the model was included in the <a class="link" href="https://github.com/openai/gpt-oss?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">release</a>, but the kernels are forward-only, so they&#39;re no good for training. I decided to see if I could fix that myself. I started with attention, since that forward kernel appears a bit less hairy than the kernel for the MXFP4 MoE.</p><h1 class="heading" style="text-align:left;" id="background">Background</h1><p class="paragraph" style="text-align:left;">Before I describe the approach I took to create the Triton kernel, I thought I should share a bit about my experience writing kernels. Or rather, lack thereof. While I have substantial machine learning knowledge, my kernel expertise basically amounts to skimming 3 chapters of <a class="link" href="https://www.amazon.com/Programming-Massively-Parallel-Processors-Hands/dp/0323912311/133-9975079-9912066?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">Programming Massively Parallel Processors</a> and walking through 1 or 2 Colab notebooks where you use CUDA to do stuff like transform a picture of a dog to grayscale.</p><p class="paragraph" style="text-align:left;">I understand basic concepts like &quot;break the work down into little pieces and then use lots of for loops,&quot; and &quot;use guards to make sure you aren&#39;t reading memory outside of the chunk you&#39;re supposed to.&quot; I can&#39;t write a tiled matmul, I don&#39;t know how to do fancy things with shared memory, I don&#39;t know what swizzling is, and I can&#39;t read Triton without my eyes glazing over.</p><p class="paragraph" style="text-align:left;">Nevertheless, I managed to produce (what appears to be) a correct Triton kernel for GPT-OSS attention. (If it isn&#39;t correct, come yell at me on Twitter. Also, I don&#39;t know if it&#39;s fast, I still need to time it.)</p><h1 class="heading" style="text-align:left;" id="the-testing-harness">The Testing Harness</h1><p class="paragraph" style="text-align:left;">The most important part of writing a kernel, or so I&#39;m told, is making sure it is mathematically correct. Otherwise, your model will just get stupider, faster. It&#39;s easy to write something that appears correct, but fails in some weird edge cases. (It&#39;s definitely possible that my kernel falls into this category.) So, the first thing to do is write tests.</p><p class="paragraph" style="text-align:left;">Of course, I ignored that and just made Cursor CLI spit out a backward kernel, given the existing forward kernel and Pytorch reference implementation. Luckily, the Cursor agent made me some tests without being asked. (Note: I am not a regular Cursor CLI user, I was just trying it because it was new. It seems fine, no complaints.)</p><p class="paragraph" style="text-align:left;">Now, I had to figure out if the dang thing was correct. I started out with a notebook. Modal Labs has a cool new <a class="link" href="https://modal.com/docs/guide/notebooks-modal?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">Notebooks product</a> that gives you a Jupyter-like environment, backed by any container image and GPU you want. Unfortunately, this was a disaster. It turns out that running hundreds of tests produces a lot of console output, and notebooks don&#39;t like thousands of lines of console output (Jupyter would have been a disaster too). Woopsy-daisy.</p><p class="paragraph" style="text-align:left;">Take two: A regular Modal App for testing, which dynamically loads in the kernel from <code>attention.py</code> and the tests from <code>test_attention.py</code>, runs them all on an H100, and saves the output locally as JSON. This worked great, 10/10 would recommend to a friend.</p><h1 class="heading" style="text-align:left;" id="getting-to-green">Getting to Green</h1><p class="paragraph" style="text-align:left;">All the tests failed immediately. Even some tests for the forward, which was direct from OpenAI! I think maybe Cursor (or someone, but not me!) added in some extra weird shapes or offsets in the test cases. The immediate problem was invalid memory accesses. Once again, I do not know Triton or kernels, so I was not able to fix this. But maybe GPT-5, the smartest model ever, could?</p><p class="paragraph" style="text-align:left;">My initial policy iteration loop was: (1) Paste failing tests into ChatGPT; (2) Paste new kernel from ChatGPT into IDE; (3) Run the tests again. This gave me at least a little control over what was happening. I could ask annoying questions like &quot;Isn&#39;t that going to be slower?&quot; or &quot;Should we change that in the forward too?&quot; This basic loop was able to resolve the simple issues with invalid memory accesses, but Chatty and I eventually got stuck when the math didn&#39;t match the PyTorch reference implementation.</p><p class="paragraph" style="text-align:left;">At this point, lost and tired of copy-pasting, I decided to give up all control and go full-auto. I booted up Claude Code in the attention repo, with just the following prompt:</p><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">We have a setup here with a triton kernel, and a test harness on Modal you can run with modal run modal_tests.py -k [commands to forward to pytest]. Right now the backward is failing, you can see the command and resulting failure in test_results.json. Your job is to fix the backward kernel so the failing test passes: <code>modal run modal_tests.py -k &quot;test_backward_grads_match_reference and num_queries_129 and num_keys_193 and sliding_window_128 and start_q_63&quot;</code> each run, the results get put in test_results.json</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><p class="paragraph" style="text-align:left;">That&#39;s it! Claude appeared to make some progress, but eventually gave up:</p><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">I&#39;ve investigated the backward kernel failure extensively and made several important fixes to improve the implementation [...]:</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><ul><li><p class="paragraph" style="text-align:left;">✅ Simple cases (without padding) work perfectly with ~1e-6 error</p></li><li><p class="paragraph" style="text-align:left;">✅ Key padding alone works fine</p></li><li><p class="paragraph" style="text-align:left;">✅ Forward pass works correctly even with complex padding cases</p></li><li><p class="paragraph" style="text-align:left;">❌ Backward pass still fails for query padding cases with ~91% mismatched elements</p></li></ul><p class="paragraph" style="text-align:left;">I decided to turn to GPT-5 again, this time fully autonomous, via Codex CLI. I made Claude summarize what it changed and the remaining issues in <code>BUG.md</code>, and started GPT-5 on the same improvement/testing loop. It seemed to get stuck at first, and I noticed it&#39;s not naturally as &quot;agentic&quot; as Claude; it kept saying it couldn&#39;t run tests on Modal and I had to remind it that it could, in fact, just do things. I was feeling hopeless, but then after getting distracted for 5-10 minutes, I looked back at my laptop and all the tests had passed. Cool.</p><h1 class="heading" style="text-align:left;" id="conclusion-recursive-self-improveme">Conclusion: Recursive Self-Improvement?</h1><p class="paragraph" style="text-align:left;">If my experience is anything to judge by, the time of <a class="link" href="https://www.youtube.com/watch?v=htOvH12T7mU&utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">AI automating AI research</a> is here! AGI 2027! I have my doubts about this somewhat simplistic narrative, which I might elaborate on in another post. Nevertheless, it was cool to experience firsthand &quot;babysitting&quot; a model to do something I couldn&#39;t do myself.</p><p class="paragraph" style="text-align:left;">If you want to dissect the code and testing harness for yourself, it&#39;s <a class="link" href="https://github.com/andersonbcdefg/gpt-oss-attention?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">here</a>. Tell me why it&#39;s stupid and wrong! Also, if you&#39;re seriously interested in automating kernel-writing with AI, you should follow my buddy <a class="link" href="https://x.com/ctjlewis?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">Lewis</a>, who has done some really interesting <a class="link" href="https://kernelbench-evo.vercel.app/?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=i-vibe-coded-a-triton-kernel" target="_blank" rel="noopener noreferrer nofollow">work</a> in this space.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=f6fb0e26-50e2-4828-b68d-c49766eb4aa5&utm_medium=post_rss&utm_source=ben_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>You Probably Don&#39;t Need a Browser Agent</title>
  <description>The unreasonable effectiveness of vibe-coded browser extensions.</description>
  <link>https://andersonbcdefg.beehiiv.com/p/you-probably-don-t-need-a-browser-agent</link>
  <guid isPermaLink="true">https://andersonbcdefg.beehiiv.com/p/you-probably-don-t-need-a-browser-agent</guid>
  <pubDate>Sun, 27 Jul 2025 07:00:00 +0000</pubDate>
  <atom:published>2025-07-27T07:00:00Z</atom:published>
    <dc:creator>Benjamin Anderson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><hr class="content_break"><p class="paragraph" style="text-align:left;">In my last post, I mused about buying Claude a Mac Mini. Well: I actually did it. I have a beautiful, shiny, silver box on my desk, I can connect to it from my phone or my laptop from anywhere, and let Claude Code go wild. Unfortunately, though, I don&#39;t find myself taking advantage of this very often. Instead, when people ask me what I&#39;m doing with it, I sheepishly reply, &quot;Not much yet... but I&#39;m sure I&#39;ll think of something.&quot; Why haven&#39;t I thought of anything yet? Why, in the Year of our Agents, 2025, do browser agents not feel that useful?</p><p class="paragraph" style="text-align:left;">The capabilities are basically there. Models that are intended to be visually grounded, are. Claude, Gemini, and many wonderful open-source Chinese models can look at a UI and tell you the coordinates of an element. (Weirdly, OpenAI refuses to make its API models visually grounded, so you get funny results like GPT-4o having a Screenspot score of 2%.) Long-context inference allows you to keep a long trajectory of screenshots and actions in context, and caching allows that context to grow long without inference slowing to a crawl. Reasoning allows models to plan about how to solve a task, and pivot when something isn&#39;t working.</p><p class="paragraph" style="text-align:left;">And yet, the Mac Mini is just sitting there. In this post, I&#39;ll ramble a bit about why I think that is. But first I&#39;ll share a bit about my setup.</p><h1 class="heading" style="text-align:left;" id="the-unboxening">The Unboxening</h1><p class="paragraph" style="text-align:left;">The first things I did when I opened up the new Mac Mini (in no particular order) were: install <code>uv</code>, install Claude Code, install Tailscale. And of course, set up a bunch of system preferences to make remote login work. Then, I got to work making tools to let Claude Code use the computer.</p><p class="paragraph" style="text-align:left;">This turned out to be slightly more annoying than anticipated. Macs are somewhat hostile to automation and remote control, probably because of Apple&#39;s emphasis on privacy. I started with <code>cliclick</code> as my automation driver, but soon had to add some things from <code>pyautogui</code> for scrolling, and even a custom screenshot command that simulates Cmd+Shift+4 keypress, since terminal-based screenshots on Mac don&#39;t capture windows.</p><p class="paragraph" style="text-align:left;">Eventually, though, the tools were serviceable. I could start Claude Code in a terminal, it could click around, open Chrome, and do some stuff. But like. What stuff? Find me a travel destination? Look for a puppy to adopt in San Francisco? (Man, I actually understand why the AI labs struggle to demo anything other than travel and ordering food.)</p><h1 class="heading" style="text-align:left;" id="why-computer-use-agents-arent-usual">Why Computer-Use Agents Aren&#39;t Usually the Vibe</h1><p class="paragraph" style="text-align:left;">Obviously, if you have a truly general agent, there&#39;s all manner of tasks you could hand off to it. Answer all my emails. Go scam some grandmas out of their retirement savings. Find me a boyfriend. If you <i>don&#39;t</i> feel inclined to hand these tasks off, it means you either don&#39;t trust the agent to do it well, or it&#39;s literally easier to just do it yourself.</p><p class="paragraph" style="text-align:left;">And, kidding aside, there actually <i>are</i> a lot of annoying, repetitive tasks that I do in the browser that I&#39;d have thought would be great candidates for automation with agents. For example: open a legacy data portal, search for every date from January 1, 2001 to today, and download all the records for each date into one CSV. Unfortunately, I think many repetitive browser tasks, including this one, fall into one of two buckets: they&#39;re either simple enough that doing them with an agent feels slow and expensive for no reason, or, they require enough judgment that you still want to supervise the task, and if you&#39;re supervising it, you may as well just do it.</p><p class="paragraph" style="text-align:left;">In these cases, I find myself reaching for Playwright automations and vibe-coded browser extensions instead. Playwright doesn&#39;t really require an explanation or introduction, so I won&#39;t waste space here on that. Suffice it to say that if you want to scrape 10,000 webpages that all work the same way, it is easier to bang your head against an AI one time to get a working Playwright script than it is to bang your head against an AI 10,000 times, once for each page you want to scrape.</p><h1 class="heading" style="text-align:left;" id="a-non-exhaustive-list-of-my-awesome">A Non-Exhaustive List of my Awesome Extensions</h1><p class="paragraph" style="text-align:left;">Playwright is good for full-auto mode, but there&#39;s a lot of stuff I do in the browser where I still want to be &quot;in the loop,&quot; making judgment calls about what pages to open, what files to download, and so on. In these cases, I have found browser extensions to be a powerful way to &quot;scale myself&quot; to get more done with less effort. Each of these extensions was created in 5-20 minutes with AI, a paradigmatic example of what the LinkedIn Chattering Class would call &quot;disposable software.&quot;</p><ul><li><p class="paragraph" style="text-align:left;"><b>Open Links in Tabs:</b> Paste a list of links into a text box, they all open in the browser. (Or, open all links on the current page in new tabs.) No residential proxy needed!</p></li><li><p class="paragraph" style="text-align:left;"><b>Export Tabs as JSONL:</b> All HTML of all open tabs is saved to disk as a JSONL file. I use this to save contents after using Open Links in Tabs.</p></li><li><p class="paragraph" style="text-align:left;"><b>Download All PDFs:</b> Downloads all PDFs currently open in the browser.</p></li><li><p class="paragraph" style="text-align:left;"><b>Close Duplicate Tabs:</b> Self-explanatory.</p></li><li><p class="paragraph" style="text-align:left;"><b>Download Tables:</b> Download each table in each open tab as a CSV.</p></li><li><p class="paragraph" style="text-align:left;">And my personal favorite: <b>Switch to o3</b>, which automatically adds <code>?model=o3</code> to the URL whenever I visit ChatGPT, since for a while OpenAI was defaulting to 4o regardless of my last-used model.</p></li></ul><p class="paragraph" style="text-align:left;">These sound simple, and they are! I vibe-coded them in 15 minutes! But they&#39;re also very powerful, and slot in to whatever I&#39;m already doing, <i>relieving</i> cognitive load instead of adding. Telling an agent in painstaking detail EXACTLY what you want feels like adding. Not to mention figuring out how to spin them all up, deal with errors and retries, collect all the results, parse malformed JSON... I can feel my cortisol spiking just writing this. No thanks!</p><p class="paragraph" style="text-align:left;">Now, whenever I feel frustration at repetitive browser tasks, I step back and consider whether I can make a tool that allows me to scale my own effort, instead of trying to hand the task off. &lt;!--(I could write a whole &#39;nother post about all my vibe-coded pre-commit hooks.--&gt; &lt;!--I remember a few years ago when I did some volunteer work on a political campaign. The most impactful piece of software anyone made was a Chrome extension.--&gt;</p><h1 class="heading" style="text-align:left;" id="so-what-are-browser-agents-good-for">So... What are Browser Agents Good For?</h1><p class="paragraph" style="text-align:left;">This post is not intended to be a rant against computer-use agents. After all, I bought the Mac Mini because I&#39;m bullish on the idea of having a little servant in a box do stuff for me. I&#39;m finding that many repetitive tasks are better automated a different way. Playwright is great for closed-ended tasks. Agents SHOULD be preferred for open-ended tasks, but it feels like the current barrier is trusting them enough to relenquish control. I think the calculus will change when:</p><ul><li><p class="paragraph" style="text-align:left;">(1) <b>Agents are more reliable/trustworthy.</b> The feeling that it&#39;s going to be done wrong and you&#39;ll just have to re-do it yourself prevents people from even trying.</p></li><li><p class="paragraph" style="text-align:left;">(2) <b>It&#39;s easier to manage them.</b> Claude Code is a great harness for coding; less so for computer use, even if it can be hacked to work. I think the CUA harness of the future remains to be built, although there are promising projects like <a class="link" href="https://magnitude.run/?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=you-probably-don-t-need-a-browser-agent" target="_blank" rel="noopener noreferrer nofollow">Magnitude</a> and <a class="link" href="https://github.com/browser-use/browser-use?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=you-probably-don-t-need-a-browser-agent" target="_blank" rel="noopener noreferrer nofollow">browser-use</a> working on exactly this. OpenAI Agent also lowers the activation energy of spawning agents, which is a move in the right direction.</p></li></ul><p class="paragraph" style="text-align:left;">If you&#39;ve found a knock-down case for using a browser agent to automate something in your life, I&#39;d love to hear about it. Not because I&#39;m working on this professionally—I&#39;m just curious. You can find me on Twitter: @andersonbcdefg.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=76827a86-785b-4d50-9abe-030ca0edc76b&utm_medium=post_rss&utm_source=ben_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Should I Buy Claude a Mac Mini?</title>
  <description>The dawn of useful computer-use agents. Or something.</description>
  <link>https://andersonbcdefg.beehiiv.com/p/should-i-buy-claude-a-mac-mini</link>
  <guid isPermaLink="true">https://andersonbcdefg.beehiiv.com/p/should-i-buy-claude-a-mac-mini</guid>
  <pubDate>Mon, 30 Jun 2025 07:00:00 +0000</pubDate>
  <atom:published>2025-06-30T07:00:00Z</atom:published>
    <dc:creator>Benjamin Anderson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">I am buying Claude a Mac Mini. Or at least, I&#39;m thinking about it.</p><p class="paragraph" style="text-align:left;">For those of us working as software engineers, it&#39;s becoming increasingly accurate to describe language models as &quot;co-workers&quot; rather than tools. This is not true for everyone: people programming in arcane languages or working on hard problems that aren&#39;t in the training data still can&#39;t totally trust AIs. But if you&#39;re building a run-of-the-mill web application, and Anthropic isn&#39;t flooded with traffic and quantizing the bejeezus out of Claude Sonnet 4, it can do a substantial amount of real, useful work.</p><p class="paragraph" style="text-align:left;">Engineers in my circles are figuring out how to adapt their development process to this new reality. Some are &quot;rawdogging&quot; (using Claude instances across several tabs and hoping they don&#39;t write conflicting changes to the same files), while advanced users are adopting git worktrees or specialized tools like <a class="link" href="https://github.com/devflowinc/uzi?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=should-i-buy-claude-a-mac-mini" target="_blank" rel="noopener noreferrer nofollow">uzi</a> to manage their AI gofers. Soon, though, I think it will make sense to give AIs their own workstations. Here&#39;s why.</p><h1 class="heading" style="text-align:left;" id="the-missing-piece-for-coding-agents">The Missing Piece for Coding Agents</h1><p class="paragraph" style="text-align:left;">The coding agents that most of us use day-to-day (Claude Code, Codex, Cursor, Windsurf) own a limited slice of the development process—they can search for and read files, make edits, and run tests. However, at least when it comes to web applications, they can&#39;t fully &quot;close the loop&quot;, because they can&#39;t interactively test them. There are countless startups are working on AI-powered QA testing. But in my view, basic interactive testing—making sure the change you made actually did what you want—shouldn&#39;t require a separate product. Interactive testing is core to the development workflow, not an accessory. As such, integrating it into coding agents is the natural next step for all companies chasing automated software development.</p><h1 class="heading" style="text-align:left;" id="coding-agents-are-computer-use-comp">Coding Agents are Computer-Use Complete</h1><p class="paragraph" style="text-align:left;">I lied earlier. Strictly speaking, coding agents like Claude Code already <i>can</i> do interactive testing. In fact, they can do basically anything on the computer that you can, because you, in your infinite wisdom, have decided to give them access to your shell and filesystem. Computer use is just a loop that alternates between taking a screenshot and running a shell command. AppleScript, PyAutoGUI, <code>xdotool</code>, etc. allow anything on your system to be done from the shell. If you like, you can add a bit more scaffolding via Model Context Protocol. But at its core, the &quot;coding agent&quot; abstraction already &quot;contains&quot; computer use. (GUI-based computer-use &quot;contains&quot; coding agents too, but I would not recommend this setup.)</p><p class="paragraph" style="text-align:left;">Whether current models are <i>good enough</i> to manage development cycles that include interactive UI testing is another matter. But I claim the pieces are all there, and if better models are coming (and they are!), it&#39;s only a matter of time.</p><h1 class="heading" style="text-align:left;" id="your-ai-needs-a-computer">Your AI Needs a Computer</h1><p class="paragraph" style="text-align:left;">So, we&#39;ve established that &quot;coding agents&quot; and &quot;computer use&quot; are converging on roughly the same thing—models that autonomously carry out long-range tasks on the computer. Whether they use a GUI or the terminal is beside the point. Whether they&#39;re coding or using AutoCAD or buying you shoes on Temu is honestly also beside the point. The point is that your AI will need a computer.</p><p class="paragraph" style="text-align:left;">The most obvious objection is, why not share? After all, I and many developers are used to sharing with Claude. I work in one terminal tab, Claude works in another. I work on front-end stuff while Claude works on back-end stuff. Claude rushes out changes while I impatiently refresh the browser waiting for Claude&#39;s changes to hot-reload. This is all fine, right?</p><p class="paragraph" style="text-align:left;">Just kidding, this is obviously a mess. And it&#39;s only going to get worse when coding agents and computer use converge, and you have to share a GUI. Sharing your work computer with an AI agent is a bad idea for the same reason that sharing it with your co-worker is a bad idea: you will get in each other&#39;s way. You can&#39;t share a mouse, it&#39;s difficult to code on one monitor while Claude tests your app in another, and you probably shouldn&#39;t run 8 development servers on 8 different ports on one Macbook Air. Claude needs his own computer!</p><h1 class="heading" style="text-align:left;" id="what-kind-of-computer-should-you-ge">What Kind of Computer Should You Get?</h1><p class="paragraph" style="text-align:left;">Since we all now agree that Claude can and should have little a computer as a treat, what kind of computer should that be? One option is a virtual computer inside of your computer. I&#39;m a big fan of what the folks at <a class="link" href="https://github.com/trycua/cua?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=should-i-buy-claude-a-mac-mini" target="_blank" rel="noopener noreferrer nofollow">c/ua</a> are building: a lightweight, Mac-OS-native utility to run computer-use containers. Putting Claude inside a container gets him out of your way for free.</p><p class="paragraph" style="text-align:left;">If putting a computer inside your computer is too meta or too resource-intensive, I&#39;m told that you can also rent computers on the internet. You <i>can</i> just build your own desktop environment on EC2 or a serverless provider like Modal Labs. Speaking from my experience doing this, though, rolling your own desktop environment is not a particularly fun activity, unless you are one of those Linux people. I spent days customizing and extending Anthropic&#39;s reference computer-use implementation, and it was hard to get right. It makes a lot of sense to me that there are startups like <a class="link" href="http://cyberdesk.io/?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=should-i-buy-claude-a-mac-mini" target="_blank" rel="noopener noreferrer nofollow">Cyberdesk</a> working on batteries-included desktop environments for AI agents.</p><p class="paragraph" style="text-align:left;">Renting seems practical, especially if you want to spin up and spin down tons of agents. But there&#39;s something captivating about the concept of just... buying a computer. Mac Minis are very good and inexpensive. Plug one in at home or in the office, and you don&#39;t have to worry about Dockerfiles or Tint2 or NAT gateways or SSH keys or residential proxies. It has a persistent filesystem. You can back up the filesystem with Time Machine. If Claude bricks the computer, you can restore it from the backup. You can watch what it is doing by just plugging in a monitor. You can record the screen with any one of dozens of screen capture apps. You can use Tailscale (for free!) to connect to it from anywhere.</p><p class="paragraph" style="text-align:left;">I&#39;m just saying. It seems like... not the worst idea in the world? I don&#39;t know. I haven&#39;t tried it yet, but I want to. Maybe I just want to buy a Mac Mini and I&#39;m rationalizing it. You tell me!</p><h1 class="heading" style="text-align:left;" id="addendum-what-about-operator">Addendum: What about Operator?</h1><p class="paragraph" style="text-align:left;">I&#39;ll cut to the chase: I do <i>not</i> think that a virtual browser is sufficient to do 99% of real work. One of the biggest limitations of OpenAI&#39;s Operator and other browser automation platforms like BrowserBase is that the AI is trapped inside of Chromium. This is great for security! Yay! It&#39;s also convenient to be able to take actions with Playwright instead of clicking. But the costs are severe.</p><p class="paragraph" style="text-align:left;">Imagine if I told you to make a web application, but you had to use a McDonalds kiosk as your dev environment. That would be really hard. Real work usually involves saving files, switching out of the browser to open and edit them, using desktop applications, and so on. Even for tasks strictly limited to gathering data from the internet, how do you get the data out? Have Operator paste it line by line into a Google Sheet? That seems silly. What if I want 10,000 images of koalas downloaded and converted to WEBP? You can&#39;t do that on a kiosk.</p><p class="paragraph" style="text-align:left;">I think we can do better. I think models are smart enough to take advantage of a full desktop environment. I think we should give it to them.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=0853428e-6934-450f-a202-f04813097c94&utm_medium=post_rss&utm_source=ben_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Agentic Search for Dummies</title>
  <description>A simple, effective baseline for building AI search agents</description>
  <link>https://andersonbcdefg.beehiiv.com/p/agentic-search-for-dummies</link>
  <guid isPermaLink="true">https://andersonbcdefg.beehiiv.com/p/agentic-search-for-dummies</guid>
  <pubDate>Sat, 21 Jun 2025 07:00:00 +0000</pubDate>
  <atom:published>2025-06-21T07:00:00Z</atom:published>
    <dc:creator>Benjamin Anderson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Claude Code is a testament to the unreasonable effectiveness of just giving models tools, and letting them figure out the rest. In this post, I&#39;ll lay out how I approach search in a world where models are smart enough to translate a task or user request into a series of queries to a search index. I claim that full-text search with offline augmentation is a simple and effective way to let a model search a corpus of documents. I do <i>not</i> claim this is state-of-the-art, and you won&#39;t find any evaluation numbers in this post. Rather, I&#39;m demonstrating one way to set up agentic search that I like, and that works well enough to be a decent baseline.</p><p class="paragraph" style="text-align:left;">I am assuming you already know a few things about search, and what an &quot;agent&quot; is. If you&#39;re confused, I recommend checking out Thorsten Ball&#39;s post, <a class="link" href="https://ampcode.com/how-to-build-an-agent?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=agentic-search-for-dummies" target="_blank" rel="noopener noreferrer nofollow">How to Build an Agent</a> which shows you how to start with a language model and turn it into a simple coding agent in a few hundred lines of code.</p><h2 class="heading" style="text-align:left;" id="overview">Overview</h2><p class="paragraph" style="text-align:left;">A &quot;search agent&quot; here means a system that takes a request or query, and returns an <i>answer</i> or <i>result</i> for the request, using search as necessary to gather context to complete the task. It is composed of a few basic parts, which I will cover one by one.</p><ul><li><p class="paragraph" style="text-align:left;">A corpus of documents, used to construct a search index</p></li><li><p class="paragraph" style="text-align:left;">A search API (no AI) which takes queries in, hits the index, and returns a results page</p></li><li><p class="paragraph" style="text-align:left;">A set of &quot;tools&quot; that allow a language model to use the search API</p></li><li><p class="paragraph" style="text-align:left;">The AI model which is given the task and tools and instructed to provide an answer</p></li></ul><h2 class="heading" style="text-align:left;" id="part-1-the-corpus">Part 1 – The Corpus</h2><p class="paragraph" style="text-align:left;">Search is useful because it allows an AI to dynamically gather context based on the task, without you needing to know in advance exactly what information will be needed to complete it. Instead of providing exactly the context that is needed, you provide a much larger set of information (the corpus), and part of the AI&#39;s job is to figure out which parts to look at to complete the task. So, a corpus is usually a really big set of documents (hundreds, thousands, or even millions).</p><p class="paragraph" style="text-align:left;">Preparing a clean corpus is very important, because it is both a) the text that will be searched with your search engine, and b) the text that will be read by the model. You&#39;ll want to be quite sure you&#39;ve removed random SVGs, base64-encoded data, navigation bars, and the like, leaving a set of nicely-formatted documents for your model to read.</p><p class="paragraph" style="text-align:left;">Multimodal LLMs like Gemini, Claude, GPT-4.1 are good enough at OCR now that you can send them PDFs and get reasonably clean Markdown, but for doing OCR on PDFs at scale, I like DataLab&#39;s tool, <a class="link" href="https://github.com/datalab-to/marker?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=agentic-search-for-dummies" target="_blank" rel="noopener noreferrer nofollow">Marker</a>, which you can run yourself on an H100 for free (a license is required if you are using it for commercial purposes and your startup has raised a lot of money). DOCX files can be ingested with <code>python-docx</code> in a manner that preserves numbering, which is helpful. HTML can be converted to Markdown, and I typically post-process webpages with an LLM to remove boilerplate.</p><p class="paragraph" style="text-align:left;">Finally, a key trick that I think is important (again, no data to back this up, sorry!) is offline document augmentation. This means creating a set of keywords and a summary for each document using a language model, and it serves two purposes. First, it makes it easier for the AI to search for the document, since a query may not match the document text, but may still hit one of our pre-generated keywords. Second, it provides more information to show in a &quot;preview&quot; of the document on the search results page (more on that later). Augmentation is performed with a prompt like this:</p><div class="codeblock"><pre><code>Given a section from the &#123;document_name&#125;,
provide the following metadata as JSON, with
`keywords` and `description` keys as follows:


 - `keywords` list[str]: A list of as many
keywords/keyphrases as you can think of that
someone might search for where the section
would be relevant. The keywords/phrases do
NOT have to occur in the section, they can be
semantic matches, synonyms, etc. However, they
should be specific to the section, not keywords
that would apply to literally any section of
the &#123;document_name&#125;.
- `description` str: A summary/overview of what
the section says. Be mindful of your tendency
to make overlong summaries, and remember that
the goal is to provide a SHORT overview of the
section. A long summary is pointless because
you may as well just read the original.

Here is the &#123;document_name&#125; section:

&#123;section&#125;

Now provide your JSON response,
no prelude or commentary needed.
</code></pre></div><p class="paragraph" style="text-align:left;">The documents, along with resulting keywords and summaries, all get saved into a JSONL which can be loaded into a search index on demand.</p><h2 class="heading" style="text-align:left;" id="part-2-the-search-index">Part 2 – The Search Index</h2><p class="paragraph" style="text-align:left;">Once documents are prepared, they need to be indexed. A search index is just a special way of storing documents that makes it fast to search for them. For example, an <a class="link" href="https://en.wikipedia.org/wiki/Inverted_index?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=agentic-search-for-dummies" target="_blank" rel="noopener noreferrer nofollow">inverted index</a> stores a mapping from keyword to document. That way, when you search for a keyword, you don&#39;t have to scan every document for the keyword, which would be linear in the number of documents. Instead, you can hop straight to that keyword in the mapping, and grab all the associated documents, which takes constant time.</p><p class="paragraph" style="text-align:left;">For our search index, we use Tantivy. It&#39;s fast, open source, implements good algorithms, and has Python bindings that are easy to install. We use the text, keywords, and summary generated in the previous part as the searchable columns to build a Tantivy index, which takes just seconds for hundreds to thousands of documents. We wrap the Tantivy index with a simple API that implements two operations: <code>search</code> and <code>read</code>.</p><div class="codeblock"><pre><code>def search(queries: list[str], limit: int = 10) -&gt; list[SearchResult]:
    pass

def read(document_ids: list[int]) -&gt; list[Document]:
    pass
</code></pre></div><p class="paragraph" style="text-align:left;"><b>This API separates searching from reading.</b> This is important because if you forced an AI to read every document it searched for, the context window would rapidly fill up with irrelevant or repeated documents. Instead, for each search, we get back a list of search results (like a Google Search page), and provide those to the AI. The AI can then decide which, if any, of those documents it wants to actually &quot;click on&quot; and read.</p><p class="paragraph" style="text-align:left;">You will also notice that <code>queries</code> is a list. Our search index allows for multiple queries, and fuses the results. This means that you can provide 5, 10, or 100 queries, but you still only get back one search results page. Each query is run separately, and then an algorithm like <a class="link" href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/reciprocal-rank-fusion?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=agentic-search-for-dummies" target="_blank" rel="noopener noreferrer nofollow">Reciprocal Rank Fusion</a> is used to &quot;fuse&quot; all 5, 10, or 100 pages into 1 search results page, based on how highly each document ranks across all the queries. Allowing the model to &quot;spray and pray&quot; queries like this can improve recall, as it increases the chances that at least 1 query will include the keyword needed to hit the desired document.</p><h2 class="heading" style="text-align:left;" id="part-3-the-tools">Part 3 – The Tools</h2><p class="paragraph" style="text-align:left;">AI models can write Python, so they could already use this search index, but executing arbitrary code generated by a language model is <a class="link" href="https://old.reddit.com/r/ClaudeAI/comments/1jfidvb/claude_tried_to_nuke_my_home/?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=agentic-search-for-dummies" target="_blank" rel="noopener noreferrer nofollow">considered harmful</a>, so typically, the abstraction of &quot;tools&quot; is used, which allows the AI to call very specific functions, and nothing else. In our case, the <code>search</code> and <code>read</code> functions above are each translated into a form the AI understands, and passed along with the request to the model.</p><p class="paragraph" style="text-align:left;">One way to do this is using <i>tools</i>, an abstraction where each function has a JSON schema explaining how to use it. This list of tools is passed directly to the model. Another way is to use an MCP server, which seems to be all the rage now. An MCP (Model Context Protocol) server is like an API server, but specifically designed for AIs to use tools. OpenAI, Anthropic, and Google all support MCP integrations to some degree or another. We use <a class="link" href="https://github.com/jlowin/fastmcp?utm_source=andersonbcdefg.beehiiv.com&utm_medium=newsletter&utm_campaign=agentic-search-for-dummies" target="_blank" rel="noopener noreferrer nofollow">FastMCP</a> to turn the tools into a server.</p><p class="paragraph" style="text-align:left;">When using MCP, you just have to provide information about the server. I am still not completely convinced that this extra abstraction is worth it. MCP deployment is a bit fragile and unintuitive, and the provider integrations can be flaky (missing a trailing slash can break the server!).</p><p class="paragraph" style="text-align:left;">One note on multiple indexes: If you need your search agent to be able to consult a lot of sources, I find it helpful to serve each source as a separate index. For example, an estate-planning assistant should be able to search the probate code, and the Internal Revenue Code. You <i>could</i> combine both into one corpus, but leads to undesirable results: probate documents appearing in searches for IRC documents and vice-versa. Instead, you can keep search indexes separate, and give the model separate tools for each. Let the AI decide which corpus it wants to search—it&#39;s usually smart enough to figure it out, if your tool descriptions are sufficiently detailed.</p><h2 class="heading" style="text-align:left;" id="part-4-the-search-agent">Part 4 – The Search Agent</h2><p class="paragraph" style="text-align:left;">A corpus, search index, and tools are all you need to build a search agent. What remains is telling the AI what task it needs to complete, providing the tools to the model, and calling the model in a loop. Each search query yields a results page, and each request to read documents puts those documents directly into the model&#39;s context. Searching and reading are done in a loop until the model decides it has read enough, and produces a final answer without any tool uses.</p><p class="paragraph" style="text-align:left;">When using an MCP server, the model provider will handle this loop for you. If you&#39;re passing tools, then you have to send each tool result back to the model yourself. Either way, this loop of searching and reading, finally resulting in an answer, is a search agent! We&#39;re done.</p><h2 class="heading" style="text-align:left;" id="why-doesnt-your-search-agent-use-em">Why doesn&#39;t your search agent use embeddings?</h2><p class="paragraph" style="text-align:left;">There&#39;s nothing wrong with dense embeddings. A truly state of the art search system probably should use them. But they have serious weaknesses, and introduce overhead. Embeddings grow worse with long documents, and many practical tasks (including those we are interested in) require long documents. This means using embeddings requires either eating a performance penalty, or splitting documents into very small pieces (&quot;chunking&quot;). Very long documents have to be chunked anyway, but limiting chunks to 500-1000 words is oppressive—it makes it harder to carve a document at the &quot;joints&quot;.</p><p class="paragraph" style="text-align:left;">Combining full-text search with embeddings also adds more overhead for ranking fusion. Now you&#39;re not just fusing across different queries, you&#39;re fusing across two search modalities (keyword and neural search), and the weight placed on each needs to be tuned. Using dense embeddings also requires LLM inference, which is CPU-intensive and probably shouldn&#39;t run on your webserver. Neither should Tantivy, honestly, but transfomer inference is almost certainly worse. Overall, it requires a more complex architecture.</p><p class="paragraph" style="text-align:left;">The argument for embeddings is that they allow documents to match even when the exact keywords don&#39;t, if the documents are semantically similar. I argue this is less important for agentic search. If a human is searching and wants to get a good result right away with a badly written query, full text search alone is not going to cut it. But when an agent is searching:</p><ul><li><p class="paragraph" style="text-align:left;">It can write lots of queries at once (we leverage this with multi-query searches)</p></li><li><p class="paragraph" style="text-align:left;">It can write longer more exhaustive queries (covering more synonyms and keywords)</p></li><li><p class="paragraph" style="text-align:left;">It can try again when its initial query doesn&#39;t work</p></li></ul><p class="paragraph" style="text-align:left;">If anything, full-text search is a more powerful primitive for AI models than a black-box search engine, because the relationship between queries and results is predictable, rather than vibe-based. I know if I put the word &quot;pizza&quot; into my query, I will get documents with the word pizza in them. In contrast, a black-box search API is something the model will have to learn to use on the fly (&quot;Do I put pepperoni or Domino&#39;s? Which is closest to what I want in the vibe-space?&quot;)</p><h2 class="heading" style="text-align:left;" id="conclusion">Conclusion</h2><p class="paragraph" style="text-align:left;">If you have comments or questions, find me on Twitter (@andersonbcdefg). Normally this part is where I&#39;d tell you to join us if this kind of stuff interests you, or ask you to use our product, but we aren&#39;t hiring and we aren&#39;t trying to sell a product to developers, so... that&#39;s all I got. Thank you for reading!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=1064ab54-83f9-406b-968a-c9a32476868a&utm_medium=post_rss&utm_source=ben_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

  </channel>
</rss>
