<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>AI Newsletter on Posit Open Source</title>
    <link>https://opensource.posit.co/tags/ai-newsletter/</link>
    <description>Recent content in AI Newsletter on Posit Open Source</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <atom:link href="https://opensource.posit.co/tags/ai-newsletter/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>AI Newsletter: LLMs often miss subtle visual artifacts in data visualizations</title>
      <link>https://opensource.posit.co/blog/2026-07-17_ai-newsletter/</link>
      <pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-07-17_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<p>Imagine that you receive some patient data and load it into R or Python for the first time. You make a couple plots to get a sense of the data before coming across this one:</p>
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/artifact-plot-1.png" data-fig-align="center" width="768" />
<p>Huh. It mostly looks normal, except there&rsquo;s a few points perfectly aligned with what looks to be a &ldquo;fitted&rdquo; line. You dig into it a bit more, and realize that the rows from one study site have their cholesterol values imputed. You set them to <code>NA</code> and go along your way.</p>
<p>Would today&rsquo;s frontier LLMs catch such an oddity? We designed <a href="https://github.com/posit-dev/bluffbench2" target="_blank" rel="noopener">an LLM evaluation</a> to help us answer this question. As it turns out, LLMs mostly miss these sorts of artifacts:</p>
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/results-plot-1.png" data-fig-align="center" data-fig-alt="A bar plot showing scores for several frontier models. The two leaders, Gemini 3.5 Flash and Claude Fable 5, score in the mid teens. Models from OpenAI cluster at the bottom, never eclipsing 10%." width="768" />
<p>During exploratory or open-ended data analysis, Posit assistant <a href="https://opensource.posit.co/blog/2026-06-08_comparing-posit-assistant-and-claude-code/#specialized-data-analysis-capabilities" target="_blank" rel="noopener">&ldquo;only runs a few bits of code at a time, then summarizes what it found and suggests next steps&rdquo;</a>. This is motivated by our stance that, for now, a data scientist should mostly keep pace with and understand what the agent is doing when analyzing data. This stance was initially informed by our observation that last year&rsquo;s frontier models <a href="https://posit.co/blog/introducing-bluffbench" target="_blank" rel="noopener">tended to see what they expected to see</a> when visualizing data. While <a href="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/" target="_blank" rel="noopener">LLMs have since become much better at interpreting counterintuitive plots</a>, bluffbench2 shows they still lag behind human data scientists in interpreting data visualizations. As such, we are still cautious on the prospect of highly autonomous data agents.</p>
<h2 id="how-the-eval-works">How the eval works
</h2>
<p>The eval harness is a relatively generic coding agent harness, similar to that of Claude Code or Posit Assistant. The agent has a tool to run R code in a persistent REPL and some vague prompting about data analysis:</p>
<blockquote>
<p>You are an AI assistant embedded in the user&rsquo;s data science IDE. You can read and modify files in the user&rsquo;s workspace and execute R code in their active session, including rendering plots. Prioritize correctness and clear communication&hellip;</p>
</blockquote>
<p>In each sample, the agent first carries out a few &ldquo;lull&rdquo; turns, making a couple plots and tables unrelated to the eval. Short user messages like &ldquo;load in the csv in this folder&rdquo; are decorated with &ldquo;System Reminders&rdquo; and other noise like that injected by popular agent harnesses.</p>
<div style="display: flex; flex-direction: column; gap: 8px; padding: 20px; max-width: 100%; margin: 20px auto;">
<div style="align-self: flex-end; background-color: #e8f3fc; padding: 12px 18px; border-radius: 18px 18px 4px 18px; max-width: 70%;">
take a look at <code>dat</code> in my env
</div>
<div style="align-self: flex-start; background-color: white; padding: 12px 18px; border-radius: 18px 18px 18px 4px; max-width: 70%; border: 1px solid #e0e0e0;">
<em>Tool: Run R code</em>
</div>
<div style="align-self: flex-end; background-color: #e8f3fc; padding: 12px 18px; border-radius: 18px 18px 4px 18px; max-width: 70%;">
<em>Tool result</em>
</div>
<div style="align-self: flex-start; background-color: white; padding: 12px 18px; border-radius: 18px 18px 18px 4px; max-width: 70%; border: 1px solid #e0e0e0;">
Looks like <code>dat</code> is a data frame of...
</div>
<div style="align-self: flex-end; background-color: #e8f3fc; padding: 12px 18px; border-radius: 18px 18px 4px 18px; max-width: 70%;">
<span style="display: block; margin-bottom: 8px; font-family: monospace; font-size: 0.8em; opacity: 0.55;">&lt;system-reminder&gt;<br>Your to-do list is currently empty. If you are working on tasks that would benefit from tracking progress, consider creating to-dos. This is just a gentle reminder - ignore if not applicable.<br>&lt;/system-reminder&gt;</span>
summarize <code>$cholesterol</code>
</div>
<div style="align-self: flex-start; background-color: white; padding: 12px 18px; border-radius: 18px 18px 18px 4px; max-width: 70%; border: 1px solid #e0e0e0;">
<em>Tool: Run R code</em>
</div>
</div>
<p>After a few turns, the agent is asked to produce a data visualization that includes a subtle visual artifact that could feasibly result from a real data-generating process. The artifacts span a range of realistic data quality issues: stuck sensors, bad joins, points imputed onto a line, swapped columns, pseudoreplication, differing units, etc.</p>
<div style="display: flex; flex-direction: column; gap: 8px; padding: 20px; max-width: 100%; margin: 20px auto;">
<div style="align-self: flex-end; background-color: #e8f3fc; padding: 12px 18px; border-radius: 18px 18px 4px 18px; max-width: 70%;">
plot bmi vs cholesterol
</div>
<div style="align-self: flex-start; background-color: white; padding: 12px 18px; border-radius: 18px 18px 18px 4px; max-width: 70%; border: 1px solid #e0e0e0;">
<em>Tool: Run R code</em>
</div>
<div style="align-self: flex-end; background-color: #e8f3fc; padding: 12px 18px; border-radius: 18px 18px 4px 18px; max-width: 70%;">
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/images/labs-thumb.png" width="220" style="border-radius: 12px; display: block;">
</div>
</div>
<p>If the agent mentions the artifact in its follow-up response, it receives a full point. If the agent does not mention the artifact, it can also receive a half point by mentioning it in response to a follow-up user message along the lines of &ldquo;what do you see in the plot?&rdquo; If the agent never mentions the artifact, it is graded as incorrect.</p>
<h2 id="designing-the-eval">Designing the eval
</h2>
<p>Once we understood the mechanism behind bluffbench, implementing the eval was relatively straightforward. bluffbench demonstrates the degree to which an LLM will ignore evidence shown in a plot in favor of its expectations. So, to implement a given sample, we&rsquo;d just think of some situation that would elicit a strong prior and then subvert it. For example, a dataset called <code>doug_firs</code> with variables <code>height</code> and <code>circumference</code>; one might expect that, as height increases, so does circumference. So, instead, we did a transformation under the hood that made the relationship parabolic.</p>
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/trees-plot-1.png" data-fig-align="center" data-fig-alt="Two scatterplots side by side, both with circumference on the x axis and height on the y axis. The left, labeled &#39;Original Plot&#39;, shows height rising with circumference, a positive trend. The right, labeled &#39;Tampered Plot&#39;, shows height rising then falling as circumference increases, an inverted-U shape." width="768" />
<p>A year ago, triggering this prior was enough to frequently &rsquo;trick&rsquo; the current frontier LLMs.</p>
<p>Slipping a plotted artifact past today&rsquo;s LLMs is much harder. Any human could ace bluffbench, but only an attentive data analyst would excel at bluffbench2.</p>
<p>In our early work on a successor to bluffbench, we started off with trying to elicit priors in the same way as bluffbench did, but in more realistic, longer-context scenarios. We were surprised to find that the same mechanism broadly doesn&rsquo;t seem to trick today&rsquo;s models even in these more realistic settings.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> We then tried a &lsquo;reverse bluffbench&rsquo;, where we let the model being evaluated in on the trick, asking it to carry out the transformation itself and then look at the plotted result which was tampered with to show the original relationship. We anticipated that this stronger prior (&ldquo;I did a thing with an obvious effect&rdquo;) might cause the models to miss the (re)manipulation, but models reliably noted that the plot looked as if it hadn&rsquo;t been manipulated.</p>
<p>As such, there isn&rsquo;t a similar &rsquo;trick&rsquo; in bluffbench2 per se. The transcripts read like relatively normal data analysis sessions and the plotted artifacts are designed to plausibly result from real data-generating processes. Instead, the eval elicits 1) the &lsquo;shape&rsquo; of LLMs&rsquo; vision being different than humans&rsquo; and 2) the model&rsquo;s tendencies to perform progress, simulating a data analysis moving along smoothly.</p>
<p>Today&rsquo;s frontier models are in the mid-teens at best; the top scores belong to Claude Fable 5 and Gemini 3.5 Flash at 16%. That said, we&rsquo;d caution folks from interpreting the current scores on this eval as &lsquo;LLMs don&rsquo;t see plots well.&rsquo; The plotted artifacts are actually quite subtle, and when they&rsquo;re made even a bit more marked, models tend to call them out consistently.</p>
<p>For example, the previous version of the scatterplot had a slightly more dense cluster of points:</p>
<div class="panel-tabset">
<ul id="tabset-1" class="panel-tabset-tabby">
<li><a data-tabby-default href="#tabset-1-1">Previous</a></li>
<li><a href="#tabset-1-2">Current</a></li>
</ul>
<div id="tabset-1-1">
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/previous-labs-plot-1.png" data-fig-align="center" data-fig-alt="A scatterplot of BMI versus cholesterol with a dense run of roughly fifty points falling exactly on a straight line through the noisy cloud." width="768" />
</div>
<div id="tabset-1-2">
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/current-labs-plot-1.png" data-fig-align="center" data-fig-alt="A scatterplot of BMI versus cholesterol with a sparse run of about thirty points falling exactly on a straight line through the noisy cloud, subtler than the previous version." width="768" />
</div>
</div>
<p>Opus 4.8 (medium) consistently got this sample right in the previous iteration.</p>
<div class="callout callout-note" role="note" aria-label="Note">
<div class="callout-header">
<span class="callout-title">Note</span>
</div>
<div class="callout-body">
<p>The fact that this was the case&mdash;that models would call out more marked artifacts reliably&mdash;gave us confidence that our grading setup was reasonable. In other words, it does indeed seem like models are struggling with these tasks because their vision is not capable enough to &lsquo;see&rsquo; the plotted artifact rather than a behavioral tendency to not mention those artifacts when they do see them.</p>
</div>
</div>
<h2 id="exploring-the-evals-results">Exploring the eval&rsquo;s results
</h2>
<p>At least for now, there&rsquo;s a loosely linear relationship between the cost to run the eval and the resulting score:</p>
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/cost-plot-1.png" data-fig-align="center" data-fig-alt="A scatterplot of score against total cost for each frontier model, colored by lab. The two leaders, Gemini 3.5 Flash and Claude Fable 5, sit highest at around the mid teens, while the OpenAI models sit low regardless of cost. Higher spend does not buy a higher score." width="768" />
<div class="callout callout-note" role="note" aria-label="Note">
<div class="callout-header">
<span class="callout-title">Note</span>
</div>
<div class="callout-body">
<p>Given that Gemini 3.5 Flash is so much cheaper than Claude Fable 5 per-token ($1.50/$9 per mTok I/O vs. $10/$50), it&rsquo;s surprising that the eval was so expensive to run for Gemini 3.5 Flash. This is primarily driven by cache (in)efficiency; the harness is implemented against Gemini&rsquo;s <code>generateContent</code> API, which makes it difficult to make use of discounted cached input pricing compared to Anthropic and OpenAI&rsquo;s APIs. Implementing and switching to Gemini&rsquo;s newer Interactions API would push the Flash 3.5 point to the left.</p>
</div>
</div>
<p>One of the most interesting learnings from examining the logs is a behavioral one. Even though we never request that LLMs introduce modeled results to plots, like fitted lines and confidence intervals with <code>geom_smooth(method = &quot;lm&quot;, se = TRUE)</code>, they sometimes do so anyway. For example:</p>
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/smooth-example-1.png" data-fig-align="center" data-fig-alt="The BMI versus cholesterol scatterplot with a straight fitted line and a shaded confidence-interval ribbon laid over the points, an overlay the model added on its own." width="768" />
<p>In general, adding modeled results to data visualizations without first looking at data is bad practice; it makes it hard to see the data itself. In the eval, adding a modeled result like this seems to substantially lower the chances that the model will notice the plotted artifact:</p>
<img src="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/smooth-plot-1.png" data-fig-align="center" data-fig-alt="A dumbbell plot, one row per model, comparing accuracy on artifact plots the model drew with a geom_smooth() overlay versus without. For nearly every model the &#39;with overlay&#39; point sits well to the left of the &#39;without&#39; point; Claude Fable 5 falls from about a quarter correct to zero, and Gemini 3.5 Flash from about a quarter to under a tenth." width="768" />
<h2 id="more-bluffbench">More bluffbench
</h2>
<p>If you&rsquo;d like to learn more about the bluffbench set of evals, take a look at these past posts:</p>
<ul>
<li><a href="https://posit.co/blog/introducing-bluffbench" target="_blank" rel="noopener"><strong>Introducing bluffbench</strong></a>: Writeup of the the original eval.</li>
<li><a href="https://posit.co/blog/llm-plot-interpretation" target="_blank" rel="noopener"><strong>LLMs interpret plots well, until expectations interfere</strong></a>: In-depth post on why models at the time didn&rsquo;t perform well on bluffbench, as well as various interventions we tried to improve performance.</li>
<li><a href="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/" target="_blank" rel="noopener"><strong>LLMs are getting much better at interpreting counterintuitive plots</strong></a>: In spring 2026, bluffbench scores suddenly jumped as models improved.</li>
<li><a href="https://skaltman.github.io/scipy-2026/" target="_blank" rel="noopener"><em><strong>It&rsquo;s (still) very bad to be wrong</strong></em></a>: Slides from our recent SciPy 2026 talk on building agents for correct, transparent, and reproducible data analysis in light of the bluffbench results.</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>This somewhat alleviated the fear that models had just memorized the bluffbench eval setup, mentioned in <a href="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/" target="_blank" rel="noopener">our previous post</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/images/hero.png" length="114420" type="image/png" />
    </item>
    <item>
      <title>AI Newsletter: AGENTS.md vs Skills vs MCP servers</title>
      <link>https://opensource.posit.co/blog/2026-07-03_ai-newsletter/</link>
      <pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-07-03_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<h2 id="prompt-agentsmd-skill-or-mcp-server">Prompt, AGENTS.md, skill, or MCP server?
