<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nicolai Bohn</title>
    <description>The latest articles on DEV Community by Nicolai Bohn (@nicolai_bohn_rhesis).</description>
    <link>https://dev.to/nicolai_bohn_rhesis</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3842808%2F5b6f6897-8d90-43e4-8a4a-1585c2787923.png</url>
      <title>DEV Community: Nicolai Bohn</title>
      <link>https://dev.to/nicolai_bohn_rhesis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nicolai_bohn_rhesis"/>
    <language>en</language>
    <item>
      <title>Auditable, observable, budgetable: what it takes to run AI agents in production</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Thu, 22 Oct 2026 16:34:05 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/auditable-observable-budgetable-what-it-takes-to-run-ai-agents-in-production-70o</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/auditable-observable-budgetable-what-it-takes-to-run-ai-agents-in-production-70o</guid>
      <description>&lt;p&gt;At &lt;a href="https://www.genaiberlin.com" rel="noopener noreferrer"&gt;GenAI Berlin&lt;/a&gt; I opened my talk with two questions for everyone building an agent:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is your agent ready for production, and for real customers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did it improve over the last two weeks, or did it only change?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The second one is the sharper question. Most teams change prompts, models and tools every week. Very few can say whether those changes made the agent better. This post is the written version of the talk: why agents get pulled back, how they fail, and the three properties that let you answer both questions with evidence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fenl6tg6fctokhlxz9joy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fenl6tg6fctokhlxz9joy.webp" alt="Nicolai Bohn speaking on stage at GenAI Berlin 2026, with the audience in the foreground" width="800" height="533"&gt;&lt;/a&gt; &lt;em&gt;At GenAI Berlin 2026. Photos: GenAI Berlin&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why agents get pulled back
&lt;/h2&gt;

&lt;p&gt;In May 2026, Gartner predicted that by 2027, &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2026-05-26-gartner-says-applying-uniform-governance-across-ai-agents-will-lead-to-enterprise-ai-agent-failure" rel="noopener noreferrer"&gt;40 % of enterprises will scale back or shut down autonomous AI agents&lt;/a&gt;, because governance gaps only show up after production incidents. A year earlier, Gartner had already forecast that over 40 % of agentic AI projects would be canceled by 2027 and named three reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;escalating costs,&lt;/li&gt;
&lt;li&gt;unclear business value,&lt;/li&gt;
&lt;li&gt;inadequate risk controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep those three in mind. Each one gets an answer by the end of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  An agent is a model inside a harness
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0j1ubo5bz9mhk2jn6v7v.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0j1ubo5bz9mhk2jn6v7v.webp" alt="An agent harness: the orchestration loop, model, instructions, tools and MCP servers, memory and context, sub-agents, and guardrails, each with a typical failure" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything in the blue box belongs to the harness: the orchestration loop that plans, calls tools and checks results, the model, the instructions, tools and MCP servers, memory and retrieved context, sub-agents, and guardrails with approvals.&lt;/p&gt;

&lt;p&gt;Every part can fail in its own way. The model gives a confident, wrong answer. A tool fails silently. Retrieval returns the wrong policy. A handoff between agents gets lost. An approval is skipped. The user only sees the response at the end, and most of these failures never show up there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways agents fail in production
&lt;/h2&gt;

&lt;p&gt;To make this concrete, picture an insurance assistant that answers coverage questions and files claims. The scenarios below are illustrative, built from patterns we see in real projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The requirement nobody checked
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdi4j7voxqy7bukoqc7hg.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdi4j7voxqy7bukoqc7hg.webp" alt="Sequence diagram: the assistant gets the Premium terms back, never looks up the customer's tier, and confirms coverage of up to 50,000 euros" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A customer asks whether a burst pipe is covered. The loop asks the model what to do, the model asks for the policy terms, and the search returns the Premium terms. The loop never calls the CRM tool to check which tier this customer is on. The model writes a fluent answer from the wrong terms: "Yes, up to €50,000." The customer is on Basic, capped at €5,000.&lt;/p&gt;

&lt;p&gt;No tool failed. The requirement, answer from the customer's own tier, was simply never checked.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A timeout that turns into a confirmation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft30g38dyfok10g4aljbj.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft30g38dyfok10g4aljbj.webp" alt="Sequence diagram: the claims tool times out and the assistant confirms a claim with an invented reference number" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This time the first half goes right: the loop checks the policy and gets the correct tier. Then the claims tool times out. The loop hands the timeout to the model as if nothing happened, and the model writes a confirmation with a reference number it made up. The customer waits for a payout that will never come.&lt;/p&gt;

&lt;p&gt;One rule in the harness would have stopped it: no confirmation without a claim ID from the claims system.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A correct answer at the wrong price
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvstnwc1vemhxuek8kcqx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvstnwc1vemhxuek8kcqx.webp" alt="Sequence diagram: the assistant reads the policy clause by clause, about 40 rounds with a growing context" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The answer is correct, so every quality test passes. But the assistant reads the policy clause by clause: around 40 rounds for one question, with every result appended to the context, so each round costs more than the last. One filtered search would have done the job. Only the cost per request and the trace reveal the problem, and nothing in the harness set a step limit or a budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is already happening
&lt;/h2&gt;

