<?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>Correct, transparent, and reproducible data agents</title>
      <link>https://opensource.posit.co/blog/2026-10-09_ai-newsletter/</link>
      <pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-10-09_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<div class="callout callout-tip" role="note" aria-label="Tip">
<div class="callout-header">
<span class="callout-title"><strong>Subscribe to the AI Newsletter!</strong></span>
</div>
<div class="callout-body">
<p>The AI newsletter is published as an RSS feed. Follow it in your favorite reader:</p>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 !text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
<p><strong>Want the newsletter as an email?</strong> Paste the feed URL, <a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener">https://opensource.posit.co/tags/ai-newsletter/index.xml</a>, into a free RSS-to-email service such as <a href="https://blogtrottr.com/" target="_blank" rel="noopener">Blogtrottr</a>, <a href="https://feedrabbit.com/" target="_blank" rel="noopener">Feedrabbit</a>, or <a href="https://follow.it/" target="_blank" rel="noopener">Follow.it</a>, and each new issue will arrive in your inbox.</p>
</div>
</div>
<style>
.blog-toc-content ul ul {
  display: none;
}
.prose img[src*="images/slides/"],
.prose video.column-page {
  border-radius: 0.25rem;
  box-shadow:
    0 1rem 2.5rem rgba(28, 45, 70, 0.14),
    0 0.2rem 0.6rem rgba(28, 45, 70, 0.1);
}
.prose img[src*="images/slides/"] {
  transition:
    box-shadow 160ms ease,
    transform 160ms ease;
}
.prose img[src*="images/slides/"]:hover,
.prose img[src*="images/slides/"]:focus-visible {
  box-shadow:
    0 1.2rem 3rem rgba(28, 45, 70, 0.2),
    0 0.25rem 0.75rem rgba(28, 45, 70, 0.14);
  transform: translateY(-2px);
}
</style>
<p>Last month, we gave a posit::conf(2026) keynote on building correct, transparent, and reproducible data agents. The talk brings together many themes from this newsletter, so this week we&rsquo;re sharing an annotated walkthrough. You can also see the full slide deck <a href="https://pos.it/keynote" target="_blank" rel="noopener">here</a>.</p>
<h2 id="correctness-vsconvenience">Correctness vs. convenience
</h2>
<p><strong>(Simon)</strong></p>
<p>This morning, your VP pulled up a coding agent and asked a reasonable question:</p>
<blockquote>
<p>How is traffic trending for our site?</p>
</blockquote>
<p>The agent looked around the workspace, found a table that seemed relevant,
wrote a SQL query against it, and returned a polished chart. Daily visits, it
said, were down 64% over the last 90 days.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/vp-site-traffic-reminder.webp" class="column-page" loading="lazy" data-fig-alt="A chat interface shows the question “how is traffic trending for our site?” The agent answers that daily visits are down 64 percent and displays a sharply declining line chart." width="1280" height="720" />
<p>The variation looks a little tight, and the bend is a little sharp. Is there
any possible reason we might see that bend other than a genuine change in site
traffic?</p>
<p>It turns out that a version of Chrome released 45 days earlier fired the
page-view event differently, so it was not aggregated correctly in the
database. As people updated Chrome, it appeared that site visits were trending
down. This was not even the table the data science team used to track site
traffic.</p>
<p>But you are not there! Your VP sees this chart and takes it to the rest of the
leadership team. They decide to restructure the organization and spend millions
of dollars to reverse the trend.</p>
<p>A month later, somebody asks, &ldquo;Could you recreate that chart? Let&rsquo;s see how
things are trending now.&rdquo; The agent cannot find it. Many coding agents delete
conversation histories after 30 days, and they often do data analysis in
temporary files so they do not clutter the project directory. The source code
for the analysis is long gone.</p>
<p>The coding agent offers to recreate the chart. It looks around the workspace,
finds a table, and runs some SQL. The number was going up the whole time.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/site-traffic-recreated.webp" class="column-page" loading="lazy" data-fig-alt="A chat interface cannot find the earlier conversation or its files. After recreating the analysis with a different warehouse table, it reports that daily visits increased 22 percent and shows an upward-trending chart." width="1280" height="720" />
<p>This is a fictional story, but we&rsquo;e seen situations like this internally
at Posit and at many of the organizations we work with. It is becoming normal
to <em>vibe-analyze</em> data: ask an agent a question, receive a plausible answer,
and move on without understanding how it was produced.</p>
<h3 id="the-tension-between-correctness-and-convenience-is-not-new">The tension between correctness and convenience is not new
</h3>
<p>Posit CTO Joe Cheng summarized the current moment this way:</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/convenience-versus-correctness.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide displays the quotation “In the battle between convenience and correctness, convenience is winning,” attributed to Joe Cheng, Posit CTO." width="1280" height="720" />
<p>AI has broadened the group of people who can convincingly do data analysis, but
many may have no idea what data scientists go through to produce a trustworthy
analysis.</p>
<p>Joe said this a month before the keynote, but he could have said it seven years
ago. In 2019, the beverage company Conviviality disclosed that <a href="https://www.accountingweb.co.uk/business/management-accounting/convivialitys-spreadsheet-hell-sinks-the-business" target="_blank" rel="noopener">a spreadsheet
arithmetic error had contributed £5.2 million to a £14 million forecasting
mistake</a>.
When that &ldquo;innocent spreadsheeting mistake&rdquo; came to light, the business sank.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/conviviality-spreadsheet-error.webp" class="column-page" loading="lazy" data-fig-alt="A news article about Conviviality reporting a spreadsheet arithmetic error that contributed 5.2 million pounds to a 14 million pound forecasting error." width="1280" height="720" />
<p>Or Joe could have said it 20 years ago, when <a href="https://www.science.org/doi/10.1126/science.314.5807.1856" target="_blank" rel="noopener">a sign error in closed-source
protein-modeling
software</a> sent a
research field down the wrong path. A lab published landmark study after
landmark study while other labs struggled to reproduce its findings. Only
after another lab found a protein structure that was nearly a mirror image of
one that the first lab had published did the first lab audit its source code.
They found a negative sign where it did not belong and retracted five papers.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/protein-modeling-software-error.webp" class="column-page" loading="lazy" data-fig-alt="A Science article titled &#39;Error prompts retractions&#39; describing a sign error in protein-modeling software." width="1280" height="720" />
<p>There were threats to correctness in data analysis long before AI. Posit&rsquo;s
stance has never been that people must sacrifice convenience for correctness.
While preparing the talk, I found this quote in a blog post old enough to
refer to itself as a &ldquo;weblog&rdquo;:</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/trustworthy-and-intuitive.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide quotes JJ Allaire: “Our goal is to develop a powerful tool that supports trustworthy, high quality analysis. At the same time, we want RStudio to be as straightforward and intuitive as possible.”" width="1280" height="720" />
<p>JJ was saying that a tool could be both correct and convenient. (By
convenient, we do not mean 7-Eleven. We mean straightforward and intuitive.😜)</p>
<p>Can we take the same stance toward AI? Is it possible to make data analysis
agents that are both correct and convenient for end users?</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/correct-and-convenient.webp" class="column-page" loading="lazy" data-fig-alt="Two overlapping circles, one blue and one orange, form a Venn diagram above the words &#39;Correct and convenient.&#39;" width="1280" height="720" />
<h2 id="why-build-ai-tools-at-all">Why build AI tools at all?
</h2>
<p><strong>(Sara)</strong></p>
<p>This pull between correctness and convenience has been on our minds throughout
the new, exciting age of LLMs. In 2025 and early 2026, AI started to feel
really, really convenient for data analysis. That made us worry about
correctness.</p>
<p>In August 2025, when we released Databot, our state-of-the-art exploratory data
analysis agent, we did so under what was essentially a warning label. The
release post was one of the first things I worked on after joining the AI team,
and it gave me the chance to do something I think I am particularly good at:
be pessimistic.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/databot-flotation-device.webp" class="column-page" loading="lazy" data-fig-alt="A split slide dated August 2025 shows an illustration of the Databot mascot wearing a bright orange flotation device." width="1280" height="720" />
<p>We were all really excited about Databot. It felt like flying through your
data, gathering insights faster than you thought would ever be possible. It was
precisely that convenience that worried us. People might trust it because they
were having so much fun, even when it was wrong. So we wrote an entire article
detailing basically every way we thought Databot might fail.</p>
<p>If you were at posit::conf(2025), you might remember Joe Cheng describing it as
both the most exciting and the most dangerous software he had worked on in his
30-year career.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/exciting-and-dangerous.webp" class="column-page" loading="lazy" data-fig-alt="A quotation from Joe Cheng says that Databot is both the most exciting software and the most dangerous software he has worked on in his 30-year career." width="1280" height="720" />
<p>That raises a fair question, one we contemplate ourselves on a weekly basis:
If AI causes all this chaos and makes all these mistakes, why are we doing
this? Why involve ourselves at all?</p>
<p>There are many answers. We&rsquo;ll focus on one.</p>
<h3 id="curiosity-and-exploration">Curiosity and exploration
</h3>
<p>Before joining the AI team, I taught data science. One thing that always
struck me was what brought people with very different backgrounds into the
field. The thing that united many of them was a sense of curiosity. Maybe they
were curious about a scientific field, computers, statistics, or how R and
Python themselves work. Data rewards that curiosity: There are datasets on
almost everything.</p>
<p>But even as an undergraduate who knew some statistics and a little R, I often
felt like I was looking at an ocean from above. The dataset was right in front of
me, and I knew there was so much going on, but I just couldn&rsquo;t see it.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/mission-ocean.webp" class="column-page" loading="lazy" data-fig-alt="An aerial photograph shows pale blue ocean water meeting a sandy shoreline, with a small dark shape visible below the surface." width="1280" height="720" />
<p>As a graduate student, I learned the tidyverse and more about data science. As
I got better at using those tools, I finally felt like I had what I needed to
ask and answer questions about my data.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/below-the-surface.webp" class="column-page" loading="lazy" data-fig-alt="A split slide pairs the words &#39;The right tools let us see below the surface&#39; with a photograph of rays swimming underwater." width="1280" height="720" />
<p>The right tools let us see below the surface. They enable that curiosity.</p>
<p>That same curiosity motivates our work now. We are curious about how these
models work, how we can build things around them to make them work better, and,
maybe most importantly, how we can turn them into tools that open new worlds of
analysis. For us, AI is a continuation of work we have always done: finding new
ways to explore data.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/ai-as-continuation.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide reads, &#39;AI is a continuation of our work to find new ways to explore data,&#39; with &#39;continuation&#39; and &#39;new ways to explore data&#39; highlighted." width="1280" height="720" />
<h3 id="the-models-got-better">The models got better
</h3>
<p>I also wanted to spend some time on what has changed since August 2025, when
we released that warning-label image. One major thing happened: The models got
better.</p>
<p>About a year before the keynote, we ran an experiment to understand how well
models interpret plots. We showed them plots based on a transformed diamonds
dataset and asked them to describe what they saw.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/bluffbench-counterintuitive-plot.webp" class="column-page" loading="lazy" data-fig-alt="A scatterplot shows diamond price decreasing as carat increases. An overlaid model response incorrectly says there is a strong positive relationship, followed by the question of whether models can interpret plots that contradict their expectations." width="1280" height="720" />
<p>The models gave answers like, &ldquo;There is a strong positive relationship between
carat and price.&rdquo; That sounds plausible until you look at the plot, which shows
the opposite. Behind the scenes, we had manipulated the data to reverse a
canonical relationship, so larger diamonds were, unintuitively, less expensive.</p>
<p>We wanted to know whether the models could see what was in front of them and
interpret plots that contradicted their expectations. A year ago, the answer
was largely no.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/bluffbench-november-2025.webp" class="column-page" loading="lazy" data-fig-alt="A horizontal stacked bar chart titled “Models often report what they expect to see, not what’s plotted.” GPT-5, Gemini Pro 2.5, and Claude Sonnet 4.5 are mostly marked incorrect." width="1280" height="720" />
<p>In November 2025, even the best models of the time were abysmal at this task.
They said what they expected to see instead of paying attention to what was
actually happening in the plot.</p>
<p>We tried all sorts of interventions to improve the
<a href="https://posit-dev.github.io/bluffbench/" target="_blank" rel="noopener">bluffbench</a> scores, and absolutely
nothing worked. Then we waited six months.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/bluffbench-september-2026.webp" class="column-page" loading="lazy" data-fig-alt="A horizontal stacked bar chart titled “Models got better at interpreting counterintuitive plots.” Recent thinking models have much larger correct segments than models evaluated in 2025." width="1280" height="720" />
<p>By May 2026, the major AI companies were releasing models that
were noticeably better at the task. By September, the numbers had jumped dramatically:
The models could interpret these counterintuitive plots.</p>
<p>The models got better. That does not mean data science is solved.</p>
<h3 id="models-still-make-mistakes">Models still make mistakes
</h3>
<p>After that experiment, we asked another question: Can models identify
data-quality issues in visualizations? In
<a href="https://github.com/posit-dev/bluffbench2" target="_blank" rel="noopener">bluffbench2</a>, we again showed them
plots and asked what they saw.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/bluffbench2-data-artifact.webp" class="column-page" loading="lazy" data-fig-alt="A scatterplot of sleep hours against stress score has an overall negative trend. Within the cloud, a suspicious subset of points falls exactly along a straight line." width="1280" height="720" />
<p>If you look carefully, there&rsquo;s a suspiciously straight line through the cloud
of points. If we really cared about this data, that&rsquo;s something to investigate: Did something weird happen when the data was
created? We wanted to know whether models would do the same.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/bluffbench2-results.webp" class="column-page" loading="lazy" data-fig-alt="A horizontal bar chart titled “Frontier models still struggle to notice subtle data quality issues.” Every evaluated model scores below 50 percent." width="1280" height="720" />
<p>It turns out they don&rsquo;t really. Even the leading models were not very good at
this task. They struggle to notice subtle data-quality issues.</p>
<p>But there&rsquo;s another problem. Data analysis is not just you, plus a good model,
plus your data. It also depends on context that is not necessarily in your CSV
file, warehouse table, or JSON file.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/context-outside-the-data.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide reads, &#39;Data analysis depends on context that is not in the data,&#39; with the word &#39;context&#39; highlighted." width="1280" height="720" />
<p>All data is constructed. It all has context. That context
might live in a data dictionary, a Markdown file, or a semantic view. Maybe it
just lives in the head of a coworker who has been at the organization for 15
years, knows absolutely everything, and has never written a single thing down.</p>
<p>That context is not inherently inaccessible to models. We could give it to
them. But it has to be in the right format, it has to be curated, and it has to
itself be correct.</p>
<p>So the models have gotten better, but data analysis with AI is not solved. The
question then becomes: How do we make AI-involved analysis correct?</p>
<h2 id="how-do-we-make-ai-for-data-analysis-trustworthy">How do we make AI for data analysis trustworthy?
</h2>
<p><strong>(Sara)</strong></p>
<p>Here&rsquo;s a common thought about AI: It&rsquo;s untrustworthy, but useful. To make it
trustworthy, we need to add in a person.</p>
<p>Here&rsquo;s a simple version of what that might look like. The agent or model does stuff, probably writes a bunch of code. A person then looks at that code and verifies, approves, or
redirects as needed. That feeds back into the agent. This intuitively can feel really appealing. The agent gets to do what it&rsquo;s
good at, the person does what they&rsquo;re good at, and there&rsquo;s an expert there to keep everything
from going off the rails.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/human-in-the-loop.webp" class="column-page" loading="lazy" data-fig-alt="A diagram presents a common division of labor in which an AI system produces work and a human verifies or supervises it." width="1280" height="720" />
<p>And so it&rsquo;s kind of tempting to apply this pattern everywhere. Any time the agent might make
a mistake, we have a person there to clean it up and make sure nothing bad
happens. We call this relatively simplistic view the <em>slap a human on it</em>
approach.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/slap-a-human-on-it.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide shows a roll of black repair tape, used as a metaphor for attaching a human reviewer to an AI system without designing the interaction." width="1280" height="720" />
<p>In this approach, you don&rsquo;t really think very much about what the person will actually do. How will
they apply their expertise? What is the purpose of their involvement? How will
we keep them from technically being in the loop but without actually applying
their expertise?</p>
<p>I&rsquo;m being a bit facetious, but this isn&rsquo;t that far from how we wrote risk mitigation with Databot a year earlier. We said that
Databot and LLMs were not at a point where users could abdicate responsibility.
You still needed all of your data skills to catch errors, interpret results in
context, and avoid being misled by confident but incorrect claims.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/user-responsibility.webp" class="column-page" loading="lazy" data-fig-alt="A quotation over a beach image says that people cannot abdicate responsibility or suspend skepticism when working with LLMs and that their expertise helps them catch errors and avoid confident but incorrect claims." width="1280" height="720" />
<p>And all of that is still true! But
we never said <em>how</em> this was supposed to happen. We assumed that if an expert
was there, they would catch the mistakes.</p>
<p>But just adding a person doesn&rsquo;t really guarantee a better result. Human&ndash;AI combinations do
not reliably outperform the better of the human or AI working
alone.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/human-ai-evidence.webp" class="column-page" loading="lazy" data-fig-alt="A slide reads, &#39;Adding a human does not guarantee a better result,&#39; followed by points about human-AI performance, approval fatigue, trust, timing, cognitive load, social cues, and information design." width="1280" height="720" />
<p>People also get tired of approving requests, and then they stop reading them.
Think about the last time your coding agent showed you a command to approve.
Did you carefully read it, or did you hit approve as quickly as possible and
feel annoyed that it even bothered to ask?</p>
<p>Human decision-making is not fixed. How much you trust the system, how much you
trust the people who built it, the timing of the information, your cognitive
load, and how much your coworkers trust the agent can all influence the
decision you make. Even if you are an expert who makes the right decision
outside an interaction with an agent, adding the agent might change that
decision.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/people-are-not-fixed.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide reads, &#39;People are not fixed safety components,&#39; with the final phrase highlighted." width="1280" height="720" />
<p>So how do we design the entire system to produce correct work? How do we build
trust and correctness into the agent itself, and design interactions with
users that actually support their expertise?</p>
<p>That maps onto two principles we returned to throughout the talk:</p>
<ol>
<li>Help the agent be correct.</li>
<li>Make it less bad when the agent is wrong.</li>
</ol>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/agent-correctness-goals.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide reads, &#39;Help the agent be correct&#39; and &#39;Make it less bad when the agent is wrong.&#39;" width="1280" height="720" />
<h2 id="posit-assistant">Posit Assistant
</h2>
<p><strong>(Simon)</strong></p>
<p><a href="https://pos.it/assistant" target="_blank" rel="noopener">Posit Assistant</a> is Posit&rsquo;s coding and data science
agent. It is available in RStudio, Positron, and the terminal. When it is
running inside an IDE, it works in the same R or Python session you&rsquo;re using.
You can use whatever model you want from whatever provider you have access to.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/posit-assistant.webp" class="column-page" loading="lazy" data-fig-alt="A blue slide displays the Posit Assistant wordmark and orange circular logo." width="1280" height="720" />
<p>For the demo, I returned to one of my first experiences of seeing below the
surface with data science. In an introductory statistics class, I analyzed
flight data to understand whether I could book tickets that were less likely
to be delayed. I used ggplot2 and dplyr, pushing data frames around and
visualizing them.</p>
<p>I asked Posit Assistant to find an R package with Houston flight data and
retrieve data from the previous year. It found <code>anyflights</code>, read its
documentation, and generated the correct call.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="Posit Assistant searches for an R package that provides data about flights from Houston.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/posit-assistant-web-fetch.mp4" type="video/mp4">
</video>
<p>Next, I asked it to grab data from the same time the previous year. The agent read the package documentation and so was able to write the code with the right arguments the first time.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="Posit Assistant reads the anyflights package documentation and writes code to retrieve Houston flight data.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/posit-assistant-docs.mp4" type="video/mp4">
</video>
<p>We have seen that many coding agents have a superficial relationship with data quality, and we wondered whether we could do better. Posit
Assistant proactively recommends cleaning the data and has a dedicated data-cleaning mode. It runs scratch code to look for
missing values, outliers, and similar issues. Once it finds them, it surfaces questions to the user in an interactive dialog.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="Posit Assistant enters data-cleaning mode, asks the user about missing values and outliers, and records the decisions in a persistent cleaning script.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/posit-assistant-clean-data.mp4" type="video/mp4">
</video>
<p>In the demo, the agent found missing values in a relevant column, then found some flights with departure delays of multiple days. I chose to keep both:
Those outliers represented what really happened.</p>
<p>At the end of cleaning mode, the agent wrote a persistent file in the project
directory to ingest and clean the data. When someone revisits the analysis,
they can reproduce those steps.</p>
<p>Posit Assistant also shows plots inside the conversation. It is nice to be able to see them, but we
also think it is necessary: Our evaluations show that agents cannot reliably
interpret plots. When one carrier appeared unusually delayed, it checked the sample size
and found only 32 flights, suggesting that we should not read too much into the
pattern.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="Posit Assistant plots departure delays by carrier, checks the sample size behind an apparent anomaly, and finds that the carrier has only 32 flights.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/posit-assistant-carriers.mp4" type="video/mp4">
</video>
<p>Once the analysis was complete, I asked the agent to turn it into a persistent
Quarto report.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="Posit Assistant uses a specialized skill to turn the flight-delay analysis into a persistent Quarto report.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/posit-assistant-report.mp4" type="video/mp4">
</video>
<p>I have one more &ldquo;little zoomy zoom&rdquo;: The entire conversation cost five cents.
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="The Posit Assistant conversation displays the selected GLM 5.3 Flash model, token usage, and a total cost of five cents."><source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/posit-assistant-model-cost.mp4" type="video/mp4"></video></p>
<p>Part of our mission at Posit is to provide tools to people regardless of their
economic means.</p>
<p>Posit Assistant is designed to be
token-efficient and can use capable, inexpensive open-weight models such as GLM
5.3 Flash through Posit AI Pass. We spend a lot of time
watching the open-weights model space for models on the Pareto frontier:
capable of data analysis and orders of magnitude cheaper than frontier models.</p>
<p>Returning to the two principles, part of helping the agent be correct is, quite
literally, asking nicely. We say, &ldquo;Pretty please pay attention to data
cleanliness. Pretty please be open to uncertainty when carrying out data
analysis.&rdquo;</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/posit-assistant-correctness.webp" class="column-page" loading="lazy" data-fig-alt="A slide says to help the agent be correct by encouraging sound statistics and reproducibility practices, and make errors less bad by using the user&#39;s expertise and sharing an R or Python environment." width="1280" height="720" />
<p>We also design interactions around the user&rsquo;s expertise: Cleaning mode asks
about the data-generating process, plots remain visible, and the user shares
the agent&rsquo;s R or Python session.</p>
<p>Posit Assistant assumes that the user is a data scientist, analyst, or someone
else who writes code and wants to work in an IDE, close to that code. But what
if the user is not a data scientist? How do we help them get correct answers,
too?</p>
<h2 id="introducing-commons">Introducing commons
</h2>
<p><strong>(Sara)</strong></p>
<p>Let&rsquo;s return to our vibe-analyzing VP. I think it&rsquo;s easy to say, &ldquo;They just
shouldn&rsquo;t be doing this kind of analysis.&rdquo; But let&rsquo;s be on their side for a
moment. They had a question, they wanted it answered, and so they&rsquo;re going to
reach for a tool that gives them an answer.</p>
<p>The problem is that they reached for the wrong tool and it gave them the wrong answer.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/vp-site-traffic-reminder.webp" class="column-page" loading="lazy" data-fig-alt="A chat interface shows the VP asking how traffic is trending for the site. The agent reports that daily visits are down 64 percent and displays a sharply declining line chart." width="1280" height="720" />
<p>The data team already has vetted, maintained code that computes site traffic
correctly. We call this <em>trusted code</em>. Trusted code might live in a package, Shiny app,
Quarto document, report, or dashboard.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/trusted-code.webp" class="column-page" loading="lazy" data-fig-alt="A cream-colored slide displays the words &#39;Trusted code,&#39; with &#39;Trusted&#39; highlighted in orange." width="1280" height="720" />
<p>Instead of having the model write bespoke code from scratch every time someone
asks a question, what if it could use that trusted code?</p>
<p>This is one of the core ideas behind a new open-source package that we&rsquo;re
excited to share with you all today. It&rsquo;s called commons.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/commons.webp" class="column-page" loading="lazy" data-fig-alt="A blue slide displays the orange commons bird logo and a link to pos.it/commons." width="1280" height="720" />
<p><a href="https://pos.it/commons" target="_blank" rel="noopener">commons</a> helps data scientists build trustworthy data
agents for their collaborators. It is an open-source R and Python package built
on the ellmer, chatlas, and shinychat stack.</p>
<p><strong>(Simon)</strong></p>
<p>Here is how the VP&rsquo;s analysis works with a commons agent. When the VP asks,
&ldquo;How is traffic trending for our site?&rdquo; the first thing the agent does is
search for a trusted calculation. If it finds one that answers the question,
it invokes that calculation directly.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="A commons agent answers a site-traffic question by running a trusted calculation, displaying a chart showing a 22 percent increase, and marking the answer with a green shield.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/commons-traffic-trend.mp4" type="video/mp4">
</video>
<p>The calculation returns a plot and a green shield indicating that the answer
came from a trusted calculation. commons adds that marker deterministically;
the agent itself does not control it.</p>
<p>What makes coding agents so convenient is that they are everything tools. They
will write their own R, Python, or SQL code to answer a question. Trusted
calculations cannot cover every question, so commons has a fallback path.</p>
<p>When no trusted calculation exists, the agent can use context authored by the
data team. commons verifies any citation against that context before displaying
its blue citation marker.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="A commons agent charts declining page views, uses trusted context to explain the instrumentation change behind the decline, and displays a blue citation marker.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/commons-page-views.mp4" type="video/mp4">
</video>
<p>If there is neither a trusted calculation nor supporting context to cite, the agent
can write code, but commons displays a yellow warning so the user knows to treat
the answer cautiously.</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="A commons agent writes custom code to find the day with the most site visits, then marks the answer with a yellow warning because it did not use a trusted calculation or cite trusted context.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/commons-most-visits.mp4" type="video/mp4">
</video>
<p>Here&rsquo;s a diagram of the various ways the agent can come up with answers and how the trust relationships are mapped.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/commons-trust-flow.webp" class="column-page" loading="lazy" data-fig-alt="A flow diagram shows commons first searching trusted calculations. A found calculation leads to a verified marker. Otherwise the agent searches context and writes SQL, R, or Python, leading to either a citation marker or a lower-trust warning." width="1280" height="720" />
<p>So far, we&rsquo;ve been talking about the VP&rsquo;s experience with the commons agent. What is it like to work with
commons as a data scientist? There are three main loops: build, deploy, and improve.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/commons-lifecycle.webp" class="column-page" loading="lazy" data-fig-alt="Three cards describe the commons lifecycle: build by connecting the agent to trusted code, deploy it for colleagues on Connect, and improve it by reviewing behavior and covering common use cases." width="1280" height="720" />
<p>With data collection enabled, data scientists can review cases where the agent
had to write its own code. If those cases share a pattern, they can add trusted
code that moves future responses up the trust ladder, making the agent more
correct over time.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/commons-correctness.webp" class="column-page" loading="lazy" data-fig-alt="A slide says to help the agent be correct with trusted calculations and context, and make errors less bad by signaling trust and introducing feedback loops." width="1280" height="720" />
<p>Returning to our two principles, commons helps the agent be correct by letting
it directly use trusted code. It makes mistakes less bad by telling the user
when the agent did not directly use trusted code, and by moving responses up
the trust ladder over time.</p>
<h3 id="other-use-cases-for-commons">Other use-cases for commons
</h3>
<p><strong>(Sara)</strong></p>
<p>The VP example is business intelligence, but commons is not only for BI or
vice presidents. It&rsquo;s for any data person who wants to build an agent that
gives correct answers to their collaborators.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/commons-examples.webp" class="column-page" loading="lazy" data-fig-alt="A table pairs a biostatistician with a physician comparing treatment groups, a UX researcher with a product manager summarizing experiment results, and a policy analyst with a program lead simulating a policy&#39;s budget impact." width="1280" height="720" />
<p>We&rsquo;ve made a sample <a href="https://pos.it/clinical-trials-agent" target="_blank" rel="noopener">clinical trials
agent</a> to highlight this functionality.
Its data is simulated. The trusted code is a TLG catalog: code written and
trusted by data people to work on this type of data and produce correct
answers. You can ask it questions such as, &ldquo;Plot Kaplan&ndash;Meier curves.&rdquo;</p>
<video class="column-page" loop muted playsinline controls preload="metadata" aria-label="A clinical trials agent runs a trusted calculation for the safety population and produces a Kaplan–Meier plot of serious adverse-event-free probability.">
<source src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/videos/clinical-trials-agent-demo.mp4" type="video/mp4">
</video>
<h2 id="it-is-still-very-bad-to-be-wrong">It is still very bad to be wrong
</h2>
<p><strong>(Sara)</strong></p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/conclusion.webp" class="column-page" loading="lazy" data-fig-alt="A blue slide reads “It’s (still) very bad to be wrong” in large cream-colored text." width="1280" height="720" />
<p>It&rsquo;s now so easy to ask any kind of agent a question about your data and get a
wrong answer that looks completely plausible.</p>
<p>The problem is not just that the answer is wrong, and it&rsquo;s also not just that you might be unable to reproduce it or have no
idea how it arrived at the answer.</p>
<p>These are bad enough, but there&rsquo;s another problem. If we become accustomed to, say, 15% of our numbers
being wrong, we might lose trust in analysis itself and its ability to tell us things about the world, or become used to numbers just being a bit wrong all the time.</p>
<p>But correctness matters, especially in particular industries, and Posit has always
built tools to support correct analysis. We do not think that standard should
change just because AI is here.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/conclusion-infrastructure.webp" class="column-page" loading="lazy" data-fig-alt="A blue slide reads, &#39;AI has expanded who can get answers from data. That changes the infrastructure we need for correct, transparent, and reproducible analysis.&#39;" width="1280" height="720" />
<p>But AI has expanded who can get answers from data. Now anyone can ask a
question about their data. That changes how we need to think about the
infrastructure for building correct, transparent, and reproducible agents.</p>
<p>With commons, a data team establishes which code and calculations it trusts
and provides the organizational context the agent needs. The team can give that
agent to someone who might otherwise perform a vibe analysis. That person keeps
the convenience of asking questions in natural language, while the answers are
grounded in the data team&rsquo;s trusted work and can be traced and reproduced.</p>
<p>That is where data scientists and analysts come in. This infrastructure must be
built by people who understand the data, calculations, and organization.
commons helps them build it and make it available to others.</p>
<h2 id="looking-forward">Looking forward
</h2>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/canvas.webp" class="column-page" loading="lazy" data-fig-alt="A Canvas application displays a polished data-analysis workspace with an agent conversation, visual results, and interactive controls arranged across a large visual canvas." width="1280" height="720" />
<p>Looking forward, we have been experimenting with something called Canvas.</p>
<p>Canvas is a next-generation agent experience. It assumes that you might not
always want to look at the code. That does not mean the code is not there when
you need it, but you might not always want to work in an IDE.</p>
<p>This frees up real estate for expansive, new agent-collaboration interfaces.
Canvas feels a little aggressively agentic to us, in the way Databot felt a
year ago.</p>
<img src="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/slides/thank-you.webp" class="column-page" loading="lazy" data-fig-alt="A green slide says &#39;Thank you!&#39; above resource cards linking to the keynote slides, commons, and the AI Newsletter." width="1280" height="720" />
<h3 id="recent-past-newsletters">Recent past newsletters
</h3>
<ul>
<li><a href="https://opensource.posit.co/blog/2026-09-18_ai-newsletter">New releases from ellmer, shinychat, and commons</a></li>
<li><a href="https://opensource.posit.co/blog/2026-09-04_ai-newsletter">You probably don&rsquo;t want to fine-tune</a></li>
</ul>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 !text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-10-09_ai-newsletter/images/hero.webp" length="15396" type="image/webp" />
    </item>
    <item>
      <title>AI Newsletter: New releases from ellmer, shinychat, and commons</title>
      <link>https://opensource.posit.co/blog/2026-09-18_ai-newsletter/</link>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-09-18_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<div class="callout callout-tip" role="note" aria-label="Tip">