</h2>
<p>There are a variety of ways to give a coding agent new information or abilities, but it can be confusing when to use each one. Generally, with coding agents like Claude Code or Posit Assistant, you can:</p>
<ul>
<li><strong>Write prompts</strong> in the chat (i.e., normal usage).</li>
<li>Add information to either a project-level or user-level <strong><code>CLAUDE.md</code> or <code>AGENTS.md</code>.</strong> The contents of a directory&rsquo;s <code>CLAUDE.md</code> or <code>AGENTS.md</code> are included in the agent&rsquo;s system prompt in every session in that directory. You can also create user-level versions that apply to every session.</li>
<li>Write a <strong>skill</strong> or use an existing one. Skills are packaged instructions that can include both text and code. The agent loads a skill only when it&rsquo;s relevant.</li>
<li>Add an <strong>MCP server.</strong> An <a href="https://modelcontextprotocol.io/docs/getting-started/intro" target="_blank" rel="noopener">MCP (Model Context Protocol)</a> server provides an agent with access to otherwise hard-to-find context, mostly through <a href="https://modelcontextprotocol.io/docs/learn/server-concepts#tools" target="_blank" rel="noopener">tools</a>, using a standardized interface.</li>
</ul>
<p>This list is roughly ordered from most straightforward to most complicated.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>So when do you use one over the other? There are two axes that might matter for your decision.</p>
<p>The first axis is reusability: do you want the agent to perform the task or access the information just once, or many times? The more often you or others will reuse something, the more it&rsquo;s worth encoding somewhere more permanent.</p>
<p>The second axis is reach. Prompting, <code>CLAUDE.md</code>/<code>AGENTS.md</code> files, and skills all provide guidance on how to best make use of the existing context and tools. MCP servers can provide the agent with entirely new tools (in the <a href="https://ellmer.tidyverse.org/articles/tool-calling.html" target="_blank" rel="noopener">agent tools</a> sense), granting the agent access to hard-to-reach information.</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-07-03_ai-newsletter/images/diagram.excalidraw.svg"
      alt="Decision tree for choosing how to customize a coding agent. The first question asks whether this is a one-time thing or something you&rsquo;ll need the agent to do similarly in the future. A one-time thing leads to normal prompting. If you&rsquo;ll need it again, the next question is when you want the agent to do the task: every session in the project leads to a CLAUDE.md or AGENTS.md file, while &ldquo;as needed&rdquo; leads to a further question. That question asks whether the agent has the capability to do the task with the tools it already has: if yes, write a skill; if no, use an MCP server."  title="A decision tree for choosing between prompting, AGENTS.md, skills, and MCP servers." 
      loading="lazy"
    ><figcaption class="text-sm text-center text-gray-500">A decision tree for choosing between prompting, AGENTS.md, skills, and MCP servers.</figcaption>
  </figure></div>