&lt;p&gt;These failure modes are not hypothetical. In July 2025, an AI coding agent at Replit &lt;a href="https://www.businessinsider.com/replit-ceo-apologizes-ai-coding-tool-delete-company-database-2025-7" rel="noopener noreferrer"&gt;deleted a production database during a code freeze&lt;/a&gt; and first claimed a rollback was impossible. A widely shared story describes &lt;a href="https://waxell.ai/blog/ai-agent-token-budget-enforcement" rel="noopener noreferrer"&gt;two agents looping for 11 days and spending about $47,000&lt;/a&gt;. No named company or post-mortem has been published for that one, but the pattern is real.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9mjzubi76d6qx9zx2eed.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9mjzubi76d6qx9zx2eed.webp" alt="Bar chart: 105 reported AI incidents and hazards in November 2022 and 702 in September 2026" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bigger picture points the same way. The &lt;a href="https://oecd.ai/en/incidents" rel="noopener noreferrer"&gt;OECD AI Incidents and Hazards Monitor&lt;/a&gt; counted 105 reported incidents and hazards in November 2022, the month ChatGPT launched, and 702 in September 2026. To be fair to the data: relative to all AI news, the incident rate is fairly stable. More AI in production simply means more incidents in absolute terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  From failure modes to properties
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr6poz502djes6rjd3pk6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr6poz502djes6rjd3pk6.webp" alt="Nicolai Bohn on stage at GenAI Berlin 2026, in front of a slide mapping Gartner's three reasons to auditable, observable and budgetable" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;At GenAI Berlin 2026, Humboldt Carré. Photo: GenAI Berlin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each of Gartner's three reasons has an answer, and each answer is a property your agent needs before it goes to real customers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz31jfq20crsvj8vn2bcl.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz31jfq20crsvj8vn2bcl.webp" alt="Three cards: auditable, observable and budgetable, each with the questions it answers" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Auditable: a paper trail from requirement to release
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7fjj8a56k1lt10wdlfi.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7fjj8a56k1lt10wdlfi.webp" alt="A pipeline from stakeholders to requirements, test sets, test runs and release, with every step recorded in an audit log" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Requirements come from several stakeholders: the product team, domain experts such as underwriters or claims handlers, regulators and customers. They are written down and versioned. Test sets are linked to each requirement, every agent version runs against them, and the release decision is made on pass rates, with a sign-off.&lt;/p&gt;

&lt;p&gt;Every step lands in an audit log: who tested which version, with what result, and who approved the release. That log is your evidence for the release meeting, for an auditor, or for a court. It also answers the second question from the opening, because you can compare pass rates per requirement across versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observable: see what happens under the hood
&lt;/h3&gt;

&lt;p&gt;A passing test checks the output. The path the agent took to get there stays hidden. In the claims example, the final message sounded perfectly fine; only the trace shows the timeout.&lt;/p&gt;

&lt;p&gt;Observability for agents means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tracing every step, tool call and handoff, ideally with OpenTelemetry as the open standard,&lt;/li&gt;
&lt;li&gt;evaluating the trace, beyond the final answer,&lt;/li&gt;
&lt;li&gt;making agent-to-agent messages visible, so you can see whether handoffs worked,&lt;/li&gt;
&lt;li&gt;alerting when behavior drifts from what was tested, and catching loops and retry storms early.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Budgetable: know what it costs, and cut it safely
&lt;/h3&gt;

&lt;p&gt;Before release, set a budget per task and experiment with the model, the prompt, step limits and context size, while rerunning the same tests so quality holds. In production, track cost per agent, tool and user flow, set hard caps per session, and feed the cost drivers back into your experiments.&lt;/p&gt;

&lt;p&gt;The $47,000 loop is the counterexample: the team could see the bill, but had nothing in place to stop it. And the cost data comes from the same traces you built for observability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The insurance assistant, fixed
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdejhoembvgizyh6ca924.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdejhoembvgizyh6ca924.webp" alt="The same insurance assistant with all three properties: tier looked up first, claim confirmed only with an ID, every requirement checked on the trace" width="800" height="549"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figures are illustrative.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here is the same assistant with all three properties in place. Three requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R1:&lt;/strong&gt; answer from the customer's own tier,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R2:&lt;/strong&gt; confirm a claim only with an ID,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R3:&lt;/strong&gt; stay under €0.10 per request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The loop looks up the tier first, so the coverage answer matches. The claim is confirmed only after the claims tool returns an ID. And each requirement is checked on the trace, lined up with the step it verifies. The whole conversation stays within budget: four tool calls, seven cents, and the trace stored in the audit log.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the three only work together
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6c4x3igmg7lbzrkkm5e.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6c4x3igmg7lbzrkkm5e.webp" alt="Auditable, observable and budgetable connected in a cycle, with every optimization going back through the tests before release" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tests against requirements decide the release. Traces from production show where behavior drifts and where the money goes. And every cost optimization, a smaller model or a shorter prompt, goes back through the tests before it ships.&lt;/p&gt;