<div class="callout-header">
<span class="callout-title"><strong>Subscribe to the AI Newsletter!</strong></span>
</div>
<div class="callout-body">
<p>The AI newsletter is published as an RSS feed. Follow it in your favorite reader:</p>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 !text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
<p><strong>Want the newsletter as an email?</strong> Paste the feed URL, <a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener">https://opensource.posit.co/tags/ai-newsletter/index.xml</a>, into a free RSS-to-email service such as <a href="https://blogtrottr.com/" target="_blank" rel="noopener">Blogtrottr</a>, <a href="https://feedrabbit.com/" target="_blank" rel="noopener">Feedrabbit</a>, or <a href="https://follow.it/" target="_blank" rel="noopener">Follow.it</a>, and each new issue will arrive in your inbox.</p>
</div>
</div>
<p>Last week, three packages in Posit&rsquo;s open-source AI stack shipped significant releases. We introduced commons 0.1.0, and ellmer and shinychat both received substantial updates. These releases are part of a broader effort to make it as easy as possible to build modern chat applications in R and Python.</p>
<p>In this newsletter, we&rsquo;ll take a quick tour of what&rsquo;s new.</p>
<h2 id="introducing-commons">Introducing commons
</h2>
<p><strong>commons, a new framework for building trustworthy self-service data analysis agents in R and Python, is now on CRAN.</strong> Read the full announcement <a href="https://opensource.posit.co/blog/2026-09-15_commons-0-1-0">here</a>.</p>
<p>The Python package is currently in a pre-release beta stage, with more features arriving over the next few weeks.</p>
<p>If you&rsquo;re a data analyst, data scientist, statistical programmer, or other data practitioner, you likely have extensive domain knowledge and a collection of <em>trusted code</em> that you already use in analyses, apps, reports, and packages. The core idea behind commons is that we can leverage this trusted code to improve an agent&rsquo;s correctness.</p>
<p>A commons agent first searches for a trusted calculation. If it finds one that can answer the user&rsquo;s question, it can run that vetted code and the answer is deterministically marked as verified.</p>
<img src="https://opensource.posit.co/blog/2026-09-18_ai-newsletter/images/commons-01-traffic-trend.gif" title="A commons agent answering a question with a trusted calculation." data-fig-alt="A commons agent answers how site traffic is trending by finding and running a trusted calculation. The resulting chart and answer are marked as verified." />
<p>If it doesn&rsquo;t find a trusted calculation, the agent searches trusted context before writing custom R, Python, or SQL. The answer is either given a citation or marked as &ldquo;untrusted,&rdquo; depending on whether the agent provides a verified citation that supports its approach.</p>
<p>The model doesn&rsquo;t decide how trustworthy its answer is. commons assigns each label deterministically based on the analysis path taken by the agent.</p>
<img src="https://opensource.posit.co/blog/2026-09-18_ai-newsletter/images/trust-flow.svg" class="column-page" data-fig-alt="Flow diagram showing how commons routes questions. It first searches trusted calculations. If it finds one, it runs the calculation and returns a verified answer. Otherwise, it searches trusted context, writes custom code, and returns either a cited or lower-trust answer." />
<p>commons also ships with an agent skill to help you create a commons agent and functions for analyzing your users&rsquo; conversations.</p>
<h2 id="shinychat-v050-r-and-v071-python">shinychat v0.5.0 (R) and v0.7.1 (Python)
</h2>
<p><strong>shinychat v0.5.0 for R and v0.7.1 for Python bring together more of what you need to build a complete chat application.</strong> Several of these shinychat updates also made commons possible!</p>
<p>Read the full blog post <a href="https://opensource.posit.co/blog/2026-09-15_shinychat-r-0.5.0-python-0.7.1">here</a>. There are many more updates worth checking out.</p>
<h3 id="page_chat"><code>page_chat()</code>
</h3>
<p>Use <code>page_chat()</code> instead of the bslib <code>page_*()</code> functions when you want the chat to be the center of your application. <code>page_chat()</code> creates a full-window, chatbot-oriented layout with support for navigation pages, conversation history, an <a href="https://opensource.posit.co/blog/2026-09-15_shinychat-r-0.5.0-python-0.7.1#artifact-drawer">artifact drawer</a>, and more.</p>
<img src="https://opensource.posit.co/blog/2026-09-18_ai-newsletter/images/shinychat-page-chat.png" title="A shinychat app built `page_chat()`." class="column-page" data-fig-alt="A full-window Site traffic assistant built with page_chat, showing a traffic-trend question, a compact calculation activity row, the assistant&#39;s answer, and the chat input." />
<h3 id="conversation-history">Conversation history
</h3>
<p>Conversation history is enabled by default when you use <code>chat_server()</code> in R or <code>Chat(client=...)</code> in Python, allowing users to start a new conversation, switch between saved conversations, search them, rename them, and delete them.</p>
<img src="https://opensource.posit.co/blog/2026-09-18_ai-newsletter/images/shinychat-history.png" title="Previous conversations shown in the chat history sidebar." class="column-page" data-fig-alt="The Site traffic assistant with its history sidebar open, showing controls to search or start a conversation and three saved traffic-analysis conversations beside the active chat." />
<h3 id="readable-tool-calls-and-citations">Readable tool calls and citations
</h3>
<p>This shinychat release also includes several improvements for understanding how a model arrived at its response.</p>
<p>One such improvement is readable tool calls. By default, related tool calls are grouped into compact, single-line &ldquo;activity rows&rdquo;, keeping them from overwhelming the conversation. You can still inspect the individual tool calls by expanding a row.</p>
<p>shinychat also displays citations returned by providers&rsquo; built-in web-search and web-fetch tools.</p>
<img src="https://opensource.posit.co/blog/2026-09-18_ai-newsletter/images/shinychat-tools-citations.png" title="A grouped activity row and an open citation." data-fig-alt="A Shinychat answer with a compact grouped activity row for searching documentation and querying the warehouse, plus an open citation identifying sessions_daily as the canonical site-traffic source." />
<h2 id="ellmer-050">ellmer 0.5.0
</h2>
<p><strong><a href="https://opensource.posit.co/blog/2026-09-14_ellmer-0-5-0">ellmer 0.5.0</a> is now on CRAN.</strong> ellmer makes it easy to work with LLMs from R.</p>
<p>Read the full announcement <a href="https://opensource.posit.co/blog/2026-09-14_ellmer-0-5-0">here</a>. Many of the features made available in this release are also available in recent releases of <a href="https://github.com/posit-dev/chatlas/releases" target="_blank" rel="noopener">chatlas</a>, ellmer&rsquo;s sibling package in Python.</p>
<h3 id="citations">Citations
</h3>
<p>When a model uses a supported built-in web tool, ellmer now returns and displays the provider-supplied citations. This works with <code>claude_tool_web_search()</code>, <code>claude_tool_web_fetch()</code>, <code>google_tool_web_search()</code>, and <code>openai_tool_web_search()</code>, helping you identify the sources behind the model&rsquo;s answer.</p>
<div class="code-block"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="n">chat</span> <span class="o">&lt;-</span> <span class="nf">chat_openai</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">chat</span><span class="o">$</span><span class="nf">register_tool</span><span class="p">(</span><span class="nf">openai_tool_web_search</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="n">chat</span><span class="o">$</span><span class="nf">chat</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;What is the most recent version of ellmer on CRAN? Look it up.&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#&gt; The most recent CRAN release of **ellmer** is **version 0.5.0**, published</span>
</span></span><span class="line"><span class="cl"><span class="c1">#&gt; **September 4, 2026**.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#&gt; ([cran.r-project.org](https://cran.r-project.org/package%3Dellmer))[1]</span>
</span></span><span class="line"><span class="cl"><span class="c1">#&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#&gt; Sources</span>
</span></span><span class="line"><span class="cl"><span class="c1">#&gt; [1] CRAN: Package ellmer: https://cran.r-project.org/package%3Dellmer</span></span></span></code></pre></div></div>
<h3 id="tokens-and-costs">Tokens and costs
</h3>
<p>Managing tokens and costs is an important part of working with LLMs.</p>
<p>Ever want to know how many tokens an input will take before sending it? For supported providers, you can now use <code>chat$token_count()</code> to estimate input token use. Instead of actually sending the request to the model, it sends the request to the provider&rsquo;s token-counting API.</p>
<div class="code-block"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-r" data-lang="r"><span class="line"><span class="cl"><span class="n">chat</span> <span class="o">&lt;-</span> <span class="nf">chat_openai</span><span class="p">(</span><span class="n">model</span> <span class="o">=</span> <span class="s">&#34;gpt-5.6-luna&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">prompt</span> <span class="o">&lt;-</span> <span class="nf">content_pdf_file</span><span class="p">(</span><span class="s">&#34;example-document.pdf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">chat</span><span class="o">$</span><span class="nf">token_count</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#&gt; [1] 252</span></span></span></code></pre></div></div>
<p>This estimates only the tokens used by the input and does not predict the number of output tokens, so it won&rsquo;t represent the total round-trip count.</p>
<p>Companies frequently release new models and change their prices. Use the new function <code>models_update_prices()</code> to download and cache the latest pricing data from the ellmer GitHub repo. Cost estimates reported by <code>token_usage()</code>, <code>Chat$get_cost()</code>, <code>Chat$get_tokens()</code>, and printed <code>Chat</code> objects use this data.</p>
<h3 id="send-files-to-the-model">Send files to the model
</h3>
<p>It&rsquo;s often useful to send files as part of a chat. You can now send CSV, Markdown, code, and other text-based files to a model with <code>content_document_file()</code> and <code>content_document_url()</code>. For large files or files reused across multiple turns, if you&rsquo;re using <code>chat_openai()</code>, <code>chat_anthropic()</code>, or <code>chat_google_gemini()</code>, use <code>chat$file_upload()</code> instead. It uploads the file once and returns a reference for <code>$chat()</code>. This avoids repeatedly sending the file and reduces token usage and cost.</p>
<h2 id="solid-improvements-for-custom-agents">Solid improvements for custom agents
</h2>
<p>Taken together, these releases make it easier to build more complete custom agents. ellmer manages model interactions in R, shinychat provides the user-facing chat interface, and commons adds a framework for data analysis agents that builds upon these two.</p>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-09-18_ai-newsletter/images/hero.png" length="543199" type="image/png" />
    </item>
    <item>
      <title>AI Newsletter: You probably don&#39;t want to fine-tune</title>
      <link>https://opensource.posit.co/blog/2026-09-04_ai-newsletter/</link>
      <pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-09-04_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<div class="callout callout-tip" role="note" aria-label="Tip">
<div class="callout-header">
<span class="callout-title"><strong>Subscribe to the AI Newsletter!</strong></span>
</div>
<div class="callout-body">
<p>The AI newsletter is published as an RSS feed. Follow it in your favorite reader:</p>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 !text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
<p><strong>Want the newsletter as an email?</strong> Paste the feed URL, <a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener">https://opensource.posit.co/tags/ai-newsletter/index.xml</a>, into a free RSS-to-email service such as <a href="https://blogtrottr.com/" target="_blank" rel="noopener">Blogtrottr</a>, <a href="https://feedrabbit.com/" target="_blank" rel="noopener">Feedrabbit</a>, or <a href="https://follow.it/" target="_blank" rel="noopener">Follow.it</a>, and each new issue will arrive in your inbox.</p>
</div>
</div>
<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>This week, we are busy preparing for posit::conf, so we&rsquo;re running an abbreviated version of a post Simon published on his personal blog. You can read the full version <a href="https://simonpcouch.com/blog/2026-09-03-fine-tune" target="_blank" rel="noopener">here</a>.</p>
</div>
</div>
<p>Recently, there&rsquo;s been a lot of talk about fine-tuning models. The reasoning usually goes something like this:</p>
<ul>
<li>There&rsquo;s some task that needs to be done regularly.</li>
<li>Today&rsquo;s frontier models can do it quite reliably, but it&rsquo;s expensive and the bills are starting to rack up.</li>
<li>Cheaper models can&rsquo;t quite do the task reliably, but a fine-tuned variant of a small, open-weights model might be able to just as cheaply.</li>
<li>Therefore, you should fine-tune models for tasks that your organization does.</li>
</ul>
<p>I&rsquo;ve seen <a href="https://seldo.com/posts/2026-is-the-year-of-fine-tuned-small-models/" target="_blank" rel="noopener">a</a> <a href="https://fermisense.com/when-machines-take-the-wheel/" target="_blank" rel="noopener">number</a> <a href="https://neon.com/blog/how-castform-neon-beats-frontier-models-on-price-and-efficiency" target="_blank" rel="noopener">of</a> <a href="https://shopify.engineering/sidekicks-continual-learning-loop" target="_blank" rel="noopener">blog</a> <a href="https://turbopuffer.com/blog/reinforcement-learning-sid-ai" target="_blank" rel="noopener">posts</a> cited in support of this idea.</p>
<p>It makes sense that fine-tuning is appealing! AI is getting expensive, many players in the space cannot make the privacy guarantees we&rsquo;d hope, and just as you start to rely on one proprietary model, it&rsquo;s phased out in favor of a newer release. That said, my reaction is that this approach seems more engineering-intensive and, likely, more expensive than alternative approaches. I&rsquo;ll try to make that case here.</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>When I say you <em>probably</em> don&rsquo;t want to fine-tune, I mean that I totally understand there are some valid use cases here. Some of the linked blog posts are themselves valid cases. I can see fine-tuning making sense for some <em>very</em> high-volume workloads and/or for asynchronous workloads (where it doesn&rsquo;t matter if a response comes back in a second or a day).</p>
</div>
</div>
<h2 id="what-is-fine-tuning">What is fine-tuning?
</h2>
<p>Before we go further, it&rsquo;s probably worth quickly outlining what I mean by fine-tuning. In short, fine-tuning means training an existing model further to improve its performance on a particular task.</p>
<p>Large language models contain huge arrays of parameters. Input, usually in the form of text, is turned into arrays of numbers, and those arrays get multiplied a bunch of times to form the output, which is then typically converted back into text. Those multiplications are quite computationally intensive, and the array of parameters is itself quite large. For example, the smallest models that are <a href="https://simonpcouch.com/blog/2026-09-02-local-agents-3/" target="_blank" rel="noopener">beginning to be able to</a> reliably complete basic agentic work contain 8 billion parameters (in short, &ldquo;8B&rdquo;).</p>
<p>Fine-tuning changes a model&rsquo;s behavior, either by updating the existing parameters, or by training a <a href="https://huggingface.co/learn/llm-course/en/chapter11/4" target="_blank" rel="noopener">smaller set of additional parameters</a> that work alongside the originals. The goal of fine-tuning is, broadly, to increase the performance of a model on a given task while minimizing the impact on the model&rsquo;s ability to do other tasks.</p>
<h2 id="fine-tuning-is-hard">Fine-tuning is hard
</h2>
<p>It is very, very difficult to successfully fine-tune a model. I don&rsquo;t claim that it&rsquo;s impossible, but it is a substantial engineering effort, requiring the careful attention of dedicated scientists with access to today&rsquo;s frontier models across several weeks, just for the first edition of the model. To show why, let&rsquo;s revisit each step of that process.</p>
<p><strong>What model should you start with?</strong> In short, you want the smallest possible model that has the ability to learn to do the task reliably while retaining sufficient general intelligence. It is very hard to predict when or how capabilities will emerge during fine-tuning without first fine-tuning, meaning that the choice will need to be revisited several times once you&rsquo;ve made a first go at the remaining steps.</p>
<p><strong>What data gets used for training?</strong> Once you&rsquo;ve chosen a model, you need to find some training data to fine-tune it with. What should you use? Ideally, you would use the real data that represents the task and its inputs. However, in order to train on that real data, you typically need the user&rsquo;s consent, and it&rsquo;s likely that you won&rsquo;t have that consent.</p>
<p>And then, when you do have user consent and choose to train on that data, you now have a mandate not to overfit. This is because if the model you&rsquo;re fine-tuning internalizes the data you&rsquo;re training on and is able to (even hazily) recollect it, you&rsquo;ve now exposed that data to any users of the model.</p>
<p>The other approach, then, is synthetic data, created by asking a model to generate a bunch of scenarios that resemble the real inputs and then demonstrate how to carry out the task in those scenarios. But this type of synthetic data has its own problems: notably, the models creating the data have their own set of tics that make the data unrepresentative of real-world data. The <a href="https://www.404media.co/elias-thorne-chatbots-llms-chatgpt-lighthouse-keeper-story/" target="_blank" rel="noopener">Elias in the Lighthouse</a> effect is a notable example of this phenomenon. A wide variety of models will, when asked to write a story, write about a lighthouse keeper named Elias Thorne. On its own, the story of Elias Thorne might be informative training data. However, 1,000 stories about a lighthouse keeper Elias Thorne are not.</p>
<p><strong>How do you nudge the weights?</strong> Let&rsquo;s assume you do have a diverse, representative set of training data to work with. You&rsquo;ll now need to decide how, mechanistically, to change the behavior of the model&mdash;do you need a full fine-tune, or will a <a href="https://huggingface.co/learn/llm-course/en/chapter11/4" target="_blank" rel="noopener">LoRA</a> be sufficient?</p>
<p>Next, you&rsquo;ll need to tune a set of 5-10 hyperparameters. Notably, because they are hyperparameters, there is no generally good &ldquo;magic number&rdquo; for them, and instead you&rsquo;ll need to try a bunch of values and see what works. You&rsquo;d make some guesses, see what happens, then generate some hypotheses on what a given change to those parameters might do, then try out a different number and see if it has the desired effect. Every time you&rsquo;re figuring out what to try next, you&rsquo;ll be reading a <em>ton</em> of test cases and trying to observe general failure modes exhibited in this intermediate draft of your fine-tuned model. That might change the initial choice of model you&rsquo;re fine-tuning, and it might change which subsets of the training data you&rsquo;re exposing to the training process.</p>
<p><strong>How do you measure success?</strong> You need a reliable way to tell whether each version of your model is actually improving. That is especially tricky for free-text tasks, because two answers can be equally good even when they differ syntactically. Because of this, you&rsquo;ll probably want an LLM-as-a-judge system, where another model compares the responses to a target and grades according to a rubric you&rsquo;ve supplied. LLM-as-a-judge systems are themselves quite hard to design correctly, and you&rsquo;ll be reading a bunch of that judge&rsquo;s grading transcripts, too.</p>
<p>It&rsquo;s also worth mentioning that <strong>getting your fine-tuned model to score well on your own benchmark is not the hard part</strong>. Many of these fine-tuning writeups include a plot along these lines:</p>
<img src="https://opensource.posit.co/blog/2026-09-04_ai-newsletter/index.markdown_strict_files/figure-markdown_strict/plot-finetune-benchmark-1.png" style="width:100.0%" data-fig-align="center" data-fig-alt="A scatter plot of evaluation performance against cost per million tokens (log scale). Unlabeled grey synthetic points loosely follow a rising trend. Labeled model points include Fable 5.1, GPT 5.6 Sol, Sonnet 5, Gemma 4 26B, Llama 4 8B, and Phi 5 mini. A red point labeled &#39;Our fine-tune&#39; sits in the upper left, cheap yet scoring above the frontier models." />
<p>When I see that a single-digit-billion-parameter fine-tuned model scores better than Fable 5.1 or GPT 5.6 Sol on an evaluation, I interpret that as evidence that the evaluation is not meaningful. In my own experience, it is not (comparatively) hard to get a small model to score very well on any given benchmark. What&rsquo;s much more difficult is preserving the broad intelligence of a model while driving the evaluation score up. A meaningful evaluation can do both at once, measuring task performance under a realistic, broad distribution of possible task configurations. It is very hard to author meaningful evaluations, especially for models as capable as those that exist today.</p>
<p>But let&rsquo;s say you&rsquo;ve made it this far! You found a good model to start from, a diverse set of training data that you&rsquo;ve obtained consent to train on, and a meaningful way to measure progress. Now, it&rsquo;s time to put it in production.</p>
<h2 id="fine-tuning-is-expensive">Fine-tuning is expensive
</h2>
<p>Fine-tuning can seem appealing because the actual fine-tuning part of the process can be relatively inexpensive, likely on the order of a few dollars to a few hundred dollars.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>However, actually deploying the model to do the task you trained it to do is likely to be substantially more expensive.</p>
<h3 id="because-hosting-is-expensive">&hellip;because hosting is expensive
</h3>
<p>Hosting a model yourself is more expensive than using a similarly capable model hosted by someone else unless you have extraordinary volume. Frontier-model providers like Anthropic and OpenAI serve extraordinarily large volumes, keeping their compute almost always near max capacity. It&rsquo;s likely that the same won&rsquo;t be true for your fine-tuned, self-hosted model.</p>
<p>As an example, let&rsquo;s say I host Gemma 4 26B A4B on a single H100. I can rent a high-availability <a href="https://lambda.ai/instances" target="_blank" rel="noopener">H100</a> <a href="https://fireworks.ai/pricing" target="_blank" rel="noopener">GPU</a> <a href="https://www.baseten.co/pricing/" target="_blank" rel="noopener">instance</a> at $0.0833 a minute, or $44,000 a year. Assuming a coding-agent-like workload,<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> that would buy about 96 billion <a href="https://platform.claude.com/docs/en/about-claude/pricing#:~:text=%2475%20/%20MTok-,Claude%20Sonnet%205,%2410%20/%20MTok,-Claude%20Sonnet%204.6" target="_blank" rel="noopener">Sonnet 5</a> tokens, and Sonnet 5 is a much more capable model. To break even, this fine-tuned model would need to serve about 182,000 tokens per minute, 24/7, throughout the year.</p>
<p>It might be possible to serve that many tokens. The hard part is finding enough demand for one task to keep the model busy, and that demand needs to be relatively smooth. If the model sits idle, you&rsquo;re still paying for it. If demand spikes, you either rent a second GPU or accept worse performance for users.</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>I&rsquo;m not arguing against self-hosting in general. Self-hosting (either literally on your organization&rsquo;s own hardware or by renting hardware and serving open-weights models on it with open source software) can be quite cost-effective at sufficient scale. If you know that a <em>lot</em> of traffic will go through that endpoint, do the same napkin math shown above and see if you can save some money. What I&rsquo;m particularly arguing against is that it&rsquo;s a good idea to self-host a model <em>that can only do one thing</em>. Unless you serve an extraordinary amount of traffic that does that task specifically, the payoff is not there.</p>
</div>
</div>
<h3 id="and-you-must-host">&hellip;and you must host
</h3>
<p>The other suggestion here is that, if the model is small enough, users who need to do the task can just download the weights and run it on their laptop or a dedicated workstation.</p>
<p>The effectiveness of this argument depends on the kind of task to be done. However, it&rsquo;s worth considering the potential for this to be a very unpleasant user experience compared to just using a model that someone else hosts. For example, let&rsquo;s say my colleague does some task for an hour every week and there&rsquo;s some model small enough to run on my laptop that&rsquo;s capable of doing the task. In order to use the model for that task, my colleague would need to download the 4GB or 8GB or 100GB or whatever of weights. That user would also need to be capable of configuring the serving of the model, and they&rsquo;d need to make that happen every time they started the task. If that model was accessed through a tool that the user was using regularly anyway&mdash;Claude Code pointed at a local ollama model, for instance&mdash;they&rsquo;d need to remember to switch the model over in the application&rsquo;s settings. If that model was accessed through a different interface, the user would need to use a different interface than they normally use LLMs with for that task specifically. Neither of these are good UX.</p>
<p>Even if the software for locally serving models got <em>much</em> more pleasant than it currently is, it&rsquo;s hard to compete with the experience of pay-as-you-go for the Everything Tool that wraps the Everything Model.</p>
<h2 id="your-fine-tune-will-quickly-fall-behind">Your fine-tune will quickly fall behind
</h2>
<p>Let&rsquo;s say you successfully fine-tune a model based on some fictional model Kuen 3. Then, the following week, Kuen 3.5 is released. 3 of the 100 most capable LLM scientists on this planet worked on it. It&rsquo;s almost as good as your fine-tune on that specific task, and it&rsquo;s also broadly capable at a very broad array of tasks.</p>
<p>Fine-tuning is not a boat that is lifted by the rising tide of broader AI progress&mdash;in order to take advantage of the Kuen 3.5 release with your fine-tune, you&rsquo;d need to restart that process of choosing parameters and observing fine-tuning runs. The underlying architecture of the model may have changed, and thus the approaches that you used to fine-tune Kuen 3 might not work for Kuen 3.5 on your first try.</p>
<h2 id="what-you-should-do-instead">What you should do instead
</h2>
<p>Instead, the boat that is lifted by a rising tide in this context is plain old prompt engineering. (POPE, as <a href="https://github.com/jcheng5" target="_blank" rel="noopener">Joe Cheng</a> calls it.) Choose a model that&rsquo;s available to you, that fits your price point, and seems broadly capable across a wide variety of public benchmarks. (Extra points if the vibes on the model from people you trust are good, and extra points if someone else is serving it.)</p>
<p>Then, put together a short prompt telling the model how to do the task, perhaps inside of some coding agent harness like Claude Code (or, hey, <a href="https://assistant.posit.co/" target="_blank" rel="noopener">Posit Assistant</a>), and see what it does. Adjust the prompt to tell it how to do things correctly that it tends to trip up on, and iterate from there. If you&rsquo;ve already put together an evaluation as part of your fine-tuning process, you could even reuse that! My colleague Sara and I have written about prompt engineering in the past if you&rsquo;re interested in learning more, once about the more specific task of POPE for <a href="https://posit.co/blog/custom-chat-app" target="_blank" rel="noopener">teaching LLMs about R packages</a> but in relatively generalizable ways, and once focused on <a href="https://opensource.posit.co/blog/2026-07-03_ai-newsletter/" target="_blank" rel="noopener">deciding between the popular ways to deliver context to coding agents</a>.</p>
<h2 id="recent-past-newsletters">Recent past newsletters
</h2>
<ul>
<li><a href="https://opensource.posit.co/blog/2026-08-14_ai-newsletter">How to choose a model</a></li>
<li><a href="https://opensource.posit.co/blog/2026-07-31_ai-newsletter">Keep track of your data exploration with Posit Assistant&rsquo;s EDA log</a></li>
</ul>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 !text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Various technical details might mean this is an order of magnitude or two off. Regardless, the larger point stands that a single fine-tuning run is not the expensive part of deploying a fine-tuned model.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Meaning around 90% of tokens are cached input, 9% of tokens are uncached input, and 1% of tokens are output.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-09-04_ai-newsletter/images/hero.png" length="182577" type="image/png" />
    </item>
    <item>
      <title>AI Newsletter: How to choose a model</title>
      <link>https://opensource.posit.co/blog/2026-08-14_ai-newsletter/</link>
      <pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-08-14_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<div class="callout callout-note" role="note" aria-label="Note">
<div class="callout-body">
<p><strong>Subscribe to the AI Newsletter!</strong></p>
<p>The AI newsletter is published as an RSS feed. Follow it in your favorite reader:</p>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 !text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
<p><strong>Want the newsletter as an email?</strong> Paste the feed URL — <a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener">https://opensource.posit.co/tags/ai-newsletter/index.xml</a> — into a free RSS-to-email service such as <a href="https://blogtrottr.com/" target="_blank" rel="noopener">Blogtrottr</a>, <a href="https://feedrabbit.com/" target="_blank" rel="noopener">Feedrabbit</a>, or <a href="https://follow.it/" target="_blank" rel="noopener">Follow.it</a>, and each new issue will arrive in your inbox.</p>
</div>
</div>
<br>
<p>How do you know which model to use and when? Often, it&rsquo;s not a question of which model is best, but of which model suits your task and needs at a given time. You might switch between models for different projects (package development vs. data analysis), or even within a single project (planning vs. implementation). Different tasks require a different mix of cost, token usage, speed, intelligence, and capabilities.</p>
<p>If you want our most durable, high-level advice: <strong>start with the most expensive model you have access to from either OpenAI or Anthropic.</strong><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Then, once you have a sense of the &ldquo;ceiling,&rdquo; try less expensive models and see how they compare. Developing a feel for what&rsquo;s possible with LLMs will help you make better decisions about trade-offs.</p>
<p>That said, we&rsquo;ll try to tackle this question more thoroughly in this post.</p>
<h2 id="the-model-landscape">The model landscape
</h2>
<p>Currently, Anthropic and OpenAI set the bar for AI capabilities. Google is often discussed as a third frontier lab, though its current model lineup is less competitive.</p>
<p>Anthropic and OpenAI each release a &ldquo;family&rdquo; of models: Claude and GPT, respectively. The most capable models in both families are also the slowest and most expensive. Conversely, the least capable models are the cheapest and quickest. Other labs tend to follow this same pattern, releasing a set of models with different trade-offs along the cost-performance curve.</p>
<p>Models within a given family tend to share a similar shape of intelligence, with related capabilities (relative to model size), shortcomings, and idiosyncrasies. For example, Claude Fable 5, Claude Opus 5, and Claude Sonnet 5 often use the same turns of phrase and are quite good at writing code and debugging it. Models from different families can have different shapes of intelligence even when their benchmark scores and prices are very similar. For example, GPT-5.6 Terra and Claude Sonnet 5 are priced similarly and comparably capable at agentic coding, but Terra doesn&rsquo;t &ldquo;see&rdquo; data visualizations as well as Sonnet, while Sonnet doesn&rsquo;t communicate as clearly as Terra.</p>
<p><strong>Other labs release models that score nearly as high as models from Anthropic and OpenAI on benchmarks. However, these evaluation scores can be deceiving.</strong> Labs can now train models to optimize for benchmarks (&ldquo;benchmaxxing&rdquo;). These models score well on benchmark-shaped tasks, which tend to be highly autonomous and &ldquo;tricky,&rdquo; but can fail to generalize to real-world tasks, which often involve more ambiguous requests. <a href="https://platform.kimi.ai/docs/guide/kimi-k3-quickstart" target="_blank" rel="noopener">Kimi K3</a> and <a href="https://z.ai/blog/glm-5.2" target="_blank" rel="noopener">GLM 5.2</a> offer a counterexample: they score well on benchmarks, and we&rsquo;ve also found them exceptionally well-rounded and intuitive. We recently <a href="https://opensource.posit.co/blog/2026-08-10_kimi-k3-glm-5-2-posit-ai/" target="_blank" rel="noopener">introduced both models to Posit AI</a>.</p>
<p><strong>In <a href="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/" target="_blank" rel="noopener">previous</a> <a href="https://opensource.posit.co/blog/2026-06-19_ai-newsletter/" target="_blank" rel="noopener">newsletters</a> and <a href="https://posit.co/blog/introducing-bluffbench" target="_blank" rel="noopener">blog posts</a>, we&rsquo;ve shared results from targeted evaluations. Here, instead, we offer an approximate and entirely vibes-based comparison of these model families&rsquo; characteristics.</strong></p>
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-08-14_ai-newsletter/images/model-landscape.png"
      alt="A comparison of Anthropic, OpenAI, and Google Gemini across agentic coding, vision, image generation, intuitiveness, cost effectiveness, latency, and communication style. The horizontal scale runs from a lower relative level on the left to a higher relative level on the right; higher is not necessarily better."  title="Although imprecise, vibes are an important part of evaluating models." 
      loading="lazy"
    ><figcaption class="text-sm text-center text-gray-500">Although imprecise, vibes are an important part of evaluating models.</figcaption>
  </figure></div>
</p>
<p>For data science applications broadly, you can loosely think of the relevant score as the average of the agentic coding and vision scores we&rsquo;ve assigned here. Beyond writing R and Python code, models need to be able to interpret plots accurately and faithfully.</p>
<h2 id="find-the-model-that-fits-your-task">Find the model that fits your task
</h2>
<p>Much of model choice is constrained by the models you have access to. Your organization may only allow a certain provider, or you might not want to pay multiple (possibly expensive!) subscriptions just to have access to all the top models.</p>
<p>If you do have your pick, however, here are some quick guidelines, partially shaped by what models are currently available through <a href="https://docs.posit.co/posit-ai/user/" target="_blank" rel="noopener">Posit AI</a>.</p>
<p><strong>The best open-weights model, especially for data analysis:</strong> <em>Kimi K3</em>.</p>
<p>As Simon wrote in the <a href="https://opensource.posit.co/blog/2026-08-10_kimi-k3-glm-5-2-posit-ai/" target="_blank" rel="noopener">Kimi K3 and GLM 5.2 in Posit AI announcement post</a>, &ldquo;Kimi K3 is currently the most capable open weights model out there. In our internal testing, it feels somewhere between Opus 5 and Fable 5, and is notably well-rounded compared to other open weights releases.&rdquo;</p>
<p>It also ranks near the top in <a href="https://github.com/posit-dev/bluffbench2" target="_blank" rel="noopener">bluffbench2</a> (13.46%, compared with 16.35% for the tied top scorers, Gemini 3.5 Flash and Claude Fable 5), which evaluates models&rsquo; abilities to spot subtle data quality issues in visualizations.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p><strong>A highly autonomous model for a complex coding or data task when cost and speed aren&rsquo;t a concern:</strong> <em>Claude Opus 5</em>, <em>Claude Fable 5</em>, or <em>GPT-5.6 Sol</em>.</p>
<p>These are the top-of-the-line models from Anthropic and OpenAI. They are expensive and relatively slow, but can be worth using for ambitious or highly autonomous work.</p>
<p><strong>A strong open-weights model for coding when you don&rsquo;t need vision:</strong> <em>GLM 5.2</em> (from <a href="https://z.ai/model-api" target="_blank" rel="noopener">Z.ai</a>).</p>
<p><a href="https://opensource.posit.co/blog/2026-08-10_kimi-k3-glm-5-2-posit-ai/" target="_blank" rel="noopener">&ldquo;GLM 5.2 excels at agentic coding and less so at data analysis tasks.&rdquo;</a> It is much less expensive than the proprietary models it resembles for coding tasks, but it <a href="https://docs.z.ai/guides/llm/glm-5.2" target="_blank" rel="noopener">does not natively support image inputs</a>.</p>
<p><strong>A middle-tier generalist for coding or data analysis:</strong> <em>Claude Sonnet 5</em> or <em>GPT-5.6 Terra</em>. Both are capable across coding and routine data analysis, support vision, and are less expensive than their respective labs&rsquo; higher-tier models.</p>
<p><strong>Good plot or image interpretation:</strong> One of the <em>Gemini 3.x Flash</em> models (<a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-3-7-flash/" target="_blank" rel="noopener">3.7 was released on August 13</a>).</p>
<p>This model series is particularly strong at vision and has performed well on <a href="https://github.com/posit-dev/bluffbench" target="_blank" rel="noopener">bluffbench</a> (3.5 Flash) and <a href="https://github.com/posit-dev/bluffbench2" target="_blank" rel="noopener">bluffbench2</a> (3.5 and 3.6 Flash).</p>
<p><strong>Fast answers from an Anthropic model for a task that is not particularly complex:</strong> <em>Claude Haiku 4.5</em>.</p>
<p><strong>Fast answers from an open-weights model for a task that is not particularly complex:</strong> <a href="https://posit.co/blog/gemma-4-new-budget-focused-model-posit-ai" target="_blank" rel="noopener"><em>Gemma 4</em></a>.</p>
<h2 id="assorted-notes-from-august-2026">Assorted notes from August 2026
</h2>
<p>In late summer 2026, a few developments feel notable, but, as with much in the AI world, who knows how long these observations will hold.</p>
<ul>
<li>
<p><strong>Google Gemini currently does not have any models that perform near the frontier.</strong> With the releases of Gemini 2.5 Pro (June 2025) and the Gemini 3 series (November 2025), Google seemed positioned as a third frontier lab. However, it&rsquo;s been quite a while since they released a frontier model, and they&rsquo;re now meaningfully behind. As of the time of writing, Google says Gemini 3.5 Pro is still testing with partners. Meanwhile, <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-6-flash-3-5-flash-lite-3-5-flash-cyber/" target="_blank" rel="noopener">the company has begun training Gemini 4 and says it is excited by the progress</a>.</p>
</li>
<li>
<p>For a year or so, it seemed like Anthropic was solidly ahead of OpenAI in agentic coding. However, <strong>since the Claude 4.6 releases, it has become less clear that Anthropic is meaningfully ahead of OpenAI</strong>. For one, Anthropic&rsquo;s current high-end models use newer tokenizers that, <a href="https://platform.claude.com/docs/en/about-claude/models/migration-guide#what-changed-5" target="_blank" rel="noopener">according to Anthropic, produce roughly 35% more tokens for the same text than their predecessors</a>. This means the same listed price per token does not necessarily translate to the same cost for comparable text. Further, in our experience, the Claude series has become increasingly token-hungry and difficult to communicate with. At the same time, OpenAI&rsquo;s models have a notably clear, concise communication style compared with the Claude 5 series. Anthropic is still likely ahead on autonomous, long-horizon coding, but OpenAI no longer feels behind for day-to-day software engineering and data science.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
</li>
<li>
<p><strong>There are now a number of balanced, well-rounded open-weights models relatively close to the closed-weights frontier.</strong> Kimi K3 and GLM 5.2, in particular, combine strong capabilities with a more pleasant, intuitive feel than their predecessors. While earlier open-weights models were just as close to the frontier in benchmark scores, some newer releases are notably more well-rounded and respond to prompts about as effectively as proprietary models. These releases are also priced at a steep discount compared with the proprietary models they most resemble.</p>
</li>
</ul>
<h2 id="recent-past-newsletters">Recent past newsletters
</h2>
<ul>
<li><a href="https://opensource.posit.co/blog/2026-07-31_ai-newsletter/">Keep track of your data exploration with Posit Assistant&rsquo;s EDA log</a></li>
<li><a href="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/">Which models are best at spotting subtle data quality problems?</a></li>
</ul>
<br>
<br>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>By &ldquo;access to,&rdquo; we mean either the most expensive model you can afford or the most expensive model that your organization allows you to use.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Kimi K3 supports <code>low</code>, <code>high</code>, and <code>max</code> reasoning levels. This run used <code>high</code>, its middle setting.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Notably, many of our colleagues are still using Claude Opus 4.6 as their daily driver. Despite being less capable than newer high-end Claude models on especially long-horizon work, the model is capable of day-to-day software engineering and is cheaper in practice. For example, <a href="https://platform.claude.com/docs/en/about-claude/pricing" target="_blank" rel="noopener">Opus 4.6 and Opus 5 have the same listed per-token price</a>, but Opus 4.6 predates <a href="https://platform.claude.com/docs/en/about-claude/models/migration-guide#migrating-from-claude-opus-46" target="_blank" rel="noopener">the newer tokenizer that can produce up to roughly 35% more tokens for the same text</a>. Many of our colleagues also find Opus 4.6 easier to communicate with.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-08-14_ai-newsletter/images/hero.png" length="468856" type="image/png" />
    </item>
    <item>
      <title>AI Newsletter: EDA log in Posit Assistant</title>
      <link>https://opensource.posit.co/blog/2026-07-31_ai-newsletter/</link>
      <pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://opensource.posit.co/blog/2026-07-31_ai-newsletter/</guid>
      <dc:creator>Sara Altman</dc:creator>
      <dc:creator>Simon Couch</dc:creator><description><![CDATA[<div class="callout callout-note" role="note" aria-label="Note">
<div class="callout-body">
<p><strong>Subscribe to the AI Newsletter!</strong></p>
<p>The AI newsletter is now published as an RSS feed. Follow it in your favorite reader:</p>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 !text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
<p><strong>Want the newsletter as an email?</strong> Paste the feed URL — <a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener">https://opensource.posit.co/tags/ai-newsletter/index.xml</a> — into a free RSS-to-email service such as <a href="https://blogtrottr.com/" target="_blank" rel="noopener">Blogtrottr</a>, <a href="https://feedrabbit.com/" target="_blank" rel="noopener">Feedrabbit</a>, or <a href="https://follow.it/" target="_blank" rel="noopener">Follow.it</a>, and each new issue will arrive in your inbox.</p>
</div>
</div>
<br>
[Posit Assistant](https://assistant.posit.co/) in Positron now includes an EDA log feature to help you keep track of exploratory analysis done with the agent.
<p><div class="not-prose"><figure>
    <img class="h-auto max-w-full rounded-lg"
      src="https://opensource.posit.co/blog/2026-07-31_ai-newsletter/images/eda-log-zoom.png"
      alt="Screenshot of Positron. On the left, Posit Assistant has analyzed a dataset of U.S. language speakers, showing a bar chart and written findings. On the right, the EDA Log opens in an editor tab titled &ldquo;ACS language speakers&rdquo;: a table with Area, Status, and Notes columns lists three areas—&ldquo;Dataset structure &amp; quality&rdquo; and &ldquo;Top languages nationwide&rdquo; marked Explored, and &ldquo;Language coverage across states&rdquo; marked Partial—each with bullet-point findings and an arrow that links back to the conversation, followed by a &ldquo;Next steps&rdquo; section of suggested directions." 
      loading="lazy"
    >
  </figure></div>
</p>
<p>The log summarizes findings for different areas of exploration and keeps track of next steps. To use the log, run the <code>/eda-log</code> slash command after you&rsquo;ve started the EDA process.</p>
<h3 id="why-we-made-this">Why we made this
</h3>
<p>Exploratory data analysis, the open-ended orientation to your data that often comes before anything else, can be a branching, nonlinear process. There are many questions you can ask of your data, and new areas of inquiry can open with each question you ask. Because of this, it is often hard to keep track of what you&rsquo;ve looked into, where that code lives, and what you want to explore next.</p>
<p>Historically, the EDA process was limited by how quickly you could write code and interpret the output. Coding agents like Posit Assistant lift the first of those constraints. They can carry out EDA far faster than you can on your own, which can exacerbate the issue of keeping track of what you&rsquo;ve explored.</p>
<p>This speed also introduces a new problem: the point of EDA is typically for you, the human, to understand your data, but coding agents can produce output faster than you can absorb it. If the agent completes an analysis but you haven&rsquo;t understood the insights in the data, the exploration process hasn&rsquo;t really happened.</p>
<p>Posit Assistant already has various features that tackle this problem, including an exploratory mode of interaction where it runs shorter turns and stops more frequently to involve the user.</p>
<p>The EDA log is another lightweight tool for the same goal. It keeps a running summary of what you and Posit Assistant have explored, helping your understanding keep pace with the agent&rsquo;s and giving you a clearer picture of what&rsquo;s already been done.</p>
<h3 id="details">Details
</h3>
<p>Here&rsquo;s what the EDA log looks like in action:</p>
<script src="https://fast.wistia.com/player.js" async></script>
<script src="https://fast.wistia.com/embed/bu9ch5gqvx.js" async type="module"></script>
<style>wistia-player[media-id='bu9ch5gqvx']:not(:defined) { background: center / contain no-repeat url('https://fast.wistia.com/embed/medias/bu9ch5gqvx/swatch'); display: block; filter: blur(5px); padding-top:60.42%; }</style>
<p><wistia-player media-id="bu9ch5gqvx" aspect="1.6551724137931034"></wistia-player></p>
<p>At a high level:</p>
<ul>
<li>When you run <code>/eda-log</code>, Posit Assistant will create a log for the exploration done in the conversation so far. The log then opens in the editor area in Positron.</li>
<li>The underlying logs are stored as YAML files in <code>.posit/assistant/eda-logs/</code>, next to where plans are stored.</li>
<li>Posit Assistant is instructed to loosely keep the log up to date as the conversation progresses, but you can also manually trigger an update at any time with the &ldquo;Refresh&rdquo; button.</li>
<li>Clicking the arrow next to an area scrolls you back to the spot in the conversation where that insight originated, so you can revisit the code and context that produced it.</li>
<li>Suggested next steps appear as clickable text. Clicking one sends it to Posit Assistant as your next message.</li>
<li>The creation of an EDA log is always user-triggered. Posit Assistant will never create one on its own.</li>
<li>The feature is currently only in Positron, but will come to RStudio soon.</li>
</ul>
<h2 id="recent-past-newsletters">Recent past newsletters
</h2>
<ul>
<li><a href="https://opensource.posit.co/blog/2026-07-17_ai-newsletter/">Which models are best at spotting data quality problems?</a></li>
<li><a href="https://opensource.posit.co/blog/2026-07-03_ai-newsletter/">How to choose between AGENTS.md, skills, and MCP servers</a></li>
</ul>
<br>
<br>
<p><a href="https://opensource.posit.co/tags/ai-newsletter/index.xml" target="_blank" rel="noopener noreferrer" class="btn-shortcode inline-flex mb-5 mr-5 items-center px-4 py-3 text-sm leading-5 gap-2 rounded-lg bg-blue-400 text-white font-semibold align-middle hover:bg-blue-500 transition no-underline">Subscribe via RSS</a></p>
]]></description>
      <enclosure url="https://opensource.posit.co/blog/2026-07-31_ai-newsletter/images/hero.png" length="954735" type="image/png" />
    </item>
    <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>