</p>
<p><strong>MCP servers often seem like the solution when you need to grant an agent access to an outside system, but they aren&rsquo;t always necessary.</strong> In many cases, what seems like a task for an MCP server can actually be solved by a command-line interface (CLI) tool, or a CLI plus a skill that tells the agent how to use it. For example, GitHub has an <a href="https://github.com/github/github-mcp-server" target="_blank" rel="noopener">MCP server</a>, but the <a href="https://cli.github.com/" target="_blank" rel="noopener"><code>gh</code></a> CLI does roughly the same thing.</p>
<p>The GitHub MCP server works by providing the agent with new tools, whereas the <code>gh</code> CLI takes advantage of the agent&rsquo;s existing bash tool that lets it run arbitrary shell commands. The skill plus CLI option is therefore generally preferable from a simplicity standpoint, but also from a token standpoint: adding the GitHub MCP server would inject tens of thousands of tokens of tool definitions into every request, whereas a skill that tells the agent to use <code>gh</code> costs almost nothing and loads only when it&rsquo;s relevant.</p>
<p>However, some information sources are hard to reach via the command line, because no CLI exists, the one that does isn&rsquo;t fully featured, or it&rsquo;s difficult for the agent to use. In some of these cases, the same sources can be accessed more effectively via MCP servers, such as design tools like Figma, knowledge repositories like Notion or Confluence, or issue trackers like Linear or Jira.</p>
<h2 id="posit-news">Posit news
</h2>
<h3 id="posit-assistant-in-positron">Posit Assistant in Positron
</h3>
<p>As of the <a href="https://positron.posit.co/download.html#release-notes" target="_blank" rel="noopener">June release</a> of Positron, Posit Assistant is now the default experience in Positron. Positron Assistant will be deprecated starting in the 2026.07 release (release date July 6).</p>
<p>We understand that the names are confusing! Our hope is that the transition state will be over soon and the confusion will lessen. If you want to understand why we gave different assistants very similar names, read this blog post from Posit CTO Joe Cheng: <a href="https://opensource.posit.co/blog/2026-06-11_history-of-posit-data-science-agents/" target="_blank" rel="noopener">A brief and biased history of Posit data science agents</a>.</p>
<p>Posit Assistant works with the same providers as Positron Assistant. If you have a working provider setup with Positron Assistant, you&rsquo;ll be able to use that same setup with Posit Assistant. You can read more about available providers <a href="https://assistant.posit.co/docs/downloads/positron/" target="_blank" rel="noopener">here</a>.</p>
<h3 id="package-updates">Package updates
</h3>
<ul>
<li><a href="https://opensource.posit.co/blog/2026-07-01_raghilda-0-2-0/" target="_blank" rel="noopener">raghilda v0.2</a>, a Python package for Retrieval Augmented Generation, is now on PyPI. This release, among other things, broadens support for crawling sites.</li>
<li><a href="https://opensource.posit.co/blog/2026-06-22_debrief-0-1-0/" target="_blank" rel="noopener">debrief</a>, an R package for LLM-friendly profiling, is now on CRAN. debrief turns profvis profiling output into text-based summaries, allowing AI agents to optimize R code more effectively.</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>One interface we didn&rsquo;t mention here is &lsquo;custom agents,&rsquo; a concept popularized by GitHub Copilot and now appearing under various names. These bundle some combination of prompts and tools (sometimes gathered via MCP). We&rsquo;d reach for the options mentioned above first, which are open standards that are broadly supported across most agent platforms and thus can be shared and migrated more easily.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-07-03_ai-newsletter/images/hero.png" length="83964" type="image/png" />
    </item>
    <item>
      <title>AI Newsletter: LLMs are getting much better at interpreting counterintuitive plots</title>
      <link>https://opensource.posit.co/blog/2026-06-19_ai-newsletter/</link>
      <pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-06-19_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<p>Around a year ago, we noticed a concerning behavior in the LLMs we built agents for data analysis with: when models were asked to make and interpret a plot that showed a counterintuitive trend, the <a href="https://posit.co/blog/introducing-bluffbench" target="_blank" rel="noopener">models did not faithfully interpret the plot</a>.</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/images/original-bluffbench-results.png"
      alt="Three-panel bar chart of the initial bluffbench results for Claude Sonnet 4.5, Gemini Pro 2.5, and GPT-5. In the mocked condition, all three models score in the single digits; in the intuitive condition they score in the 50–65% range; in the baseline condition, 67–85%."  title="Initial bluffbench results from November 2025." 
      loading="lazy"
    ><figcaption class="text-sm text-center text-gray-500">Initial bluffbench results from November 2025.</figcaption>
  </figure></div>