&lt;p&gt;We're not the only ones arguing for this loop. Anthropic's engineering guide &lt;a href="https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents" rel="noopener noreferrer"&gt;Demystifying evals for AI agents&lt;/a&gt; (January 2026) makes the same point: offline evals need to be combined with production monitoring, A/B testing and human review, so problems don't only surface in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back to the two questions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Why projects fail&lt;/th&gt;
&lt;th&gt;The answer&lt;/th&gt;
&lt;th&gt;The evidence you can show&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unclear business value&lt;/td&gt;
&lt;td&gt;Auditable&lt;/td&gt;
&lt;td&gt;Pass rates per requirement and version, with a sign-off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inadequate risk controls&lt;/td&gt;
&lt;td&gt;Observable&lt;/td&gt;
&lt;td&gt;Every step, tool call and handoff in the trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalating costs&lt;/td&gt;
&lt;td&gt;Budgetable&lt;/td&gt;
&lt;td&gt;Cost per request, and a cheaper setup that still passes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Is your agent ready for release? Is it better than two weeks ago? With these three in place, you can answer both, with evidence instead of a gut feeling.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Rhesis helps
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://rhesis.ai" rel="noopener noreferrer"&gt;Rhesis&lt;/a&gt; is an open-source platform for exactly this, self-hosted or on Rhesis Cloud.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;In Rhesis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rhesis.ai/platform/verifiable" rel="noopener noreferrer"&gt;Auditable&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Test sets generated from requirements, pass rates per version, sign-off, audit log on Enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rhesis.ai/platform/observable" rel="noopener noreferrer"&gt;Observable&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;OpenTelemetry tracing across agents and handoffs, expert reviews on traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rhesis.ai/platform/budgetable" rel="noopener noreferrer"&gt;Budgetable&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Experiments against a baseline, with model overrides per run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you want to see how this works with a real multi-agent example, read the companion post &lt;a href="https://rhesis.ai/post/tdd-for-ai-agents" rel="noopener noreferrer"&gt;Test-driven development for AI agents: from red-green to production&lt;/a&gt;, or try Rhesis on &lt;a href="https://github.com/rhesis-ai/rhesis" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to the GenAI Berlin team for having me, and to everyone who stayed for the questions afterwards.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://rhesis.ai/post/auditable-observable-budgetable" rel="noopener noreferrer"&gt;rhesis.ai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>trustworthyai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Human vs. automated evals: who should judge your AI agent?</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Thu, 15 Oct 2026 13:19:07 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/human-vs-automated-evals-who-should-judge-your-ai-agent-1ncf</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/human-vs-automated-evals-who-should-judge-your-ai-agent-1ncf</guid>
      <description>&lt;p&gt;Once the first prototype works, someone asks who is going to check all of this. The honest answer sounds like a lot of manual work: deciding what good means, pulling in domain experts, labeling outputs, reading failures, and doing it all again after every change. Many teams hope the AI will take that off their plate. Mostly it won't, and teams that skip the work end up shipping an agent nobody can vouch for.&lt;/p&gt;

&lt;p&gt;Netflix is a useful reality check. Their team runs an LLM judge over hundreds of thousands of recommendation explanations a week, and it still started with people (&lt;a href="https://arxiv.org/abs/2608.18300" rel="noopener noreferrer"&gt;Kong et al., 2026&lt;/a&gt;). Experts defined the criteria, wrote the labeling guidelines and handcrafted hard examples. Before launch, the benchmark held roughly 900 human-labeled explanations. After launch, about 300 freshly rated ones are added every week to catch the judge drifting.&lt;/p&gt;

&lt;p&gt;The manual part doesn't go away. It moves from writing test cases to reviewing verdicts, and that is where you can take the volume off your experts.&lt;/p&gt;

&lt;p&gt;The two approaches are good at different things. A domain expert can tell you an answer is wrong for your business. Automation can run thousands of conversations overnight. This post puts them side by side, shows where each one breaks, how they feed each other, and then walks through the loop in Rhesis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmlujmzr53umfxdvx5cnu.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmlujmzr53umfxdvx5cnu.webp" alt="Human evals and automated evals compared on what they know about, what they are strong at, where their criteria come from, volume, what they miss and what they cost" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The case for human evals
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The context only lives in your organization.&lt;/strong&gt; Generic metrics like helpfulness, toxicity or faithfulness tell you little about whether your travel agent got &lt;em&gt;your&lt;/em&gt; fare rules right. Say it tells a customer they can cancel for free up to 24 hours before departure, and the policy says 48. The answer is fluent, polite and grounded in a fare document. It is also wrong, and the only people who know that sit in your operations team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Experts are fast at spotting.&lt;/strong&gt; Show someone from customer operations ten transcripts and they find the one with last season's baggage allowance within seconds. Hamel Husain recommends making a single &lt;a href="https://hamel.dev/blog/posts/llm-judge/" rel="noopener noreferrer"&gt;principal domain expert&lt;/a&gt; the source of truth, with a binary pass or fail for every output and a written critique explaining why. The critique matters as much as the verdict, because it is what you later turn into a metric.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criteria come from looking at outputs.&lt;/strong&gt; You can't write the full rubric upfront. Shankar et al. call this &lt;a href="https://arxiv.org/abs/2404.12272" rel="noopener noreferrer"&gt;criteria drift&lt;/a&gt;: people only work out their criteria while grading, and they keep refining them as they see more outputs. A rubric written before anyone read a transcript is a first guess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it breaks:&lt;/strong&gt; experts are slow, expensive and busy. Asking them to come up with 200 test cases by hand doesn't work, and asking them to re-read every conversation after each prompt change works even less.&lt;/p&gt;

&lt;p&gt;Ye Yuan ran into exactly this building a customer service bot across travel, healthcare, education, legal services and more (&lt;a href="https://datasciencexai.substack.com/p/ai-evals-in-the-real-world-human" rel="noopener noreferrer"&gt;Data Science x AI, 2026&lt;/a&gt;). Generic NLP metrics couldn't capture multi-turn quality, so the team built its own rubric, benchmarked against their best human sales and support conversations. The first bottleneck was annotation capacity. Training and calibrating annotators was slow and expensive, and the gold dataset stayed too small.&lt;/p&gt;

&lt;h2&gt;
  
  
  The case for automated evals
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;They can explore an agent without being told anything.&lt;/strong&gt; Point an automated tester at an endpoint and it can probe the domain, map what the agent can do, and find where it refuses or redirects. No requirements document needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They run adversarial tests at scale.&lt;/strong&gt; Jailbreaks, prompt injection and multi-turn pressure need volume and variation. Covering the OWASP Top 10 for LLMs and agentic applications by hand isn't realistic. Generating and running those attacks is exactly what automation is for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They check requirements once you hand them over.&lt;/strong&gt; Every run, every model swap, every prompt change, in CI. A human reviewer gets tired by the fortieth conversation. A metric doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it breaks:&lt;/strong&gt; the devil lies in the details. LLM judges tend to be lenient, struggle with partially correct answers, and are sensitive to how the judging prompt is worded (&lt;a href="https://arxiv.org/abs/2406.12624" rel="noopener noreferrer"&gt;Thakur et al., "Judging the Judges"&lt;/a&gt;). They miss the small, off-by-one-detail errors an expert catches immediately: 24 hours instead of 48. And agreement rates hide the problem. If only 5% of outputs fail, a judge that passes everything agrees with your expert 95% of the time and catches none of the failures.&lt;/p&gt;

&lt;p&gt;Ye Yuan saw the same in production. LLM judges struggled with pragmatics, implied meaning and a user simply going quiet, with noticeable score variance between runs. Synthetic test conversations also missed the ambiguity and the emotional and topical shifts of real user traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the two feed each other
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8hclcl8ylte0gpdvnzb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8hclcl8ylte0gpdvnzb.webp" alt="Illustrative comparison of where domain experts and automated evals are strong, from defining what good looks like to re-checking on every change, with four practitioner findings below" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Experts are good at recognizing problems and bad at producing volume. Automation is the reverse. So the useful question isn't which one to pick, it's which part of the work goes where.&lt;/p&gt;

&lt;p&gt;The expert's job shifts from writing test cases to reviewing and correcting verdicts. Reviewing a pass or fail with one sentence of explanation takes seconds. Writing a good test case from scratch takes minutes, and writing 200 of them doesn't happen.&lt;/p&gt;

&lt;p&gt;Ye Yuan's team landed on a similar loop: automated evals at scale, human spot checks, manual review of every low-scoring dialogue, and failure patterns fed back into the next iteration. In practice it looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automation explores the agent and generates a first test set.&lt;/li&gt;
&lt;li&gt;An expert reviews a sample and leaves a pass or fail plus a comment.&lt;/li&gt;
&lt;li&gt;Where the expert and the judge disagree, those cases are used to tune the metric.&lt;/li&gt;
&lt;li&gt;The tuned metric runs automatically on every change.&lt;/li&gt;
&lt;li&gt;The expert only looks at conflicts and new kinds of failure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You need less human input than it sounds. Anthropic suggests &lt;a href="https://anthropic.com/engineering/demystifying-evals-for-ai-agents" rel="noopener noreferrer"&gt;starting with 20 to 50 tasks&lt;/a&gt; drawn from real failures. Hamel Husain starts with around 30 examples and keeps going until no new failure modes show up, then aims for about 100 labeled examples per failure mode to check a judge against the expert. Netflix keeps adding around 300 ratings a week because live traffic keeps changing. That is a few hours of expert time, not a quarter of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation runs the tests, experts make the call
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8lr1xm30gqygkd1hqntg.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8lr1xm30gqygkd1hqntg.webp" alt="The demo loop in Rhesis: the Architect explores and tests the agent automatically, then an expert reviews the results and makes the call, with every review sharpening the next run" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the video, I point &lt;a href="https://github.com/rhesis-ai/rhesis" rel="noopener noreferrer"&gt;Rhesis&lt;/a&gt; at a travel agent with no requirements, let it explore and test the agent, and then review the results as the domain expert.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Architect explores the endpoint.&lt;/strong&gt; In quick or comprehensive mode, it probes the domain, maps capabilities and finds where the agent refuses or redirects, starting from zero. The &lt;a href="https://docs.rhesis.ai/docs/architect/exploration" rel="noopener noreferrer"&gt;exploration docs&lt;/a&gt; cover both modes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Architect plans and runs a suite.&lt;/strong&gt; From what it found, it proposes requirements, metrics and test sets, and waits for approval before creating anything. I add one requirement myself: cancellation terms must match the fare rules. In the run, the cancellation test passes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The expert reviews the results.&lt;/strong&gt; &lt;a href="https://docs.rhesis.ai/docs/annotations" rel="noopener noreferrer"&gt;Annotations&lt;/a&gt; can sit on a whole test result, a single metric or a single turn of a conversation, each with a pass or fail and a comment. I fail the cancellation metric and write why: the fare rules say 48 hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The human verdict wins.&lt;/strong&gt; The expert's verdict now counts as the result. The automated one stays on record, and Rhesis flags the disagreement as a status conflict, so the team sees where the judge and the expert part ways. When they agree, the result shows &lt;em&gt;Confirmed by&lt;/em&gt; with the reviewer's name, so over time you see which metrics people trust and which need work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All annotations collect in the Annotations hub under Improve, where you can filter by conflicts and fix the metrics that keep getting it wrong. Engineers can also read and write annotations through the SDK and MCP, so expert verdicts end up in the same place as CI results.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/IqcxuGl9Hss" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Let experts judge, let automation do the volume
&lt;/h2&gt;

&lt;p&gt;Neither approach is enough on its own. Automated evals without expert input pass fluent answers that are wrong for your business. Expert review without automation covers a few dozen conversations and stops. Put the expert where judgment is needed, and let automation handle the exploring, attacking and re-checking.&lt;/p&gt;

&lt;p&gt;Rhesis is open source. Try it on &lt;a href="https://app.rhesis.ai" rel="noopener noreferrer"&gt;app.rhesis.ai&lt;/a&gt; or self-host it from &lt;a href="https://gihub.com/rhesis-ai/rhesis" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>llmops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What are Jev-based evals?</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Wed, 14 Oct 2026 19:14:40 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/what-are-jev-based-evals-3b0f</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/what-are-jev-based-evals-3b0f</guid>
      <description>&lt;p&gt;There’s a lot of talk about Jev right now. The idea is simple. An LLM judge writes out a verdict and the reasoning behind it. Jev skips the writing. You give it a fixed set of labels, it picks one and tells you how sure it is. That makes it fast, cheap and easy to plug into a pipeline.&lt;/p&gt;

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

&lt;p&gt;We support Jev in Rhesis as of v0.18. You can pick it as the evaluation model on any categorical metric, like tone, intent or policy compliance. Your LLM judges keep handling the open-ended checks where the reasoning matters.&lt;/p&gt;