</p>
<p>In the &ldquo;mocked&rdquo; condition, we secretly tamper with well-known datasets, like <code>mtcars</code>, so that when the model plots the data, the trend shown is not what it expects. This is especially adversarial and not representative of the use case we&rsquo;re most concerned about, the more realistic &ldquo;intuitive&rdquo; condition. For these samples, we synthesized data, but named the datasets and variables to suggest an intuitive relationship that the actual data contradicts. Finally, the &ldquo;baseline&rdquo; condition asks models to interpret plots with generic column names, and the results establish that models can &lsquo;see&rsquo; just fine.</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/images/students.png"
      alt="Two scatterplots of exam score versus weekly study hours demonstrating the bluffbench intervention.  The left panel, labeled &lsquo;Intuitive relationship,&rsquo; shows a gentle positive trend from about 60 to 75 as study hours increase. The right panel, labeled &lsquo;Bluffbench relationship,&rsquo; shows a flat trend around 60–70 that jumps sharply above 20 hours, with scores reaching near 100, creating a discontinuity a model might not expect."  title="Example of an intuitive sample. The model might expect a positive association between study time and exam score, but the bluffbench dataset shows a discontinuity." 
      loading="lazy"
    ><figcaption class="text-sm text-center text-gray-500">Example of an intuitive sample. The model might expect a positive association between study time and exam score, but the bluffbench dataset shows a discontinuity.</figcaption>
  </figure></div>
</p>
<p>We <a href="https://posit.co/blog/llm-plot-interpretation" target="_blank" rel="noopener">tried all sorts of things to drive those scores up</a>, to little effect. We let the model write a &lsquo;memo&rsquo; to itself in a private scratchpad, enabled thinking, introduced a &ldquo;model-in-the-middle&rdquo; that pre-interprets the plot (so that the main agent sees only text), and even prefilled the response so that the agent was forced to say the correct interpretation (which it would then directly contradict).</p>
<!-- Source: https://posit.co/blog/llm-plot-interpretation (intervention-comparison-2.png) -->
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/images/intervention-comparison.png"
      alt="Two-panel bar chart of interventions run with Claude Opus 4.5. In the mocked condition, none of the interventions (memo, extended thinking, model-in-the-middle) lift accuracy above ~10%; in the intuitive condition there&rsquo;s modest improvement over the no-intervention baseline." 
      loading="lazy"
    >
  </figure></div>