</description>
      <category>jev</category>
      <category>ai</category>
      <category>evals</category>
    </item>
    <item>
      <title>Agent cost optimization: same quality, lower price</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Wed, 07 Oct 2026 12:27:17 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/agent-cost-optimization-same-quality-lower-price-3jof</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/agent-cost-optimization-same-quality-lower-price-3jof</guid>
      <description>&lt;p&gt;Most teams pick their agent's model while prototyping. It works, it ships, and nobody touches it again. Meanwhile cheaper models come out every few weeks.&lt;/p&gt;

&lt;p&gt;Switching sounds easy until someone asks whether the new model will handle your refund policy questions as well as the old one. Nobody knows. There is no test set to run it against, so the team stays on the old model, and the bill stays where it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhc749ajumo8iio3kx0bk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhc749ajumo8iio3kx0bk.webp" alt="Your agent's cost is a design decision" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Breaking that loop takes two things: knowing what a single run of your agent costs, and a safe way to compare one setup against another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the money goes
&lt;/h2&gt;

&lt;p&gt;Cost is tokens times price, summed over every LLM call your agent makes. Four levers decide how big that number gets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8ojzoni4xr0rtw2kxld.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8ojzoni4xr0rtw2kxld.webp" alt="Four levers decide what a run costs" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model.&lt;/strong&gt; Price per token can differ by an order of magnitude between model tiers. For most agents this is the biggest lever. Test it by swapping the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt and context.&lt;/strong&gt; The system prompt and any retrieved context are sent again on every call. A 3,000-token system prompt in a ten-turn conversation is 30,000 input tokens before the user has said much at all. Test it by shortening the prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent steps.&lt;/strong&gt; Every tool call or reasoning step is another LLM call, and conversations carry their history forward. An agent that takes six steps where two would do pays for it on every request. Test it by capping the steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caching.&lt;/strong&gt; Many providers bill cached input tokens at a lower rate. Keeping the start of your prompt stable lets you benefit from that. Test it by keeping prefixes stable and comparing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheaper only counts if quality holds
&lt;/h2&gt;

&lt;p&gt;A cost number on its own tells you very little. If v2 costs half as much but fails a third of your cancellation tests, you haven't saved anything. You've moved the cost to your support team.&lt;/p&gt;

&lt;p&gt;So look at pass rate and cost together, on the same test set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wsblaz20hucv3s7mh65.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wsblaz20hucv3s7mh65.webp" alt="Cheaper only counts if quality holds" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That gives you four outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cheaper, same or better quality:&lt;/strong&gt; promote it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More expensive, better quality:&lt;/strong&gt; decide whether the gain matters to your users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheaper, lower quality:&lt;/strong&gt; check which behaviors failed. A prompt tweak may win the quality back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More expensive, lower quality:&lt;/strong&gt; roll it back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Change one thing, compare side by side
&lt;/h2&gt;

&lt;p&gt;The method is plain experimentation. Change one variable at a time so you know what caused the difference.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffxkaip6bcfs22dqer6tp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffxkaip6bcfs22dqer6tp.webp" alt="Change one thing, compare side by side" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Save a baseline.&lt;/strong&gt; v1 is your current setup: model, prompt and temperature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vary one parameter.&lt;/strong&gt; v2 swaps the model. v3 keeps the model and trims the prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the same tests&lt;/strong&gt; against each version, with the same metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare the runs&lt;/strong&gt; on pass rate and cost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a support agent this could look like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;System prompt&lt;/th&gt;
&lt;th&gt;What you're testing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;your current model&lt;/td&gt;
&lt;td&gt;full prompt&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v2&lt;/td&gt;
&lt;td&gt;a smaller model&lt;/td&gt;
&lt;td&gt;full prompt&lt;/td&gt;
&lt;td&gt;does the cheaper model hold up?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3&lt;/td&gt;
&lt;td&gt;your current model&lt;/td&gt;
&lt;td&gt;trimmed prompt&lt;/td&gt;
&lt;td&gt;how much does the prompt cost you?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How this works in Rhesis
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/rhesis-ai/rhesis" rel="noopener noreferrer"&gt;Rhesis&lt;/a&gt; is an open-source platform for testing LLM apps and agents. We recently added cost tracking to test runs, and it pairs well with Experiments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every test run shows its tokens, cost and model&lt;/strong&gt; in the runs list. You can sort by cost to find your most expensive runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each run has a Cost card&lt;/strong&gt; with input and output tokens priced separately. It updates live while the run executes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqupxy327d8jvujjr2r40.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqupxy327d8jvujjr2r40.webp" alt="Test run summary with the Cost card next to pass rate" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Experiments store configurations as versions.&lt;/strong&gt; A parameter schema defines the slots (model, prompt, temperature), and every change becomes an immutable version, so a run against v2 is reproducible later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side-by-side comparison&lt;/strong&gt; shows pass rate and cost with deltas against the baseline. The cost delta turns green when the new run was cheaper.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Costs are calculated from the tokens each LLM call reports, multiplied by list prices from LiteLLM's model database. That makes them a good relative comparison. They don't include discounts or committed-use pricing, and models missing from the database show tokens without a cost. Details are in the &lt;a href="https://docs.rhesis.ai/docs/tracing/costs" rel="noopener noreferrer"&gt;token costs docs&lt;/a&gt; and the &lt;a href="https://docs.rhesis.ai/docs/experiments" rel="noopener noreferrer"&gt;experiments docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's the walkthrough:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WKrWp8bYENs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Rhesis is MIT-licensed. You can use it at &lt;a href="https://app.rhesis.ai" rel="noopener noreferrer"&gt;app.rhesis.ai&lt;/a&gt; or self-host it from &lt;a href="https://github.com/rhesis-ai/rhesis" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're running cost experiments on your own agents, I'd like to hear which lever saved you the most. Let me know in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://rhesis.ai/post/agent-cost-optimization" rel="noopener noreferrer"&gt;Rhesis blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llmops</category>
      <category>programming</category>
    </item>
    <item>
      <title>What are Jev evals? How they work and how they compare to LLM-as-a-judge</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Tue, 06 Oct 2026 13:14:40 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/what-are-jev-evals-how-they-work-and-how-they-compare-to-llm-as-a-judge-34h</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/what-are-jev-evals-how-they-work-and-how-they-compare-to-llm-as-a-judge-34h</guid>
      <description>&lt;p&gt;Evaluating agents with Jev has become one of the most discussed ideas in AI testing over the past few weeks. The appeal is easy to see: a verdict in milliseconds, for a fraction of what an LLM judge costs. Rhesis now supports Jev as a model provider for evaluation, so you can put it behind your categorical metrics today.&lt;/p&gt;