</p>
<div class="callout callout-note" role="note" aria-label="Note">
<div class="callout-body">
<p>One promising finding was that, even if axis labels could activate the priors, models without access to the rest of the conversation history could still reliably interpret plots when told to ignore axis labels.</p>
</div>
</div>
<h2 id="bluffbench-is-near-saturation">bluffbench is near saturation
</h2>
<p>As is often the case, the best approach to drive these eval scores up was to wait a few months. A couple months ago, with the releases of Gemini 3.5 Flash and Opus 4.8, we saw our first &gt;50% scores on the hardest &ldquo;mocked&rdquo; case in the eval. Then, last week, Fable 5 nearly aced the &ldquo;mocked&rdquo; case; almost all of the samples that it failed on had triggered the biology classifier and fallen back to Opus 4.8.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/images/near-saturation-results.png"
      alt="Three-panel bar chart of recent bluffbench results across the mocked, intuitive, and baseline conditions, with models ordered by mocked-condition performance. Claude Fable 5 (medium) leads the mocked condition at ~73%, followed by Gemini 3.5 Flash (high) and Claude Opus 4.8 (high); scores on the intuitive and baseline conditions are uniformly high." 
      loading="lazy"
    >
  </figure></div>
</p>
<p>There&rsquo;s still certainly room for improvement here; any human data scientist would likely score near 100% on all three conditions. A score in the 70s is still meaningfully sub-human. That said, it doesn&rsquo;t seem like it will be long until bluffbench is saturated:</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/images/mocked-frontier.png"
      alt="Scatter plot of the best mocked-case bluffbench score against model release date, showing only models that set a new record when released. The frontier climbs from Gemini Pro 2.5 (9%, March 2025) and Claude Sonnet 4.5 (12%, September 2025) through GPT-5.2 (33%, December 2025), Gemma4 26B A4B (39%, March 2026), and Gemini 3.5 Flash (67%, May 2026) to Claude Fable 5 (73%, June 2026)." 
      loading="lazy"
    >
  </figure></div>
</p>
<p>As is the fate of many saturated evals, we&rsquo;ll soon be using bluffbench primarily to identify models on the Pareto frontier: what is the cheapest model that can reliably interpret plots, even when the plotted results are counterintuitive? While it&rsquo;s certainly impressive that Fable 5 (medium) can interpret counterintuitive plots this well, driving all data analysis conversations with a model this expensive is not economically feasible for most of our users.</p>
<h2 id="theres-still-more-to-do">There&rsquo;s still more to do
</h2>
<p>Even though bluffbench itself is nearing saturation, the problem of LLM agents failing to reliably incorporate surprising evidence and subtle artifacts into their analyses remains an issue. We see this qualitatively in our own work, and also have recently been able to quantify this in evals we&rsquo;ll release soon.</p>
<p>Notably, the bluffbench harness and conversations are relatively contrived and unrealistic. There is no system prompt (by default) and the models receive only a single tool called <code>create_ggplot()</code>, which they use to create the plot that they&rsquo;re then immediately asked to interpret.</p>
<p>For actual coding agents, system prompts can be extensive. Posit Assistant&rsquo;s and Claude Code&rsquo;s stretch into the tens of thousands of tokens. And in contrast to bluffbench, where the plot interpretation task appears in the first user message, real agents might create and interpret plots hundreds of turns into a conversation, and there&rsquo;s evidence that performance may degrade as conversations go on.</p>
<p>Further, the user messages in the bluffbench eval are quite &ldquo;clean.&rdquo; They are composed only of the user&rsquo;s relatively clear directive, with no &ldquo;fluff&rdquo; automatically injected by the harness. In most real coding agents, there are all sorts of hidden information and system reminders appended to the user message that are broadly unrelated to what the user is requesting in most situations, and agents need to ignore it.</p>
<p>Because of this lack of realism, and the fact that the eval and associated writing may now appear in the training data of newer models, models may know they are being evaluated in bluffbench. This risks &lsquo;sandbagging&rsquo;, where LLMs alter their behavior in situations where they suspect they&rsquo;re being evaluated.</p>
<p>We&rsquo;re seeing that in long-context, multi-turn, messy situations, even the most capable frontier models still struggle to notice counterintuitive patterns shown in data. This will continue to inform the design of our own data agents, which we&rsquo;ve intentionally made auditable and less-autonomous than many other agents on the market: we continue to believe that there are not yet models and harnesses capable of highly independent, green-field data analyses.</p>
<h2 id="posit-assistants-harness-helps">Posit Assistant&rsquo;s harness helps
</h2>
<p>That said, we&rsquo;ve been encouraged (and somewhat surprised) to see that Posit Assistant&rsquo;s harness seems to improve agents&rsquo; ability to interpret counterintuitive plots. Through some confluence of factors arising from the agents&rsquo; prompting, Posit Assistant scores more highly on bluffbench than the minimally sufficient harness from the open source eval:</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/images/harness-comparison.png"
      alt="Grouped bar chart comparing bluffbench accuracy on the intuitive condition under Posit Assistant&rsquo;s harness versus a minimal harness, for Claude Haiku 4.5, Sonnet 4.6, Sonnet 4.6 (medium), and Opus 4.8 (medium). Posit Assistant&rsquo;s harness scores higher for every model except Haiku 4.5, where the two are roughly even." 
      loading="lazy"
    >
  </figure></div>
</p>
<div class="callout callout-note" role="note" aria-label="Note">
<div class="callout-body">
<p>The scaffold that assembles Posit Assistant&rsquo;s prompting is not open source. That said, we&rsquo;ve instructed the agent to freely share its prompting; you&rsquo;re welcome to ask the agent what the version of prompting available in your session looks like.</p>
</div>
</div>
<p>This correctness boost also holds up in comparison to another popular coding agent. Coupled with the UI affordances that make it easier for users to audit the agent&rsquo;s code and results, we&rsquo;re excited to see that Posit Assistant seems to be a step forward in what&rsquo;s possible for correct agent-assisted data analysis.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://www.anthropic.com/news/claude-fable-5-mythos-5" target="_blank" rel="noopener">Per Anthropic</a>, &ldquo;When Fable’s classifiers detect a request related to cybersecurity, biology and chemistry, or distillation, the response is automatically handled by Claude Opus 4.8 instead.&rdquo;&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/images/featured.png" length="611941" type="image/png" />
    </item>
    <item>
      <title>AI Newsletter: Gemma 4 in Posit Assistant</title>
      <link>https://opensource.posit.co/blog/2026-05-22_ai-newsletter/</link>
      <pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-05-22_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<h2 id="external-news">External news