&lt;p&gt;This post explains what Jev is and how it compares to an LLM judge. There's a demo video at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Jev is
&lt;/h2&gt;

&lt;p&gt;Jev is a "System One" model from &lt;a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev" rel="noopener noreferrer"&gt;TypeSafe AI&lt;/a&gt;, released in September 2026. The name borrows from Kahneman's fast, intuitive System 1. Jev makes decisions and never generates text. You get no prose out of it, only typed values with probabilities attached.&lt;/p&gt;

&lt;p&gt;A call has two parts. The state is whatever you want judged, as plain text or JSON. Alongside it you send a set of typed questions, and Jev answers all of them together in one parallel pass.&lt;/p&gt;

&lt;p&gt;Take a support ticket that reads "I was charged twice for order A-104. Please refund the duplicate." You could ask Jev three questions about it at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choice&lt;/strong&gt;, &lt;code&gt;department&lt;/code&gt;: billing, technical or sales? Jev picks one of up to 255 options and returns a probability for each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score&lt;/strong&gt;, &lt;code&gt;frustration&lt;/code&gt;: where does the customer sit on a scale from calm to very angry? A scale can have between two and ten levels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noul&lt;/strong&gt;, &lt;code&gt;refund_requested&lt;/code&gt;: is a refund being asked for? This is a yes/no question, answered as a probability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://docs.typesafe.ai/concepts/system-one" rel="noopener noreferrer"&gt;System One concept page&lt;/a&gt; in TypeSafe's docs explains these three primitives in more detail.&lt;/p&gt;

&lt;p&gt;Pricing is $0.042 per million input tokens, and output is free. According to TypeSafe, a call takes 70 to 500 ms end to end. For a hands-on walkthrough with code, the &lt;a href="https://dev.to/valyuai/how-to-use-jev-a-practical-guide-to-typesafes-system-one-model-g5e"&gt;practical guide from Valyu on DEV&lt;/a&gt; is the best place to start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50j9k8wd007ye5ed2poe.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50j9k8wd007ye5ed2poe.webp" alt="A Jev call: a support ticket as state, three typed questions answered in one parallel pass, and the typed answers with their probabilities" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it differs from an LLM judge
&lt;/h2&gt;

&lt;p&gt;An LLM judge reads a rubric written in plain language. It returns a score or a category, usually with written reasoning that explains the verdict. That flexibility is why it works for any kind of metric. It also has a cost. Each call takes seconds, and you pay for every output token, reasoning included.&lt;/p&gt;

&lt;p&gt;Jev takes a question with fixed answer options. It returns one of those options with a probability for each, and nothing else. Since there is no explanation to fall back on, the option names have to carry the meaning on their own. The price difference is largest where inputs are long. Output is free, so a long conversation costs you only its input tokens. The &lt;a href="https://www.mindstudio.ai/blog/jev-pricing-api-credits" rel="noopener noreferrer"&gt;MindStudio post on Jev pricing&lt;/a&gt; compares this with using a general-purpose LLM for the same kind of decision, and shows the gap growing as inputs get longer.&lt;/p&gt;

&lt;p&gt;Jev has real limits, and you should know them before you rely on it. It reads negations literally, so "the agent did not avoid the topic" lands at face value. It can't count or do math. It gives you no written rationale, which makes a surprising verdict harder to debug. The &lt;a href="https://dev.to/valyuai/how-to-use-jev-a-practical-guide-to-typesafes-system-one-model-g5e#the-failure-modes-read-this-before-you-ship"&gt;failure modes section of the Valyu guide&lt;/a&gt; covers these with examples. On the plus side, its probabilities are calibrated, so a high probability really does mean a more reliable answer. &lt;a href="https://www.datacamp.com/blog/system-one-models-jev" rel="noopener noreferrer"&gt;DataCamp's explainer&lt;/a&gt; describes how TypeSafe trains for that.&lt;/p&gt;

&lt;p&gt;My rule of thumb: use Jev when the verdict is one of a few known outcomes, and use an LLM judge when you need a numeric score or an explanation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0yhxwwpe50pv0hma6eqk.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0yhxwwpe50pv0hma6eqk.webp" alt="Jev vs. an LLM judge: input, output, speed, price, what to watch out for and where each works in Rhesis" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Jev in Rhesis
&lt;/h2&gt;

&lt;p&gt;Jev is a new model provider in Rhesis. It does not add a new metric type. It is evaluation-only and works only with categorical metrics, the ones built on &lt;code&gt;CategoricalJudge&lt;/code&gt;. Rhesis won't let you pick it for test generation or test runs, and numeric metrics refuse it as well.&lt;/p&gt;

&lt;p&gt;When a categorical metric runs on Jev, Rhesis turns it into a single Choice question. The test input and the agent's reply become the state. The metric's prompt and evaluation steps become the instructions. Its categories become the answer options. Jev picks one category and returns probabilities for all of them, and Rhesis maps that pick to pass or fail based on the metric's passing categories. The result shows the chosen category and its probability. There is no reasoning text.&lt;/p&gt;

&lt;p&gt;Two habits make Jev metrics work better. Name each category so it describes its outcome without context, for example &lt;code&gt;recommended_partner_airline&lt;/code&gt; rather than &lt;code&gt;ok&lt;/code&gt;. And phrase instructions positively, so the meaning doesn't hinge on a "not".&lt;/p&gt;

&lt;p&gt;Setup takes a minute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;Models&lt;/strong&gt; page and choose the &lt;strong&gt;Jev&lt;/strong&gt; tile.&lt;/li&gt;
&lt;li&gt;Paste your TypeSafe API key.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Test Connection&lt;/strong&gt; to confirm Rhesis can reach Jev.&lt;/li&gt;
&lt;li&gt;Pick Jev as the model for a categorical metric, or make it your default model for evaluation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://docs.rhesis.ai/docs/models#decision-models" rel="noopener noreferrer"&gt;decision models section of the Rhesis docs&lt;/a&gt; covers the details, and the &lt;a href="https://docs.rhesis.ai/docs/metrics" rel="noopener noreferrer"&gt;metrics docs&lt;/a&gt; explain how categorical metrics are set up. If you want to see how the integration is built, it landed in &lt;a href="https://github.com/rhesis-ai/rhesis/pull/2840" rel="noopener noreferrer"&gt;PR #2840&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi6pcvqluogd8h1o10i0a.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi6pcvqluogd8h1o10i0a.webp" alt="How Rhesis maps a categorical metric onto a Jev call, and the three setup steps" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  See it in action
&lt;/h2&gt;

&lt;p&gt;In the video, I test a travel agent that should only recommend partner airlines. For every reply, Rhesis asks Jev one Choice question, and Jev decides whether the agent kept to that rule. You'll see the categorical metric, the replies being judged one by one, and the category Jev picked for each test along with its probabilities.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/DG949BTHv8I" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Rhesis is open source. You can try it on &lt;a href="https://app.rhesis.ai" rel="noopener noreferrer"&gt;app.rhesis.ai&lt;/a&gt; or self-host it from &lt;a href="https://github.com/rhesis-ai/rhesis" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://rhesis.ai/post/what-are-jev-evals" rel="noopener noreferrer"&gt;Rhesis blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Have you tried a decision model like Jev for your evals yet, or are you sticking with LLM judges? I'd like to hear in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>evals</category>
      <category>agents</category>
    </item>
    <item>
      <title>Where AI agent test cases come from: synthetic vs. production data</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Mon, 05 Oct 2026 14:56:22 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/where-ai-agent-test-cases-come-from-synthetic-vs-production-data-2dff</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/where-ai-agent-test-cases-come-from-synthetic-vs-production-data-2dff</guid>
      <description>&lt;p&gt;Before you can evaluate an agent, you need something to evaluate it against. Which test cases you can get depends mostly on timing. Before launch, everything you test with is something your team came up with. After launch, your users start writing test cases for you, whether you collect them or not.&lt;/p&gt;

&lt;p&gt;This post compares the main sources and shows how the mix changes as your agent matures. There's a walkthrough video at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two sources: synthetic and production data
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgmyghr5nrus8ov9oq75b.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgmyghr5nrus8ov9oq75b.webp" alt="Where your test cases come from: synthetic test cases vs. tests from real conversations" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Synthetic test cases&lt;/strong&gt; are the ones you create yourself. You can write them while exploring the agent in a playground, or generate them from a description of what you want to test. They are available from day one, and they are how you cover reliability (does the agent meet your requirements?) and robustness (does it hold up against jailbreaks, prompt injection and other adversarial inputs?).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tests from production data&lt;/strong&gt; come from conversations real users had with your agent. They include the edge cases nobody on the team thought to write down. You only get them once you are live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each method is good for
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfx0eb3zi5gxo4tp2s4w.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfx0eb3zi5gxo4tp2s4w.webp" alt="Pros and cons of playground, synthesizer and real conversations" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Playground
&lt;/h3&gt;

&lt;p&gt;The fastest way to start. You chat with your agent, and when it gets something wrong, you save that exchange as a test case. Say your claims assistant tells a customer they have 30 days to file when your policy says 14. That conversation becomes a regression test in a few clicks.&lt;/p&gt;

&lt;p&gt;The limit is you. Coverage only reaches as far as the scenarios you think of, and recording cases one at a time takes a while.&lt;/p&gt;

&lt;h3&gt;
  
  
  Synthesizer
&lt;/h3&gt;

&lt;p&gt;Here you describe what you want to test, for example &lt;em&gt;"customers asking about cancellation deadlines, including attempts to get the agent to promise refunds it can't give"&lt;/em&gt;. You rate a few samples so the generator learns what you mean, and you get back a full test set. The same works for multi-turn simulations, where a simulated user pushes the agent over several turns instead of a single prompt.&lt;/p&gt;

&lt;p&gt;You get broad coverage of your requirements and adversarial inputs before a single user has touched the agent. You still have to define the scope and review samples, though. And generated inputs tend to read cleaner than real ones. Real users make typos and ask several things in one message.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real conversations
&lt;/h3&gt;

&lt;p&gt;Nothing is more realistic than what your users actually typed. Production conversations show you real phrasing and real edge cases, and they tell you what people want from the agent, which is not always what the spec assumed.&lt;/p&gt;