</h2>
<p>Through 2023 and 2024, the dominant narrative on AI token pricing was that the cost to use AI was <a href="https://epoch.ai/data-insights/llm-inference-price-trends" target="_blank" rel="noopener">dramatically</a> <a href="https://hai.stanford.edu/news/ai-index-2025-state-of-ai-in-10-charts" target="_blank" rel="noopener">decreasing</a> and <a href="https://blog.samaltman.com/three-observations" target="_blank" rel="noopener">would continue to do so</a>. However, in the last year, that trend is reversing course.</p>
<ul>
<li>On Tuesday, Google released <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-5/" target="_blank" rel="noopener">Gemini 3.5 Flash</a>, and priced it at three times the previous Flash model, Gemini 3 Flash.</li>
<li><a href="https://openai.com/index/introducing-gpt-5-5/" target="_blank" rel="noopener">GPT-5.5</a>, released last month, is twice as expensive as GPT-5.4.</li>
<li><a href="https://www.anthropic.com/news/claude-opus-4-7" target="_blank" rel="noopener">Opus 4.7</a>, also released last month, has the same price per token as Opus 4.6, but uses an updated tokenizer that <a href="https://simonwillison.net/2026/apr/20/claude-token-counts/" target="_blank" rel="noopener">results in ~45% more tokens for the same text</a>.</li>
</ul>
<p>Combined with changes to subscription pricing (<a href="https://help.openai.com/en/articles/20001106-codex-rate-card#codex-rate-card-token-based-pricing" target="_blank" rel="noopener">Copilot</a>, <a href="https://help.openai.com/en/articles/20001106-codex-rate-card#codex-rate-card-token-based-pricing" target="_blank" rel="noopener">Codex</a>, <a href="https://www.pcworld.com/article/3100787/anthropic-confirms-its-been-adjusting-claude-usage-limits.html" target="_blank" rel="noopener">Claude</a>), this suggests that AI prices are on the rise. Over the last few years, the major model providers have subsidized tokens to acquire users, and it seems like that period is ending.</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-05-22_ai-newsletter/images/plot-model-price.png"
      alt="Scatter plot showing the cost to run the Artificial Analysis benchmark suite over time for 12 models from Anthropic, Google, and OpenAI. Arrows connect predecessor-successor pairs, showing that most models have become more expensive to benchmark across generations, with Opus 4.7 the most expensive at over $5,000."  title="Costs to run the Artificial Analysis benchmark suite (https://artificialanalysis.ai/) are higher for recent models compared to their direct predecessors." 
      loading="lazy"
    ><figcaption class="text-sm text-center text-gray-500">Costs to run the Artificial Analysis benchmark suite (<a href="https://artificialanalysis.ai/" target="_blank" rel="noopener">https://artificialanalysis.ai/</a>) are higher for recent models compared to their direct predecessors.</figcaption>
  </figure></div>
</p>
<p>You can read more about this trend, and also how it shaped the thinking behind pricing Posit AI, in this blog post: <a href="https://posit.co/blog/posit-ai-priced-long-run" target="_blank" rel="noopener">Posit AI is priced for the long run</a>.</p>
<h2 id="posit-news">Posit news
</h2>
<h3 id="gemma-4-in-posit-assistant">Gemma 4 in Posit Assistant
</h3>
<p><strong>Gemma 4 is <a href="https://posit.co/blog/gemma-4-new-budget-focused-model-posit-ai/" target="_blank" rel="noopener">now available in Posit Assistant</a> via the Posit AI provider.</strong> Gemma 4 is a relatively small open-weights model released by Google Gemini, and one example of <a href="https://simonpcouch.com/blog/2026-04-16-local-agents-2/" target="_blank" rel="noopener">recent improvements</a> in local models small enough to run on a laptop.</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-05-22_ai-newsletter/images/gemma.svg"
      alt="Screenshot of Posit Assistant in RStudio with Gemma 4 selected in the model picker."  title="Gemma 4 selected in the Posit Assistant model picker." 
      loading="lazy"
    ><figcaption class="text-sm text-center text-gray-500">Gemma 4 selected in the Posit Assistant model picker.</figcaption>
  </figure></div>
</p>
<p>The primary motivation for including a model like Gemma 4 in Posit AI is cost. We wanted to include a budget model that is still capable and reliable enough to power Posit Assistant across a wide range of tasks.</p>
<p>We recommend using the more capable models with longer-running tasks (e.g., implementing a feature that touches code across many files in a package), but Gemma is still capable of assisting with basic data analysis. You can read more about model choice in the <a href="https://posit.co/blog/gemma-4-new-budget-focused-model-posit-ai/" target="_blank" rel="noopener">announcement blog post</a>.</p>
<h3 id="tidy-design-principles">Tidy design principles
</h3>
<p><strong>Hadley Wickham restarted his <a href="https://tidydesign.substack.com/p/returning-to-life" target="_blank" rel="noopener">Tidy design principles substack</a> this week</strong>, starting with a thoughtful reflection on the tension between LLMs&rsquo; helpful and harmful effects.</p>
<p>The following is an excerpt of that post, but we encourage you to read the entire thing.</p>
<blockquote>
<p>In future posts, I’ll get more technical, but I wanted to begin by acknowledging your likely deeply conflicted feelings about AI.</p>
<p><strong>Programming accessibility.</strong> There are tons of people who could benefit from a programming language like R, but can’t justify the investment in learning it. AI has dramatically lowered that barrier and you can now get many of the benefits of reproducible programming with R much faster than you could before. Similarly, effective usage of git is now within reach to a much broader audience.</p>
<p><strong>Translation.</strong> While machine translations are still far from perfect, their quality has improved radically in the last few years. This means that much more of the programming ecosystem is now available to the majority of the world who are not fluent English speakers.</p>
<p><strong>Voice input.</strong> Voice input is a super exciting technology because it means that you no longer need to be a fluent touch typist in order to quickly get your thoughts into a computer. (Not to mention making a lot more technology available if you can’t read or write.) That’s a meaningful expansion of who gets to participate in technology.</p>
<p><strong>Wide and shallow expertise.</strong> I love Tukey’s quote that statisticians get to play in everyone’s backyard. And it’s now easier than ever thanks to AI. AI will not make you an expert but can give you shallow expertise in basically anything you’re curious about. I think that’s pretty cool.</p>
<p>Finally, I have found AI to be a tremendous accelerator in my own work. It’s allowed me to fix 100s of issue in core infrastructure packages like roxygen2 and testthat. This is not AI slop; this is carefully vetted code that I can now write ~2-5x faster than I could before.</p>
<p>But you can’t use AI without also considering the harms, of which there are many.</p>
<p><strong>Environmental impact.</strong> At the individual level, I believe that if you want to reduce your environmental footprint, there are higher-leverage changes that you can make. But at the societal level, the picture is more concerning: the rush to create new data centers is increasing need for electricity and water, and leading companies to rollback their climate commitments.</p>
<p><strong>Copyright theft.</strong> LLMs are trained on vast quantities of copyrighted material, taken at an unprecedented and industrial scale, without permission or compensation.</p>
<p><strong>Concentration of wealth.</strong> The AI craze is pushing more and more money into the hands of fewer and fewer people. I find the concentration of wealth and power into the hands of a very small number of people to be genuinely disturbing and I think is something that we should all be concerned about.</p>
<p><strong>Intellectual laziness.</strong> AI supports a kind of shallow engagement where you never have to strain your brain on any task. The path of least resistance is to disengage and just let the model handle it. You no longer have to experience any mental discomfort, and thus you never really learn.</p>
<p><strong>Equity and access.</strong> I’ve built my career around open source software, and one of the things I love about it is that it’s available to everyone, everywhere in the world, regardless of their means. That’s not possible with AI. The best tools cost real money, usually charged in US dollars, and that makes them out of reach for a lot of people in a lot of places.</p>
</blockquote>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-05-22_ai-newsletter/images/newsletter.png" length="223008" type="image/png" />
    </item>
    <item>
      <title>AI Newsletter: A Data Cleaning Mode for Posit Assistant</title>
      <link>https://opensource.posit.co/blog/2026-05-08_ai-newsletter/</link>
      <pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-05-08_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<h2 id="posit-news">Posit news
</h2>
<p><strong>The latest release of Posit Assistant includes a Data Cleaning Mode.</strong> When Posit Assistant enters the mode, it spends time identifying and fixing data quality issues and preparing your data for analysis. When certain decisions (e.g., how to recode a variable) require user decisions, it surfaces those decisions in a specialized interface. When you and Posit Assistant are done making decisions about the cleaning process, all the cleaning code is written to a script.</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-05-08_ai-newsletter/images/data-cleaning-mode.png"
      alt="A screenshot of Posit Assistant in Data Cleaning Mode. The agent is asking the user a number of questions, presented as tabs, about data quality. The active question points out that the distribution of a variable in the data is very uneven and includes a table of row counts by the variable. The agent recommends keeping all rows, but runs this decision by the user first."  title="Posit Assistant in Data Cleaning Mode, surfacing data quality decisions to the user." 
      loading="lazy"
    ><figcaption class="text-sm text-center text-gray-500">Posit Assistant in Data Cleaning Mode, surfacing data quality decisions to the user.</figcaption>
  </figure></div>
</p>
<p>Broadly, we&rsquo;ve seen that many coding agents seem to have a superficial regard for data quality, focusing only on errors thrown by analysis code. This is one of several features we&rsquo;re iterating on to tailor the agent experience more closely to the real work of data science.</p>
<p><strong>The initial release of the tabpfn package <a href="https://tidyverse.org/blog/2026/03/tabpfn-0-1-0/" target="_blank" rel="noopener">recently made it to CRAN</a>.</strong> TabPFN is a pre-trained neural network for tabular data. In a typical predictive modeling workflow, you train a model on existing data (the training data), and then apply the resulting model to new, unseen data. TabPFN, in contrast, is a neural network pre-trained on a vast array of synthetic datasets. When using TabPFN, the model learns from the analyst&rsquo;s training data <em>in-context</em>, in a similar way that an LLM can &rsquo;learn&rsquo; over the course of a conversation, allowing it to predict on new data without an explicit training step. The tabpfn package provides R tidymodels bindings to the pre-trained model.</p>
<h2 id="terms">Terms
</h2>
<p>TabPFN and LLMs rely on <strong>in-context learning</strong> to provide more helpful responses.</p>
<p>Many recent model releases have announced increased <strong>context windows</strong> of 1 million tokens.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> The context window is the maximum length of the &lsquo;conversation history&rsquo;. So, if you&rsquo;ve had 10 messages back and forth with an LLM, and each message was composed of 100 tokens, the context length would be 1,000, well under the context window for most modern LLMs.</p>
<p>LLMs learn in a few different stages. The most recognizable stage is probably <strong>pre-training,</strong> in which the model gains general knowledge and capabilities by learning from massive collections of text. Another important stage of learning is <strong>in-context learning,</strong> which happens over the course of a conversation. For example, if you paste a document into an LLM chat and then start asking questions about it, the document has been learned in-context.</p>
<p>TabPFN follows this same learning setup as modern LLMs. The TabPFN team pre-trains the neural network and then allows users to download the resulting weights. Then, the model learns from the analysts&rsquo; training data in-context.</p>
<h2 id="learn-more">Learn more
</h2>
<ul>
<li>OpenAI released <a href="https://openai.com/index/introducing-gpt-5-5/" target="_blank" rel="noopener">GPT 5.5</a>, an incremental improvement over GPT 5.4. Google Gemini released <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/next-generation-gemini-deep-research/" target="_blank" rel="noopener">Deep Research Max</a>, an incremental improvement over its Deep Research tool.</li>
<li>Yihui Xie <a href="https://yihui.org/en/2026/05/ai-reflections/" target="_blank" rel="noopener">wrote up a thoughtful reflection on his experience with AI-assisted coding</a>.</li>
<li>LLM use for open-source contributions can be controversial. <a href="https://ziglang.org/" target="_blank" rel="noopener">Zig</a> has instituted a <a href="https://ziglang.org/code-of-conduct/" target="_blank" rel="noopener">ban on LLM contributions</a>. You can read their rationale <a href="https://kristoff.it/blog/contributor-poker-and-ai/" target="_blank" rel="noopener">here</a>.</li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>A token is, roughly, a word.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-05-08_ai-newsletter/images/featured.png" length="1641281" type="image/png" />
    </item>
    <item>
      <title>2026-04-24 AI Newsletter</title>
      <link>https://opensource.posit.co/blog/2026-04-24_ai-newsletter/</link>
      <pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-04-24_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<blockquote>
<p><em>The AI newsletter has moved! From this edition forward, we&rsquo;ll be publishing here, on the Open Source website. You can read past editions on the main <a href="https://posit.co/blog" target="_blank" rel="noopener">Posit blog</a>.</em></p>
</blockquote>
<h2 id="external-news">External news
</h2>
<h3 id="ai-and-cybersecurity">AI and cybersecurity
</h3>
<p>Anthropic recently announced <strong><a href="https://www.anthropic.com/glasswing" target="_blank" rel="noopener">Project Glasswing</a>, an effort to bolster critical software against the threat of AI systems that are increasingly capable of finding and exploiting security vulnerabilities.</strong> Through the project, a number of organizations that maintain critical software will be allotted credits to Claude Mythos, Anthropic&rsquo;s yet-to-be-publicly-released model that reportedly found high-severity security issues in <a href="https://red.anthropic.com/2026/mythos-preview/" target="_blank" rel="noopener">&ldquo;every major operating system and web browser&rdquo;</a>. The goal is to give these organizations a head start in finding and patching these vulnerabilities before bad actors have access to the same technology.</p>
<h3 id="a-step-change-for-local-coding-agents">A step change for local coding agents
</h3>
<p>One of the most common questions we receive when releasing LLM-enabled software is &ldquo;Can I use this with a local model?&rdquo; Up until this point, we&rsquo;ve largely discouraged using our products with LLMs small enough that you could run them on a laptop. <a href="https://posit.co/blog/local-models-are-not-there-yet" target="_blank" rel="noopener">Local models are not there (yet)</a> showed that, at the time, models small enough to run on a laptop failed a simple refactoring task every time, while the frontier, cloud-hosted models were largely successful.</p>
<p><strong>However, the last couple weeks have brought two important releases for the local model space—<a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/" target="_blank" rel="noopener">Gemma 4</a> and <a href="https://qwen.ai/blog?id=qwen3.6-35b-a3b" target="_blank" rel="noopener">Qwen 3.6</a>. Both of these new models <a href="https://simonpcouch.com/blog/2026-04-16-local-agents-2/" target="_blank" rel="noopener">successfully completed the refactoring task in 9 of 10 attempts</a>.</strong></p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-04-24_ai-newsletter/images/local-models.png"
      alt="Horizontal bar chart titled &lsquo;Agentic Coding Reliability.&rsquo; Three groups of models are compared on percent correct (0–100). Frontier models (Gemini Pro 3.1, Claude Sonnet 4.5, and GPT-4.1) all score between approximately 80 and 100 percent. Local models from 4 months ago (Qwen 3 14B, Mistral 3.1 24B, and GPT OSS 20B) all score 0 percent. Today&rsquo;s local models (Qwen 3.5 35B-A3B and Gemma 4 26B-A4B) score approximately 90 percent, comparable to the frontier models." 
      loading="lazy"
    >
  </figure></div>
</p>
<h2 id="posit-news">Posit news
</h2>
<p>Posit recently announced <strong><a href="https://opensource.posit.co/blog/2026-04-20_ggsql_alpha_release/" target="_blank" rel="noopener">ggsql</a>, an implementation of the grammar of graphics for SQL.</strong> One of the motivations for ggsql is safer AI agent tooling for visualization. With ggsql, rather than giving a visualization agent a full R or Python runtime (where the agent could execute arbitrary code, write files, or make network calls), you can provide it with a SQL runtime instead. SQL limits the agent to database operations, and you can restrict even those by connecting read-only, reducing the risk that the agent will do something undesirable.</p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-04-24_ai-newsletter/images/ggsql.png"
      alt="A ggsql example showing a stacked bar chart of penguin counts by island, colored by species, generated from the SQL query &lsquo;VISUALIZE island AS x, species AS color FROM ggsql:penguins DRAW bar&rsquo;." 
      loading="lazy"
    >
  </figure></div>
</p>
<h2 id="terms">Terms
</h2>
<p>A <strong>dense model</strong> is one where every parameter is used to process every token. For example, if a model has 14 billion parameters, in a dense model, all 14 billion are involved in generating each token.</p>
<p>Dense models are in contrast to sparse models, a subset of which use an architecture called <strong>Mixture of Experts (MoE)</strong>. In MoE models, only a fraction of the model&rsquo;s parameters are involved at any given time. The model contains many parallel sub-networks called &ldquo;experts,&rdquo; and a small router decides which ones to activate for each token. This means a model only needs to pay the computational cost of the small active subset per token.</p>
<p>This is the architecture of the most recent local models, and partially explains the jump in ability we saw. Gemma 4 26B-A4B, for example, has 26 billion total parameters but only activates 4 billion per token (the &ldquo;A&rdquo; is for &ldquo;active parameters&rdquo;). The models we tested from the previous generation were dense, requiring you to choose between a model small enough to run on a laptop or one that was good enough to be useful. The MoE architecture helps break that tradeoff.</p>
<h2 id="learn-more">Learn more
</h2>
<ul>
<li><strong>Anthropic released <a href="https://www.anthropic.com/news/claude-opus-4-7" target="_blank" rel="noopener">Opus 4.7</a></strong>, an incremental improvement over Opus 4.6. <strong>OpenAI released <a href="https://openai.com/index/scaling-trusted-access-for-cyber-defense/" target="_blank" rel="noopener">GPT-5.4-Cyber</a></strong>, a fine-tune of GPT 5.4 for cyberdefense.</li>
<li>A <a href="https://arxiv.org/abs/2603.21687" target="_blank" rel="noopener">new paper</a> shows that <strong>vision language models excel at many image benchmarks even when the actual images aren&rsquo;t provided</strong>, because the answers are implicit in the questions.</li>
<li>Posit&rsquo;s Jeremy Allen has been keeping a <a href="https://www.thetreeline.pub/p/ais-transformation-of-work" target="_blank" rel="noopener">log of the ways AI is transforming work</a>.</li>
</ul>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-04-24_ai-newsletter/images/featured.png" length="1641281" type="image/png" />
    </item>
  </channel>
</rss>