&lt;p&gt;They have two catches. You need to be live, and you usually want to find problems before your users do. And real conversations contain personal data, so they need cleanup before they become test cases. For teams in Europe that is a GDPR question as much as a technical one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Working from a coding agent instead?&lt;/strong&gt; You don't have to go through a UI for any of this. The &lt;a href="https://docs.rhesis.ai/docs/agent-skill" rel="noopener noreferrer"&gt;Rhesis MCP server&lt;/a&gt; exposes the synthesizer and your production traces to Claude Code, Cursor and other MCP clients. Paste a product spec and the agent &lt;a href="https://docs.rhesis.ai/docs/agent-skill/spec" rel="noopener noreferrer"&gt;proposes requirements, metrics and test sets&lt;/a&gt;, creating them once you approve. Or ask it to read recent traces and turn the conversations worth keeping into test cases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Your test sources shift as the agent matures
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fusinwga1h1ti01wogns1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fusinwga1h1ti01wogns1.webp" alt="Your test sources shift as the agent matures" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In practice, most teams end up using all three, in roughly this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Exploring by hand.&lt;/strong&gt; In the first iterations, domain experts use the playground and record what they see. This is where your first expectations come from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generating at scale.&lt;/strong&gt; Once requirements settle, the synthesizer and simulations carry most of the volume, covering requirements and adversarial inputs systematically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning from production.&lt;/strong&gt; After launch, real conversations show you what the synthetic sets missed. A failure from production also makes a good seed for new synthetic variations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated where possible.&lt;/strong&gt; Routine checks run automatically. Experts stay in the loop on the hard, novel cases.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  See it in action
&lt;/h2&gt;

&lt;p&gt;In the video, I go through each method in Rhesis, from the first case recorded in the playground to test cases built from production conversations.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/X0Qbq3pPr-8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Rhesis is open source. You can try it on &lt;a href="https://app.rhesis.ai" rel="noopener noreferrer"&gt;app.rhesis.ai&lt;/a&gt; or self-host it from &lt;a href="https://github.com/rhesis-ai/rhesis" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://rhesis.ai/post/agent-test-case-sources" rel="noopener noreferrer"&gt;Rhesis blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How do you source test cases for your agents? Mostly synthetic, mostly production, or something else entirely? I'd like to hear in the comments.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>evals</category>
    </item>
    <item>
      <title>Launch week day 1: drive the full AI testing workflow from inside any AI tool</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Mon, 04 May 2026 17:17:03 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/launch-week-day-1-drive-the-full-ai-testing-workflow-from-inside-any-ai-tool-1b6b</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/launch-week-day-1-drive-the-full-ai-testing-workflow-from-inside-any-ai-tool-1b6b</guid>
      <description>&lt;p&gt;Building an AI agent uses one tool. Testing it uses another. Every iteration cycle ends with you switching to your test platform UI, running tests, inspecting results, then back to your editor to fix what broke. The context switch is small, but it adds up.&lt;/p&gt;

&lt;p&gt;Today we shipped the fix: the &lt;strong&gt;Rhesis Agent Skill&lt;/strong&gt;, day 1 of Rhesis Launch Week.&lt;/p&gt;

&lt;p&gt;If you build LLM agents and use Claude Code, Cursor, Codex, Gemini CLI, or any of 40+ other AI tools, you can now drive the full Rhesis testing workflow from inside the chat where you write the code.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/_YYj98Lu5rU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;The Agent Skill packages our domain knowledge into a portable skill file that any compatible AI tool can load. Once installed, your AI assistant gains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint discovery&lt;/strong&gt; in Quick or Comprehensive mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test suite design&lt;/strong&gt; with behaviors, test sets, and metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirmation guards&lt;/strong&gt; that wait for approval before anything is created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test execution&lt;/strong&gt; against your endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure analysis&lt;/strong&gt; with pass/fail summaries and links back to runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All powered by the Rhesis MCP server (27 tools covering test sets, behaviors, metrics, runs, and OData queries), all in natural language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Single command across all your AI tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add rhesis-ai/rhesis &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI detects which AI tools you have installed and configures the skill for each one. Then set your API token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;RHESIS_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rhs_your_token_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get a token at &lt;a href="https://app.rhesis.ai/tokens" rel="noopener noreferrer"&gt;app.rhesis.ai/tokens&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;

&lt;p&gt;Claude Code uses a plugin system that bundles the skill and MCP server config together:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Add the MCP server to your &lt;code&gt;.cursor/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rhesis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;https://api.rhesis.ai/mcp&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_RHESIS_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For self-hosted backends, swap &lt;code&gt;https://api.rhesis.ai/mcp&lt;/code&gt; for &lt;code&gt;http://localhost:8080/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use it
&lt;/h2&gt;

&lt;p&gt;Type something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Test my support agent on billing scenarios, run it, and rank the failures by severity."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The skill walks the conversation through a 6-step loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discover&lt;/strong&gt;: explores what your endpoint can do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan&lt;/strong&gt;: proposes a test suite with behaviors and metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review&lt;/strong&gt;: waits for your approval before creating anything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt;: builds entities on the platform following the approved plan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute&lt;/strong&gt;: runs tests once you confirm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze&lt;/strong&gt;: surfaces a pass/fail summary, failure patterns, and links back to results&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For ad-hoc operations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"List my existing test sets."&lt;br&gt;
"Improve the Safety Compliance metric. Make the threshold stricter."&lt;br&gt;
"Compare my last two test runs."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The host agent's native confirmation handles the safety guard, so destructive actions never happen without your sign-off.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>testing</category>
      <category>llmops</category>
    </item>
    <item>
      <title>Issues in conversational AI apps are so obvious right now that even John Oliver felt the need to dedicate a whole episode to the topic: https://www.youtube.com/watch?v=Ykvf3MunGf8

#AISafety #AIEvals #Testing #QA</title>
      <dc:creator>Nicolai Bohn</dc:creator>
      <pubDate>Tue, 28 Apr 2026 09:24:37 +0000</pubDate>
      <link>https://dev.to/nicolai_bohn_rhesis/issues-in-conversational-ai-apps-are-so-obvious-right-now-that-even-john-oliver-felt-the-need-to-3oj8</link>
      <guid>https://dev.to/nicolai_bohn_rhesis/issues-in-conversational-ai-apps-are-so-obvious-right-now-that-even-john-oliver-felt-the-need-to-3oj8</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.youtube.com/watch?v=Ykvf3MunGf8" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;youtube.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
