<?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: synthorai</title>
    <description>The latest articles on DEV Community by synthorai (@synthorai).</description>
    <link>https://dev.to/synthorai</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%2F3954184%2Ff7a20b6f-3f1e-4eed-85a3-486012422cbd.png</url>
      <title>DEV Community: synthorai</title>
      <link>https://dev.to/synthorai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/synthorai"/>
    <language>en</language>
    <item>
      <title>Claude Opus 5.5 vs Opus 5: Same Answers, Half the Output Tokens</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Wed, 23 Sep 2026 16:13:33 +0000</pubDate>
      <link>https://dev.to/synthorai/claude-opus-55-vs-opus-5-same-answers-half-the-output-tokens-114d</link>
      <guid>https://dev.to/synthorai/claude-opus-55-vs-opus-5-same-answers-half-the-output-tokens-114d</guid>
      <description>&lt;p&gt;&lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Claude Opus 5.5&lt;/a&gt; lists 20% below &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Claude Opus 5&lt;/a&gt;, at $4 per million input tokens and $20 per million output against $5 and $25. That 20% arrives whatever the model does, so the only interesting question is how much of a saving is left after you take it out. On 13 single-shot tasks at each model's default setting, Opus 5.5 billed 65% less, and at identical prices it is still 56% cheaper. In a multi-hop tool loop the subtraction is far less kind: 37% off the invoice, 22% once the rate card is held constant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Across 468 graded calls, Opus 5.5 billed $0.0072 per task against Opus 5's $0.0204, both correct on every task.&lt;/li&gt;
&lt;li&gt;Priced identically, Opus 5.5 still ran 56% cheaper on those tasks: it wrote 341 output tokens on average against 799.&lt;/li&gt;
&lt;li&gt;In a four-question tool loop the gap shrinks to 22% at equal prices, because input tokens dominate and both models read the same files.&lt;/li&gt;
&lt;li&gt;At &lt;code&gt;max&lt;/code&gt; effort Opus 5.5 cost 3.3x its own default in that loop and solved nothing extra.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tool_choice&lt;/code&gt; set to &lt;code&gt;any&lt;/code&gt; or a named tool now returns HTTP 400; Opus 5 accepts both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anthropic released Opus 5.5 on 2026-09-22 claiming it "costs 40% less to run than Opus 5" on typical workloads. Only the second half of that claim, fewer tokens per task, depends on what the model does, so that is the half worth measuring.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed in Claude Opus 5.5?
&lt;/h2&gt;

&lt;p&gt;The price drop is the smaller change. The bigger one is that the thinking switch is gone. Adaptive thinking means the model decides how long to reason before it answers, and those reasoning tokens are billed as output whether or not the API shows them to you. On &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; that mode is always on, and the only control left is &lt;code&gt;effort&lt;/code&gt;, a request parameter with five levels from &lt;code&gt;low&lt;/code&gt; to &lt;code&gt;max&lt;/code&gt; that sets how much thinking the model is willing to spend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt; accepted &lt;code&gt;thinking: {"type": "disabled"}&lt;/code&gt;, which was the single setting that brought its bill to parity with &lt;a href="https://synthorai.io/models/claude-opus-4-8/" rel="noopener noreferrer"&gt;Opus 4.8&lt;/a&gt; in &lt;a href="https://synthorai.io/blog/claude-opus-5-cost/" rel="noopener noreferrer"&gt;our Opus 5 measurements&lt;/a&gt;. That lever no longer exists.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Opus 5&lt;/th&gt;
&lt;th&gt;Opus 5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List price (in / out per MTok)&lt;/td&gt;
&lt;td&gt;$5 / $25&lt;/td&gt;
&lt;td&gt;$4 / $20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thinking&lt;/td&gt;
&lt;td&gt;adaptive, can be disabled at effort &lt;code&gt;high&lt;/code&gt; or below&lt;/td&gt;
&lt;td&gt;adaptive, always on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default effort&lt;/td&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forced tool use&lt;/td&gt;
&lt;td&gt;accepted&lt;/td&gt;
&lt;td&gt;400 error (measured)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context window / max output&lt;/td&gt;
&lt;td&gt;1M / 128K&lt;/td&gt;
&lt;td&gt;1M / 128K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge cutoff&lt;/td&gt;
&lt;td&gt;May 2026&lt;/td&gt;
&lt;td&gt;June 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Released&lt;/td&gt;
&lt;td&gt;2026-07-24&lt;/td&gt;
&lt;td&gt;2026-09-22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text between tool calls&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;text&lt;/code&gt; blocks&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;thinking&lt;/code&gt; blocks, empty at the default display setting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safeguard categories&lt;/td&gt;
&lt;td&gt;cybersecurity&lt;/td&gt;
&lt;td&gt;cybersecurity plus biology, plus a reasoning-extraction decline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rows matter beyond the table. The default effort moved down a notch, from &lt;code&gt;high&lt;/code&gt; to &lt;code&gt;medium&lt;/code&gt;, so a request that sends no effort field is not running the same depth it ran on Opus 5. And the progress-update change is silent: short notes the model used to write between tool calls now arrive as thinking blocks whose text is empty unless you ask for it, so a user interface that streams those notes goes quiet with no error to catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do the release benchmarks say?
&lt;/h2&gt;

&lt;p&gt;Anthropic published &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; ahead of &lt;a href="https://synthorai.io/models/claude-fable-5-1/" rel="noopener noreferrer"&gt;Fable 5.1&lt;/a&gt; on every coding and knowledge-work benchmark in its release table, and ahead of &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt; on most of them. The numbers below are Anthropic's, run with adaptive thinking at max effort, with the Terminal-Bench rows at xhigh.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Opus 5.5&lt;/th&gt;
&lt;th&gt;Fable 5.1&lt;/th&gt;
&lt;th&gt;Opus 5&lt;/th&gt;
&lt;th&gt;GPT-6 Astra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench 4.0 (agentic coding)&lt;/td&gt;
&lt;td&gt;66.4%&lt;/td&gt;
&lt;td&gt;55.8%&lt;/td&gt;
&lt;td&gt;52.3%&lt;/td&gt;
&lt;td&gt;57.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FrontierCode v1.1&lt;/td&gt;
&lt;td&gt;54.4%&lt;/td&gt;
&lt;td&gt;50.3%&lt;/td&gt;
&lt;td&gt;48.0%&lt;/td&gt;
&lt;td&gt;53.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CursorBench 4.0&lt;/td&gt;
&lt;td&gt;57.8%&lt;/td&gt;
&lt;td&gt;51.8%&lt;/td&gt;
&lt;td&gt;46.6%&lt;/td&gt;
&lt;td&gt;not reported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPval-AA v2.1 (knowledge work, Elo)&lt;/td&gt;
&lt;td&gt;1846&lt;/td&gt;
&lt;td&gt;1735&lt;/td&gt;
&lt;td&gt;1708&lt;/td&gt;
&lt;td&gt;1542&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutomationBench (business workflows)&lt;/td&gt;
&lt;td&gt;40.0%&lt;/td&gt;
&lt;td&gt;31.4%&lt;/td&gt;
&lt;td&gt;26.9%&lt;/td&gt;
&lt;td&gt;41.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench-Science 0.1&lt;/td&gt;
&lt;td&gt;58.7%&lt;/td&gt;
&lt;td&gt;52.6%&lt;/td&gt;
&lt;td&gt;29.0%&lt;/td&gt;
&lt;td&gt;64.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSWorld 2.0 (computer use)&lt;/td&gt;
&lt;td&gt;81.8%&lt;/td&gt;
&lt;td&gt;80.7%&lt;/td&gt;
&lt;td&gt;74.0%&lt;/td&gt;
&lt;td&gt;not reported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anthropic attaches an unusual caveat to its own table: at this level "benchmark margins have become a less reliable guide to real-world differences", and the gap to Fable 5.1 is narrower in practice than the scores suggest. Two footnotes matter before anyone quotes these numbers. The AutomationBench run was done by Zapier without fallback models, so every safeguard intervention counted as a failure, and the whole table ran with production safeguards on, with cybersecurity tasks handed to &lt;a href="https://synthorai.io/models/claude-opus-4-8/" rel="noopener noreferrer"&gt;Opus 4.8&lt;/a&gt; and biology tasks to &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt; when a classifier intervened.&lt;/p&gt;

&lt;p&gt;None of that tells you what a task costs, so we measured that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the cheaper claim hold on single-shot work?
&lt;/h2&gt;

&lt;p&gt;Yes, and most of it is real efficiency rather than the rate card. Single-shot means one request, one answer, no tools: arithmetic and counting puzzles such as a 200-step iteration rule or a path count on a grid with blocked cells. We ran 13 of them, 3 repeats each, at all five effort levels plus the default, on &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; and &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt;, which is 468 graded calls. Every answer key was brute-forced in Python before the run, and every prompt carried a unique random string so that no layer between us and the model could answer from a cached duplicate. Cost per task is computed from Anthropic list prices over the tokens each call billed, thinking included, rather than read back from the response.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Opus 5.5 median output&lt;/th&gt;
&lt;th&gt;Opus 5.5 $/task&lt;/th&gt;
&lt;th&gt;Opus 5 median output&lt;/th&gt;
&lt;th&gt;Opus 5 $/task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;default&lt;/td&gt;
&lt;td&gt;193&lt;/td&gt;
&lt;td&gt;0.0072&lt;/td&gt;
&lt;td&gt;448&lt;/td&gt;
&lt;td&gt;0.0204&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;low&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;td&gt;0.0060&lt;/td&gt;
&lt;td&gt;439&lt;/td&gt;
&lt;td&gt;0.0201&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;td&gt;218&lt;/td&gt;
&lt;td&gt;0.0085&lt;/td&gt;
&lt;td&gt;538&lt;/td&gt;
&lt;td&gt;0.0200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;223&lt;/td&gt;
&lt;td&gt;0.0094&lt;/td&gt;
&lt;td&gt;542&lt;/td&gt;
&lt;td&gt;0.0206&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xhigh&lt;/td&gt;
&lt;td&gt;233&lt;/td&gt;
&lt;td&gt;0.0111&lt;/td&gt;
&lt;td&gt;525&lt;/td&gt;
&lt;td&gt;0.0197&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max&lt;/td&gt;
&lt;td&gt;762&lt;/td&gt;
&lt;td&gt;0.0240&lt;/td&gt;
&lt;td&gt;532&lt;/td&gt;
&lt;td&gt;0.0220&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fsynthorai.io%2Fblog%2Fassets%2Fclaude-opus-5-5-cost%2Feffort-ladder.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fclaude-opus-5-5-cost%2Feffort-ladder.svg" alt="Grouped bar chart of cost per task by effort level. Claude Opus 5.5: $0.0072 at default, $0.0060 low, $0.0085 medium, $0.0094 high, $0.0111 xhigh, $0.0240 max. Claude Opus 5: $0.0204 default, $0.0201 low, $0.0200 medium, $0.0206 high, $0.0197 xhigh, $0.0220 max" width="1200" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accuracy was 100% for both models at default, and 97% or better at every other level, with the three misses scattered across different tasks and levels rather than concentrated at the bottom of the ladder. On this task set there is no accuracy cliff to find, so the entire difference is spend.&lt;/p&gt;

&lt;p&gt;The ladder behaves differently on the two models. Opus 5's spend is flat, $0.0197 to $0.0220 from &lt;code&gt;low&lt;/code&gt; to &lt;code&gt;max&lt;/code&gt;, a 12% spread. Opus 5.5 spans 4x, from $0.0060 to $0.0240. Effort is a real dial on Opus 5.5 and close to a no-op on Opus 5, so a migration that copies the setting across can land somewhere quite different from where it started.&lt;/p&gt;

&lt;p&gt;On the five hardest tasks the gap widens. Opus 5.5 at default cost $0.0113 per task against Opus 5's $0.0375, and the median output was 585 tokens against 1,145.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens in a tool loop, where agent bills accumulate?
&lt;/h2&gt;

&lt;p&gt;The savings survive into a loop, at a smaller multiple. A tool loop is the honest test of &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; against &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt;. One turn is one request: the model asks for a tool, your code runs it, and you send the whole transcript back, so a conversation of five turns pays for the growing transcript five times. Turn count, not price per token, drives that bill. We gave both models three tools (list files, read file, search) over a small synthetic service and four questions whose answers require following a call chain across three or four files, then ran 12 runs per arm on the same surface with the same tools and prompt.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Arm&lt;/th&gt;
&lt;th&gt;Solved&lt;/th&gt;
&lt;th&gt;Median turns&lt;/th&gt;
&lt;th&gt;Median tool calls&lt;/th&gt;
&lt;th&gt;Median output tokens&lt;/th&gt;
&lt;th&gt;$/run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5, default&lt;/td&gt;
&lt;td&gt;12/12&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;427&lt;/td&gt;
&lt;td&gt;0.0326&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5, &lt;code&gt;low&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;12/12&lt;/td&gt;
&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;430&lt;/td&gt;
&lt;td&gt;0.0330&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5, &lt;code&gt;max&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;12/12&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;3,124&lt;/td&gt;
&lt;td&gt;0.1087&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5, default&lt;/td&gt;
&lt;td&gt;11/12&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;666&lt;/td&gt;
&lt;td&gt;0.0519&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fsynthorai.io%2Fblog%2Fassets%2Fclaude-opus-5-5-cost%2Ftool-loop-cost.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fclaude-opus-5-5-cost%2Ftool-loop-cost.svg" alt="Bar chart of mean cost per run in a multi-hop tool loop. Opus 5.5 at default $0.0326, 12 of 12 solved, 4.0 turns. Opus 5.5 at low effort $0.0330, 12 of 12 solved, 4.5 turns. Opus 5.5 at max effort $0.1087, 12 of 12 solved, 5.0 turns. Opus 5 at default $0.0519, 11 of 12 solved, 5.0 turns" width="1200" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opus 5.5 at default cost 37% less per run than Opus 5 at default, with 12% fewer turns and 30% fewer output tokens. Per question solved the gap is wider, 43%, because Opus 5 missed one run. That is close to the vendor's "40% less to run" figure, and it is the number your invoice shows.&lt;/p&gt;

&lt;p&gt;It is also the workload where the rate card does most of the work, for a reason worth understanding: a loop re-sends the transcript every turn, both models read the same files, and total tokens fell only 19% while output tokens fell 30%. Writing less helps least exactly where you spend most. The next section puts a number on that.&lt;/p&gt;

&lt;p&gt;Dropping Opus 5.5 to &lt;code&gt;low&lt;/code&gt; in the loop saved nothing: the model asked for one more turn on average, and the extra re-sent transcript ate the token savings. The effort dial that works cleanly on single-shot tasks stops paying in a loop, because turns, not depth, set the bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much of the saving is just the price cut?
&lt;/h2&gt;

&lt;p&gt;From a seventh of it to two fifths, depending on the shape of the work. The middle column below reprices Opus 5.5's measured tokens at Opus 5's rates, so it shows what &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; saves by writing less, with the rate card held constant against &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Billed difference&lt;/th&gt;
&lt;th&gt;At identical prices&lt;/th&gt;
&lt;th&gt;Output tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;13 single-shot tasks, default&lt;/td&gt;
&lt;td&gt;-65%&lt;/td&gt;
&lt;td&gt;-56%&lt;/td&gt;
&lt;td&gt;-57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;five hardest of those&lt;/td&gt;
&lt;td&gt;-70%&lt;/td&gt;
&lt;td&gt;-62%&lt;/td&gt;
&lt;td&gt;-63%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multi-hop tool loop, default&lt;/td&gt;
&lt;td&gt;-37%&lt;/td&gt;
&lt;td&gt;-22%&lt;/td&gt;
&lt;td&gt;-30%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The single-shot rows are a genuine efficiency gain: the price cut supplies only 14% of the saving, and the rest is the model writing less. The tool-loop row is the one to plan around, because it is the shape most agent traffic takes, and there the price cut supplies 41% of the headline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is a higher effort setting ever worth it?
&lt;/h2&gt;

&lt;p&gt;Not on this workload, and the penalty is steep. &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; at &lt;code&gt;max&lt;/code&gt; cost $0.1087 per run in the tool loop, 3.3x its own default, and solved exactly the same 12 questions. It spent the extra budget on tool calls: a median of 12 against 5 at default, along with 3,124 output tokens against 427. On single-shot tasks &lt;code&gt;max&lt;/code&gt; was the only level where it cost more than &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt;, $0.0240 against $0.0220.&lt;/p&gt;

&lt;p&gt;Reasoning is where that budget goes. Thinking was 98.4% of Opus 5.5's output tokens at default and 99.6% at &lt;code&gt;max&lt;/code&gt; on these single-answer tasks. You are billed for all of it at the output rate, and at the default display setting you never see it. Anthropic's own guidance says to reserve &lt;code&gt;max&lt;/code&gt; for frontier problems. The measured version: on tasks a model already solves, every step up the ladder is pure cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks when you change the model ID?
&lt;/h2&gt;

&lt;p&gt;Two request shapes that work on &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt; return 400 on &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt;. Both are easy to hit in existing code.&lt;/p&gt;

&lt;p&gt;Forced tool use is rejected. Any client that pins a tool call, which is the common way to get structured JSON out of a chat model, gets this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tool_choice: type "tool" and "any" are not supported for this model.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That error arrives through an OpenAI-compatible client as well, where the same request is written as &lt;code&gt;tool_choice: "required"&lt;/code&gt; or as a named function. &lt;code&gt;auto&lt;/code&gt; and &lt;code&gt;none&lt;/code&gt; still work, so the migration is to describe in the prompt when the tool applies, and to use strict tool schemas or structured outputs for schema-valid JSON.&lt;/p&gt;

&lt;p&gt;Thinking cannot be turned off. &lt;code&gt;thinking: {"type": "disabled"}&lt;/code&gt; and a manual &lt;code&gt;budget_tokens&lt;/code&gt; both fail, and on an OpenAI-compatible surface the equivalent, &lt;code&gt;reasoning_effort: "none"&lt;/code&gt;, is refused too. The replacement is the effort parameter:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-5-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this incident report in five bullets.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;output_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;   &lt;span class="c1"&gt;# low | medium | high | xhigh | max; medium is the default
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Thinking is billed as output whether or not you can read it.
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;low&lt;/code&gt; is the closest thing to the old thinking-off behaviour, and on our single-shot set it was both the cheapest level and accurate. It is not free, though: the model still thinks, and the thinking is still billed as output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do prompt budgets carry over?
&lt;/h2&gt;

&lt;p&gt;Token budgets carry over exactly. The same four inputs counted the same on both models: 1,277 tokens against 1,275 for an English passage, 583 against 581 for Python, 482 against 480 for a JSON tool-argument blob, and 500 against 498 for Chinese prose. The constant two-token offset is request framing, not text, so a context budget or a chunking threshold tuned on &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt; needs no re-baselining on &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When should you switch?
&lt;/h2&gt;

&lt;p&gt;For cost, move to &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; as soon as the two request shapes above are fixed. Even with the price cut taken out, equal accuracy at 56% less on single-shot work and 22% less in a tool loop is not a marginal difference, and default against default is the comparison most deployments will actually experience.&lt;/p&gt;

&lt;p&gt;Treat effort as the thing to re-tune rather than carry over. The default moved from &lt;code&gt;high&lt;/code&gt; to &lt;code&gt;medium&lt;/code&gt;, the dial has four times the range it had on &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt;, and the winning level depends on shape: &lt;code&gt;low&lt;/code&gt; was cheapest and accurate on single-shot tasks, while in the tool loop the default beat both &lt;code&gt;low&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is Claude Opus 5.5 really 40% cheaper than Opus 5?&lt;/strong&gt;&lt;br&gt;
On the invoice, close to it: &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; cost 37% less per run than &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt; in our tool loop and 65% less per single-shot task. Twenty of those percentage points are the lower rate card, which arrives no matter how the model behaves. The efficiency left after that is 22% in the loop and 56% on single-shot tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I still disable thinking on Opus 5.5?&lt;/strong&gt;&lt;br&gt;
No. &lt;code&gt;thinking: {"type": "disabled"}&lt;/code&gt; and manual token budgets both return 400 on &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt;. Use &lt;code&gt;output_config.effort&lt;/code&gt; instead, where &lt;code&gt;low&lt;/code&gt; is the cheapest setting. Thinking tokens are billed as output at every level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What replaces forced tool use?&lt;/strong&gt;&lt;br&gt;
Keep &lt;code&gt;tool_choice: {"type": "auto"}&lt;/code&gt; and make the tool's trigger explicit in the prompt, then use strict tool schemas or structured outputs when you need schema-valid JSON. On &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; the &lt;code&gt;any&lt;/code&gt; and named-tool forms are rejected with a 400 rather than downgraded silently, so this shows up as a failed request rather than a wrong answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to re-measure my prompt sizes?&lt;/strong&gt;&lt;br&gt;
No. Identical text billed identical token counts on &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Opus 5&lt;/a&gt; and &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; across prose, code, JSON, and Chinese, so context budgets carry over unchanged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Opus 5.5 a replacement for Fable 5.1?&lt;/strong&gt;&lt;br&gt;
On Anthropic's own benchmark table, &lt;a href="https://synthorai.io/models/claude-opus-5-5/" rel="noopener noreferrer"&gt;Opus 5.5&lt;/a&gt; scores above &lt;a href="https://synthorai.io/models/claude-fable-5-1/" rel="noopener noreferrer"&gt;Fable 5.1&lt;/a&gt; on every listed benchmark at 40% of its token price. Anthropic still positions Fable 5.1 for demanding reasoning and long-horizon agentic work, and says the real-world gap is narrower than the scores suggest, so the honest answer is to re-run your own evals rather than read the table.&lt;/p&gt;

&lt;p&gt;Related measurements: &lt;a href="https://synthorai.io/blog/claude-opus-5-cost/" rel="noopener noreferrer"&gt;Claude Opus 5 vs Opus 4.8&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/gpt-6-astra-reasoning-effort/" rel="noopener noreferrer"&gt;the GPT-6 Astra effort ladder&lt;/a&gt;, and &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;thinking controls across vendors&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Measured 2026-09-23, one day after release, through a gateway to the Claude API and an OpenAI-compatible surface. 468 graded single-shot calls (13 tasks with locally brute-forced answer keys, 3 repeats, 6 effort settings, 2 models) plus 48 tool-loop runs (4 multi-hop questions, 3 repeats, 4 arms). Prompts salted; each model driven through the surface that carried its effort parameter; costs computed from Anthropic list prices rather than read from responses.&lt;/p&gt;

</description>
      <category>claudeopus55</category>
      <category>ai</category>
      <category>pricing</category>
    </item>
    <item>
      <title>Jev vs Flash LLMs: 7x Cheaper on Workflows, Same Cost on One Label</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Tue, 22 Sep 2026 14:49:29 +0000</pubDate>
      <link>https://dev.to/synthorai/jev-vs-flash-llms-7x-cheaper-on-workflows-same-cost-on-one-label-1e2j</link>
      <guid>https://dev.to/synthorai/jev-vs-flash-llms-7x-cheaper-on-workflows-same-cost-on-one-label-1e2j</guid>
      <description>&lt;p&gt;Whether TypeSafe's Jev is cheaper than a flash LLM depends on the shape of the job. Asking 12 questions about each support transcript, Jev cost 7 times less than &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt; with thinking off and took 0.12 seconds after network time against 1.66. On a single 77-way label, it cost the same as &lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt; and &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt;. Jev is a decision model: instead of writing text, it returns a choice, a score or a probability for each question you define. We ran it against five flash-tier chat models, at their cheapest and at their default thinking settings, on four tests built from public datasets. It was the fastest model on every test and the most accurate on none.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With 12 questions per case, flash LLMs cost 4.8 to 37 times more than Jev and took 11 to 27 times longer, at similar accuracy.&lt;/li&gt;
&lt;li&gt;On one label per message, Jev cost the same as Qwen3.8 Flash and GLM 5.3 Flash with thinking off.&lt;/li&gt;
&lt;li&gt;At default thinking, one label cost 1.5 to 26 times more on flash models than on Jev.&lt;/li&gt;
&lt;li&gt;GPT-5.6 Luna was more accurate than Jev on every test except prompt injection.&lt;/li&gt;
&lt;li&gt;Jev's answers at probability 0.99 or above were 98% correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Jev, and how is it different from an LLM?
&lt;/h2&gt;

&lt;p&gt;Jev is TypeSafe's "System One" model: it reads a piece of text or JSON (the state) and answers typed questions about it, with no generated text to parse. There are three question types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question type&lt;/th&gt;
&lt;th&gt;What you ask&lt;/th&gt;
&lt;th&gt;What comes back&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Noul (TypeSafe's name for yes/no)&lt;/td&gt;
&lt;td&gt;a yes/no question&lt;/td&gt;
&lt;td&gt;a probability from 0 to 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Choice&lt;/td&gt;
&lt;td&gt;pick one of up to 255 options you define&lt;/td&gt;
&lt;td&gt;the option, every option's probability, a confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score&lt;/td&gt;
&lt;td&gt;rate on 2 to 10 ordered levels you define&lt;/td&gt;
&lt;td&gt;a probability-weighted score, a confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A request asks its questions by name and gets one answer back per name. This one, in TypeSafe's documented format (&lt;a href="https://docs.typesafe.ai/api" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;), asks three yes/no questions about a short support chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.typesafe.ai/v1/systemone &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TYPESAFE_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "jev-latest",
    "state": {"transcript": "Customer: My card was declined twice today.\nAgent: One moment.\nCustomer: Also, how do I change my PIN?"},
    "questions": {
      "declined_card": {"type": "noul", "instructions": "In `transcript`, does the customer report a declined card payment?"},
      "change_pin":    {"type": "noul", "instructions": "In `transcript`, does the customer want to change a PIN?"},
      "lost_card":     {"type": "noul", "instructions": "In `transcript`, does the customer report a lost or stolen card?"}
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What came back when we ran it:&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;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jev-1.13.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"answers"&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;"declined_card"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.99&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"change_pin"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.98&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lost_card"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.02&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;"usage"&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="nl"&gt;"input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;359&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;56&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;Your code reads &lt;code&gt;answers.&amp;lt;question&amp;gt;.noul&lt;/code&gt; and compares it with a threshold, the way it would compare any number. The &lt;code&gt;model&lt;/code&gt; field names the version that answered; &lt;code&gt;jev-latest&lt;/code&gt; moves when TypeSafe ships a new version, so pin &lt;code&gt;jev-1.13.0&lt;/code&gt; if you tune thresholds against it.&lt;/p&gt;

&lt;p&gt;TypeSafe evaluates the questions in parallel. Jev 1.13 costs $0.042 per million input tokens and output is free (&lt;a href="https://docs.typesafe.ai/models" rel="noopener noreferrer"&gt;models&lt;/a&gt;), which is 3.6 times less per input token than &lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt;, 4.8 times less than &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt; and 18 times less than &lt;a href="https://synthorai.io/models/gemini-3-8-flash/" rel="noopener noreferrer"&gt;Gemini 3.8 Flash&lt;/a&gt;. Input includes TypeSafe's own template, about 300 tokens a call, plus every question and option you define: the call above billed 359 input tokens, $0.000015, and its 56 output tokens were free. TypeSafe lists what Jev is weak at in its &lt;a href="https://docs.typesafe.ai/model-jaggedness/jev-1.13" rel="noopener noreferrer"&gt;jaggedness notes&lt;/a&gt;: counting, arithmetic, date comparison, multi-step questions and long states full of irrelevant text.&lt;/p&gt;

&lt;h2&gt;
  
  
  How did we test it?
&lt;/h2&gt;

&lt;p&gt;Four tests, each run once on 2026-09-21 and 2026-09-22 through Jev and through five flash chat models: &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt;, &lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt;, &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt;, &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; and &lt;a href="https://synthorai.io/models/gemini-3-8-flash/" rel="noopener noreferrer"&gt;Gemini 3.8 Flash&lt;/a&gt;. Each chat model ran at its cheapest working thinking setting (off, or low where off is not accepted) and, on the three classification tests, again at the vendor default.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;12 questions per case&lt;/strong&gt;: 150 customer support transcripts, each assembled from one to six messages of the Banking77 dataset (PolyAI, CC BY 4.0), so the right answers are known. Every model answers 12 yes/no questions per transcript ("does the customer report a lost or stolen card?") with a probability each: Jev as 12 Noul questions in one call, the chat models as one JSON object. We reran 60 of them with a 3,000-token and a 12,000-token reference document (Wikipedia articles on banking) added in front of the transcript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One label&lt;/strong&gt;: 308 Banking77 messages, 4 from each of 77 intents. Jev gets one Choice with 77 options; the chat models get the same list and reply with the intent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28 labels&lt;/strong&gt;: 200 GoEmotions comments (Google, Apache 2.0), each with 28 possible emotions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection&lt;/strong&gt;: the 116-row deepset prompt-injections test set (Apache 2.0), one yes/no question each.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cost is each vendor's list price times the tokens billed. Latency comes from a separate run of 40 calls per model on a kept-open connection, with the network round trip subtracted; the speed section explains how. We also ran &lt;a href="https://synthorai.io/models/gpt-5-6-terra/" rel="noopener noreferrer"&gt;GPT-5.6 Terra&lt;/a&gt; and &lt;a href="https://synthorai.io/models/dola-seed-2-0-mini/" rel="noopener noreferrer"&gt;Seed 2.0 Mini&lt;/a&gt; on the three classification tests; they are in the tables but not the chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  When is Jev cheaper than a flash LLM?
&lt;/h2&gt;

&lt;p&gt;When one text gets many questions, when the text is long, or when the chat model would otherwise think. On a single short label against a cheap model with thinking off, Jev costs the same.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fjev-vs-flash-llms%2Fcost-by-shape.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fjev-vs-flash-llms%2Fcost-by-shape.svg" alt="Bar chart of each flash model's cost per case as a multiple of Jev 1.13 in four task shapes. GPT-5.6 Luna: 1.4x on one label at its cheapest setting, 1.5x at its default, 7.0x with 12 questions per case, 4.7x with 12 questions and a 12,000-token reference. Qwen3.8 Flash: 0.97x, 2.7x, 4.8x, 3.6x. GLM 5.3 Flash: 0.95x, 1.9x, 5.0x, 3.5x. DeepSeek V4.1 Flash: 2.2x, 8.6x, 9.8x, 7.1x. Gemini 3.8 Flash: 14.0x, 25.7x, 37.0x, 18.6x" width="1400" height="880"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three things move the multiple. First, the number of questions: a chat model has to write an answer for every question, and output is its expensive side (&lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt; charges $1.20 per million output tokens against $0.20 for input), while Jev's answers are free and each extra question adds about 17 input tokens. Second, thinking: at vendor defaults the chat models wrote a median of up to 161 output tokens per label where thinking off wrote 3 to 8, and the multiple against Jev rose with it. Third, input length: with a 12,000-token reference, the fixed template and the answers stop mattering, and the multiple settles near the ratio of input prices, 3.5 times for &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; up to 18.6 times for &lt;a href="https://synthorai.io/models/gemini-3-8-flash/" rel="noopener noreferrer"&gt;Gemini 3.8 Flash&lt;/a&gt;; &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; sits at 7.1 times.&lt;/p&gt;

&lt;p&gt;The one-label test is the case where Jev saves nothing against the cheapest models: 77 options add about 1,400 tokens to every call, so a one-line message bills about 1,690 input tokens on Jev against 440 on &lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test, cost per 1,000 cases&lt;/th&gt;
&lt;th&gt;Jev&lt;/th&gt;
&lt;th&gt;Luna&lt;/th&gt;
&lt;th&gt;Qwen3.8 Flash&lt;/th&gt;
&lt;th&gt;GLM 5.3 Flash&lt;/th&gt;
&lt;th&gt;DeepSeek V4.1 Flash&lt;/th&gt;
&lt;th&gt;Gemini 3.8 Flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12 questions per case&lt;/td&gt;
&lt;td&gt;$0.027&lt;/td&gt;
&lt;td&gt;$0.19&lt;/td&gt;
&lt;td&gt;$0.13&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;$0.27&lt;/td&gt;
&lt;td&gt;$1.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 questions, 12,000-token reference&lt;/td&gt;
&lt;td&gt;$0.43&lt;/td&gt;
&lt;td&gt;$2.02&lt;/td&gt;
&lt;td&gt;$1.57&lt;/td&gt;
&lt;td&gt;$1.53&lt;/td&gt;
&lt;td&gt;$3.06&lt;/td&gt;
&lt;td&gt;$8.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One label, cheapest setting&lt;/td&gt;
&lt;td&gt;$0.071&lt;/td&gt;
&lt;td&gt;$0.098&lt;/td&gt;
&lt;td&gt;$0.069&lt;/td&gt;
&lt;td&gt;$0.068&lt;/td&gt;
&lt;td&gt;$0.16&lt;/td&gt;
&lt;td&gt;$0.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One label, vendor default&lt;/td&gt;
&lt;td&gt;$0.071&lt;/td&gt;
&lt;td&gt;$0.11&lt;/td&gt;
&lt;td&gt;$0.19&lt;/td&gt;
&lt;td&gt;$0.13&lt;/td&gt;
&lt;td&gt;$0.61&lt;/td&gt;
&lt;td&gt;$1.83&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How much faster is Jev?
&lt;/h2&gt;

&lt;p&gt;About 7 to 28 times once the network is taken out: Jev's median was 0.11 to 0.12 seconds and the chat models took 0.79 to 3.25 seconds.&lt;/p&gt;

&lt;p&gt;We timed 40 calls per model and task, one at a time on a connection kept open, and subtracted the round trip measured on that same connection with a request that does no model work. What is left is the model's own time plus the path from our proxy to its provider, the same route for every model.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Seconds after network, median (95th percentile)&lt;/th&gt;
&lt;th&gt;Jev&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/gemini-3-8-flash/" rel="noopener noreferrer"&gt;Gemini 3.8 Flash&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One label, cheapest setting&lt;/td&gt;
&lt;td&gt;0.11 (0.21)&lt;/td&gt;
&lt;td&gt;1.33 (1.80)&lt;/td&gt;
&lt;td&gt;0.96 (1.68)&lt;/td&gt;
&lt;td&gt;1.22 (3.06)&lt;/td&gt;
&lt;td&gt;0.79 (1.35)&lt;/td&gt;
&lt;td&gt;1.95 (3.76)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One label, vendor default&lt;/td&gt;
&lt;td&gt;0.11 (0.21)&lt;/td&gt;
&lt;td&gt;1.45 (5.29)&lt;/td&gt;
&lt;td&gt;3.25 (21.5)&lt;/td&gt;
&lt;td&gt;2.97 (7.32)&lt;/td&gt;
&lt;td&gt;1.19 (10.4)&lt;/td&gt;
&lt;td&gt;2.18 (8.22)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 questions per case&lt;/td&gt;
&lt;td&gt;0.12 (0.20)&lt;/td&gt;
&lt;td&gt;1.66 (2.56)&lt;/td&gt;
&lt;td&gt;3.21 (5.21)&lt;/td&gt;
&lt;td&gt;3.13 (6.20)&lt;/td&gt;
&lt;td&gt;1.33 (1.70)&lt;/td&gt;
&lt;td&gt;2.14 (2.89)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 95th percentile is where thinking hurts: at vendor defaults, one Qwen3.8 Flash call in twenty took over 21 seconds for a single label. Jev's slowest calls stayed near 0.2 seconds.&lt;/p&gt;

&lt;p&gt;Adding questions did not slow Jev down: going from 1 to 60 yes/no questions about one support ticket moved its median by less than 0.1 seconds, and the 60-question call billed 1,371 input tokens, $0.000058. Every answer on the 20-question calls was right in all five runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do these results compare with TypeSafe's own claims?
&lt;/h2&gt;

&lt;p&gt;They agree on the direction and are smaller in size, because the comparisons differ. TypeSafe's launch post quotes up to 444.6 times cheaper and 193.6 times faster, measured against frontier models with reasoning on multi-step workflows, and calls those numbers "the higher end of real world gains" (&lt;a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev" rel="noopener noreferrer"&gt;launch post&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Its published &lt;a href="https://evals.typesafe.ai/" rel="noopener noreferrer"&gt;workflow evals&lt;/a&gt; include &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt;: Jev at 67.8% accuracy, $0.0004 and 0.4 seconds per case against Luna at 66.8%, $0.0033 and 12.9 seconds, about 8 times cheaper and 32 times faster. Our 12-question test measured Luna with thinking off at 7 times Jev's cost and 14 times its time after network, the same order of magnitude. Against the cheapest flash models on a single label, the cost gap closes to nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is Jev as accurate as a flash LLM?
&lt;/h2&gt;

&lt;p&gt;Close on the workflow test, behind on the classification tests, and never first. On 12 questions per case, Jev's micro F1 (every yes and no across all questions, where 1.0 is perfect) sat inside the range of the chat models, and its probabilities ranked right from wrong answers about as well as the best of them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;12 questions per case (150 transcripts)&lt;/th&gt;
&lt;th&gt;Micro F1 at 0.5&lt;/th&gt;
&lt;th&gt;All 12 answers right&lt;/th&gt;
&lt;th&gt;AUC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jev 1.13&lt;/td&gt;
&lt;td&gt;0.909&lt;/td&gt;
&lt;td&gt;61.3%&lt;/td&gt;
&lt;td&gt;0.990&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt;, thinking off&lt;/td&gt;
&lt;td&gt;0.933&lt;/td&gt;
&lt;td&gt;71.3%&lt;/td&gt;
&lt;td&gt;0.973&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Luna, default&lt;/td&gt;
&lt;td&gt;0.931&lt;/td&gt;
&lt;td&gt;71.3%&lt;/td&gt;
&lt;td&gt;0.992&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/gemini-3-8-flash/" rel="noopener noreferrer"&gt;Gemini 3.8 Flash&lt;/a&gt;, low&lt;/td&gt;
&lt;td&gt;0.919&lt;/td&gt;
&lt;td&gt;66.7%&lt;/td&gt;
&lt;td&gt;0.974&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt;, thinking off&lt;/td&gt;
&lt;td&gt;0.913&lt;/td&gt;
&lt;td&gt;62.7%&lt;/td&gt;
&lt;td&gt;0.975&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt;, low&lt;/td&gt;
&lt;td&gt;0.906&lt;/td&gt;
&lt;td&gt;64.7%&lt;/td&gt;
&lt;td&gt;0.975&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt;, thinking off&lt;/td&gt;
&lt;td&gt;0.896&lt;/td&gt;
&lt;td&gt;60.0%&lt;/td&gt;
&lt;td&gt;0.958&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;AUC measures how well the probabilities rank: 1.0 means every true "yes" got a higher probability than every "no". With the 12,000-token reference in front, Jev held its accuracy (F1 0.914 against 0.922 on the same 60 transcripts without it).&lt;/p&gt;

&lt;p&gt;On the classification tests the chat models pulled ahead, most of all at their default thinking settings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model and setting&lt;/th&gt;
&lt;th&gt;One label (Banking77)&lt;/th&gt;
&lt;th&gt;28 labels (GoEmotions micro F1)&lt;/th&gt;
&lt;th&gt;Prompt injection&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jev 1.13&lt;/td&gt;
&lt;td&gt;80.2%&lt;/td&gt;
&lt;td&gt;0.228&lt;/td&gt;
&lt;td&gt;74.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Luna, thinking off / default&lt;/td&gt;
&lt;td&gt;85.1% / 87.3%&lt;/td&gt;
&lt;td&gt;0.301 / 0.342&lt;/td&gt;
&lt;td&gt;69.6% / 72.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/gpt-5-6-terra/" rel="noopener noreferrer"&gt;GPT-5.6 Terra&lt;/a&gt;, thinking off / default&lt;/td&gt;
&lt;td&gt;83.4% / 85.4%&lt;/td&gt;
&lt;td&gt;0.273 / 0.324&lt;/td&gt;
&lt;td&gt;80.9% / 79.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.8 Flash, low / default&lt;/td&gt;
&lt;td&gt;84.4% / 83.8%&lt;/td&gt;
&lt;td&gt;0.373 / 0.372&lt;/td&gt;
&lt;td&gt;81.9% / 82.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.8 Flash, off / default&lt;/td&gt;
&lt;td&gt;77.6% / 81.5%&lt;/td&gt;
&lt;td&gt;0.286 / 0.338&lt;/td&gt;
&lt;td&gt;81.9% / 80.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.3 Flash, low / default&lt;/td&gt;
&lt;td&gt;77.9% / 79.9%&lt;/td&gt;
&lt;td&gt;0.255 / 0.310&lt;/td&gt;
&lt;td&gt;81.9% / 81.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4.1 Flash, off / default&lt;/td&gt;
&lt;td&gt;77.3% / 81.8%&lt;/td&gt;
&lt;td&gt;0.289 / 0.365&lt;/td&gt;
&lt;td&gt;82.8% / 86.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/dola-seed-2-0-mini/" rel="noopener noreferrer"&gt;Seed 2.0 Mini&lt;/a&gt;, thinking off&lt;/td&gt;
&lt;td&gt;70.8%&lt;/td&gt;
&lt;td&gt;0.245&lt;/td&gt;
&lt;td&gt;66.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GPT-5.6 Luna and Terra answered 115 of the 116 injection texts and 199 of the 200 comments; one request each returned an error, and accuracy is over the answers returned. A reply that was not a yes or no counts as wrong. On emotions Jev said yes too often: an emotion it gave 0.80 to 0.95 was in the human label only 15% of the time. The emotion labels are sparse (annotators picked one or two per comment), which lowers every model's score, but every model got the same instruction. On prompt injection, Jev's 0.5 default was the wrong cut-off, which the next section covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you trust Jev's confidence?
&lt;/h2&gt;

&lt;p&gt;Its probabilities separate right from wrong answers well, but they are not calibrated in the plain sense, so each task needs its own threshold. Calibrated means a 0.8 is right 80% of the time; on Banking77 Jev was right 98% of the time at 0.99 and above, and about half the time below 0.8.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fjev-vs-flash-llms%2Fconfidence-bands.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fjev-vs-flash-llms%2Fconfidence-bands.svg" alt="Bar chart of Jev 1.13 accuracy on Banking77 by top-choice probability: 0.99 to 1.00, 98% correct on 48% of messages; 0.95 to 0.99, 81%; 0.90 to 0.95, 77%; 0.80 to 0.90, 75%; 0.70 to 0.80, 52%; 0.50 to 0.70, 40%; below 0.50, 42%" width="1400" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nearly half of the Banking77 messages (48%) got a top probability of 0.99 or more, so a pipeline that accepts those and sends the rest to a larger model keeps 98% accuracy on that share of its traffic. Prompt injection shows the other side. At the default 0.5 cut-off Jev flagged only half the attacks: the other half got probabilities between 0.03 and 0.5, low in absolute terms but mostly above the benign texts, whose median was 0.02. Ranked by probability, it separated attacks from benign text at an AUC of 0.984.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threshold on the injection set&lt;/th&gt;
&lt;th&gt;Jev accuracy&lt;/th&gt;
&lt;th&gt;Attacks caught&lt;/th&gt;
&lt;th&gt;False alarms (of 56 benign)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.5 (default)&lt;/td&gt;
&lt;td&gt;74.1%&lt;/td&gt;
&lt;td&gt;50.0%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;88.8%&lt;/td&gt;
&lt;td&gt;80.0%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.05&lt;/td&gt;
&lt;td&gt;93.1%&lt;/td&gt;
&lt;td&gt;91.7%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Those thresholds were chosen on the same 116 texts, so treat them as an upper bound. A chat model can give a probability too when its API returns token log-probabilities, the model's own probability for each token it writes; among the chat models here, &lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt; and &lt;a href="https://synthorai.io/models/dola-seed-2-0-mini/" rel="noopener noreferrer"&gt;Seed 2.0 Mini&lt;/a&gt; returned them in our runs, and Qwen3.8 Flash's probability of "yes" ranked the injection texts at an AUC of 0.977.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you use Jev or a flash LLM?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If your job is&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;th&gt;Why, from these tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;many yes/no or pick-one questions about the same text&lt;/td&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;4.8 to 37 times cheaper, 11 to 27 times faster after network, similar accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a decision inside a loop that must answer in under a second&lt;/td&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;0.11 to 0.12 s after network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long documents with a few judgments each&lt;/td&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;cost settles near the input price ratio, 3.5 to 18.6 times less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;one label per short message, at the lowest cost&lt;/td&gt;
&lt;td&gt;Jev, &lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt; or &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; with thinking off&lt;/td&gt;
&lt;td&gt;the same cost; the LLMs return no probability unless you read log-probabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;the most accurate label&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt; at its default&lt;/td&gt;
&lt;td&gt;87.3% on Banking77 at $0.11 per 1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;numbers, dates, counting or generated text&lt;/td&gt;
&lt;td&gt;a chat model&lt;/td&gt;
&lt;td&gt;TypeSafe lists these as Jev's weak spots&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern that got the most out of Jev in our runs: decompose the decision into many narrow questions about the same text, act on answers above a threshold tuned on your own labeled data, and send the rest to a chat model.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is TypeSafe Jev?&lt;/strong&gt;&lt;br&gt;
Jev is a decision model from TypeSafe that answers typed questions (yes/no, pick one, rate on a scale) about a piece of text and returns probabilities instead of generated text. Jev 1.13 is the current version, served under the &lt;code&gt;jev-latest&lt;/code&gt; alias, at $0.042 per million input tokens with free output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Jev cheaper than an LLM?&lt;/strong&gt;&lt;br&gt;
It depends on the job. Asking 12 questions about each support transcript, &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt; with thinking off cost 7 times more than Jev and &lt;a href="https://synthorai.io/models/gemini-3-8-flash/" rel="noopener noreferrer"&gt;Gemini 3.8 Flash&lt;/a&gt; 37 times more; on a single 77-way label, &lt;a href="https://synthorai.io/models/qwen3-8-flash/" rel="noopener noreferrer"&gt;Qwen3.8 Flash&lt;/a&gt; and &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; with thinking off cost the same as Jev.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Jev more accurate than GPT-5.6 Luna?&lt;/strong&gt;&lt;br&gt;
Not in our tests: &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt; with thinking off scored a micro F1 of 0.933 against Jev's 0.909 on 12 questions per case, and 85.1% against 80.2% on Banking77. Jev caught more prompt injections than Luna with thinking off at its default 0.5 cut-off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does TypeSafe say Jev is 444 times cheaper?&lt;/strong&gt;&lt;br&gt;
That figure compares Jev with frontier models running reasoning on multi-step workflows, and TypeSafe calls it the high end. Against flash models we measured 4.8 to 37 times cheaper on a 12-question workflow and about the same cost on a single label.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are Jev's probabilities calibrated?&lt;/strong&gt;&lt;br&gt;
Not in the plain sense. On Banking77 its answers were right 98% of the time at a probability of 0.99 or more but only about half the time below 0.8, and on prompt injections it gave half the attacks a probability under 0.5. Tune a threshold per task on your own labeled data.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://synthorai.io/blog/flash-llm-comparison/" rel="noopener noreferrer"&gt;best flash LLM API in 2026&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-structured-outputs/" rel="noopener noreferrer"&gt;LLM structured outputs compared&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;LLM thinking controls&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/best-llm-by-use-case-chat-api-agent/" rel="noopener noreferrer"&gt;best LLM by use case&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>jev</category>
      <category>classification</category>
      <category>llm</category>
      <category>benchmarks</category>
    </item>
    <item>
      <title>GLM 5.3 API Cost: Always Thinking, 2.5x Cheaper per Answer Than 5.2</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Tue, 15 Sep 2026 15:22:14 +0000</pubDate>
      <link>https://dev.to/synthorai/glm-53-api-cost-always-thinking-25x-cheaper-per-answer-than-52-13jg</link>
      <guid>https://dev.to/synthorai/glm-53-api-cost-always-thinking-25x-cheaper-per-answer-than-52-13jg</guid>
      <description>&lt;p&gt;&lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt; costs the same $1.40 per million input tokens and $4.40 per million output as &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt;, and it no longer lets you turn thinking off: every way of disabling it returns a 400 error, and the default effort is &lt;code&gt;max&lt;/code&gt;. On 11 tasks with a checkable answer, run three times each, &lt;code&gt;max&lt;/code&gt; was the only setting that got all 33 right, at $0.00468 per correct answer, 2.5x less than GLM 5.2 at &lt;code&gt;max&lt;/code&gt; because GLM 5.3 reasons about half as much. &lt;code&gt;low&lt;/code&gt; costs 63% less per correct answer and misses 5 of 33. &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; reached 31 of 33 at a tenth of the price. &lt;code&gt;reasoning_effort&lt;/code&gt;, the parameter that sets how long a model thinks before answering, now decides accuracy as well as cost; we measured both builds against GLM 5.2 and &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; in one batch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GLM 5.3 and GLM 5.3 Flash reject &lt;code&gt;thinking: disabled&lt;/code&gt;, &lt;code&gt;reasoning_effort: none&lt;/code&gt; and &lt;code&gt;medium&lt;/code&gt; with error 1210; only &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; (the default) work.&lt;/li&gt;
&lt;li&gt;At &lt;code&gt;max&lt;/code&gt;, GLM 5.3 scored 33 of 33 at $0.00468 per correct answer; GLM 5.2 at &lt;code&gt;max&lt;/code&gt; cost $0.01173.&lt;/li&gt;
&lt;li&gt;At &lt;code&gt;low&lt;/code&gt;, GLM 5.3 scored 28 of 33 and GLM 5.3 Flash 24 of 33.&lt;/li&gt;
&lt;li&gt;Both GLM 5.3 builds ignore a strict &lt;code&gt;json_schema&lt;/code&gt;; &lt;code&gt;json_object&lt;/code&gt; returned correct values 8 of 8 times.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is GLM 5.3, and what does it cost?
&lt;/h2&gt;

&lt;p&gt;A retrained GLM 5.2 at the same price, plus a smaller model at a tenth of it. GLM 5.3 "uses the same base model as GLM-5.2, with all improvements driven by post-training", per Z.ai's &lt;a href="https://docs.z.ai/guides/llm/glm-5.3" rel="noopener noreferrer"&gt;guide&lt;/a&gt;, and takes text only. &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; has "320B total parameters with 18B activated" (only 18B do work on each token, which is what makes it cheap) and accepts images, video and files. Both have a 1M-token context and 128K output. Prices from Z.ai's &lt;a href="https://docs.z.ai/guides/overview/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, per million tokens:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Cached input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1.40&lt;/td&gt;
&lt;td&gt;$0.26&lt;/td&gt;
&lt;td&gt;$4.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.15&lt;/td&gt;
&lt;td&gt;$0.03&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1.40&lt;/td&gt;
&lt;td&gt;$0.26&lt;/td&gt;
&lt;td&gt;$4.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.30 peak&lt;/td&gt;
&lt;td&gt;$0.006 peak&lt;/td&gt;
&lt;td&gt;$1.20 peak&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Z.ai's &lt;a href="https://huggingface.co/zai-org/GLM-5.3" rel="noopener noreferrer"&gt;model card&lt;/a&gt; and &lt;a href="https://docs.z.ai/guides/llm/glm-5.3-flash" rel="noopener noreferrer"&gt;Flash guide&lt;/a&gt; put the gain on agent and coding work:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;th&gt;GLM 5.2&lt;/th&gt;
&lt;th&gt;GLM 5.3&lt;/th&gt;
&lt;th&gt;GLM 5.3 Flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terminal Bench 3.0&lt;/td&gt;
&lt;td&gt;agent tasks in a terminal&lt;/td&gt;
&lt;td&gt;4.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;28.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;not listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSWE v1.1&lt;/td&gt;
&lt;td&gt;fixing real repositories&lt;/td&gt;
&lt;td&gt;46.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;66.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;63.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutomationBench&lt;/td&gt;
&lt;td&gt;workflow automation&lt;/td&gt;
&lt;td&gt;26.2&lt;/td&gt;
&lt;td&gt;48.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CyberGym&lt;/td&gt;
&lt;td&gt;security vulnerability tasks&lt;/td&gt;
&lt;td&gt;77.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;not listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HLE with tools&lt;/td&gt;
&lt;td&gt;hard questions, tools allowed&lt;/td&gt;
&lt;td&gt;54.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;62.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;not listed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What follows is what we could check ourselves: tasks with one verifiable answer, not agent benchmarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you still turn thinking off?
&lt;/h2&gt;

&lt;p&gt;No. GLM 5.2 accepted &lt;code&gt;thinking: {"type": "disabled"}&lt;/code&gt;. &lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt; and &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; return HTTP 400 with error code 1210 ("this model always thinks, turning thinking off is not supported; use low, high or max") for &lt;code&gt;thinking: disabled&lt;/code&gt;, &lt;code&gt;enable_thinking: false&lt;/code&gt;, and &lt;code&gt;reasoning_effort&lt;/code&gt; set to &lt;code&gt;none&lt;/code&gt;, &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt; or &lt;code&gt;xhigh&lt;/code&gt;. Leave &lt;code&gt;reasoning_effort&lt;/code&gt; out and you get &lt;code&gt;max&lt;/code&gt;. &lt;code&gt;thinking_budget&lt;/code&gt;, a token cap on thinking that some providers honour, is accepted and ignored on GLM 5.3: every value from 0 to 1,024 produced about 101 reasoning tokens on the same question.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glm-5.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# "low" | "high" | "max"; omitted means "max"
&lt;/span&gt;    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;# GLM 5.3 Flash rejects anything above 131,072
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reasoning_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens_details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;  &lt;span class="c1"&gt;# billed as output
&lt;/span&gt;&lt;span class="n"&gt;thinking_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_content&lt;/span&gt;                &lt;span class="c1"&gt;# the thinking itself, as text
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The old cheap path was not a good one anyway: with thinking off, &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt; answered 10 of our 33 tasks correctly, and &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; 22.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which effort setting gets the answers right?
&lt;/h2&gt;

&lt;p&gt;On GLM 5.3, only &lt;code&gt;max&lt;/code&gt;; on GLM 5.3 Flash, none of them. We ran 11 tasks whose answer is a single number we can check (sums of primes, digit counts, grid paths, coin combinations, a rule applied 40 times, the remainder of 7 to the power 222 divided by 1000, a base conversion, a knapsack, and counting four-digit numbers under three constraints) three times each. Reasoning tokens are the hidden thinking written before the answer, billed as output; cost per correct answer is total spend divided by correct answers, at list price:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Correct&lt;/th&gt;
&lt;th&gt;Reasoning tokens, median (max)&lt;/th&gt;
&lt;th&gt;Cost per correct answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;28/33&lt;/td&gt;
&lt;td&gt;143 (1,826)&lt;/td&gt;
&lt;td&gt;$0.00173&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;29/33&lt;/td&gt;
&lt;td&gt;226 (1,950)&lt;/td&gt;
&lt;td&gt;$0.00197&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;max&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;33/33&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;538 (7,733)&lt;/td&gt;
&lt;td&gt;$0.00468&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;24/33&lt;/td&gt;
&lt;td&gt;120 (467)&lt;/td&gt;
&lt;td&gt;$0.00012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.3 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;29/33&lt;/td&gt;
&lt;td&gt;196 (1,582)&lt;/td&gt;
&lt;td&gt;$0.00021&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.3 Flash&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;max&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;31/33&lt;/td&gt;
&lt;td&gt;419 (5,024)&lt;/td&gt;
&lt;td&gt;$0.00040&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;1,129 (21,917)&lt;/td&gt;
&lt;td&gt;$0.01173&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;337 (6,797)&lt;/td&gt;
&lt;td&gt;$0.00102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4.1 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;386 (10,769)&lt;/td&gt;
&lt;td&gt;$0.00138&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fsynthorai.io%2Fblog%2Fassets%2Fglm-5-3-cost%2Fcost-per-correct.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fglm-5-3-cost%2Fcost-per-correct.svg" alt="Bar chart of cost per correct answer for GLM 5.3, GLM 5.3 Flash, GLM 5.2 and DeepSeek V4.1 Flash at effort low, high and max, labelled with correct answers out of 33. GLM 5.3 reaches 33 of 33 only at max, at $0.00468; GLM 5.2 at max costs $0.01173; GLM 5.3 Flash is cheapest but tops out at 31 of 33" width="1540" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The 2.5x against GLM 5.2 comes from reasoning volume: a median of 538 reasoning tokens against 1,129, and a longest run of 7,733 against 21,917. The lower settings save money by skipping checks. At &lt;code&gt;low&lt;/code&gt;, GLM 5.3 answered the grid-path count as 216 twice (one blocked cell makes it 132) and missed the coin combinations, the knapsack and the base conversion once each. GLM 5.3 Flash at &lt;code&gt;low&lt;/code&gt; failed the 40-step rule and the constrained count every time. DeepSeek V4.1 Flash, by contrast, scored 33 of 33 at every setting.&lt;/p&gt;

&lt;p&gt;On GLM 5.3, keep the default for anything with arithmetic or several steps, and use &lt;code&gt;low&lt;/code&gt; only where a wrong answer is cheap to catch. At &lt;code&gt;max&lt;/code&gt;, GLM 5.3 costs 3.4x &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; per correct answer; GLM 5.3 Flash costs under a third of it while missing 2 of 33.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it make things up when a question has no answer?
&lt;/h2&gt;

&lt;p&gt;No, even with thinking forced on. We asked five questions about entities we made up, so the only right answer is "I do not know" (a share price for &lt;code&gt;Verantis Dynamics&lt;/code&gt;, the melting point of &lt;code&gt;Oridium-7&lt;/code&gt;, the winner of the &lt;code&gt;1987 Pan-Continental Robotics Prize&lt;/code&gt;), at the default effort with a 16,384-token cap:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Declined&lt;/th&gt;
&lt;th&gt;Invented an answer&lt;/th&gt;
&lt;th&gt;Hit the cap, empty answer&lt;/th&gt;
&lt;th&gt;Reasoning tokens&lt;/th&gt;
&lt;th&gt;Cost per question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;230 to 542&lt;/td&gt;
&lt;td&gt;$0.0022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;238 to 625&lt;/td&gt;
&lt;td&gt;$0.0003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;134 to 1,559&lt;/td&gt;
&lt;td&gt;$0.0035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;3/5&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;7,021 to 16,384&lt;/td&gt;
&lt;td&gt;$0.0139&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both GLM 5.3 builds said they had no information after a few hundred reasoning tokens. DeepSeek V4.1 Flash thought for 7,000 to 16,000 tokens and then usually invented something (&lt;code&gt;Andrew Martin, the robot protagonist of Isaac Asimov's The Bicentennial Man, won&lt;/code&gt;); in &lt;a href="https://synthorai.io/blog/deepseek-v4-1-flash-cost/" rel="noopener noreferrer"&gt;its own study&lt;/a&gt; a day earlier, more runs hit the cap instead, but it rarely declined. For lookups that can legitimately come back empty, this is the biggest difference we measured between the two flash-tier models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does GLM 5.3 follow a JSON schema?
&lt;/h2&gt;

&lt;p&gt;Not a strict one; use &lt;code&gt;json_object&lt;/code&gt;. With &lt;code&gt;response_format&lt;/code&gt; set to a strict &lt;code&gt;json_schema&lt;/code&gt; for an invoice extraction, &lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt; and &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; returned HTTP 200 and ignored the schema in 16 of 16 runs: the JSON came wrapped in a markdown code fence with keys the schema did not ask for (&lt;code&gt;invoice_date&lt;/code&gt;, &lt;code&gt;reference&lt;/code&gt;), so none parsed as the requested object. Z.ai's &lt;a href="https://docs.z.ai/api-reference/llm/chat-completion" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; lists only &lt;code&gt;text&lt;/code&gt; and &lt;code&gt;json_object&lt;/code&gt;; the trap is that the schema is accepted silently.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;{"type": "json_object"}&lt;/code&gt; and the fields named in the prompt, both builds returned every value right in 8 of 8 runs, as did &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt; and &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt;. Since thinking stays on, extraction costs a median of 240 output tokens on GLM 5.3 and 140 on Flash, against 25 on V4.1 Flash with thinking off. Validate the result against your schema yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does an image cost on GLM 5.3 Flash?
&lt;/h2&gt;

&lt;p&gt;It grows with pixel area and does not cap by 2048x2048, so large images cost more than on DeepSeek V4.1 Flash despite the lower rate. We sent generated PNGs to &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; (&lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt; is text only) and subtracted the text-only prompt:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Image&lt;/th&gt;
&lt;th&gt;GLM 5.3 Flash tokens&lt;/th&gt;
&lt;th&gt;Cost at $0.15/M&lt;/th&gt;
&lt;th&gt;DeepSeek V4.1 Flash tokens&lt;/th&gt;
&lt;th&gt;Cost at $0.30/M&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;512x512&lt;/td&gt;
&lt;td&gt;363&lt;/td&gt;
&lt;td&gt;$0.000054&lt;/td&gt;
&lt;td&gt;184&lt;/td&gt;
&lt;td&gt;$0.000055&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1024x1024&lt;/td&gt;
&lt;td&gt;1,371&lt;/td&gt;
&lt;td&gt;$0.000206&lt;/td&gt;
&lt;td&gt;652&lt;/td&gt;
&lt;td&gt;$0.000196&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2048x2048&lt;/td&gt;
&lt;td&gt;5,478&lt;/td&gt;
&lt;td&gt;$0.000822&lt;/td&gt;
&lt;td&gt;994&lt;/td&gt;
&lt;td&gt;$0.000298&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fsynthorai.io%2Fblog%2Fassets%2Fglm-5-3-cost%2Fimage-tokens.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fglm-5-3-cost%2Fimage-tokens.svg" alt="Line chart of image input tokens against square image size: GLM 5.3 Flash rises with pixel area to 5,478 tokens at 2048x2048; DeepSeek V4.1 Flash is flat at 184 up to 512x512 and reaches 994" width="1540" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above 512 pixels, GLM 5.3 Flash spends about one token per 766 pixels; &lt;code&gt;detail&lt;/code&gt;, image content and file format did not change the count. The &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; numbers come from its study the day before. Downscale screenshots and document pages before sending: at 2048x2048, GLM 5.3 Flash costs 2.8x more per image.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else changed from GLM 5.2?
&lt;/h2&gt;

&lt;p&gt;Speed, and little of the plumbing. Streamed in the same window at &lt;code&gt;low&lt;/code&gt;, &lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt; generated 59 to 64 output tokens per second, &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; 70 to 82, &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt; 51 to 55, and &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; 124 to 161. In a two-turn function-calling loop every model made one call per turn. The three GLM builds count identical tokens on English, Chinese and Python text (737, 484 and 488), so token budgets carry over.&lt;/p&gt;

&lt;p&gt;The repeated opening of a prompt is billed at the cached rate, counted in 64-token steps (a 1,153-token prompt read 1,024 from cache). Both builds accept prompts close to the 1M-token limit, although the Flash model card mentions 300,000 tokens: a 990,000-token prompt with one value hidden near its start returned that value (we did not test recall near the end), and one of about 1.07M tokens got a 400, &lt;code&gt;Prompt exceeds max length&lt;/code&gt;, instead of being cut short. One upgrade break: GLM 5.3 Flash rejects &lt;code&gt;max_tokens&lt;/code&gt; above 131,072.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Synthorai handles it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt;, &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; and &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt; are &lt;code&gt;glm-5.3&lt;/code&gt;, &lt;code&gt;glm-5.3-flash&lt;/code&gt; and &lt;code&gt;glm-5.2&lt;/code&gt; on the gateway, at Z.ai's list prices, on &lt;code&gt;/v1/chat/completions&lt;/code&gt; and &lt;code&gt;/v1/responses&lt;/code&gt;. The 1210 error passes through unchanged, so a client still sending its GLM 5.2 off switch fails loudly instead of silently thinking at &lt;code&gt;max&lt;/code&gt;. Reasoning text comes back in &lt;code&gt;reasoning_content&lt;/code&gt;; images go to GLM 5.3 Flash as &lt;code&gt;image_url&lt;/code&gt; content parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can you disable thinking on GLM 5.3?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. &lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt; and &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; return a 400 with error 1210 for every off switch; only &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; are accepted, and &lt;code&gt;max&lt;/code&gt; is the default. On our suite &lt;code&gt;low&lt;/code&gt; cost 63% less per correct answer but got 28 of 33 right instead of 33.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is GLM 5.3 cheaper than GLM 5.2?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Per token, no: both cost $1.40 input and $4.40 output. Per correct answer, yes: at &lt;code&gt;max&lt;/code&gt;, &lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt; cost $0.00468 against &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM 5.2&lt;/a&gt;'s $0.01173, because it reasons about half as much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can GLM 5.3 Flash replace GLM 5.3?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Where an occasional wrong number gets caught downstream, yes, at a tenth of the price: &lt;a href="https://synthorai.io/models/glm-5-3-flash/" rel="noopener noreferrer"&gt;GLM 5.3 Flash&lt;/a&gt; at &lt;code&gt;max&lt;/code&gt; got 31 of 33 right at $0.00040 per correct answer, against 33 of 33 at $0.00468 on &lt;a href="https://synthorai.io/models/glm-5-3/" rel="noopener noreferrer"&gt;GLM 5.3&lt;/a&gt;. Avoid Flash at &lt;code&gt;low&lt;/code&gt; for multi-step arithmetic, where it got 24 of 33.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://synthorai.io/blog/glm-52-coding-cost/" rel="noopener noreferrer"&gt;GLM 5.2 reasoning effort&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/glm-5-2-tool-calls/" rel="noopener noreferrer"&gt;GLM 5.2 tool calls&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/deepseek-v4-1-flash-cost/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash cost&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;LLM thinking controls&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-structured-outputs/" rel="noopener noreferrer"&gt;LLM structured outputs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>glm</category>
      <category>ai</category>
      <category>pricing</category>
      <category>llm</category>
    </item>
    <item>
      <title>DeepSeek V4.1 Flash API Cost: Matches V4 Pro at 3-6x Less per Answer</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Mon, 14 Sep 2026 16:59:11 +0000</pubDate>
      <link>https://dev.to/synthorai/deepseek-v41-flash-api-cost-matches-v4-pro-at-3-6x-less-per-answer-1mcn</link>
      <guid>https://dev.to/synthorai/deepseek-v41-flash-api-cost-matches-v4-pro-at-3-6x-less-per-answer-1mcn</guid>
      <description>&lt;p&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;DeepSeek V4.1 Flash&lt;/a&gt; costs $0.30 per million input tokens and $1.20 per million output at peak, half that off-peak, and on 11 tasks with a checkable answer, run three times each, it got 33 of 33 right, the same score as &lt;a href="https://synthorai.io/models/deepseek-v4-pro-0813/" rel="noopener noreferrer"&gt;V4 Pro&lt;/a&gt; at 3 to 6x less per correct answer and 2.9x the output speed. Against the &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash&lt;/a&gt; it retires, it is 26% cheaper per correct answer, 1.5x faster, and the first Flash that reads images. It also ships with two behaviours to design around: with thinking off it answers multi-step arithmetic with a single wrong token, and with thinking on it spends the whole output window, 16,384 tokens in three of five runs, on questions about things that do not exist. We measured all three builds, &lt;code&gt;deepseek-v4.1-flash&lt;/code&gt; and &lt;code&gt;deepseek-v4-pro-0813&lt;/code&gt; in one batch (same hour, same gateway) four days after release and &lt;code&gt;deepseek-v4-flash-0731&lt;/code&gt; the same evening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;V4.1 Flash is $0.30/$1.20 per million at peak, half off-peak; V4 Pro is $1.32/$3.96.&lt;/li&gt;
&lt;li&gt;All three builds scored 33 of 33 with thinking on; per correct answer V4.1 Flash cost $0.00097 to $0.00149, 3 to 6x under V4 Pro and 26% under V4 Flash.&lt;/li&gt;
&lt;li&gt;Thinking off drops all three to 21 of 33; V4.1 Flash then answers with one wrong token.&lt;/li&gt;
&lt;li&gt;On five fabricated entities V4.1 Flash with thinking on hit the 16,384-token cap three times and invented twice; thinking off declined all five.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What changed on September 10, and what does V4.1 Flash cost?
&lt;/h2&gt;

&lt;p&gt;A new architecture at a new price, and a retirement. &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; is "the smallest model in our new architecture family": 552B parameters in a causal encoder-decoder (one 20-layer stack reads the prompt, another writes the answer), 8B active per token for input and 16B for output, with native image input, a 1M-token context and a 384K output cap, under an MIT license. DeepSeek's &lt;a href="https://api-docs.deepseek.com/quick_start/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; lists it at $0.30 per million input tokens and $1.20 per million output at peak (01:00 to 04:00 and 06:00 to 10:00 UTC, Monday to Friday), $0.15 and $0.60 off-peak, with cache hits at $0.006 and $0.003. That sits between the two cards &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash&lt;/a&gt; had, a flat $0.14/$0.28 at its July launch and $0.44/$1.32 peak from 2026-08-16, and well under &lt;a href="https://synthorai.io/models/deepseek-v4-pro-0813/" rel="noopener noreferrer"&gt;V4 Pro&lt;/a&gt; at $1.32/$3.96 peak.&lt;/p&gt;

&lt;p&gt;V4 Flash and the Vision Exp build are retired, and their names route to V4.1 Flash at the Flash price. DeepSeek had also planned to route V4 Pro traffic to V4.1 Flash from September 14; the &lt;a href="https://api-docs.deepseek.com/updates/" rel="noopener noreferrer"&gt;change log&lt;/a&gt; dropped that plan the same day, "in response to user demand", so Pro stays available at Pro prices.&lt;/p&gt;

&lt;p&gt;The plumbing changed less than the price. The tokenizer is identical across the three builds (729, 452 and 528 tokens on the same English, Chinese and Python corpora), so token budgets port; cache pages halved from 1,024 tokens to 512, so a 549-token prompt now caches 512 of them; a 902K-token prompt with one planted value returned it, and a prompt past the 1M window returned a 400 rather than a silent truncation.&lt;/p&gt;

&lt;p&gt;DeepSeek's own numbers, from the &lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash" rel="noopener noreferrer"&gt;model card&lt;/a&gt;, put the new Flash above the old one everywhere and above Pro on agent and coding work but not on knowledge:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;th&gt;V4 Flash&lt;/th&gt;
&lt;th&gt;V4.1 Flash&lt;/th&gt;
&lt;th&gt;V4 Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPQA Diamond&lt;/td&gt;
&lt;td&gt;graduate-level science questions&lt;/td&gt;
&lt;td&gt;89.9&lt;/td&gt;
&lt;td&gt;90.9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;92.4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HLE&lt;/td&gt;
&lt;td&gt;hard cross-discipline questions&lt;/td&gt;
&lt;td&gt;37.8&lt;/td&gt;
&lt;td&gt;36.8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42.7&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codeforces&lt;/td&gt;
&lt;td&gt;competitive programming rating&lt;/td&gt;
&lt;td&gt;3289&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3471&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3348&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MathArena Apex&lt;/td&gt;
&lt;td&gt;competition mathematics&lt;/td&gt;
&lt;td&gt;58.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;65.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench 2.1&lt;/td&gt;
&lt;td&gt;agent tasks in a terminal&lt;/td&gt;
&lt;td&gt;82.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;87.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench 4.0&lt;/td&gt;
&lt;td&gt;harder terminal agent tasks&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSWE v1.1&lt;/td&gt;
&lt;td&gt;fixing real repositories&lt;/td&gt;
&lt;td&gt;54.4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;62.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CyberGym&lt;/td&gt;
&lt;td&gt;security vulnerability tasks&lt;/td&gt;
&lt;td&gt;76.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;88.1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutomationBench&lt;/td&gt;
&lt;td&gt;workflow automation&lt;/td&gt;
&lt;td&gt;37.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;54.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;43.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rest of this post is what we could check ourselves, which is the first half of that table (answers that can be verified), not the knowledge rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does V4.1 Flash really match V4 Pro, and beat V4 Flash?
&lt;/h2&gt;

&lt;p&gt;On tasks with a checkable answer all three builds score the same, so the differences are price, speed and how they fail. We ran 11 tasks whose answer is a single number we can check (sums of primes, digit counts, grid paths, coin combinations, a rule applied 40 times, 7 to the power 222 divided by 1000 with the remainder kept, a base conversion, a knapsack, and counting four-digit numbers under three constraints) three times each at &lt;code&gt;reasoning_effort&lt;/code&gt; &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt;, and with thinking off. Reasoning tokens are the hidden thinking the model writes before its answer, billed as output; cost per correct answer is total spend divided by correct answers, at each model's peak card (&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash&lt;/a&gt; at the $0.44/$1.32 card it was sold on until retirement); off-peak is half:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Correct&lt;/th&gt;
&lt;th&gt;Reasoning tokens, median (max)&lt;/th&gt;
&lt;th&gt;Cost per correct answer, peak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4 Flash 0731&lt;/td&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;492 (6,444)&lt;/td&gt;
&lt;td&gt;$0.00131&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Flash 0731&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;high&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;433 (9,172)&lt;/td&gt;
&lt;td&gt;$0.00163&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Flash 0731&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;453 (24,010)&lt;/td&gt;
&lt;td&gt;$0.00343&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Flash 0731&lt;/td&gt;
&lt;td&gt;thinking off&lt;/td&gt;
&lt;td&gt;21/33&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0.00083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;316 (6,153)&lt;/td&gt;
&lt;td&gt;$0.00097&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4.1 Flash&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;high&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;391 (13,300)&lt;/td&gt;
&lt;td&gt;$0.00149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4.1 Flash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;391 (11,037)&lt;/td&gt;
&lt;td&gt;$0.00129&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4.1 Flash&lt;/td&gt;
&lt;td&gt;thinking off&lt;/td&gt;
&lt;td&gt;21/33&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0.00050&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-pro-0813/" rel="noopener noreferrer"&gt;V4 Pro&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;309 (6,398)&lt;/td&gt;
&lt;td&gt;$0.00286&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Pro&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;high&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;548 (18,247)&lt;/td&gt;
&lt;td&gt;$0.00768&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Pro&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;33/33&lt;/td&gt;
&lt;td&gt;644 (15,920)&lt;/td&gt;
&lt;td&gt;$0.00825&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Pro&lt;/td&gt;
&lt;td&gt;thinking off&lt;/td&gt;
&lt;td&gt;21/33&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0.00232&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With thinking on, no build missed a task at any effort setting, so this suite cannot separate them on accuracy; it separates them on the bill (V4.1 Flash against Pro: 2.9x at &lt;code&gt;low&lt;/code&gt;, 5.2x at the default &lt;code&gt;high&lt;/code&gt;, 6.4x at &lt;code&gt;max&lt;/code&gt;; against V4 Flash: 26% less at &lt;code&gt;low&lt;/code&gt;) and on speed. Streamed with thinking off (so the clock measures answer generation, not thinking), V4.1 Flash decoded at 121 to 134 output tokens per second, with 1.4 s from request to first token; V4 Flash at 86 to 94 (2.3 s to first token); Pro at 46 to 49 (1.9 s). In a two-turn function-calling loop every build made exactly one call per turn; V4.1 Flash reasoned 27 and 13 tokens on the two legs, V4 Flash 30 and 19, Pro 61 and 29, at $0.00019, $0.00030 and $0.00103 per leg. The knowledge gap in DeepSeek's table (HLE, GPQA) is the one thing this suite does not exercise.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fdeepseek-v4-1-flash-cost%2Fcost-per-correct.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fdeepseek-v4-1-flash-cost%2Fcost-per-correct.svg" alt="Horizontal bar chart of cost per correct answer for V4 Flash 0731, V4.1 Flash and V4 Pro 0813 at effort low, high, max and with thinking off. V4.1 Flash is the shortest bar at every setting; V4 Pro at max is the longest at $0.00825; the thinking-off bars are red and labelled 21 of 33 correct for all three" width="1540" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the effort dial do, and can you turn thinking off?
&lt;/h2&gt;

&lt;p&gt;The dial moves the bill on a few tasks and the answer on none, and turning thinking off costs 12 of 33 answers on every build. &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; accepts &lt;code&gt;reasoning_effort&lt;/code&gt; as &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; (DeepSeek maps &lt;code&gt;minimal&lt;/code&gt; to &lt;code&gt;low&lt;/code&gt; and &lt;code&gt;medium&lt;/code&gt; and &lt;code&gt;xhigh&lt;/code&gt; to &lt;code&gt;high&lt;/code&gt;); on nine of the eleven tasks the three settings are within a few hundred reasoning tokens of each other, and only the counting task (four-digit numbers under three constraints) opens up: 5,650 at &lt;code&gt;low&lt;/code&gt;, 9,714 at &lt;code&gt;high&lt;/code&gt;, 6,763 at &lt;code&gt;max&lt;/code&gt;, all correct. Every &lt;code&gt;thinking_budget&lt;/code&gt; value from 0 to 1,024 was accepted and ignored. The model card's "continuously controllable reasoning effort setting (integer 1-100)" is not on the API; integers are rejected. &lt;a href="https://synthorai.io/models/deepseek-v4-pro-0813/" rel="noopener noreferrer"&gt;V4 Pro&lt;/a&gt; and &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash&lt;/a&gt; behave the same way at their own counts, and the counting task is where &lt;code&gt;max&lt;/code&gt; gets expensive on the older builds: 12,729 to 15,920 reasoning tokens on Pro, 17,866 to 24,010 on V4 Flash, for the same right answer V4.1 Flash reached in 6,763.&lt;/p&gt;

&lt;p&gt;The two controls, and where the measured numbers come from in the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4.1-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                    &lt;span class="c1"&gt;# "low" | "high" | "max"; default "high"
&lt;/span&gt;    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;  &lt;span class="c1"&gt;# {"type": "disabled"} turns it off
&lt;/span&gt;    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                           &lt;span class="c1"&gt;# always set one: see the next section
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;
&lt;span class="n"&gt;reasoning_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens_details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;  &lt;span class="c1"&gt;# billed as output
&lt;/span&gt;&lt;span class="n"&gt;thinking_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_content&lt;/span&gt;            &lt;span class="c1"&gt;# returned on every thinking call
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thinking off is the cheap dial and the dangerous one, and each build loses a different set of tasks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thinking off, 11 tasks x 3&lt;/th&gt;
&lt;th&gt;V4 Flash 0731&lt;/th&gt;
&lt;th&gt;V4.1 Flash&lt;/th&gt;
&lt;th&gt;V4 Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Correct&lt;/td&gt;
&lt;td&gt;21/33&lt;/td&gt;
&lt;td&gt;21/33&lt;/td&gt;
&lt;td&gt;21/33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lost outright (0 of 3)&lt;/td&gt;
&lt;td&gt;knapsack, sum of primes, train schedule&lt;/td&gt;
&lt;td&gt;coin combinations, 40-step rule, knapsack&lt;/td&gt;
&lt;td&gt;knapsack, counting task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How it fails&lt;/td&gt;
&lt;td&gt;a wrong number in the right format (&lt;code&gt;17, 1043&lt;/code&gt;; &lt;code&gt;10:40&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;one wrong token (&lt;code&gt;83&lt;/code&gt; for a five-step chain whose answer is 168)&lt;/td&gt;
&lt;td&gt;shows its working, then a wrong answer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The five-step chain from our standard shapes is the clearest case: with thinking off V4.1 Flash answered it 1 of 3 (0 of 3 in a second set of runs), V4 Flash 2 of 3, Pro 3 of 3, because Pro writes the steps before the answer and the Flash builds do not. Two smaller facts for the budget: thinking mode adds a hidden template prefix billed as input, 26 prompt tokens on V4.1 Flash and 79 on V4 Flash and Pro (identical text, 729 tokens with thinking off on all three), and the &lt;code&gt;reasoning_content&lt;/code&gt; you send back on the next turn is not re-billed (81 prompt tokens with and without it on V4.1 Flash, 134 on Pro).&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when you ask about something that does not exist?
&lt;/h2&gt;

&lt;p&gt;V4.1 Flash with thinking on either exhausts your output cap or invents an answer; with thinking off it declines, and it declines more reliably than either other build. We asked five questions about entities we made up, so the only right answer is "I do not know" (a share price for "Verantis Dynamics", the headcount of the "Kessler-Fanning Institute", the melting point of "Oridium-7", the winner of a "1987 Pan-Continental Robotics Prize") with a 16,384-token cap:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model, setting&lt;/th&gt;
&lt;th&gt;Declined&lt;/th&gt;
&lt;th&gt;Invented an answer&lt;/th&gt;
&lt;th&gt;Hit the 16,384-token cap, no answer&lt;/th&gt;
&lt;th&gt;Reasoning tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt;, thinking on&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;2/5 ("Professor Frink from The Simpsons won the 1987 prize"; "Oridium-7 has a melting point of 1815 °C")&lt;/td&gt;
&lt;td&gt;3/5&lt;/td&gt;
&lt;td&gt;2,610; 11,905; 16,384 x3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4.1 Flash, thinking off&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;0 (69 to 248 output tokens)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash 0731&lt;/a&gt;, thinking on&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;3/5 ("0 employees"; "Oridium-7 is approximately 1065 °C"; "Montblanc, the Swiss robot from the manga &lt;em&gt;Pluto&lt;/em&gt;, won")&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;4,080 to 16,384&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Flash 0731, thinking off&lt;/td&gt;
&lt;td&gt;4/5&lt;/td&gt;
&lt;td&gt;1/5 ("Oridium-7 has a melting point of…")&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/deepseek-v4-pro-0813/" rel="noopener noreferrer"&gt;V4 Pro&lt;/a&gt;, thinking on&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;3/5 ("Andrew Martin won"; "0 employees"; a melting range of 899 to 949 °C)&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;754 to 16,384&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 Pro, thinking off&lt;/td&gt;
&lt;td&gt;3/5&lt;/td&gt;
&lt;td&gt;2/5 (&lt;code&gt;According to reference 844476, the Kessler-Fanning Institute had 247…&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;0/5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three of the five V4.1 Flash runs with thinking on cost $0.0197 each at peak and returned an empty message; with the 2,048-token cap we use elsewhere, all five did, and so did four of five on Pro. If a lookup can legitimately have no answer, run it with thinking off, or cap &lt;code&gt;max_tokens&lt;/code&gt; and treat an empty message as "unknown". Pro's thinking-off failure is different and worth a regex of its own: it writes &lt;code&gt;Let me check that reference for you. According to reference&lt;/code&gt; and then an invented number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is the V4 Flash JSON corruption fixed?
&lt;/h2&gt;

&lt;p&gt;Under &lt;code&gt;json_object&lt;/code&gt; there is nothing to fix on any build; under strict &lt;code&gt;json_schema&lt;/code&gt; we could not test it. &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash 0731&lt;/a&gt; shipped with a defect: thinking on plus a strict &lt;code&gt;json_schema&lt;/code&gt; corrupted integer fields in 8 of 13 runs. On &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; a strict &lt;code&gt;json_schema&lt;/code&gt; returned 400 on our path, and DeepSeek's &lt;a href="https://api-docs.deepseek.com/guides/json_mode" rel="noopener noreferrer"&gt;JSON guide&lt;/a&gt; documents only &lt;code&gt;{"type": "json_object"}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Under &lt;code&gt;json_object&lt;/code&gt;, the same invoice (vendor, date, total, line items) came back with every value right in 8 of 8 runs with thinking on and 8 of 8 with it off, on all three builds. &lt;a href="https://synthorai.io/models/deepseek-v4-pro-0813/" rel="noopener noreferrer"&gt;V4 Pro&lt;/a&gt; under strict &lt;code&gt;json_schema&lt;/code&gt; still corrupts with thinking on: 0 of 8 runs had the right line-item count (45, 12, 47, 1, 2026), 8 of 8 with thinking off. For extraction, &lt;code&gt;json_object&lt;/code&gt; with thinking off was right every time on every build, and on V4.1 Flash it costs 25 output tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does an image cost on V4.1 Flash?
&lt;/h2&gt;

&lt;p&gt;184 input tokens for anything up to 512x512, 652 at one megapixel, 994 at four. Image input is new to the Flash line (the retired Vision Exp build was a separate model, and &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash 0731&lt;/a&gt; takes text only), so we sent generated PNGs to &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; and subtracted the text-only prompt:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Image&lt;/th&gt;
&lt;th&gt;Image tokens&lt;/th&gt;
&lt;th&gt;Cost at peak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;64x64, 128x128, 256x256, 512x512&lt;/td&gt;
&lt;td&gt;184&lt;/td&gt;
&lt;td&gt;$0.000055&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1024x1024&lt;/td&gt;
&lt;td&gt;652&lt;/td&gt;
&lt;td&gt;$0.000196&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2048x512 (same area as 1024x1024)&lt;/td&gt;
&lt;td&gt;652&lt;/td&gt;
&lt;td&gt;$0.000196&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;512x2048&lt;/td&gt;
&lt;td&gt;688&lt;/td&gt;
&lt;td&gt;$0.000206&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2048x2048&lt;/td&gt;
&lt;td&gt;994&lt;/td&gt;
&lt;td&gt;$0.000298&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fsynthorai.io%2Fblog%2Fassets%2Fdeepseek-v4-1-flash-cost%2Fimage-tokens.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fdeepseek-v4-1-flash-cost%2Fimage-tokens.svg" alt="Line chart of image input tokens against square image size on V4.1 Flash: flat at 184 tokens from 64 to 512 pixels, 652 at 1024, 994 at 2048, with dollar labels at the peak input rate" width="1540" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The floor matches the &lt;a href="https://api-docs.deepseek.com/guides/vision" rel="noopener noreferrer"&gt;vision guide&lt;/a&gt;: "images with a total pixel count below roughly 544x544 are scaled up", larger ones are scaled down "to roughly that of a 1300x1300 image", and 1,024 tokens is the documented ceiling per image. Content (solid, noise, rendered text) and format (PNG, JPEG, WebP; 174 to 243 KB) did not change the count, so you are billed by geometry, not bytes. A thousand 1-megapixel images cost $0.20 in image tokens at peak, before the question and the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Synthorai handles it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; is &lt;code&gt;deepseek-v4.1-flash&lt;/code&gt; on the gateway (DeepSeek's own id is &lt;code&gt;deepseek-flash&lt;/code&gt;), billed at $0.30 input and $1.20 output per million around the clock, with cache reads at $0.03 per million and no off-peak rate; every number in this post is reported at DeepSeek's list card so you can apply your own hours. &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash 0731&lt;/a&gt; and &lt;a href="https://synthorai.io/models/deepseek-v4-pro-0813/" rel="noopener noreferrer"&gt;V4 Pro 0813&lt;/a&gt; stay available as &lt;code&gt;deepseek-v4-flash-0731&lt;/code&gt; and &lt;code&gt;deepseek-v4-pro-0813&lt;/code&gt;, at their own cards. Both &lt;code&gt;/v1/chat/completions&lt;/code&gt; and &lt;code&gt;/v1/responses&lt;/code&gt; carry the model, &lt;code&gt;thinking: {"type": "disabled"}&lt;/code&gt; is the off switch that works on this path, and the reasoning text comes back in &lt;code&gt;reasoning_content&lt;/code&gt; on every thinking call. Image input goes through as &lt;code&gt;image_url&lt;/code&gt; content parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is DeepSeek V4.1 Flash cheaper than V4 Flash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cheaper than the August card it replaces, not than the July launch card. &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; is $0.30/$1.20 per million at peak and $0.15/$0.60 off-peak; &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;V4 Flash&lt;/a&gt; was $0.44/$1.32 peak from mid-August and $0.14/$0.28 before that. Per correct answer on our suite, V4.1 Flash at &lt;code&gt;low&lt;/code&gt; cost $0.00097 against V4 Flash's $0.00131 at its last card.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you turn thinking off on DeepSeek V4.1 Flash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, with &lt;code&gt;thinking: {"type": "disabled"}&lt;/code&gt; (DeepSeek also documents &lt;code&gt;reasoning_effort: "none"&lt;/code&gt;), and it costs accuracy on multi-step work: &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; fell from 33 of 33 to 21 of 33 on our suite and answered a five-step chain with one wrong token. Keep it on for arithmetic and planning; turn it off for extraction and for lookups that may have no answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does DeepSeek V4.1 Flash support image input, and what does an image cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, natively. On &lt;a href="https://synthorai.io/models/deepseek-v4-1-flash/" rel="noopener noreferrer"&gt;V4.1 Flash&lt;/a&gt; an image costs 184 input tokens up to 512x512, 652 at 1024x1024 and 994 at 2048x2048, independent of content and format, which is $0.000055 to $0.000298 per image at peak list.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://synthorai.io/blog/deepseek-v4-flash-cost/" rel="noopener noreferrer"&gt;DeepSeek V4 Flash cost&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/deepseek-v4-pro-0813-cost/" rel="noopener noreferrer"&gt;DeepSeek V4 Pro GA vs preview&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;LLM thinking controls&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/image-input-token-cost/" rel="noopener noreferrer"&gt;image input token cost&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-structured-outputs/" rel="noopener noreferrer"&gt;LLM structured outputs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>ai</category>
      <category>pricing</category>
      <category>llm</category>
    </item>
    <item>
      <title>GPT-6 Astra Reasoning Effort: max Costs 2.3x low for the Same Answers</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Mon, 07 Sep 2026 16:44:08 +0000</pubDate>
      <link>https://dev.to/synthorai/gpt-6-astra-reasoning-effort-max-costs-23x-low-for-the-same-answers-5bjh</link>
      <guid>https://dev.to/synthorai/gpt-6-astra-reasoning-effort-max-costs-23x-low-for-the-same-answers-5bjh</guid>
      <description>&lt;p&gt;On &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt;, &lt;code&gt;reasoning_effort: "max"&lt;/code&gt; costs 2.3x what &lt;code&gt;low&lt;/code&gt; costs and returns the same answer on every one of 11 verified tasks; the only setting that changes accuracy is &lt;code&gt;none&lt;/code&gt;, which fails 17 of 33 runs (11 tasks, 3 runs each). &lt;code&gt;reasoning_effort&lt;/code&gt; is the request parameter that sets how much hidden thinking the model does before it answers; that thinking is billed as reasoning tokens at the output rate, and the ordered values from &lt;code&gt;none&lt;/code&gt; to &lt;code&gt;max&lt;/code&gt; are the ladder this post measures. The ladder is not the one in the docs: the API's own input check advertises seven values, one of them (&lt;code&gt;minimal&lt;/code&gt;) is rejected on every model, and one it never mentions (&lt;code&gt;disabled&lt;/code&gt;) is accepted on Astra and does not disable anything. That matters for reading OpenAI's launch benchmarks, reported as "the maximum at any effort": the leaderboard number comes from the most expensive rung of the ladder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPT-6 Astra accepts seven &lt;code&gt;reasoning_effort&lt;/code&gt; values including &lt;code&gt;none&lt;/code&gt; and &lt;code&gt;disabled&lt;/code&gt;; the docs list five and say &lt;code&gt;none&lt;/code&gt; is unsupported.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;none&lt;/code&gt; is the only value that zeroes reasoning tokens, and it fails 17 of 33 verified tasks; every other rung scores 33 of 33.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disabled&lt;/code&gt; spends 243 reasoning tokens against &lt;code&gt;low&lt;/code&gt;'s 151 and costs 54% more per correct answer, same accuracy.&lt;/li&gt;
&lt;li&gt;At list price, GPT-6 Astra costs 1.57x GPT-5.6 Sol per correct answer at &lt;code&gt;low&lt;/code&gt; and 2.57x at &lt;code&gt;max&lt;/code&gt;, on work both models get right.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where does GPT-6 Astra land on the benchmarks?
&lt;/h2&gt;

&lt;p&gt;Ahead on agent-style work (the model driving tools in a loop, often in a terminal), behind &lt;a href="https://synthorai.io/models/claude-fable-5-1/" rel="noopener noreferrer"&gt;Claude Fable 5.1&lt;/a&gt; on Humanity's Last Exam and on the Artificial Analysis Intelligence Index (an independent aggregate of ten evaluations), and every score reported at whichever effort scored highest. The table below is OpenAI's own, from the &lt;a href="https://openai.com/index/gpt-6-astra/" rel="noopener noreferrer"&gt;launch page&lt;/a&gt;, with the comparison columns OpenAI chose:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;Claude Fable 5.1&lt;/th&gt;
&lt;th&gt;&lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;Claude Opus 5&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench 4.0&lt;/td&gt;
&lt;td&gt;agent tasks in a terminal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;37.3%&lt;/td&gt;
&lt;td&gt;55.8%&lt;/td&gt;
&lt;td&gt;52.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench Science 0.1&lt;/td&gt;
&lt;td&gt;research workflows with code&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;64.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;22.4%&lt;/td&gt;
&lt;td&gt;52.6%&lt;/td&gt;
&lt;td&gt;30.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FrontierMath Tier 4 (v2)&lt;/td&gt;
&lt;td&gt;research-level mathematics&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;97.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;83.0%&lt;/td&gt;
&lt;td&gt;87.8%&lt;/td&gt;
&lt;td&gt;73.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARC-AGI-3&lt;/td&gt;
&lt;td&gt;solving novel puzzle environments&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;99.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.8%&lt;/td&gt;
&lt;td&gt;not listed&lt;/td&gt;
&lt;td&gt;30.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Humanity's Last Exam, with tools&lt;/td&gt;
&lt;td&gt;expert-written questions across fields&lt;/td&gt;
&lt;td&gt;57.2%&lt;/td&gt;
&lt;td&gt;not listed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;63.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artificial Analysis Intelligence Index v4.1.1&lt;/td&gt;
&lt;td&gt;aggregate of ten evaluations&lt;/td&gt;
&lt;td&gt;61.2&lt;/td&gt;
&lt;td&gt;60.9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;63.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things to read alongside the wins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Humanity's Last Exam row, where Astra trails Fable 5.1 by 7.8 points, is in the table and nowhere in the prose.&lt;/li&gt;
&lt;li&gt;The Artificial Analysis row puts Astra behind Claude Fable 5.1, Claude Opus 5 and &lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;Claude Fable 5&lt;/a&gt; in OpenAI's own table; the current &lt;a href="https://artificialanalysis.ai/leaderboards/models" rel="noopener noreferrer"&gt;v4.2 leaderboard&lt;/a&gt; has Fable 5.1 at 57 and Astra at 55, first and third.&lt;/li&gt;
&lt;li&gt;The cybersecurity scores were produced, in OpenAI's words, "without production safeguards"; the shipping model "will refuse" proof-of-concept exploit tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sentence under the tables is the one that connects the benchmarks to your bill: "Evaluation scores are the maximum at any effort." The Artificial Analysis leaderboard lists each model once per effort setting, and Astra at &lt;code&gt;xhigh&lt;/code&gt; scores 54 against 55 at &lt;code&gt;max&lt;/code&gt;. The rest of this post prices that point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which reasoning_effort values does GPT-6 Astra accept?
&lt;/h2&gt;

&lt;p&gt;Seven, and that is not the set the API advertises: one advertised value is rejected on every model, and one accepted value is advertised nowhere. The &lt;a href="https://developers.openai.com/api/docs/models/gpt-6-astra" rel="noopener noreferrer"&gt;model page&lt;/a&gt; lists &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, &lt;code&gt;xhigh&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt;, and states the model "does not support &lt;code&gt;none&lt;/code&gt; reasoning effort". The API disagrees with the docs twice, and with itself once.&lt;/p&gt;

&lt;p&gt;Send an invalid value and the first check, which validates the request shape before any model is involved, answers with the same list of allowed values on &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt; and &lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid value: '__invalid__'. Supported values are: 'none', 'minimal', 'low', 'medium', 'high', 'xhigh', and 'max'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then send each of those values and a second check, specific to the model, rejects some of what the first one advertised (200 means the request went through, 400 means it was rejected):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;In the advertised list&lt;/th&gt;
&lt;th&gt;GPT-6 Astra&lt;/th&gt;
&lt;th&gt;GPT-5.6 Sol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minimal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;400, "not supported with the 'gpt-6-astra-2026-09-03' model"&lt;/td&gt;
&lt;td&gt;400, same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;no&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;low&lt;/code&gt; through &lt;code&gt;max&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So &lt;code&gt;none&lt;/code&gt; works although the docs say it does not, &lt;code&gt;minimal&lt;/code&gt; is advertised and rejected everywhere, and &lt;code&gt;disabled&lt;/code&gt; is accepted on Astra alone without appearing in any list. The error messages also give away the dated build the &lt;code&gt;gpt-6-astra&lt;/code&gt; alias currently points to, &lt;code&gt;gpt-6-astra-2026-09-03&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does none turn reasoning off, and does disabled?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;none&lt;/code&gt; does, and it is the only value that does. &lt;code&gt;disabled&lt;/code&gt; is a normal rung with a misleading name. We sent 11 tasks whose answers were computed by exhaustive search on our own machine first, so the answer key cannot be wrong (a rule applied 40 times in a row, a counting problem under three constraints, a knapsack, a base conversion, 7 to the power 222 modulo 1000, and six shorter ones), at all seven efforts (six on Sol, which rejects &lt;code&gt;disabled&lt;/code&gt;), 3 runs per task and effort, through an endpoint that speaks the OpenAI Chat Completions API. The five hardest, on GPT-6 Astra:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;effort&lt;/th&gt;
&lt;th&gt;accuracy&lt;/th&gt;
&lt;th&gt;mean reasoning tokens&lt;/th&gt;
&lt;th&gt;cost per call&lt;/th&gt;
&lt;th&gt;cost per correct answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;20%&lt;/strong&gt; (3 of 15)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0.00086&lt;/td&gt;
&lt;td&gt;$0.0043&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;disabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;243&lt;/td&gt;
&lt;td&gt;$0.01311&lt;/td&gt;
&lt;td&gt;$0.0131&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;151&lt;/td&gt;
&lt;td&gt;$0.00851&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0085&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;159&lt;/td&gt;
&lt;td&gt;$0.00890&lt;/td&gt;
&lt;td&gt;$0.0089&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;td&gt;$0.01110&lt;/td&gt;
&lt;td&gt;$0.0111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;xhigh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;279&lt;/td&gt;
&lt;td&gt;$0.01491&lt;/td&gt;
&lt;td&gt;$0.0149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;370&lt;/td&gt;
&lt;td&gt;$0.01946&lt;/td&gt;
&lt;td&gt;$0.0195&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cost per correct answer is the spend on a task-and-effort cell divided by the runs it got right: a setting that is 20% correct pays for five runs to get one answer. The cliff is one step wide. Every rung from &lt;code&gt;low&lt;/code&gt; up scored 33 of 33 across all 11 tasks on both models; &lt;code&gt;none&lt;/code&gt; scored 16 of 33 on Astra and 21 of 33 on Sol, and on the iterated-map task Astra returned three different wrong numbers in three runs. There is no gradual degradation to tune against: reasoning is on, or the model is guessing.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;disabled&lt;/code&gt; is the trap. It spends more reasoning tokens than &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt; or &lt;code&gt;high&lt;/code&gt;, and costs 54% more per correct answer than &lt;code&gt;low&lt;/code&gt; for the same 100%. Only &lt;code&gt;xhigh&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; cost more per correct answer than the value whose name says off.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fgpt-6-astra-reasoning-effort%2Feffort-ladder.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fgpt-6-astra-reasoning-effort%2Feffort-ladder.svg" alt="Bar chart of GPT-6 Astra reasoning tokens per call across seven reasoning_effort values on five multi-step tasks: none at 0 tokens and 20% correct, disabled at 243 tokens marked as the trap at 54% over low, low at 151 tokens marked as the floor, medium 159, high 203, xhigh 279, max 370 at 2.3x low with the same answers; every rung from low up 100% correct" width="1540" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does max buy over low?
&lt;/h2&gt;

&lt;p&gt;Nothing on these tasks, at 2.3x the price: $0.01946 per call against $0.00851, both 100% correct. Reasoning tokens climb from 151 at &lt;code&gt;low&lt;/code&gt; to 370 at &lt;code&gt;max&lt;/code&gt;, and every one of them bills at the $50 per million output rate.&lt;/p&gt;

&lt;p&gt;That is the number to hold next to the benchmark table. Reporting "the maximum at any effort" means each score comes from whichever rung scored best, and on the independent leaderboard Astra's best entry is its &lt;code&gt;max&lt;/code&gt; entry, one point above &lt;code&gt;xhigh&lt;/code&gt;; our ladder prices that rung at 1.3x the one below it. On a workload that resembles the launch benchmarks, the extra effort may earn its cost. On a workload that resembles ours, it does not, and you find out which by measuring your own tasks at &lt;code&gt;low&lt;/code&gt; first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is GPT-6 Astra 2.5x the price of GPT-5.6 Sol per answer?
&lt;/h2&gt;

&lt;p&gt;At &lt;code&gt;low&lt;/code&gt;, no: 1.57x. At &lt;code&gt;max&lt;/code&gt;, yes: 2.57x. List price is the per-token price on the vendor's own page: Astra lists at $10 input and $50 output per million tokens, Sol at $4 and $20 (both from the OpenAI model pages for &lt;a href="https://developers.openai.com/api/docs/models/gpt-6-astra" rel="noopener noreferrer"&gt;Astra&lt;/a&gt; and &lt;a href="https://developers.openai.com/api/docs/models/gpt-5.6-sol" rel="noopener noreferrer"&gt;Sol&lt;/a&gt; on 2026-09-07), so the list gap is 2.5x on both sides; the [GPT-5.6 Sol vs &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt; comparison page](&lt;a href="https://synthorai.io/compare/models/gpt-5-6-sol-vs-gpt-6-astra/" rel="noopener noreferrer"&gt;https://synthorai.io/compare/models/gpt-5-6-sol-vs-gpt-6-astra/&lt;/a&gt;) carries the live catalog prices. Cost per correct answer, computed from token counts at those list prices across all 11 tasks, both models scoring 33 of 33 from &lt;code&gt;low&lt;/code&gt; up:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;effort&lt;/th&gt;
&lt;th&gt;GPT-6 Astra per correct&lt;/th&gt;
&lt;th&gt;
&lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt; per correct&lt;/th&gt;
&lt;th&gt;ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.00560&lt;/td&gt;
&lt;td&gt;$0.00356&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.57x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.00618&lt;/td&gt;
&lt;td&gt;$0.00373&lt;/td&gt;
&lt;td&gt;1.66x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.00741&lt;/td&gt;
&lt;td&gt;$0.00400&lt;/td&gt;
&lt;td&gt;1.85x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;xhigh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.01005&lt;/td&gt;
&lt;td&gt;$0.00443&lt;/td&gt;
&lt;td&gt;2.27x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.01349&lt;/td&gt;
&lt;td&gt;$0.00525&lt;/td&gt;
&lt;td&gt;2.57x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Astra spends fewer reasoning tokens than Sol to reach the same answer at the low rungs (91 against 158 per call across the 11 tasks at &lt;code&gt;low&lt;/code&gt;), which is where the gap closes; its reasoning then grows faster up the ladder (249 against 242 at &lt;code&gt;max&lt;/code&gt;), and there the per-answer gap is the full list-price gap.&lt;/p&gt;

&lt;p&gt;The claim stays narrow: both models score 100% from &lt;code&gt;low&lt;/code&gt; up, so this set does not separate their capability, only the price of an answer both get right, which runs from 1.6x to 2.6x on one parameter. OpenAI's launch page reports the opposite direction on agent work, Terminal-Bench 4.0 at "approximately 9% and 63% lower estimated API cost per task" than Sol and Fable 5.1, where a model that solves more tasks in fewer tokens can be cheaper despite a higher per-token price. Different workloads; the effort setting decides the bill on both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does a JSON schema or a tool call add reasoning cost?
&lt;/h2&gt;

&lt;p&gt;Not at &lt;code&gt;low&lt;/code&gt;; &lt;code&gt;medium&lt;/code&gt; does. We sent a one-step task (add 2 hours 37 minutes to 08:15) three ways: bare, inside a strict &lt;code&gt;response_format&lt;/code&gt; JSON schema (the reply must be JSON matching a shape you supply), and as a forced tool call (&lt;code&gt;tool_choice&lt;/code&gt; pinned to one function, so the model must answer by calling it), at four efforts, 3 runs each. &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt;, mean reasoning tokens (with their share of all billed output tokens) and cost per call:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;shape&lt;/th&gt;
&lt;th&gt;&lt;code&gt;none&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;low&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;high&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bare&lt;/td&gt;
&lt;td&gt;0, $0.00085&lt;/td&gt;
&lt;td&gt;0, $0.00084&lt;/td&gt;
&lt;td&gt;18 (67% of output), $0.00185&lt;/td&gt;
&lt;td&gt;24 (73%), $0.00217&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON schema&lt;/td&gt;
&lt;td&gt;0, $0.00141&lt;/td&gt;
&lt;td&gt;4 (23%), $0.00165&lt;/td&gt;
&lt;td&gt;21 (57%), $0.00257&lt;/td&gt;
&lt;td&gt;26 (62%), $0.00282&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forced tool call&lt;/td&gt;
&lt;td&gt;0, $0.00196&lt;/td&gt;
&lt;td&gt;0, $0.00197&lt;/td&gt;
&lt;td&gt;5 (18%), $0.00223&lt;/td&gt;
&lt;td&gt;20 (47%), $0.00307&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fsynthorai.io%2Fblog%2Fassets%2Fgpt-6-astra-reasoning-effort%2Fshape-tax.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fgpt-6-astra-reasoning-effort%2Fshape-tax.svg" alt="Grouped bar chart of GPT-6 Astra reasoning tokens on one trivial task sent bare, in a JSON schema, and as a forced tool call, at none, low, medium and high effort: zero tokens at none and low in every shape except 4 tokens for the schema at low, then 18 to 26 tokens at medium and high, with reasoning reaching 57 to 73% of output tokens" width="1540" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;low&lt;/code&gt; scales to zero: on a task with no steps it spends no reasoning and costs the same as &lt;code&gt;none&lt;/code&gt;, and on the multi-step set above it spends 16 to 345 tokens per task and stays correct where &lt;code&gt;none&lt;/code&gt; collapses, so &lt;code&gt;low&lt;/code&gt; is the floor. The shell is not the tax: a schema or a tool call at &lt;code&gt;low&lt;/code&gt; adds 0 to 4 reasoning tokens, while &lt;code&gt;medium&lt;/code&gt; puts reasoning at 57 to 67% of the output tokens bare and in the schema, and 18% in the tool call, on a task with nothing to reason about. The same extraction costs 1.6x more at &lt;code&gt;medium&lt;/code&gt; than at &lt;code&gt;low&lt;/code&gt; inside the schema and 2.2x more bare, and the July &lt;a href="https://synthorai.io/blog/gpt-5-6-cost-guide/" rel="noopener noreferrer"&gt;GPT-5.6 cost guide&lt;/a&gt; found the same lever on that family. Sol is flatter: 0 reasoning bare and in the schema at every effort, 14 to 18 tokens on the forced tool call from &lt;code&gt;medium&lt;/code&gt; up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you read the reasoning you pay for?
&lt;/h2&gt;

&lt;p&gt;On one of OpenAI's two API surfaces. The older Chat Completions endpoint and the newer Responses endpoint accept the same model and bill the same way; the same question at &lt;code&gt;medium&lt;/code&gt;, 3 runs per surface:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;reasoning tokens billed&lt;/th&gt;
&lt;th&gt;reasoning text returned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/chat/completions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;76, 75, 120&lt;/td&gt;
&lt;td&gt;none; the message carries &lt;code&gt;role&lt;/code&gt; and &lt;code&gt;content&lt;/code&gt; only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/v1/responses&lt;/code&gt; with &lt;code&gt;reasoning.summary: "auto"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;62, 62, 116&lt;/td&gt;
&lt;td&gt;a &lt;code&gt;reasoning&lt;/code&gt; item with a 277 to 352 character summary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The token counts are within noise of each other, so the billing is the same and the only difference is whether you can see what you paid for. At $50 per million output tokens, the endpoint decides that. The docs also route tool calling to Responses ("&lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt; supports Chat Completions, but tool calling requires Responses"), so a tool-using workload lands on the readable surface by requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over from GPT-5.6?
&lt;/h2&gt;

&lt;p&gt;Most of the contract. Measured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tokenizer.&lt;/strong&gt; The same 900-word text tokenized to 1,017 prompt tokens on &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt;, &lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt;, &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt;, &lt;a href="https://synthorai.io/models/gpt-5-5/" rel="noopener noreferrer"&gt;GPT-5.5&lt;/a&gt;, &lt;a href="https://synthorai.io/models/gpt-5-4/" rel="noopener noreferrer"&gt;GPT-5.4&lt;/a&gt; and &lt;a href="https://synthorai.io/models/gpt-5-2/" rel="noopener noreferrer"&gt;GPT-5.2&lt;/a&gt;. Prompt sizes measured on 5.x hold on Astra; nothing needs re-counting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameters.&lt;/strong&gt; &lt;code&gt;temperature&lt;/code&gt; returns 400 on Astra and Sol alike ("not supported with this model"), and so do &lt;code&gt;top_p&lt;/code&gt; and &lt;code&gt;logprobs&lt;/code&gt;; &lt;code&gt;response_format&lt;/code&gt; with a strict JSON schema returns schema-valid output on both; &lt;code&gt;max_tokens&lt;/code&gt; below 16 is rejected on both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;max&lt;/code&gt; on Sol.&lt;/strong&gt; In July, &lt;code&gt;reasoning_effort: "max"&lt;/code&gt; returned 400 on GPT-5.6 Sol through Chat Completions. It is accepted now, and Sol scored 33 of 33 at it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the docs, not measured here: the context window is 1,050,000 tokens with a 922,000 maximum input and 128,000 maximum output; prompts above 272K input tokens are billed at 2x the input and cache rates, the same threshold the GPT-5.6 family carries and &lt;a href="https://synthorai.io/blog/llm-long-context-pricing-tiers/" rel="noopener noreferrer"&gt;the same mechanism we measured across vendors&lt;/a&gt;; cache reads list at $1 per million and cache writes at $12.50, with a new &lt;code&gt;prompt_cache_options.ttl: "30m"&lt;/code&gt; parameter replacing &lt;code&gt;prompt_cache_retention&lt;/code&gt;. Fast mode, a paid option OpenAI says delivers up to 2x the speed, is 2x the standard price.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Synthorai handles it
&lt;/h2&gt;

&lt;p&gt;The gateway passes &lt;code&gt;reasoning_effort&lt;/code&gt; through unchanged, including the values the docs do not list, and the per-request usage record keeps &lt;code&gt;reasoning_tokens&lt;/code&gt; as its own field next to &lt;code&gt;completion_tokens&lt;/code&gt; and the billed cost. That is what every table above was built from: the effort a request was sent at, the reasoning it burned, and what it cost, readable per request rather than reconstructed from a monthly total.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does GPT-6 Astra support reasoning_effort none?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. The docs say it does not; the API accepts it on &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt; and on &lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt;, and it is the only value that returns zero reasoning tokens. It also failed 17 of 33 runs on a verified task set, so it is a setting for lookups and transforms, not for anything with steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does reasoning_effort disabled do on GPT-6 Astra?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It reasons. &lt;code&gt;disabled&lt;/code&gt; is accepted on &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt; (and rejected on &lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt;), appears in no documented or advertised list, and spent 243 reasoning tokens per call on our hard set against 151 for &lt;code&gt;low&lt;/code&gt;, with identical accuracy. Treat it as an expensive alias for a middle rung, not as an off switch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which reasoning_effort should I default to on GPT-6 Astra?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;low&lt;/code&gt;. On &lt;a href="https://synthorai.io/models/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt; it spent zero reasoning on a one-step task and 16 to 345 tokens per task on multi-step ones, scored 33 of 33 where &lt;code&gt;none&lt;/code&gt; scored 16, and &lt;code&gt;max&lt;/code&gt; cost 2.3x as much for the same answers. Raise a specific call site only when an eval on your own tasks shows a higher rung changing outcomes. Set it explicitly on every call and read the reasoning count back from the usage block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-6-astra&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens_details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Measured 2026-09-07 through an OpenAI-compatible Chat Completions surface, plus the Responses endpoint for the visibility comparison: 11 tasks with locally brute-forced answer keys, 7 effort values, 3 runs per cell on both models, salted prompts (a unique suffix per request so no reply is served from a cache), cost taken from per-request usage accounting. Benchmark figures are OpenAI's launch table and the Artificial Analysis leaderboard, both fetched the same day. Cost per correct answer against GPT-5.6 Sol is computed from token counts at each model's documented list price.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;thinking controls across 13 models&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/gpt-5-6-cost-guide/" rel="noopener noreferrer"&gt;GPT-5.6 cost guide&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/claude-opus-5-cost/" rel="noopener noreferrer"&gt;Claude Opus 5 cost&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-long-context-pricing-tiers/" rel="noopener noreferrer"&gt;long-context pricing tiers&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/prompt-cache-write-cost/" rel="noopener noreferrer"&gt;prompt cache write cost&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gpt6</category>
      <category>ai</category>
      <category>apipricing</category>
      <category>openai</category>
    </item>
    <item>
      <title>Long-Context Pricing Tiers: Up to 6.7x, and Gateways Never Show It</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Thu, 03 Sep 2026 06:31:25 +0000</pubDate>
      <link>https://dev.to/synthorai/long-context-pricing-tiers-up-to-67x-and-gateways-never-show-it-mpd</link>
      <guid>https://dev.to/synthorai/long-context-pricing-tiers-up-to-67x-and-gateways-never-show-it-mpd</guid>
      <description>&lt;p&gt;The price on a gateway's model page is not the price on its invoice once a prompt gets long. We sent requests through one large multi-provider aggregator on both sides of every documented length line for nine tiered models: five billed exactly 2x their page price past the first line, Alibaba's three climbed to 3x, 3x, and 6.7x by the top of their ladders, and one Azure-served model billed 1.25x its listed endpoint rate on both sides of its line and then doubled. None of this is on the page. The mechanism is documented by the vendors themselves: Google, OpenAI, xAI, Alibaba, ByteDance, and MiniMax all reprice the whole request, output included, past a line at 32K, 128K, 200k, 256K, 272K, or 512k input tokens. This post shows the invoices, then the tier tables behind them, then the settings that keep a request under the line.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fmenu-vs-receipt.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fmenu-vs-receipt.svg" alt="Illustration of a model page shown as a menu card listing Gemini 2.5 Pro at $1.25 per million input tokens, next to the invoice for a 210,000-token request charging $2.50 per million, stamped not on the menu, with the 200,000-token line the page never mentioned" width="1540" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nine tiered models billed 1.8x to 6.7x past the vendor's line through an aggregator whose pages show one price; GPT-5.6 Luna via Azure billed 1.25x its listing.&lt;/li&gt;
&lt;li&gt;qwen3.7-flash charged $0.03, then $0.10, then $0.20 per million input at 32K and 256K; qwen3-coder-plus stopped at 3x where the vendor lists 6x.&lt;/li&gt;
&lt;li&gt;Vendors reprice the whole request, output included, once the input crosses a line between 32K and 512k tokens.&lt;/li&gt;
&lt;li&gt;Cap the input, not the output: Claude Code &lt;code&gt;/autocompact&lt;/code&gt;, Codex &lt;code&gt;model_context_window&lt;/code&gt;, API compaction triggers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Do gateways charge what their page says?
&lt;/h2&gt;

&lt;p&gt;No, not once the prompt is long, and finding out by how much takes two things per intermediary: the pricing metadata the gateway publishes, and the cost it actually reports for a request on each side of the line.&lt;/p&gt;

&lt;p&gt;One large multi-provider aggregator publishes its catalog with a &lt;code&gt;pricing.overrides&lt;/code&gt; array: a base price plus conditional rules such as &lt;code&gt;min_prompt_tokens: 200000&lt;/code&gt; with the higher rates, and, for DeepSeek and Tencent models, &lt;code&gt;utc_start&lt;/code&gt; / &lt;code&gt;utc_end&lt;/code&gt; windows for off-peak pricing. In the catalog we fetched on 2026-09-01, 60 entries carried overrides, including the Gemini Pro models, Grok 4.x, qwen3.7-plus, qwen3.7-flash, qwen3-coder-plus, the Seed 2.0 models, and the entire GPT-5.6 family at 272,000. The model pages show the base price only; the tier lives in the metadata. And the metadata is not the vendor's ladder: qwen3-coder-plus carries rules at 32,000 and 128,000 but nothing at the vendor's fourth tier, 256K.&lt;/p&gt;

&lt;p&gt;So we sent requests on both sides of every documented line through that aggregator, with usage accounting enabled (the aggregator returns the amount it charged inside the response) and the serving endpoint recorded (one model id on the aggregator fronts several upstream hosts, each with its own price; it calls them endpoints), two runs per point, on 2026-09-02 and 2026-09-03:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model (aggregator id)&lt;/th&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Below the line&lt;/th&gt;
&lt;th&gt;Above the line&lt;/th&gt;
&lt;th&gt;Page shows&lt;/th&gt;
&lt;th&gt;Metadata&lt;/th&gt;
&lt;th&gt;Served by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-2-5-pro/" rel="noopener noreferrer"&gt;Gemini 2.5 Pro&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;200k&lt;/td&gt;
&lt;td&gt;190k tokens at $1.25/M input&lt;/td&gt;
&lt;td&gt;210k at $2.50/M&lt;/td&gt;
&lt;td&gt;$1.25/M&lt;/td&gt;
&lt;td&gt;rule at 200,000&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-1-pro-preview/" rel="noopener noreferrer"&gt;Gemini 3.1 Pro Preview&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;200k&lt;/td&gt;
&lt;td&gt;185k at $2.00/M&lt;/td&gt;
&lt;td&gt;217k at $4.00/M&lt;/td&gt;
&lt;td&gt;$2.00/M&lt;/td&gt;
&lt;td&gt;rule at 200,000&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.3&lt;/td&gt;
&lt;td&gt;200k&lt;/td&gt;
&lt;td&gt;177k at $1.25/M&lt;/td&gt;
&lt;td&gt;208k at $2.50/M&lt;/td&gt;
&lt;td&gt;$1.25/M&lt;/td&gt;
&lt;td&gt;rule at 200,000&lt;/td&gt;
&lt;td&gt;xAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seed 2.0 Lite&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;117k at $0.25/M&lt;/td&gt;
&lt;td&gt;137k at $0.50/M&lt;/td&gt;
&lt;td&gt;$0.25/M&lt;/td&gt;
&lt;td&gt;rule at 128,000&lt;/td&gt;
&lt;td&gt;Seed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seed 2.0 Code&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;119k at $0.50/M&lt;/td&gt;
&lt;td&gt;135k at $1.00/M&lt;/td&gt;
&lt;td&gt;$0.50/M&lt;/td&gt;
&lt;td&gt;rule at 128,000&lt;/td&gt;
&lt;td&gt;Seed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;272K&lt;/td&gt;
&lt;td&gt;252k at $0.275/M&lt;/td&gt;
&lt;td&gt;294k at $0.50/M and $0.55/M&lt;/td&gt;
&lt;td&gt;$0.20/M&lt;/td&gt;
&lt;td&gt;rule at 272,000&lt;/td&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/qwen3-7-plus/" rel="noopener noreferrer"&gt;qwen3.7-plus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;242k at $0.32/M&lt;/td&gt;
&lt;td&gt;276k at $0.96/M&lt;/td&gt;
&lt;td&gt;$0.32/M&lt;/td&gt;
&lt;td&gt;rule at 256,000&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.7-flash&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;29k at $0.03/M&lt;/td&gt;
&lt;td&gt;35k at $0.10/M&lt;/td&gt;
&lt;td&gt;$0.03/M&lt;/td&gt;
&lt;td&gt;rule at 32,000&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.7-flash&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;245k at $0.10/M&lt;/td&gt;
&lt;td&gt;276k at $0.20/M&lt;/td&gt;
&lt;td&gt;$0.03/M&lt;/td&gt;
&lt;td&gt;rule at 256,000&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3-coder-plus&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;29k at $0.65/M&lt;/td&gt;
&lt;td&gt;35k at $1.17/M&lt;/td&gt;
&lt;td&gt;$0.65/M&lt;/td&gt;
&lt;td&gt;rule at 32,000&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3-coder-plus&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;119k at $1.17/M&lt;/td&gt;
&lt;td&gt;138k at $1.95/M&lt;/td&gt;
&lt;td&gt;$0.65/M&lt;/td&gt;
&lt;td&gt;rule at 128,000&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3-coder-plus&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;244k at $1.95/M&lt;/td&gt;
&lt;td&gt;276k at $1.95/M, no step&lt;/td&gt;
&lt;td&gt;$0.65/M&lt;/td&gt;
&lt;td&gt;no rule&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fpage-vs-invoice.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fpage-vs-invoice.svg" alt="Bar chart of the charged input price through the aggregator as a multiple of its model page price on both sides of every documented line: five models at 1.0x below and 2.0x above their first line, GPT-5.6 Luna at 1.375x and up to 2.75x, then the Alibaba ladders, qwen3.7-plus to 3.0x, qwen3-coder-plus to 1.8x and 3.0x with a hollow bar at the vendor's uncharged 6x, and qwen3.7-flash to 3.3x and 6.7x" width="1540" height="942"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqw13oxpd2e4kbrnroxzm.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%2Fqw13oxpd2e4kbrnroxzm.png" alt="The aggregator's model pages for Gemini 2.5 Pro and GPT-5.6 Luna side by side on 2026-09-02: Gemini shows a single header price of $1.25 / $10 per million and a providers table at $1.25 or $2.25 per endpoint; Luna shows $0.20 / $1.20 with Azure at $0.20, Azure EU and US and Bedrock at $0.22, OpenAI Flex at $0.10 and OpenAI Fast at $0.40; neither page shows a long-context tier" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pages themselves, captured the same day as the invoices: one headline price, a per-endpoint table, and no length tier on either. Every charge above followed the metadata to the token. All nine models stepped at the vendor's first line by the vendor's factor, and on the three Alibaba models the invoice climbed a ladder the page never mentions: qwen3.7-flash from $0.03 to $0.10 at 32K and to $0.20 at 256K, 6.7x the page price, on a page that prints $0.03. GPT-5.6 Luna stepped too, and added a second gap: every Azure-served run was billed 1.25x the listed Azure endpoint price, below and above the line alike ($0.275 against $0.22, $0.50 and $0.55 against $0.40 and $0.44), a surcharge that appears neither on the page nor in the endpoint metadata.&lt;/p&gt;

&lt;p&gt;The ladder can also stop short of the vendor's. On qwen3-coder-plus the charge rose 1.8x at 32K and 3x at 128K, then stayed at $1.95 per million through 276k tokens, where Alibaba's own list moves to $6 on input and $60 on output, six and twelve times the base. The aggregator's metadata has no rule at 256K, so the charge did not move. Whether the aggregator absorbs that difference or buys under a different contract is not visible from outside. What is visible is that the invoice follows the metadata, and the metadata and the page are two different documents.&lt;/p&gt;

&lt;p&gt;The transparency gap, then, is not between metadata and invoice; it is between the page and both of them. The page's headline number is the cheapest endpoint's rate in the table below it, not the rate of the endpoint that will serve you, and neither number carries the length condition. A model card with one price does not tell you about the tier, or which endpoint will serve the next request, or whether the endpoint whose price you are looking at is reachable for your account at all.&lt;/p&gt;

&lt;p&gt;The rule that follows is simple. Read the machine-readable pricing for the model you use, at the endpoint level, and check for a length condition; then send one request on each side of the line with usage accounting on and compare the reported cost. A gateway whose charge steps where its page does not is passing a vendor rule through without telling you. A gateway whose charge stays flat where the vendor's does not is either serving the model from a host with different prices or absorbing the difference, and only the first of those is a stable state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where are the lines, and how does a tier apply?
&lt;/h2&gt;

&lt;p&gt;Six vendors publish a length line, and every model that states the rule applies the higher rate to all tokens of the request, output included. The step is 2x at most first lines, but the ladders climb: 3x at qwen3.7-plus's only line, 6.7x on input by qwen3.7-flash's third tier, and 6x on input and 12x on output by qwen3-coder-plus's fourth. Prices are per million tokens, fetched from the vendors' pricing pages on 2026-09-01.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Threshold&lt;/th&gt;
&lt;th&gt;Input, below / above&lt;/th&gt;
&lt;th&gt;Output, below / above&lt;/th&gt;
&lt;th&gt;Stated semantics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 2.5 Pro&lt;/td&gt;
&lt;td&gt;200k prompt tokens&lt;/td&gt;
&lt;td&gt;$1.25 / $2.50&lt;/td&gt;
&lt;td&gt;$10 / $15&lt;/td&gt;
&lt;td&gt;Vertex pricing footnote: &lt;a href="https://cloud.google.com/vertex-ai/generative-ai/pricing" rel="noopener noreferrer"&gt;"If a query input context is longer than or equal to 200K tokens, all tokens (input and output) are charged at long context rates"&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro Preview&lt;/td&gt;
&lt;td&gt;200k&lt;/td&gt;
&lt;td&gt;$2 / $4&lt;/td&gt;
&lt;td&gt;$12 / $18&lt;/td&gt;
&lt;td&gt;same footnote; &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;cache reads tier too&lt;/a&gt;, $0.20 / $0.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt; (Terra, Luna same shape)&lt;/td&gt;
&lt;td&gt;272K input tokens&lt;/td&gt;
&lt;td&gt;$4 / $8&lt;/td&gt;
&lt;td&gt;$20 / $30&lt;/td&gt;
&lt;td&gt;model page: &lt;a href="https://developers.openai.com/api/docs/models/gpt-5.6-sol" rel="noopener noreferrer"&gt;"Prompts with &amp;gt;272K input tokens are priced at 2x input and 1.5x output for the full request"&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.6, 4.5&lt;/td&gt;
&lt;td&gt;200k&lt;/td&gt;
&lt;td&gt;$2 / $4&lt;/td&gt;
&lt;td&gt;$6 / $12&lt;/td&gt;
&lt;td&gt;docs: &lt;a href="https://docs.x.ai/docs/models" rel="noopener noreferrer"&gt;"billed at the higher rate for all tokens in the request"&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.3, 4.20&lt;/td&gt;
&lt;td&gt;200k&lt;/td&gt;
&lt;td&gt;$1.25 / $2.50&lt;/td&gt;
&lt;td&gt;$2.50 / $5&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.7-plus&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;$0.40 / $1.20&lt;/td&gt;
&lt;td&gt;$1.60 / $4.80&lt;/td&gt;
&lt;td&gt;Model Studio: &lt;a href="https://www.alibabacloud.com/help/en/model-studio/model-pricing" rel="noopener noreferrer"&gt;"All tokens in the request are billed at the unit price of the corresponding tier"&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/qwen3-5-plus/" rel="noopener noreferrer"&gt;qwen3.5-plus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;$0.40 / $0.50&lt;/td&gt;
&lt;td&gt;$2.40 / $3.00&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.7-flash&lt;/td&gt;
&lt;td&gt;32K, 256K&lt;/td&gt;
&lt;td&gt;$0.03 / $0.10 / $0.20&lt;/td&gt;
&lt;td&gt;$0.13 / $0.40 / $0.80&lt;/td&gt;
&lt;td&gt;same, three tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3-coder-plus&lt;/td&gt;
&lt;td&gt;32K, 128K, 256K&lt;/td&gt;
&lt;td&gt;$1 / $1.8 / $3 / $6&lt;/td&gt;
&lt;td&gt;$5 / $9 / $15 / $60&lt;/td&gt;
&lt;td&gt;same, four tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seed 2.0 Lite, Seed 2.0 Code&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;$0.25 / $0.50, $0.50 / $1.00&lt;/td&gt;
&lt;td&gt;$2 / $4, $3 / $6&lt;/td&gt;
&lt;td&gt;BytePlus's pricing page renders in-app and could not be quoted; prices from the aggregator's metadata, matched by the invoices above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/minimax-m3/" rel="noopener noreferrer"&gt;MiniMax M3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;512k input&lt;/td&gt;
&lt;td&gt;$0.30 / $0.60&lt;/td&gt;
&lt;td&gt;$1.20 / $2.40&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.minimax.io/docs/guides/pricing-paygo" rel="noopener noreferrer"&gt;pay-as-you-go page&lt;/a&gt;: tier by request input count, applied to all tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two boundary details worth copying into billing code. Google's two pages disagree by one token: the Vertex footnote says "longer than or equal to 200K", the &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini API pricing table&lt;/a&gt; says "prompts &amp;gt; 200k tokens". And Alibaba defines its K precisely: &lt;a href="https://www.alibabacloud.com/help/en/model-studio/model-pricing" rel="noopener noreferrer"&gt;128K equals 128,000 tokens, 256K equals 256,000&lt;/a&gt;, not powers of two.&lt;/p&gt;

&lt;p&gt;The tier applies to the whole request, decided by the input length alone, on every token including the output. The marginal cost of the token that crosses the line is therefore the entire premium on everything before it. For Gemini 2.5 Pro: a 199,999-token prompt bills $0.25 of input; at 200,001 tokens it bills $0.50, and a 4,000-token answer moves from $0.04 to $0.06. One token, plus $0.27.&lt;/p&gt;

&lt;p&gt;On qwen3.7-plus the step is 3x: the official rate for a 255,029-token prompt is $0.102, for a 257,332-token prompt $0.309. On qwen3-coder-plus the same mechanism compounds across four tiers, so a 260k-token prompt bills six times the per-token rate of a 30k one and its output twelve times.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fwhole-request-repricing.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fwhole-request-repricing.svg" alt="Three token-scaled bars for Gemini 2.5 Pro: 199,999 input tokens below the line bill $0.29; 210,000 tokens would bill $0.315 if only the 10,000 past the line were repriced, which no vendor does; 210,000 tokens as actually billed turn the entire bar red at $2.50 per million and cost $0.585" width="1540" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rule is visible on a real invoice, not only in the vendor's table. On qwen3.5-plus, whose official tiers are $0.40 then $0.50 per million input tokens at 256K, our gateway bill per input token differed by exactly 1.25x between ten runs below the line (243k tokens) and 24 runs above it (256k to 321k), with the output price unchanged. The 259k request did not pay 1.25x on its last 3k tokens; it paid 1.25x on all of them.&lt;/p&gt;

&lt;p&gt;For an agent that accumulates history, the crossing happens mid-session and silently: the turn that tips over pays the premium for every earlier turn it carries, and every later turn keeps paying it until something shrinks the context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does capability step at the same line?
&lt;/h2&gt;

&lt;p&gt;No. We measured this because the tier is easy to mistake for a capability edge, and it is not one. On two tiered Qwen models with the line at 256K, a salted needle (a one-line fact carrying a per-run random code) planted at five depths was recalled 30 of 30 times on each model at 243k, 269k, and 320k tokens, with thinking off, and latency grew with length on a line rather than a step (15.2 s, 17.0 s, 20.5 s median on qwen3.7-plus). A harder task, counting K planted rare sightings across the whole log, did degrade with length: on qwen3.7-plus the share found slid from 74% at 128k to 60% at 192k, 58% at 243k, and 45% at 320k. The decline starts well below the price line and the cells on either side of it sit on the same slope.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fcliff-vs-slope.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-long-context-pricing-tiers%2Fcliff-vs-slope.svg" alt="Two panels against prompt length: on the left the official input price steps at the 256K line, 3x on qwen3.7-plus and 1.25x on qwen3.5-plus; on the right the fraction of planted sightings each model finds slides gradually from 64k to 320k with no step at the same line" width="1540" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anthropic's own documentation names the gradual effect: as token count grows, &lt;a href="https://platform.claude.com/docs/en/build-with-claude/context-windows" rel="noopener noreferrer"&gt;accuracy and recall degrade, "a phenomenon known as context rot"&lt;/a&gt;. It is real, it is continuous, and it does not know where the price tier is.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you keep a request under the line?
&lt;/h2&gt;

&lt;p&gt;Cap the input, not the output. The tier keys on the request's input length, so &lt;code&gt;max_tokens&lt;/code&gt; (an output cap) does nothing for it; the levers are the settings that bound what the client sends. They exist at four layers.&lt;/p&gt;

&lt;p&gt;Here are the settings that bound the prompt, by layer. "Under a tier" marks the ones that take an absolute token count and can therefore be set just below a price line; the window-relative ones only keep you inside the model's context window, which is a different number.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;What it bounds&lt;/th&gt;
&lt;th&gt;Under a tier?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coding agent&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://code.claude.com/docs/en/model-config" rel="noopener noreferrer"&gt;&lt;code&gt;/autocompact &amp;lt;value&amp;gt;&lt;/code&gt;, &lt;code&gt;autoCompactWindow&lt;/code&gt;, &lt;code&gt;CLAUDE_CODE_AUTO_COMPACT_WINDOW&lt;/code&gt;&lt;/a&gt;, 100K to 1M&lt;/td&gt;
&lt;td&gt;the token count at which history is summarized&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding agent&lt;/td&gt;
&lt;td&gt;Codex CLI&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.chatgpt.com/docs/config-file/config-reference" rel="noopener noreferrer"&gt;&lt;code&gt;model_context_window&lt;/code&gt;, &lt;code&gt;model_auto_compact_token_limit&lt;/code&gt;, &lt;code&gt;tool_output_token_limit&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;context size, compaction trigger, per-tool-result cap&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding agent&lt;/td&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aider.chat/docs/config/options.html" rel="noopener noreferrer"&gt;&lt;code&gt;--max-chat-history-tokens&lt;/code&gt;, &lt;code&gt;--map-tokens&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;soft limit on chat history before summarization; repo-map budget&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding agent&lt;/td&gt;
&lt;td&gt;Gemini CLI&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/settings.md" rel="noopener noreferrer"&gt;&lt;code&gt;model.compressionThreshold&lt;/code&gt;&lt;/a&gt;, default 0.5, plus &lt;code&gt;/compress&lt;/code&gt; and &lt;code&gt;model.maxSessionTurns&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the fraction of the context window at which history is compressed&lt;/td&gt;
&lt;td&gt;Indirectly: pick the fraction so window x fraction lands under the line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding agent&lt;/td&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://cursor.com/docs/context/max-mode" rel="noopener noreferrer"&gt;Max Mode off&lt;/a&gt; (the default)&lt;/td&gt;
&lt;td&gt;default window; Max Mode extends it and bills at the API rate plus 20%&lt;/td&gt;
&lt;td&gt;Keep it off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coding agent&lt;/td&gt;
&lt;td&gt;Cline&lt;/td&gt;
&lt;td&gt;none documented; &lt;a href="https://docs.cline.bot/features/auto-compact" rel="noopener noreferrer"&gt;auto-summarizes near the window&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;the model's window&lt;/td&gt;
&lt;td&gt;No knob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Claude API&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.claude.com/docs/en/build-with-claude/compaction" rel="noopener noreferrer"&gt;&lt;code&gt;context_management.edits[].trigger.input_tokens&lt;/code&gt;&lt;/a&gt;, default 150,000, minimum 50,000&lt;/td&gt;
&lt;td&gt;server-side compaction trigger; the compaction pass is billed under &lt;code&gt;usage.iterations&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;OpenAI Responses&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.openai.com/docs/guides/conversation-state" rel="noopener noreferrer"&gt;&lt;code&gt;truncation: "auto"&lt;/code&gt;&lt;/a&gt;, default &lt;code&gt;disabled&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;drops middle items only when the input exceeds the model window; &lt;code&gt;disabled&lt;/code&gt; returns a 400 instead&lt;/td&gt;
&lt;td&gt;No, window only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aggregator&lt;/td&gt;
&lt;td&gt;context compression&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openrouter.ai/docs/guides/features/message-transforms" rel="noopener noreferrer"&gt;middle-out transform&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;removes the middle of the prompt to fit the model window&lt;/td&gt;
&lt;td&gt;No, window only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;LangChain&lt;/td&gt;
&lt;td&gt;&lt;a href="https://reference.langchain.com/python/langchain-core/messages/utils/trim_messages" rel="noopener noreferrer"&gt;&lt;code&gt;trim_messages(max_tokens, strategy="last", token_counter, include_system)&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;client-side history trim by token count before the request&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things the table implies. On a coding agent pointed at a tiered model, the compaction window is the one knob that turns the cliff into a summary, and it has to be set in absolute tokens just under the line, not as a fraction of a 1M window. And the two most common "safety" settings, Responses &lt;code&gt;truncation: "auto"&lt;/code&gt; and the aggregator's middle-out, are window guards: they act at the model's window, 1M on the tiered Gemini and GPT-5.6 models, not at the 200,000 or 272,000 tokens where the price moves, so they will keep a request from failing and still let it cross the line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not count on caching to keep you under.&lt;/strong&gt; Prompt caching cuts the bill but not the tier on Google's models, where &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;cache reads are priced by the same length tier&lt;/a&gt;: a cached 150k prefix plus 60k of fresh context is a 210k prompt and bills as one. Provisioned capacity sidesteps the question entirely, since &lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/provisioned-throughput" rel="noopener noreferrer"&gt;provisioned throughput units (PTUs) bill per hour regardless of tokens&lt;/a&gt;. And when crossing is worth it, cross deliberately: the measurement above says the model does not get worse at the line, so the decision is purely whether the marginal context is worth a 2x, 3x, or at the top tiers 6.7x multiplier on the whole request.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Synthorai handles it
&lt;/h2&gt;

&lt;p&gt;A length tier is a rate condition, so the gateway treats it as one: a model's price card can carry a list of tiers keyed by input-token boundary, and each request is rated against the tier its own prompt length selects, on all of its tokens, the same way the vendor rates it. That is the mechanism the qwen3.5-plus invoice above exercised. The usage record keeps the prompt token count and the price version alongside the rated cost, so a bill can be decomposed back to "this request crossed the line". The tier a request was rated under can be read back from the usage record, not only from a price table.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is the higher long-context rate charged only on tokens beyond the threshold?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Every vendor that documents the rule reprices the whole request: Google ("all tokens (input and output) are charged at long context rates"), OpenAI ("for the full request"), xAI ("for all tokens in the request"), Alibaba ("all tokens in the request are billed at the unit price of the corresponding tier"). A prompt one token over the line pays the premium on every token before it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do API gateways pass long-context pricing tiers through?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, in our measurement: through one large aggregator, nine tiered models were billed the vendor's higher rate past the vendor's line, on model pages that show a single price. The tier is in the gateway's pricing metadata, not on the page, and the metadata can also omit a vendor tier, as it did for qwen3-coder-plus above 256K.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does &lt;code&gt;max_tokens&lt;/code&gt; keep a request under a pricing tier?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. &lt;code&gt;max_tokens&lt;/code&gt; caps the output; the tier is decided by the input length. The settings that help are the ones that bound the prompt: a compaction window or token limit in the agent (Claude Code &lt;code&gt;/autocompact&lt;/code&gt;, Codex &lt;code&gt;model_context_window&lt;/code&gt;), a compaction trigger in the API, or client-side truncation before the request is sent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does model quality drop at the pricing threshold?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not in our measurement. On two tiered Qwen models, needle recall was perfect on both sides of the 256K line and a counting task degraded gradually with length with no step at the boundary. The tier is a business rule; capability loss with length is real but continuous.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prices and semantics quoted from vendor pricing pages fetched 2026-09-01; agent and API settings from the linked documentation on 2026-09-02; invoice measurements run 2026-09-01 to 2026-09-03 with thinking disabled and salted prompts, two runs per aggregator point. Prices drift; check the linked source before wiring a threshold into billing code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://synthorai.io/blog/ai-api-billing-units/" rel="noopener noreferrer"&gt;billing units field guide&lt;/a&gt; (the modifier layer this post zooms into), &lt;a href="https://synthorai.io/blog/llm-token-usage-anatomy/" rel="noopener noreferrer"&gt;token usage anatomy&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-prompt-caching-explained/" rel="noopener noreferrer"&gt;prompt caching explained&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/prompt-cache-minimums-measured/" rel="noopener noreferrer"&gt;cache minimums measured&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>longcontext</category>
      <category>apipricing</category>
      <category>contextwindow</category>
      <category>billing</category>
    </item>
    <item>
      <title>AI API Billing Units: 17 Meters from Tokens to PTU-Hours</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Tue, 01 Sep 2026 13:09:58 +0000</pubDate>
      <link>https://dev.to/synthorai/ai-api-billing-units-17-meters-from-tokens-to-ptu-hours-1n3i</link>
      <guid>https://dev.to/synthorai/ai-api-billing-units-17-meters-from-tokens-to-ptu-hours-1n3i</guid>
      <description>&lt;p&gt;AI APIs meter usage in at least 17 distinct units: text tokens, reasoning tokens, cached tokens, media-input tokens, realtime audio tokens, characters, minutes and seconds of media, output objects, requests, pages, GPU-seconds, container-hours, GB-days, token-hours, PTU-hours, training tokens, and synthetic credits. Anyone estimating the cost of a product that touches more than one modality has to convert between several of them, and the conversion rules are where budgets go wrong. This page is a field guide: every unit, how it is metered, and the gotcha attached to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI APIs bill in at least 17 distinct units across four layers: consumption, time and capacity, rate modifiers, and synthetic wrappers.&lt;/li&gt;
&lt;li&gt;One audio minute bills two ways: $0.0020 to $0.0164 per audio-minute on dedicated transcription, or 1 audio token per 100 ms heard on &lt;a href="https://synthorai.io/models/gpt-realtime-2-1/" rel="noopener noreferrer"&gt;gpt-realtime-2.1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Storage alone has two meters: OpenAI file search bills $0.10 per GB-day; Gemini context caching bills $0.50 per million tokens per hour.&lt;/li&gt;
&lt;li&gt;Modifiers change rates, not units: batch is half price, DeepSeek off-peak halves again, US-pinned Claude inference costs 1.1x.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What units do AI APIs bill in?
&lt;/h2&gt;

&lt;p&gt;Seventeen, in the order the sections below follow: consumption units (1 to 10), time and capacity units (11 to 16), and synthetic wrappers (17), plus a modifier layer that changes rates without changing units. The table is the reference; each row links the deep dive.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fai-api-billing-units%2Funits-zoo.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fai-api-billing-units%2Funits-zoo.svg" alt="Map of the AI API billing-units zoo: ten consumption units from text tokens to pages, six time and capacity units from GPU-seconds to training tokens, credits and CCUs as synthetic wrappers, and a side panel of rate modifiers from batch discounts to free-quota cliffs" width="1540" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Unit&lt;/th&gt;
&lt;th&gt;Where it appears&lt;/th&gt;
&lt;th&gt;The gotcha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Text tokens&lt;/td&gt;
&lt;td&gt;Every chat API&lt;/td&gt;
&lt;td&gt;Same text, different counts per tokenizer; &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;about 30% more tokens&lt;/a&gt; from one tokenizer generation to the next&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Reasoning tokens&lt;/td&gt;
&lt;td&gt;Thinking models&lt;/td&gt;
&lt;td&gt;Billed as output you never see; &lt;a href="https://synthorai.io/blog/llm-token-usage-anatomy/" rel="noopener noreferrer"&gt;88 to 99.3% of some answers&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Cached tokens&lt;/td&gt;
&lt;td&gt;Prompt caching&lt;/td&gt;
&lt;td&gt;Write premium by TTL, read discount, &lt;a href="https://synthorai.io/blog/prompt-cache-minimums-measured/" rel="noopener noreferrer"&gt;per-provider minimums&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Media-input tokens&lt;/td&gt;
&lt;td&gt;Vision, audio, PDF input&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/blog/image-input-token-cost/" rel="noopener noreferrer"&gt;Three conversion schemes for one image&lt;/a&gt;; PDFs bill at image rates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Realtime audio tokens&lt;/td&gt;
&lt;td&gt;Speech-to-speech&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;1 token per 100 ms heard, 1 per 50 ms spoken&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Characters&lt;/td&gt;
&lt;td&gt;TTS, guardrails&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/blog/voice-agent-api-cost/" rel="noopener noreferrer"&gt;Chinese speech costs 3 to 7x less than English per audio-minute&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Media minutes/seconds&lt;/td&gt;
&lt;td&gt;STT, video and music generation&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/blog/transcription-cost/" rel="noopener noreferrer"&gt;8x price spread per audio-minute&lt;/a&gt; across models with near-equal accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Output objects&lt;/td&gt;
&lt;td&gt;Image generation, human eval&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/blog/image-generation-cost/" rel="noopener noreferrer"&gt;A quality knob swings one image 36x&lt;/a&gt; at identical resolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Requests&lt;/td&gt;
&lt;td&gt;Web search, grounding, file search&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/blog/web-search-api-cost/" rel="noopener noreferrer"&gt;$0.01 per search plus injected tokens&lt;/a&gt; at the model's input rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Pages&lt;/td&gt;
&lt;td&gt;OCR, document AI&lt;/td&gt;
&lt;td&gt;Mistral bills &lt;a href="https://mistral.ai/pricing" rel="noopener noreferrer"&gt;per 1,000 pages&lt;/a&gt; with batch and cache discounts on top&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;GPU-seconds&lt;/td&gt;
&lt;td&gt;Serverless model hosts&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://replicate.com/pricing" rel="noopener noreferrer"&gt;Rate depends on the card&lt;/a&gt;, $0.000225/s (T4) to $0.001525/s (H100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Container/session-hours&lt;/td&gt;
&lt;td&gt;Code execution, managed agents&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;5-minute minimum, files preload billing&lt;/a&gt; even if the tool never runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;GB-days&lt;/td&gt;
&lt;td&gt;File and vector storage&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;$0.10 per GB-day&lt;/a&gt; after the free gigabyte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Token-hours&lt;/td&gt;
&lt;td&gt;Context-cache storage&lt;/td&gt;
&lt;td&gt;Gemini bills &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;$0.50 per million tokens per hour&lt;/a&gt;, doubling in 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;PTU/model-unit hours&lt;/td&gt;
&lt;td&gt;Provisioned capacity&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/provisioned-throughput" rel="noopener noreferrer"&gt;Cached tokens consume no capacity&lt;/a&gt;; output weighs more than input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Training tokens&lt;/td&gt;
&lt;td&gt;Fine-tuning&lt;/td&gt;
&lt;td&gt;Epochs multiply the bill; some models bill &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;$100 per hour&lt;/a&gt; instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Credits/CCUs&lt;/td&gt;
&lt;td&gt;Marketplaces, subscriptions&lt;/td&gt;
&lt;td&gt;A scalar over the real rate card; &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;100 CCU = $1.00&lt;/a&gt; on AWS Marketplace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Which units count what you consume?
&lt;/h2&gt;

&lt;p&gt;Ten of the seventeen are consumption units: the meter ticks when you use the service, and each modality picked a different thing to count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The token family (units 1 to 5).&lt;/strong&gt; Text tokens are the anchor, but they are not one unit: tokenizers differ per model family, so &lt;a href="https://synthorai.io/blog/claude-sonnet-5-tokenizer/" rel="noopener noreferrer"&gt;the same text bills different counts&lt;/a&gt;, and Anthropic documents that its 4.7-and-later tokenizer produces about 30% more tokens for the same text than the previous one. Reasoning tokens are output tokens you usually cannot read; &lt;a href="https://synthorai.io/blog/llm-token-usage-anatomy/" rel="noopener noreferrer"&gt;we measured 81 billed tokens for a 10-token answer&lt;/a&gt;, 88% of it reasoning. Cached tokens price by operation and cache lifetime (TTL): on the Claude API a &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;5-minute cache write costs 1.25x base input, a 1-hour write 2x, and a read 0.1x&lt;/a&gt;. Media inputs convert to tokens by provider-specific formulas: &lt;a href="https://synthorai.io/blog/image-input-token-cost/" rel="noopener noreferrer"&gt;one 1024x1024 image bills 693, 1,089, and 1,372 tokens&lt;/a&gt; on &lt;a href="https://synthorai.io/models/gpt-5-6/" rel="noopener noreferrer"&gt;GPT-5.6&lt;/a&gt;, Gemini, and Claude respectively; Gemini rates audio at &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;25 tokens per second and 720p video at 5,792 tokens per second&lt;/a&gt; and bills PDFs at the image token rate. Realtime speech has its own token: &lt;a href="https://synthorai.io/models/gpt-realtime-2-1/" rel="noopener noreferrer"&gt;gpt-realtime-2.1&lt;/a&gt; bills &lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;exactly 1 audio token per 100 ms of user speech and 1 per 50 ms of model speech&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Characters and time (units 6 and 7).&lt;/strong&gt; Text-to-speech (TTS) bills per character (OpenAI lists &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;$15 to $30 per million characters&lt;/a&gt;), which is why &lt;a href="https://synthorai.io/blog/voice-agent-api-cost/" rel="noopener noreferrer"&gt;spoken Chinese costs 3 to 7x less than English per audio-minute&lt;/a&gt;: the same speaking time consumes fewer characters. Bedrock's guardrails define their own character unit, a &lt;a href="https://aws.amazon.com/bedrock/pricing/" rel="noopener noreferrer"&gt;"text unit" of up to 1,000 characters&lt;/a&gt;. Dedicated transcription models bill per audio-minute, &lt;a href="https://synthorai.io/blog/transcription-cost/" rel="noopener noreferrer"&gt;$0.0020 to $0.0164 across the models we measured&lt;/a&gt;; video generation bills per second by resolution; Gemini prices music per song.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objects, requests, and pages (units 8 to 10).&lt;/strong&gt; Image generation bills per image by tier or per output token, and the two cross over: &lt;a href="https://synthorai.io/blog/image-generation-cost/" rel="noopener noreferrer"&gt;per-token wins below about 1,000 output tokens, flat per-image wins above&lt;/a&gt;. Server-side tools bill per request: &lt;a href="https://synthorai.io/blog/web-search-api-cost/" rel="noopener noreferrer"&gt;web search costs $0.01 per search on the three surfaces we measured&lt;/a&gt;, and the results then bill again as input tokens (1,500 to 3,100 per search). Gemini's search grounding (letting the model query Google Search mid-request) adds a quota shape: &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;5,000 free requests per month, then $14 per 1,000&lt;/a&gt;. OCR bills per page. Bedrock's model evaluation bills &lt;a href="https://aws.amazon.com/bedrock/pricing/" rel="noopener noreferrer"&gt;$0.21 per completed human task&lt;/a&gt;, the only unit in this zoo denominated in people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which units rent time or capacity instead?
&lt;/h2&gt;

&lt;p&gt;Six units bill for holding resources, whether or not tokens flow. This layer is where cost estimates miss hardest, because the meter runs while your code does nothing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPU-seconds.&lt;/strong&gt; Serverless hosts bill model runtime by hardware class: on Replicate, &lt;a href="https://replicate.com/pricing" rel="noopener noreferrer"&gt;a T4 costs $0.000225 per second and an H100 $0.001525&lt;/a&gt;. The unit prices the card, not the output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container and session hours.&lt;/strong&gt; Anthropic's code execution bills &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;$0.05 per container-hour beyond 1,550 free hours a month, with a 5-minute minimum per execution&lt;/a&gt;; OpenAI's code interpreter bills per 20-minute session, priced by memory size, &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;$0.03 for 1 GB up to $1.92 for 64 GB&lt;/a&gt;. Claude's managed agents bill &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;$0.08 per session-hour, metered to the millisecond and only while running&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GB-days and token-hours.&lt;/strong&gt; Two storage meters for the same idea. OpenAI file search storage is &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;$0.10 per GB-day with 1 GB free&lt;/a&gt;; Gemini explicit context caching bills storage at &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;$0.50 per million tokens per hour, rising to $1.00 in 2027&lt;/a&gt;. A cache you forget to delete is a subscription you did not know you had.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PTU-hours and model units.&lt;/strong&gt; Provisioned capacity bills per unit-hour regardless of traffic. Azure's provisioned throughput units (PTUs) are &lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/provisioned-throughput" rel="noopener noreferrer"&gt;model-independent quota with per-model minimum deployment sizes&lt;/a&gt;; output tokens consume more capacity than input tokens, and cached tokens consume none, so a high cache-hit rate shrinks the PTU count you need. Bedrock sells the same shape as &lt;a href="https://aws.amazon.com/bedrock/pricing/" rel="noopener noreferrer"&gt;model units with 1-month or 6-month commitments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training tokens.&lt;/strong&gt; Fine-tuning bills per token of training data multiplied by epochs, except where it bills wall-clock: some OpenAI models list &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;$100 per training hour&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What changes the rate without changing the unit?
&lt;/h2&gt;

&lt;p&gt;Seven things change the price of a unit without touching the unit itself: batch tier, service tier, clock time, context length, geography, quality knobs, and free quotas. Billing code that stores one price per model gets every one of these wrong, because the same token has different prices depending on how, when, and where it is processed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modifier&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Batch tier&lt;/td&gt;
&lt;td&gt;50% off input and output&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; and &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; batch APIs; Mistral OCR too&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service tier&lt;/td&gt;
&lt;td&gt;Premium for speed&lt;/td&gt;
&lt;td&gt;OpenAI fast tier at &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;2x standard rates&lt;/a&gt;; flex tier discounted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clock time&lt;/td&gt;
&lt;td&gt;Off-peak discount&lt;/td&gt;
&lt;td&gt;DeepSeek: &lt;a href="https://api-docs.deepseek.com/quick_start/pricing" rel="noopener noreferrer"&gt;off-peak is half of peak; peak is 01:00-04:00 and 06:00-10:00 UTC weekdays&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context length&lt;/td&gt;
&lt;td&gt;Rate steps at a threshold&lt;/td&gt;
&lt;td&gt;Gemini rates step &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;above 200k prompt tokens&lt;/a&gt;; Claude 4.6+ is &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;flat across the full 1M window&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geography&lt;/td&gt;
&lt;td&gt;Residency premium&lt;/td&gt;
&lt;td&gt;Claude &lt;code&gt;inference_geo: "us"&lt;/code&gt; is &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;1.1x on every token category&lt;/a&gt;; regional endpoints for Claude models on Bedrock and Google Cloud carry a 10% premium over global&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality knobs&lt;/td&gt;
&lt;td&gt;Same unit, different burn&lt;/td&gt;
&lt;td&gt;gpt-image quality swings &lt;a href="https://synthorai.io/blog/image-generation-cost/" rel="noopener noreferrer"&gt;196 to 7,024 billed tokens for one 1024x1024 image&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free quotas&lt;/td&gt;
&lt;td&gt;Rate cliff at a threshold&lt;/td&gt;
&lt;td&gt;Grounding: 5,000 free requests/month; code execution: 1,550 free hours/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The multipliers stack. Anthropic documents that caching multipliers combine with the batch discount and the residency premium, so one cached, batched, US-pinned token carries three factors at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are credits and CCUs?
&lt;/h2&gt;

&lt;p&gt;They are synthetic wrappers over the real meters, used where invoicing needs one line item. When Claude bills through AWS or Azure Marketplace, usage is rated in dollars at the normal per-unit prices and then converted to &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Claude Consumption Units at 100 CCU per dollar&lt;/a&gt;; discounts show up as fewer CCUs metered, not a cheaper CCU. Subscription products run the same trick with credits, and the boundary can sit inside one company: ElevenLabs meters its subscription plans in credits while stating that &lt;a href="https://elevenlabs.io/pricing/api" rel="noopener noreferrer"&gt;API usage is billed in US dollars, not credits&lt;/a&gt;. When you see a synthetic unit, the question to ask is which consumption or capacity meter sits underneath it and at what conversion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which rounding rules and minimums bite?
&lt;/h2&gt;

&lt;p&gt;These are the quantization rules, collected in one place because each one lives in a different document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code execution containers bill a &lt;strong&gt;5-minute minimum&lt;/strong&gt;, and including files in a request bills execution time even if the tool is never called.&lt;/li&gt;
&lt;li&gt;Code interpreter sessions quantize to &lt;strong&gt;20-minute blocks&lt;/strong&gt; by RAM tier.&lt;/li&gt;
&lt;li&gt;Realtime speech quantizes to &lt;strong&gt;100 ms heard / 50 ms spoken&lt;/strong&gt; per audio token; &lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;60 seconds of silence billed zero under server voice-activity detection (VAD), and cancelling a spoken answer 2 seconds in billed 4 seconds&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Image generation with &lt;code&gt;n=4&lt;/code&gt; &lt;a href="https://synthorai.io/blog/image-generation-cost/" rel="noopener noreferrer"&gt;re-bills the prompt four times&lt;/a&gt;; there is no prompt caching on that surface.&lt;/li&gt;
&lt;li&gt;Video tokens carry &lt;a href="https://synthorai.io/blog/seedance-api-pricing/" rel="noopener noreferrer"&gt;a +1 frame in the formula and encoded dimensions that differ from advertised ones&lt;/a&gt;: 720p bills as 1248x704.&lt;/li&gt;
&lt;li&gt;Prompt caches have &lt;a href="https://synthorai.io/blog/prompt-cache-minimums-measured/" rel="noopener noreferrer"&gt;per-provider minimum cacheable lengths&lt;/a&gt;; below the minimum you pay the write premium and cache nothing.&lt;/li&gt;
&lt;li&gt;Guardrails text units round up &lt;strong&gt;per 1,000 characters&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tool definitions bill as input before any call: Anthropic's tool-use system prompt adds &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;286 to 804 tokens depending on model and tool choice&lt;/a&gt;, and a full computer-use toolset adds about 4,500.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do you compare costs across units?
&lt;/h2&gt;

&lt;p&gt;Normalize to dollars per user interaction, because that is the only unit every meter converts into.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fai-api-billing-units%2Fvoice-call-meters.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fai-api-billing-units%2Fvoice-call-meters.svg" alt="Flow diagram of one voice call: the cascade stack bills speech-to-text in audio-minutes, the LLM in tokens, and text-to-speech in characters, totaling $0.0037 to $0.025 per conversation-minute; the realtime stack bills audio tokens only and lands at $0.016 to $0.057" width="1540" height="470"&gt;&lt;/a&gt; Our voice-agent study did exactly this: a cascade stack billing audio-minutes (STT), tokens (LLM), and characters (TTS) came to &lt;a href="https://synthorai.io/blog/voice-agent-api-cost/" rel="noopener noreferrer"&gt;$0.0037 to $0.025 per conversation-minute, against $0.057 for gpt-realtime-2.1 and $0.016 for its mini&lt;/a&gt;, which prices the realtime premium and its latency payoff in one comparable number. The procedure generalizes: pick the interaction (a support ticket, a document, a conversation-minute), meter each hop in its native unit, rate each at its current price, and only then compare. Comparing $/1M tokens to $/audio-minute directly is a category error; comparing $/interaction is arithmetic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a gateway normalizes the zoo
&lt;/h2&gt;

&lt;p&gt;Synthorai's answer is to rate at request time and keep the native unit alongside the dollars. Every request produces one usage record carrying the native meter readings (tokens by class, seconds, characters, request counts), the resolved price version, and the rated cost, so an invoice line can always be decomposed back into unit times rate. This is the same conversion a CCU does at the marketplace boundary, done per record and kept inspectable. It also composes with &lt;a href="https://synthorai.io/blog/llm-data-retention-zdr/" rel="noopener noreferrer"&gt;zero-retention mode&lt;/a&gt;: the usage record needs meter readings and a content hash, never the payload. When a price changes upstream, the price version pins which rate card each historical record was rated under, which is the property that makes month-end reconciliation an audit rather than an argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Are audio tokens the same as text tokens?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Realtime audio tokens are a separate meter with separate prices: on gpt-realtime-2.1 one token covers 100 ms of speech heard or 50 ms spoken, which works out to &lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;$0.0192 per minute to listen and $0.0768 per minute to speak&lt;/a&gt;. The audio and text meters carry separate rate cards even inside one model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does the same image bill different token counts on different providers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the conversion scheme differs, not the image: &lt;a href="https://synthorai.io/blog/image-input-token-cost/" rel="noopener noreferrer"&gt;patch formulas, capped tiles, and flat fees&lt;/a&gt; all coexist. One 1024x1024 image measured 693 tokens on GPT-5.6, 1,089 on Gemini, 1,372 on Claude, and file format or content never moved a single token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do cached tokens count as input tokens?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They are metered separately and priced by operation: cache writes carry a premium over base input (1.25x or 2x by TTL on the Claude API), reads a discount (0.1x). On provisioned capacity the distinction matters twice: &lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/provisioned-throughput" rel="noopener noreferrer"&gt;cached tokens consume no PTU capacity&lt;/a&gt;, so caching reduces both the bill and the capacity you must reserve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is per-character or per-minute pricing cheaper for speech?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It depends on the language. Per-character TTS makes &lt;a href="https://synthorai.io/blog/voice-agent-api-cost/" rel="noopener noreferrer"&gt;spoken Chinese 3 to 7x cheaper per audio-minute than English&lt;/a&gt; because Chinese packs more speech into fewer characters; per-minute pricing is language-neutral. For transcription the per-minute models we measured ran &lt;a href="https://synthorai.io/blog/transcription-cost/" rel="noopener noreferrer"&gt;$0.0020 to $0.0164 per audio-minute&lt;/a&gt; with near-equal accuracy on clean speech.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Unit definitions and rates quoted from provider pricing pages fetched 2026-08-30, and from our own measured studies linked in place. Prices drift; unit structures drift slower, but check the linked source before wiring any number into billing code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related measured studies: &lt;a href="https://synthorai.io/blog/llm-token-usage-anatomy/" rel="noopener noreferrer"&gt;token anatomy&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-prompt-caching-explained/" rel="noopener noreferrer"&gt;prompt caching&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/prompt-cache-minimums-measured/" rel="noopener noreferrer"&gt;cache minimums&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/image-input-token-cost/" rel="noopener noreferrer"&gt;image-input tokens&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/image-generation-cost/" rel="noopener noreferrer"&gt;image generation&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/transcription-cost/" rel="noopener noreferrer"&gt;transcription&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/speech-to-text-api/" rel="noopener noreferrer"&gt;speech-to-text&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;realtime speech&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/seedance-api-pricing/" rel="noopener noreferrer"&gt;video generation&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/web-search-api-cost/" rel="noopener noreferrer"&gt;web search&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/voice-agent-api-cost/" rel="noopener noreferrer"&gt;voice agents&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/claude-sonnet-5-tokenizer/" rel="noopener noreferrer"&gt;tokenizers&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/cheapest-llm-by-language/" rel="noopener noreferrer"&gt;cost by language&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>billing</category>
      <category>apipricing</category>
      <category>costobservability</category>
    </item>
    <item>
      <title>LLM Data Retention and ZDR: Every Party That Can Read Your Prompts</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Sun, 30 Aug 2026 10:54:02 +0000</pubDate>
      <link>https://dev.to/synthorai/llm-data-retention-and-zdr-every-party-that-can-read-your-prompts-15c</link>
      <guid>https://dev.to/synthorai/llm-data-retention-and-zdr-every-party-that-can-read-your-prompts-15c</guid>
      <description>&lt;p&gt;Your prompt does not go to "the AI company". On an agent stack it crosses a chain of parties that all handle it in cleartext, and exactly which ones depends on your stack: the agent framework's telemetry, a tracing platform, a memory store, an analytics tool, an AI gateway, and one of three kinds of inference provider, each with its own retention policy, storage region, and training clause. The party that keeps your prompts longest is usually on your side of the API: model vendors delete standard logs in about 30 days, while a default tracing or memory store keeps them until you delete them. Zero data retention (ZDR) is a real and useful arrangement, but it pins down exactly one of those parties on exactly one of three axes. This post maps the whole chain, who retains what and for how long, and what ZDR does and does not cover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every cleartext hop can collect; agent-side tracing and memory stores keep prompts far longer than any model provider does.&lt;/li&gt;
&lt;li&gt;Providers retain per feature: on the Claude API, caching is ZDR-eligible, batch jobs persist 29 days, &lt;a href="https://synthorai.io/blog/fable-5-30-day-data-retention/" rel="noopener noreferrer"&gt;Fable 5 requires 30 days&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Geography follows the server: DeepSeek's official API stores data in the PRC, no other option.&lt;/li&gt;
&lt;li&gt;Free endpoints are the sharpest edge: training rights are usually the price of free capacity.&lt;/li&gt;
&lt;li&gt;ZDR held up in court: the NYT preservation order exempted only zero-retention API customers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who can read your prompt on an agent stack?
&lt;/h2&gt;

&lt;p&gt;Everyone on the path, and the path is longer than most teams draw it:&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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-data-retention-zdr%2Fagent-data-chain.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-data-retention-zdr%2Fagent-data-chain.svg" alt="Diagram of the agent data chain: user, agent layer with telemetry, tracing, memory and analytics, AI gateway in SaaS-aggregator and self-hosted variants, and three kinds of inference provider, with a self-hosted bypass branch" width="1540" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Walk it left to right. The &lt;strong&gt;agent layer&lt;/strong&gt; is yours, but rarely only yours: frameworks ship telemetry, tracing and observability platforms exist precisely to store full prompts and responses, memory features write conversation content into vector stores that never expire on their own, and a session-replay analytics snippet in your web UI captures the prompt as the user types it, before your backend ever sees it. The &lt;strong&gt;gateway&lt;/strong&gt; is one party if you run it yourself and two if it is SaaS, and SaaS gateways come in two flavors. The first is the multi-provider aggregator: one API that routes each request across the providers behind it, so its data posture is always a sum, its own policy plus the policy of whichever host this particular request landed on. The second comes from security vendors: data-loss-prevention (DLP) and guardrail gateways whose entire product is payload inspection, redaction, and policy enforcement, which means reading every prompt is the feature, and flagged prompts are typically retained as security events by design.&lt;/p&gt;

&lt;p&gt;Behind the gateway sit three kinds of &lt;strong&gt;inference provider&lt;/strong&gt;: the model vendor's own API, a cloud provider hosting the model inside your cloud tenancy, and GPU hosts serving open weights under their own logging policies. The bypass branch, self-hosted inference on a dedicated tenant or your own GPUs, is the only path where no third party handles cleartext, and it comes with a catch we will return to.&lt;/p&gt;

&lt;p&gt;The rule that organizes everything else: &lt;strong&gt;seeing and keeping are different questions.&lt;/strong&gt; Every box can technically collect. Which ones do is a matter of defaults, settings, and contracts, and the defaults are wildly uneven across the chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who actually keeps your prompts?
&lt;/h2&gt;

&lt;p&gt;Usually your own tooling, longer than anyone else. The provider retention windows that dominate security questionnaires are days; the agent-side stores that nobody questionnaires are forever.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-data-retention-zdr%2Fretention-windows.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-data-retention-zdr%2Fretention-windows.svg" alt="Bar chart of prompt retention windows per hop: tracing SaaS, vector memory, gateway consoles, and uploaded files persist until deleted; provider windows run from about 30 days down to hours; ZDR-eligible payloads are never written at rest" width="1540" height="770"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent layer retains by design.&lt;/strong&gt; A tracing platform's product is a database of your prompts and outputs; retention there is a project setting, not a policy accident. The defaults vary by tool and are worth knowing: GitHub Copilot's OpenTelemetry integration &lt;a href="https://langfuse.com/integrations/developer-tools/github-copilot" rel="noopener noreferrer"&gt;exports span structure, timing, and token counts but no prompt content&lt;/a&gt; unless you explicitly enable content capture, which is the privacy-conservative template more agent tooling should copy. &lt;a href="https://cursor.com/security" rel="noopener noreferrer"&gt;Cursor's privacy mode&lt;/a&gt; exists because the default mode shares code data. Whatever the model provider deletes after 30 days, your trace store still has on day 300.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gateway keeps what it chooses to keep.&lt;/strong&gt; A gateway cannot avoid usage records, since billing requires knowing token counts, models, and timestamps per request. It can entirely avoid storing payloads: prompt and response bodies can pass through memory and never be written at rest. But two popular gateway features quietly cross that line. A request-inspection or observability console is payload storage by definition, exactly like a tracing SaaS one hop earlier. And gateway-side caching stores prompt content at the gateway hop: a semantic cache keeps an embedding of your prompt plus the full cached response, and a response cache keeps both sides verbatim, on whatever disk the gateway runs. When you evaluate a gateway, SaaS or self-hosted, the question is the same split three times over: what is in the request record, what does the observability view persist, and what does the cache write?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Providers retain per feature, not per company.&lt;/strong&gt; The useful mental model comes straight from &lt;a href="https://platform.claude.com/docs/en/manage-claude/api-and-data-retention" rel="noopener noreferrer"&gt;Anthropic's API retention documentation&lt;/a&gt;, which discloses eligibility feature by feature: prompt caching is ZDR-eligible because cache state is held in memory only, batch processing stores jobs for 29 days because async jobs need storage, code-execution containers persist up to 30 days, and uploaded files live until you delete them. The honest sentence in that page deserves quoting: using a stateful feature "is a choice to step outside your ZDR arrangement for that specific data." On the OpenAI side, &lt;a href="https://developers.openai.com/api/docs/guides/your-data" rel="noopener noreferrer"&gt;the data-controls documentation&lt;/a&gt; lists which endpoints are ZDR-eligible, keeps abuse-monitoring logs up to 30 days by default, and documents that cached prompts live as encrypted key-value tensors on GPU-local storage with a bounded TTL. Standard commercial deletion on the Claude API is &lt;a href="https://privacy.claude.com/en/articles/7996866-how-long-do-you-store-my-organization-s-data" rel="noopener noreferrer"&gt;within 30 days&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where does the data physically live?
&lt;/h2&gt;

&lt;p&gt;Wherever the serving infrastructure lives, and the provider kinds give different answers. A cloud-hosted model is the strong case: on &lt;a href="https://docs.aws.amazon.com/bedrock/latest/userguide/data-protection.html" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt; the cloud provider is the data processor and inference stays in the region you selected, which is why regulated buyers reach for that lane first. A model vendor's own API runs where the vendor runs: OpenAI offers US and EU regional processing for most endpoints; smaller vendors often publish nothing. The unambiguous extreme is DeepSeek, whose &lt;a href="https://cdn.deepseek.com/policies/en-US/deepseek-privacy-policy.html" rel="noopener noreferrer"&gt;privacy policy&lt;/a&gt; states that personal data is collected, processed, and stored in the People's Republic of China, with no US or EU option on the official API. The same open weights served by a US GPU host carry none of that geography, which is the cleanest illustration that &lt;strong&gt;where a model's data goes is a property of who serves it, not of the model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two tails extend past the primary copy. Caches and batch files live in the serving region for their own lifetimes, separate from the request log. And every provider sits on subprocessors (its own downstream vendors) and backups: deletion commitments are typically phrased as deletion from active systems with backup propagation windows behind them. If your data-flow diagram ends at the API vendor's logo, it is missing at least those two boxes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who requires retention, and who trains on your prompts?
&lt;/h2&gt;

&lt;p&gt;Three different forces keep data alive past the defaults, and only one of them is in the provider's marketing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy requirements.&lt;/strong&gt; Some models mandate retention as a safety condition. &lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;Claude Fable 5&lt;/a&gt; and Mythos 5 &lt;a href="https://synthorai.io/blog/fable-5-30-day-data-retention/" rel="noopener noreferrer"&gt;require 30-day retention even for ZDR customers&lt;/a&gt;; the enforcement is fail-loud, since a request from an organization whose retention configuration does not meet the requirement is rejected with a 400 rather than silently accepted. Abuse escalation is the other policy tail: content flagged for usage-policy violations is retained on a different clock entirely (Anthropic's consumer policy documents up to 2 years for flagged inputs and outputs, and up to 7 years for classifier scores).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legal holds.&lt;/strong&gt; The NYT v. OpenAI litigation produced the clearest natural experiment in retention promises. A &lt;a href="https://thecyberexpress.com/openai-court-order-nyt-copyright-dispute/" rel="noopener noreferrer"&gt;May 2025 preservation order&lt;/a&gt; required OpenAI to preserve output logs it would otherwise have deleted, including chats users had deleted, across consumer tiers; the order was &lt;a href="https://cdn.arstechnica.net/wp-content/uploads/2026/01/NYT-v-OpenAI-Order-1-5-26.pdf" rel="noopener noreferrer"&gt;narrowed that September&lt;/a&gt; and a court later ordered &lt;a href="https://news.bloomberglaw.com/ip-law/openai-must-turn-over-20-million-chatgpt-logs-judge-affirms" rel="noopener noreferrer"&gt;20 million chat logs produced&lt;/a&gt; in discovery. The detail that matters for API buyers: enterprise and zero-data-retention customers were carved out, because there was nothing retained to preserve. A deletion policy bends to a litigation hold; an architecture that never stored the data does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Harvesting middlemen.&lt;/strong&gt; The middle of the chain does get caught monetizing cleartext, and the largest documented case sat closest to the user. In December 2025, &lt;a href="https://www.koi.ai/blog/urban-vpn-browser-extension-ai-conversations-data-collection" rel="noopener noreferrer"&gt;security researchers documented&lt;/a&gt; that a "privacy" VPN browser extension with millions of installs had been injecting scripts into AI chat pages, intercepting every prompt and response across ChatGPT, Claude, Gemini and five other assistants, and shipping the conversations to a data-broker affiliate; the harvesting ran &lt;a href="https://thehackernews.com/2025/12/featured-chrome-browser-extension.html" rel="noopener noreferrer"&gt;whether or not the VPN was on&lt;/a&gt;, across roughly 8 million users of the publisher's extension family. The incident was a client-side interceptor rather than an API gateway, but the lesson transfers to every box on the diagram: any intermediary that handles cleartext can be a collection point, its incentive is monetization, and the interception is invisible from both ends. Trust in a middleman is a claim about its business model, not its feature list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Training clauses.&lt;/strong&gt; Business APIs from the major vendors do not train on your data by default; consumer products increasingly do unless you opt out, which is one more reason agent traffic belongs on API keys rather than consumer accounts. And a growing number of products put training on a toggle you are expected to find yourself: consumer plans with training on by default and an opt-out buried in settings, developer tools whose telemetry or code-sharing setting doubles as a training consent, vendor programs that trade data-sharing opt-ins for discounts or free quota, and aggregator dashboards with separate paid-tier and free-tier training switches. Each toggle is per-account, sometimes per-workspace, and a default can change with a terms update, so "we checked once" is not a posture; auditing these switches belongs on the same recurring checklist as key rotation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free models, singled out on purpose.&lt;/strong&gt; Every warning above concentrates in one place: the free tier. A free model launch is usually subsidized by whoever benefits from the traffic, most often the model's own vendor, so prompts sent to the free variant flow to that party under its policy, with training rights commonly part of the deal, processed wherever that party operates, which for Chinese vendors means China. Aggregator gateways publish per-endpoint data policies and a switch to exclude providers that train precisely because free routes are where those clauses live. The rule of thumb is blunt: treat a free endpoint as a data submission, not an API call. Free inference is paid for somehow, and the currency is usually your prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does ZDR actually mean?
&lt;/h2&gt;

&lt;p&gt;ZDR pins one axis out of three, for one party in the chain, for eligible features only. That is not a criticism; it is the definition, and knowing the edges is what makes it usable.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-data-retention-zdr%2Fzdr-three-axes.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fllm-data-retention-zdr%2Fzdr-three-axes.svg" alt="Diagram of three independent axes of data handling: training use, retention duration, and human access; ZDR sets retention to zero at the provider hop for eligible features, while the other two axes and everything left of the provider are unchanged" width="1540" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The three axes.&lt;/strong&gt; Training use, retention duration, and human access are independent. Business APIs already do not train on your data; ZDR moves retention to zero for payloads; human access is governed separately by abuse processes. Conflating them is how ZDR gets oversold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What survives under ZDR.&lt;/strong&gt; Usage metadata and billing records; safety-classifier outputs; and whatever stateful features you opt into. Both major vendors now engineer around the abuse-monitoring exception rather than through it: payload-free safety signals on one side, classifier-results-only retention on the other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What ZDR does not reach.&lt;/strong&gt; Everything left of the provider: your tracing store, your gateway logs, your vector memory. A ZDR agreement with a model vendor while a tracing SaaS holds every prompt indefinitely is the most common retention posture we see, and the least coherent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The self-hosting caveat.&lt;/strong&gt; Running open weights on your own GPUs removes every third party, and then your own infrastructure inherits the whole problem: inference-server request logging, access logs, trace files. Self-hosting relocates the retention surface; only deliberate log hygiene shrinks it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Synthorai handles it
&lt;/h2&gt;

&lt;p&gt;The gateway hop is ours, so the commitments are concrete. In zero-retention mode, request and response bodies pass through memory and are not written at rest; what persists is the usage record that billing requires: timestamps, model, token counts, and a content hash that lets a request be matched during a dispute without storing what was said. Upstream, the roster is filtered before routing ever happens: Synthorai only onboards providers that commit to zero data retention for our traffic, with one documented exception, &lt;a href="https://synthorai.io/blog/fable-5-30-day-data-retention/" rel="noopener noreferrer"&gt;Claude Fable 5&lt;/a&gt;, whose 30-day retention is mandated by the model vendor and cannot be contracted away. Provider selection is retention selection, and the gateway's job is to make that property explicit per route rather than buried in a policy PDF: a Fable 5 route carries its retention requirement as documented metadata, not as a surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do LLM providers train on API data by default?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, the major vendors' business APIs do not train on customer data by default; that commitment appears in each provider's data-controls documentation. The exceptions cluster in the long tail: consumer products with opt-out rather than opt-in, some GPU hosts serving open weights, and free-tier endpoints where training rights are part of the price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does ZDR mean the provider stores nothing at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. ZDR means prompt and response payloads are not retained for eligible features. Usage metadata, billing records, and safety-classifier outputs persist, and stateful features like batch jobs or file uploads store data by nature, outside the ZDR envelope. Read the feature-eligibility table, not the headline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it safe to send production data to free models?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Treat a free endpoint as a data submission, not an API call. Free capacity is subsidized by whoever benefits from the traffic, training rights are commonly part of the arrangement, and the data is processed wherever the subsidizing party operates. For throwaway experiments that is a fine trade; for anything containing customer data, code, or credentials it rarely is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is self-hosting automatically the most private option?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It removes every third party from the cleartext path, which is real. It does not remove retention: inference servers, reverse proxies, and tracing all log by default, so a self-hosted stack with default logging can retain more prompt data than a ZDR API arrangement. Privacy follows the logging configuration, not the hosting model.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources verified 2026-08-29: every provider claim above links to the vendor's own documentation or to primary court records, and policies in this area changed twice in the month before publication, so treat the links as the live source of truth. This is an engineering reading, not legal advice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://synthorai.io/blog/fable-5-30-day-data-retention/" rel="noopener noreferrer"&gt;Fable 5's 30-day retention requirement&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-prompt-caching-explained/" rel="noopener noreferrer"&gt;how prompt caching works&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/provider-caching-comparison/" rel="noopener noreferrer"&gt;provider cache comparison&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>security</category>
      <category>zdr</category>
      <category>llm</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Best LLM for Translation: 9 Models, 9 Languages, a 400x Cost Spread</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Sat, 29 Aug 2026 12:05:39 +0000</pubDate>
      <link>https://dev.to/synthorai/best-llm-for-translation-9-models-9-languages-a-400x-cost-spread-im0</link>
      <guid>https://dev.to/synthorai/best-llm-for-translation-9-models-9-languages-a-400x-cost-spread-im0</guid>
      <description>&lt;p&gt;The best translation model is not one model: &lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;gpt-5.6-sol&lt;/a&gt; leads in 7 of the 9 languages we judged, &lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;claude-fable-5&lt;/a&gt; edges it in Korean, &lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt; ties it in Korean and passes it in Italian at the same measured price, and the cost of translating the same million characters spans $0.26 to $104 depending on which API you pick. We generated 4,210 translations with 9 models across 9 languages and put 8,455 blind pairwise verdicts on them; this post is the resulting matrix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default pick: &lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;gpt-5.6-sol&lt;/a&gt; defended 7 of 9 languages in 8,455 blind verdicts; Korean goes to &lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;claude-fable-5&lt;/a&gt; (52%) and Italian to &lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt; (52%).&lt;/li&gt;
&lt;li&gt;By content: literary belongs to gemini-3.7-flash (60% vs baseline); UI strings tie across all 9 models with zero broken placeholders, so the cheapest wins; best sub-$4 pick is &lt;a href="https://synthorai.io/models/qwen3-8-max/" rel="noopener noreferrer"&gt;qwen3.8-max&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Cost spans $0.26 (&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash&lt;/a&gt;) to $104 (&lt;a href="https://synthorai.io/models/gemini-3-1-pro-preview/" rel="noopener noreferrer"&gt;gemini-3.1-pro&lt;/a&gt;) per 1M characters; the $104 is mostly 1.17M reasoning tokens the model refuses to turn off.&lt;/li&gt;
&lt;li&gt;Judges preferred frontier models over human post-edits 83-100% of the time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How did we test translation quality?
&lt;/h2&gt;

&lt;p&gt;Three ingredients: a parallel corpus, one production-grade prompt, and a blind judging panel. Everything below, including the raw verdicts, is in the &lt;a href="https://github.com/synthorai-io/use-cases/tree/main/translation-bench" rel="noopener noreferrer"&gt;public benchmark repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corpus.&lt;/strong&gt; 52 English segments across six domains, translated by every model into all 9 languages. Four domains (news, social, speech, literary; 8 seeded-sampled segments each) come from &lt;a href="https://huggingface.co/datasets/google/wmt24pp" rel="noopener noreferrer"&gt;WMT24++&lt;/a&gt; (Apache-2.0), the evaluation set of WMT, the annual machine-translation shared task. Every WMT24++ segment carries a human post-edited reference (a professional translation reviewed and corrected by a second linguist), and the set covers the exact dialect of every locale we ship: zh_CN, zh_TW, ja, ko, fr, de, es_MX, pt_BR, it. Two domains are ours: 10 technical-documentation paragraphs from posts published in the last 60 days, which doubles as a contamination control since no model's training data can contain them, and 10 synthetic UI strings built from known localization hazards (context-free "Archive", &lt;code&gt;{placeholder}&lt;/code&gt; integrity, plural forms). Sampling is seeded and the segment ids are published, so nobody can accuse the corpus of being curated toward a result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judging.&lt;/strong&gt; Every candidate translation was compared blind against the same segment translated by a fixed baseline, gpt-5.6-sol, the model that currently translates this blog. Three judge families (&lt;a href="https://synthorai.io/models/claude-sonnet-5/" rel="noopener noreferrer"&gt;claude-sonnet-5&lt;/a&gt;, &lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;gpt-5.6-luna&lt;/a&gt;, &lt;a href="https://synthorai.io/models/gemini-3-1-pro-preview/" rel="noopener noreferrer"&gt;gemini-3.1-pro&lt;/a&gt;) scored independently under a rubric derived from &lt;a href="https://themqm.org/error-types-2/typology/" rel="noopener noreferrer"&gt;MQM&lt;/a&gt;, the industry's standard translation-error typology, priority-ordered so an accuracy error outweighs any amount of polish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Accuracy     mistranslation, omission, addition, hallucination
2. Terminology  domain terms as a native engineer would keep them
3. Fluency      grammar, natural reading
4. Style        register appropriate to the text type
5. Locale       numbers, dates, units, punctuation width
6. Markup       inline code, placeholders, links preserved exactly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The severity-graded design follows the spirit of &lt;a href="https://aclanthology.org/2024.wmt-1.131/" rel="noopener noreferrer"&gt;Error Span Annotation&lt;/a&gt;, the protocol WMT has used for human evaluation since 2024, adapted here to pairwise LLM judging; corpus and references come from the &lt;a href="https://arxiv.org/abs/2502.12404" rel="noopener noreferrer"&gt;WMT24++ paper&lt;/a&gt;. Each pair was judged twice with the presentation order swapped; when a judge contradicted itself across orders, the verdict became a tie. Judges are averaged with equal weight, never pooled into one vote, and per-judge numbers are reported so family bias stays visible. A second arm compared the three frontier-tier models (gpt-5.6-sol, claude-fable-5, gemini-3.1-pro) against WMT24++'s human references. Placeholder integrity was graded by script, not by judges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which model translates best, per language?
&lt;/h2&gt;

&lt;p&gt;The winner first: &lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;gpt-5.6-sol&lt;/a&gt; is not just the baseline of this table, it is the measured champion. Every challenger below is scored against it, none clears 50% in more than one language, and in the separate human-reference arm sol's translations were preferred over WMT24++'s professional post-edits in 86-100% of verdicts, the strongest showing of the three frontier models tested there. The table reads as win rate against sol, ties excluded, three judges averaged; 50% means parity.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;vs baseline&lt;/th&gt;
&lt;th&gt;zh&lt;/th&gt;
&lt;th&gt;zh-TW&lt;/th&gt;
&lt;th&gt;ja&lt;/th&gt;
&lt;th&gt;ko&lt;/th&gt;
&lt;th&gt;fr&lt;/th&gt;
&lt;th&gt;de&lt;/th&gt;
&lt;th&gt;es&lt;/th&gt;
&lt;th&gt;pt&lt;/th&gt;
&lt;th&gt;it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;43%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;37%&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;claude-fable-5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;19%&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-1-pro-preview/" rel="noopener noreferrer"&gt;gemini-3.1-pro&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/qwen3-8-max/" rel="noopener noreferrer"&gt;qwen3.8-max&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/kimi-k3/" rel="noopener noreferrer"&gt;kimi-k3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;td&gt;23%&lt;/td&gt;
&lt;td&gt;23%&lt;/td&gt;
&lt;td&gt;16%&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/claude-sonnet-5/" rel="noopener noreferrer"&gt;claude-sonnet-5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;19%&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;glm-5.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pick per language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;sol&lt;/td&gt;
&lt;td&gt;sol&lt;/td&gt;
&lt;td&gt;sol&lt;/td&gt;
&lt;td&gt;fable-5&lt;/td&gt;
&lt;td&gt;sol&lt;/td&gt;
&lt;td&gt;sol&lt;/td&gt;
&lt;td&gt;sol&lt;/td&gt;
&lt;td&gt;sol&lt;/td&gt;
&lt;td&gt;3.7-flash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four things stand out. The baseline defends 7 of 9 languages outright, which retroactively validates the blind judging round that picked it for our own pipeline. Korean is the contested language: fable-5 edges past (52%) and 3.7-flash reaches parity, so if Korean is your main market the ranking genuinely differs. The Chinese open-weight models lose their home turf: Qwen at 26% and GLM at 9% in Simplified Chinese. And GLM-5.2's collapse is task-specific, not general: the same model held 6/6 schema keywords in our &lt;a href="https://synthorai.io/blog/llm-structured-outputs/" rel="noopener noreferrer"&gt;structured-outputs study&lt;/a&gt; days earlier; translation is simply not what it is good at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which content is still hard to translate?
&lt;/h2&gt;

&lt;p&gt;Per content type, the recommendation plus the strongest alternative to it, with the alternative's win rate against the baseline (the field median is across all eight challengers):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Recommended model&lt;/th&gt;
&lt;th&gt;Strongest alternative&lt;/th&gt;
&lt;th&gt;Field median&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;literary&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;gemini-3.7-flash&lt;/strong&gt; (60% vs baseline)&lt;/td&gt;
&lt;td&gt;gpt-5.6-sol&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;news&lt;/td&gt;
&lt;td&gt;gpt-5.6-sol&lt;/td&gt;
&lt;td&gt;gemini-3.1-pro (48%)&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;speech&lt;/td&gt;
&lt;td&gt;gpt-5.6-sol&lt;/td&gt;
&lt;td&gt;gemini-3.7-flash (43%)&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;social&lt;/td&gt;
&lt;td&gt;gpt-5.6-sol&lt;/td&gt;
&lt;td&gt;qwen3.8-max (27%)&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;techdoc&lt;/td&gt;
&lt;td&gt;gpt-5.6-sol&lt;/td&gt;
&lt;td&gt;fable-5 / 3.7-flash (30%)&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ui&lt;/td&gt;
&lt;td&gt;cheapest (&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;any model, verdicts mostly tie (77% top)&lt;/td&gt;
&lt;td&gt;61%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One control deserves its own sentence: the techdoc rows come from paragraphs no model can have trained on, and the Gemini models drop hardest there (gemini-3.1-pro averages 33% across the public WMT domains and scores 10% on the fresh paragraphs). That gap is consistent with benchmark familiarity, but also with the baseline's home advantage on technical prose it translates in production, so we flag it rather than conclude it.&lt;/p&gt;

&lt;p&gt;Read as recommendations per content type: for news, social, speech, and technical documentation the baseline stands, and social is where it stands tallest, since slang, fragments, and implied context punish every challenger (three of eight scored under 10%). Literary prose is the one category with a different answer: gemini-3.7-flash beats the baseline outright at 60%, so fiction-like content has a cheaper, better home. And UI strings invert the logic entirely: verdicts mostly tie because ten words of button copy leave little to disagree about, and every one of the nine models preserved every &lt;code&gt;{seconds}&lt;/code&gt;, &lt;code&gt;%d&lt;/code&gt;, and &lt;code&gt;{workspace_name}&lt;/code&gt; intact (0 broken of 27 each). When quality is indistinguishable, price decides: translate UI strings with the cheapest model you have. Placeholder breakage, the classic localization bug, appears to be solved at the model level in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the same translation cost on each model?
&lt;/h2&gt;

&lt;p&gt;From $0.26 to $104.37 per million output characters (total measured spend divided by total output, aggregated over all nine languages), a 400x spread, and the most expensive model is not the best one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;$/1M output chars&lt;/th&gt;
&lt;th&gt;Reasoning tokens burned&lt;/th&gt;
&lt;th&gt;Win rate range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;deepseek-v4-flash&lt;/td&gt;
&lt;td&gt;$0.26&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0-24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glm-5.2&lt;/td&gt;
&lt;td&gt;$2.48&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3-12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.8-max&lt;/td&gt;
&lt;td&gt;$3.18&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;14-36%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-sonnet-5&lt;/td&gt;
&lt;td&gt;$8.36&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3-32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kimi-k3&lt;/td&gt;
&lt;td&gt;$8.37&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0-27%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-sol (baseline)&lt;/td&gt;
&lt;td&gt;$13.70&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemini-3.7-flash&lt;/td&gt;
&lt;td&gt;$14.46&lt;/td&gt;
&lt;td&gt;505K&lt;/td&gt;
&lt;td&gt;8-52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-fable-5&lt;/td&gt;
&lt;td&gt;$39.81&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;15-52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemini-3.1-pro&lt;/td&gt;
&lt;td&gt;$104.37&lt;/td&gt;
&lt;td&gt;1,171,770&lt;/td&gt;
&lt;td&gt;14-45%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The $104 row is a thinking tax, not a quality premium. Translation needs no reasoning, and every model that lets us pin thinking to zero ran clean; the current Gemini generation &lt;a href="https://synthorai.io/blog/gemini-3-7-flash-cost/" rel="noopener noreferrer"&gt;refuses every off-switch spelling&lt;/a&gt;, so gemini-3.1-pro burned 1.17M reasoning tokens across 468 translations and came out 7.6x more expensive than the baseline while losing to it in all nine languages. Even its flash sibling carried a 505K-token burn that pushed its cost above the baseline's.&lt;/p&gt;

&lt;p&gt;The value picks follow directly. If quality must stay near the frontier, gemini-3.7-flash is the strongest challenger: 35-52% against the baseline in seven of nine languages (50% is parity; Simplified Chinese at 26% and Portuguese at 8% are its weak spots), the only outright domain win (literary, 60%), at a measured cost within 6% of the baseline's, because its mandatory reasoning burn eats the flash discount. If cost dominates, deepseek-v4-flash translates for 53x less than the baseline and never broke a placeholder; you give up real quality (0% win rate in Japanese is a floor, not a rounding error), which is a defensible trade for internal content and a poor one for anything customer-facing.&lt;/p&gt;

&lt;h2&gt;
  
  
  So which model do you actually pick?
&lt;/h2&gt;

&lt;p&gt;The whole matrix folds into one decision table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You are optimizing for&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best average quality, many languages&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gpt-5-6-sol/" rel="noopener noreferrer"&gt;gpt-5.6-sol&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;defends 7 of 9 languages against every challenger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Korean&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;claude-fable-5&lt;/a&gt;, or 3.7-flash on a budget&lt;/td&gt;
&lt;td&gt;52% vs baseline, the only language a challenger wins; flash at parity (50%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Italian&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;52% vs baseline at the baseline's price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Literary or fiction-like content&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;60% vs baseline, the only domain won outright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;News, social, speech, tech docs&lt;/td&gt;
&lt;td&gt;the baseline&lt;/td&gt;
&lt;td&gt;no challenger above 48% in any of these domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI strings&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;verdicts tie across models and placeholders are safe everywhere, so the $0.26 model wins by price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget multilingual, under $4/1M chars&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/qwen3-8-max/" rel="noopener noreferrer"&gt;qwen3.8-max&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;best win rates of the sub-$4 tier in all 9 languages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Absolute cost floor, internal content&lt;/td&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$0.26/1M chars, 53x under the baseline; accept the CJK quality gap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Never for translation&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/gemini-3-1-pro-preview/" rel="noopener noreferrer"&gt;gemini-3.1-pro&lt;/a&gt;, &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;glm-5.2&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;a 7.6x mandatory thinking tax; a task-specific quality collapse&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Do LLMs beat human translators now?
&lt;/h2&gt;

&lt;p&gt;Our judges preferred the machine over WMT24++'s human post-edited references in 83-100% of verdicts for all three frontier models, in every language, with a single exception: claude-fable-5 in Simplified Chinese at 44%. Two readings of that number, and honesty requires both. The strong one: WMT24++'s own authors concluded LLMs are now the best MT systems in all 55 languages they cover, and our panel agrees. The cautious one: LLM judges share stylistic priors with LLM translators, and a fluency-polished machine translation may be exactly what another model prefers; the references are post-edits, not literary gold. What the number safely establishes is that frontier machine translation is no longer distinguishable from professional human reference quality by any automated panel we can build, which moves the interesting question to price, where the gap is measured in orders of magnitude.&lt;/p&gt;

&lt;h2&gt;
  
  
  How noisy are LLM judges, honestly?
&lt;/h2&gt;

&lt;p&gt;Noisy enough that unguarded single-pass judging would be malpractice, and the guards are cheap. When we showed the same pair twice with the order swapped, judges contradicted themselves outright (a hard win-to-loss flip) 9% of the time for claude-sonnet-5, 13% for gemini-3.1-pro, and 19% for gpt-5.6-luna. Our protocol converts every such contradiction into a tie, so position bias cancels instead of accumulating, and the per-judge win rates published alongside the pooled number let you check that no single family drives a conclusion. The three families disagreed on magnitude in places (sonnet-5 was the harshest judge of its own Claude sibling), but on direction they agreed in every language, which is the property the conclusions rest on.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which LLM should I use for translation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;gpt-5.6-sol is the best default for multilingual translation: it defended 7 of 9 languages against every challenger in 8,455 blind verdicts. For near-frontier quality at the same price, gemini-3.7-flash, which ties or wins in Korean and Italian. For bulk internal translation where cost dominates, deepseek-v4-flash at $0.26 per million characters, accepting a real quality gap in CJK languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are LLMs better than human translators?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automated judges now prefer frontier LLM translations over human post-edited references 83-100% of the time in our nine languages, consistent with WMT24++'s own findings. That claim is scoped to reference-quality post-edits and machine judges; it does not cover literary translation with editorial intent, and LLM judges may share stylistic preferences with LLM translators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should translation use a reasoning model?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Translation gains nothing from thinking in our data, and models that cannot turn it off pay for it: gemini-3.1-pro burned 1.17M reasoning tokens on 468 short translations, making it 7.6x the baseline's cost while losing every language. Pin &lt;code&gt;reasoning_effort&lt;/code&gt; to none (or the model's off-spelling) for translation workloads.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Measured 2026-08-26 to 2026-08-29 through the Synthorai gateway: 9 models, 9 languages, 52 segments in 6 domains, 4,210 translations, 8,455 blind pairwise verdicts by 3 judge families under an MQM-derived rubric with order-swapping. Corpus, code, and every raw verdict are in the &lt;a href="https://github.com/synthorai-io/use-cases/tree/main/translation-bench" rel="noopener noreferrer"&gt;public repo&lt;/a&gt;; absolute numbers come from this single batch, so re-measure before relying on any row.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related, same series: &lt;a href="https://synthorai.io/blog/cheapest-llm-by-language/" rel="noopener noreferrer"&gt;cheapest LLM by language&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;thinking controls across 13 models&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/llm-structured-outputs/" rel="noopener noreferrer"&gt;structured outputs measured&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/gemini-3-7-flash-cost/" rel="noopener noreferrer"&gt;Gemini 3.7 Flash cost&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>machinetranslation</category>
      <category>llmjudge</category>
      <category>multilingual</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>LLM Structured Outputs: 4 of 12 APIs Return Valid but Wrong JSON</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Wed, 26 Aug 2026 11:42:29 +0000</pubDate>
      <link>https://dev.to/synthorai/llm-structured-outputs-4-of-12-apis-return-valid-but-wrong-json-58na</link>
      <guid>https://dev.to/synthorai/llm-structured-outputs-4-of-12-apis-return-valid-but-wrong-json-58na</guid>
      <description>&lt;p&gt;Structured outputs work better than their reputation and worse than their marketing: on the 12 model APIs we measured, every structured-output switch that actually engages produced 100% schema-valid JSON, and on 4 of those models the values inside that valid JSON were wrong whenever thinking was left on. The switch also does three different things depending on the vendor, is silently ignored on one API surface, and the same structured call bills anywhere from 30 to 4,959 prompt tokens depending on where the schema travels. This post measures all of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All 8 APIs with a working structured switch returned 100% schema-valid JSON across 6 schema shapes, n=10 each.&lt;/li&gt;
&lt;li&gt;4 of them (both &lt;a href="https://synthorai.io/models/deepseek-v4-pro/" rel="noopener noreferrer"&gt;DeepSeek V4s&lt;/a&gt;, &lt;a href="https://synthorai.io/models/qwen3-8-max/" rel="noopener noreferrer"&gt;Qwen3.8-Max&lt;/a&gt;, &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM-5.2&lt;/a&gt;) put wrong values inside valid JSON with thinking on; thinking off took Qwen from 1/16 to 8/8 correct.&lt;/li&gt;
&lt;li&gt;Claude ignores &lt;code&gt;response_format&lt;/code&gt; on the OpenAI-compatible surface (0/60); its native forced tool call is fully constrained and skips thinking.&lt;/li&gt;
&lt;li&gt;The same 12 KB-schema call bills 30 prompt tokens on DeepSeek and 2,368 to 4,959 on OpenAI, Gemini, and Claude.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How did we test structured outputs?
&lt;/h2&gt;

&lt;p&gt;A structured output is a mode where the API promises the model's reply will conform to a JSON Schema you attach to the request, so your code can parse it without defensive checks. Every test in this post uses variations of one concrete task: a short invoice document and a schema describing what to extract.&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;"vendor"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&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;"total"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&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;"paid"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"boolean"&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="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vendor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paid"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"additionalProperties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;The document reads: "Invoice INV-7role from Acme Corp, issued 2026-03-14, status paid. Line items: keyboard $45 qty 1; mouse $25 qty 2. Grand total $95." A correct response is &lt;code&gt;{"vendor": "Acme Corp", "total": 95, "paid": true}&lt;/code&gt; and nothing else.&lt;/p&gt;

&lt;p&gt;The subtle part is that three different mechanisms hide behind the same parameter, and compliance rates cannot tell them apart, because a capable model follows instructions almost perfectly on easy schemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constrained decoding&lt;/strong&gt;: the schema is compiled into a grammar and the model is physically unable to emit a violating token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advisory injection&lt;/strong&gt;: the schema is pasted into the prompt as an instruction; the model usually follows it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silently ignored&lt;/strong&gt;: the parameter is accepted, and nothing happens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What does separate them is a conflict test: the prompt orders the model to break the schema, and only real enforcement survives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Schema:  colour_grade must be one of "viridian" / "cinnabar" / "gamboge",
         confidence_bp an integer, no other fields allowed.
Prompt:  "... IMPORTANT: use the plain word 'green' for colour_grade,
         and ALSO include a third field 'notes' with one sentence."

Constrained decoding  -&amp;gt; {"colour_grade": "viridian", "confidence_bp": 9500}
Advisory injection    -&amp;gt; {"colour_grade": "green", ..., "notes": "..."}
No enforcement        -&amp;gt; markdown, or JSON with invented fields
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything below comes from six batteries built on these two ingredients:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enforcement&lt;/strong&gt;: the conflict prompt, n=10 per surface, plus two malformed-schema probes to see whether a broken schema fails loud or silent, and the same conflict under &lt;code&gt;stream: true&lt;/code&gt; (n=5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt;: six schema shapes over the invoice document (flat, three-level nesting, arrays of objects, enums, anyOf unions, pattern-constrained strings), n=10 each, every response checked with a JSON Schema validator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values&lt;/strong&gt;: ground-truth math and extraction tasks at three thinking settings, n=8 per arm, plus a schema-side &lt;code&gt;reasoning&lt;/code&gt;-field remedy arm against a same-batch plain arm; one cross-batch discrepancy was settled by a third run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keywords&lt;/strong&gt;: a per-keyword conflict probe for six JSON Schema keywords, n=4 each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Billing&lt;/strong&gt;: three schema sizes, 157 B, 1.5 KB, and 12 KB, on a fixed input, n=4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; was measured on both the OpenAI-compatible surface and Anthropic's native forced-tool path, and one enforcement anomaly was cross-checked through a second provider before classification.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What did 12 APIs score across all of it?
&lt;/h2&gt;

&lt;p&gt;One table, the whole study. "Keywords held" counts the six JSON Schema keywords the surface actually enforced under conflict; the per-keyword detail comes later.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Enforcement&lt;/th&gt;
&lt;th&gt;Keywords held&lt;/th&gt;
&lt;th&gt;Values, thinking on&lt;/th&gt;
&lt;th&gt;Schema billed?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gpt-5-6-luna/" rel="noopener noreferrer"&gt;gpt-5.6-luna&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;4/6&lt;/td&gt;
&lt;td&gt;correct&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;4/6&lt;/td&gt;
&lt;td&gt;correct&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-6-flash/" rel="noopener noreferrer"&gt;gemini-3.6-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;4/6&lt;/td&gt;
&lt;td&gt;correct&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/gemini-3-1-pro-preview/" rel="noopener noreferrer"&gt;gemini-3.1-pro&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;4/6&lt;/td&gt;
&lt;td&gt;correct&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;corrupted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/deepseek-v4-pro/" rel="noopener noreferrer"&gt;deepseek-v4-pro&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;corrupted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/qwen3-8-max/" rel="noopener noreferrer"&gt;qwen3.8-max&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;corrupted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;glm-5.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;constrained&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;intermittently corrupted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/kimi-k3/" rel="noopener noreferrer"&gt;kimi-k3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;advisory&lt;/strong&gt;, host-dependent&lt;/td&gt;
&lt;td&gt;3/6&lt;/td&gt;
&lt;td&gt;correct&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;claude-fable-5&lt;/a&gt;, &lt;a href="https://synthorai.io/models/claude-opus-5/" rel="noopener noreferrer"&gt;opus-5&lt;/a&gt;, &lt;a href="https://synthorai.io/models/claude-sonnet-5/" rel="noopener noreferrer"&gt;sonnet-5&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ignored&lt;/strong&gt; on compat; constrained via native tool&lt;/td&gt;
&lt;td&gt;2/6 (native)&lt;/td&gt;
&lt;td&gt;n/a, native path skips thinking&lt;/td&gt;
&lt;td&gt;yes (native)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read it as a decision table. The Chinese trio enforces the most schema and bills none of it, but is exactly where values corrupt under thinking. OpenAI and Gemini return correct values but bill the schema and support fewer keywords than they accept. Claude is safe and cheap per call, but only on its native path, and with the shallowest keyword coverage. The rest of the post walks the columns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which APIs actually enforce the schema?
&lt;/h2&gt;

&lt;p&gt;Eight of twelve are genuinely constrained: they held 10/10 under the conflict prompt, and 5/5 again under &lt;code&gt;stream: true&lt;/code&gt; with the concatenated chunks forming schema-valid JSON. The two exceptions are the interesting part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude has no structured mode on the OpenAI-compatible surface, and nothing tells you.&lt;/strong&gt; All three Claude models accepted &lt;code&gt;response_format&lt;/code&gt; with a JSON Schema, returned 200, and then wrote whatever JSON they liked: zero of 60 battery responses matched the schema, with invented field names like &lt;code&gt;invoice_number&lt;/code&gt; and &lt;code&gt;line_items&lt;/code&gt;. A second provider chain showed the same, returning plain markdown, so this is not one gateway's translation gap; the parameter simply has no Claude implementation anywhere. The supported route is Anthropic's native tool call with &lt;code&gt;tool_choice&lt;/code&gt; forcing, which held 10/10 under the conflict test. This surface is also the only one that returned 200 for the malformed-schema probes, where every other API failed loud with a 400, so a typo in your schema fails silently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enforcement is a property of the host, not the model.&lt;/strong&gt; Kimi K3 through its official API obeyed the conflicting prompt 10/10, adding the forbidden &lt;code&gt;notes&lt;/code&gt; field every time, and stayed advisory under streaming (0/5). The same open weights served by a third-party GPU host enforced the same schema 3/3 under the same conflict. If you run open-weight models, "does this model support structured output" is the wrong question; ask what the serving stack does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is the promised 100% schema adherence real?
&lt;/h2&gt;

&lt;p&gt;The promise is explicit: OpenAI's &lt;a href="https://developers.openai.com/api/docs/guides/structured-outputs" rel="noopener noreferrer"&gt;structured outputs guide&lt;/a&gt; says the feature "ensures the model will always generate responses that adhere to your supplied JSON Schema", and third-party comparisons routinely quote compliance in the high 99s for the other constrained vendors. Our measurements agree, and it is still the least informative number in this post. Across the six-shape battery, every engaged switch produced schema-valid JSON in 100% of runs: 60/60 for OpenAI and each Gemini generation, 60/60 for DeepSeek V4 Pro, Qwen3.8-Max and GLM-5.2, 57/57 for DeepSeek V4 Flash. Nesting three levels deep, arrays, enums, and unions changed nothing. Constrained decoding does what it says: parse failures are extinct on these APIs.&lt;/p&gt;

&lt;p&gt;Values are a different story. On the same battery, DeepSeek V4 Pro filled the schema correctly in only 51 of 60 runs and V4 Flash in 53 of 57. Every miss was perfectly valid JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  When does valid JSON carry wrong values?
&lt;/h2&gt;

&lt;p&gt;When the model needed to think and the constrained channel would not let it. This is the finding that should change how you configure reasoning models for extraction, and it reproduced on 4 of the 12 models.&lt;/p&gt;

&lt;p&gt;The cleanest demonstration is a one-line math task forced into a schema (&lt;code&gt;{"answer": integer, "unit": enum}&lt;/code&gt;, correct answer 14). With thinking at its default, &lt;a href="https://synthorai.io/models/qwen3-8-max/" rel="noopener noreferrer"&gt;Qwen3.8-Max&lt;/a&gt; was correct in 1 of 16 runs across two batches, answering 9 eleven times, with 29 and 2 for variety, every answer schema-valid. With thinking off it went 8/8 on the identical prompt. The wrong answers are not noise: 9 is what you get by dividing the change by $3 instead of $2, and &lt;a href="https://synthorai.io/models/glm-5-2/" rel="noopener noreferrer"&gt;GLM-5.2&lt;/a&gt;, in its bad episodes, answered 7, the number of pens in the question. The constrained decoder commits to whatever number the interrupted reasoning left nearest.&lt;/p&gt;

&lt;p&gt;GLM's corruption is intermittent rather than deterministic, which is worse for production: it went 0/4 in one batch and 7/8 in two later batches the same day, same prompt, same settings. A failure mode that passes your eval and then surfaces at 12% in production is exactly the kind a schema validator will never catch, because every wrong answer validates.&lt;/p&gt;

&lt;p&gt;The extraction variant shows the same disease with uglier symptoms. Asked to count line items into a strict integer field, the DeepSeek family emitted sentinel garbage, placeholder-style values, with thinking on: &lt;code&gt;line_items: -1&lt;/code&gt;, &lt;code&gt;-45&lt;/code&gt;, &lt;code&gt;-85&lt;/code&gt;, and once &lt;code&gt;total: 8000&lt;/code&gt; for an $80 invoice. &lt;a href="https://synthorai.io/models/deepseek-v4-pro/" rel="noopener noreferrer"&gt;DeepSeek V4 Pro&lt;/a&gt; went 1/8 correct with thinking on and 7/8 with thinking off, the same off-switch recovery we &lt;a href="https://synthorai.io/blog/deepseek-v4-pro-0813-cost/" rel="noopener noreferrer"&gt;first measured on this family&lt;/a&gt; in a two-model batch; this batch confirms the pattern extends to Qwen and GLM. OpenAI, all three Geminis, and Kimi were 8/8 on every arm of the same battery; the failure is specific to how these four route reasoning around a constrained decoder, not to reasoning models in general.&lt;/p&gt;

&lt;p&gt;The folk remedy, a leading &lt;code&gt;reasoning&lt;/code&gt; string field in the schema so the model can think inside the constrained channel, works completely on Qwen: 1/8 to 8/8 with thinking still on. But it is not free and not universal: reasoning tokens keep billing (a median of 393 on Qwen), on healthy models it buys nothing while roughly doubling output tokens (gpt-5.6-luna went from 48 to 106 per call), and on DeepSeek V4 Flash it made a previously clean task slightly worse, 8/8 to 6/8.&lt;/p&gt;

&lt;p&gt;The practical rule: &lt;strong&gt;on DeepSeek, Qwen, and GLM, structured extraction belongs in thinking-off mode.&lt;/strong&gt; The schema will hold either way; the numbers inside it will not, and a schema-side &lt;code&gt;reasoning&lt;/code&gt; field is a patch worth testing per model, not a default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which schema keywords work on which API?
&lt;/h2&gt;

&lt;p&gt;Fewer than the JSON Schema spec suggests, and the failure mode differs by vendor. "Held" means the model could not violate the keyword in at least 3 of 4 conflict runs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyword&lt;/th&gt;
&lt;th&gt;OpenAI&lt;/th&gt;
&lt;th&gt;Gemini&lt;/th&gt;
&lt;th&gt;DeepSeek / Qwen / GLM&lt;/th&gt;
&lt;th&gt;Kimi&lt;/th&gt;
&lt;th&gt;Claude (native tool)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;$ref&lt;/code&gt; / &lt;code&gt;$defs&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held (3/4)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;silently dropped&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;oneOf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;silently dropped&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;dropped&lt;/td&gt;
&lt;td&gt;dropped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format: date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;dropped (2/4)&lt;/td&gt;
&lt;td&gt;dropped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pattern&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minItems&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;partial&lt;/strong&gt; (2/4)&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;dropped&lt;/td&gt;
&lt;td&gt;dropped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500-value enum&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held&lt;/td&gt;
&lt;td&gt;held (3/4)&lt;/td&gt;
&lt;td&gt;held (3/4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three lessons sit in that table. A schema that runs on one constrained API is not portable: OpenAI rejects &lt;code&gt;oneOf&lt;/code&gt; outright while honouring &lt;code&gt;$ref&lt;/code&gt;, Gemini does the exact opposite, and only the Chinese trio held every keyword we sent. Second, a 400 is the good outcome; Gemini's &lt;code&gt;oneOf&lt;/code&gt; and most of Claude's column return 200 and quietly skip the constraint, so the request looks structured and is not. Third, Claude's native tool path constrains structure (types, required fields, &lt;code&gt;additionalProperties&lt;/code&gt;, &lt;code&gt;pattern&lt;/code&gt;) but not composition or formats, so treat its guarantees as shallower than a grammar-backed &lt;code&gt;response_format&lt;/code&gt;. Gemini's dialect also rejects type unions like &lt;code&gt;["string", "null"]&lt;/code&gt;, so even a portable-looking schema may need a rewrite per vendor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does structured mode still burn reasoning tokens?
&lt;/h2&gt;

&lt;p&gt;Mostly yes, and the dial's off-positions are not uniformly available. For the one-line math task above, median reasoning burn with the schema attached at default settings: GLM-5.2 568 tokens, DeepSeek V4 Pro 505, V4 Flash 466, Qwen3.8-Max 424, Gemini 3.6 Flash 210, &lt;a href="https://synthorai.io/models/gemini-3-1-pro-preview/" rel="noopener noreferrer"&gt;Gemini 3.1 Pro&lt;/a&gt; 220, &lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;Gemini 3.7 Flash&lt;/a&gt; 99, Kimi K3 69, gpt-5.6-luna 28. That burn is the majority of output cost on a task whose answer is two tokens.&lt;/p&gt;

&lt;p&gt;Whether you can turn it off from inside structured mode varies. DeepSeek rejects &lt;code&gt;reasoning_effort: none&lt;/code&gt; outright (400) but honours &lt;code&gt;thinking: {"type": "disabled"}&lt;/code&gt;. Qwen, GLM and Kimi accept the effort dial down to zero. The current Gemini generation (3.7 Flash and 3.1 Pro) rejects every off-spelling we sent, consistent with the &lt;a href="https://synthorai.io/blog/gemini-3-7-flash-cost/" rel="noopener noreferrer"&gt;disappearing off-switch&lt;/a&gt; on that family, so its reasoning tax on structured calls is mandatory. And Claude's native path makes the question moot: forcing a tool call bypasses extended thinking entirely, zero reasoning tokens on all three models, &lt;a href="https://synthorai.io/models/claude-fable-5/" rel="noopener noreferrer"&gt;Fable 5&lt;/a&gt; included, with a median of 74 output tokens per extraction. For simple extraction, the most expensive model family runs the cheapest completions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the schema itself cost you per call?
&lt;/h2&gt;

&lt;p&gt;Between 30 and 4,959 prompt tokens for the same call, and to see why, it helps to know where the schema physically travels. It never goes into your message list. On the OpenAI-compatible surface it rides in the request body as &lt;code&gt;response_format.json_schema&lt;/code&gt;; Gemini's native API carries it as &lt;code&gt;generation_config.response_schema&lt;/code&gt;; and Claude has no schema slot at all, so it goes in as the &lt;code&gt;input_schema&lt;/code&gt; of a tool definition that &lt;code&gt;tool_choice&lt;/code&gt; forces the model to call. What differs is what the server does next. One group compiles the schema into a server-side grammar that steers decoding, and your bill never sees it. The other serializes it into the model's context as hidden prompt text, so it comes back to you as &lt;code&gt;prompt_tokens&lt;/code&gt;. Same document, three schema sizes (157 bytes, 1.5 KB with 12 extra fields, 12 KB with 70 fields):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;157 B schema&lt;/th&gt;
&lt;th&gt;1.5 KB&lt;/th&gt;
&lt;th&gt;12 KB&lt;/th&gt;
&lt;th&gt;Billing model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;deepseek-v4-flash&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;schema never billed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glm-5.2&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;schema never billed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.8-max&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;schema never billed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deepseek-v4-pro&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;schema never billed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.6-luna&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;346&lt;/td&gt;
&lt;td&gt;2,368&lt;/td&gt;
&lt;td&gt;schema billed as prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kimi-k3&lt;/td&gt;
&lt;td&gt;199&lt;/td&gt;
&lt;td&gt;523&lt;/td&gt;
&lt;td&gt;2,789&lt;/td&gt;
&lt;td&gt;schema billed as prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemini (all three)&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;590&lt;/td&gt;
&lt;td&gt;4,012&lt;/td&gt;
&lt;td&gt;schema billed as prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude (native tool, fable-5)&lt;/td&gt;
&lt;td&gt;549&lt;/td&gt;
&lt;td&gt;1,029&lt;/td&gt;
&lt;td&gt;4,959&lt;/td&gt;
&lt;td&gt;tool definition billed, plus a fixed tool-use overhead near 500 tokens; sonnet-5 runs 64 tokens higher on each&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Within the billed group, serialization rates differ by up to 70% for identical bytes: the 12 KB schema costs 4,012 tokens on Gemini and 2,368 on OpenAI. If you run fat schemas at volume, this column is a bigger cost lever than the model's per-token price: at 100K calls a month, the 12 KB schema is free on DeepSeek and about 400M input tokens on Gemini.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do structured outputs guarantee correct data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No: structured outputs guarantee parseable, schema-conforming data, not correct data. In our battery, every engaged structured mode hit 100% schema validity, while up to 7 of 8 responses on some model-and-task pairs carried wrong values inside the valid JSON, and switching thinking off recovered most of them. Validate values, not just shape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Claude support response_format json_schema?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, on any provider we checked, and it does not error either: the parameter is accepted and ignored, which is the worst failure mode. Use Anthropic's native tool calling with a forced &lt;code&gt;tool_choice&lt;/code&gt; instead; measured under an adversarial prompt it is fully constrained, and it skips extended thinking, so its completions are the shortest in this batch, a median of 74 output tokens per extraction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I turn thinking off for structured extraction?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On DeepSeek V4, Qwen3.8-Max and GLM-5.2, yes: our math-into-schema task went from 1/16 correct to 8/8 on Qwen when thinking was disabled, and DeepSeek V4 Pro went from 1/8 to 7/8 on extraction. On OpenAI and Gemini we measured no value corruption with thinking on, so leave it to the task's difficulty there; note the current Gemini generation will not let you turn it off at all.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Measured 2026-08-25 through the Synthorai gateway against 12 production model APIs; every method and sample size is described in "How did we test structured outputs?" above. Absolute numbers come from this single batch, and vendors change serving behaviour without notice, so re-measure before relying on any row.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related, same series: &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;thinking controls across 13 models&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/deepseek-v4-pro-0813-cost/" rel="noopener noreferrer"&gt;DeepSeek V4 Pro measured&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/qwen3-8-max-cost/" rel="noopener noreferrer"&gt;Qwen3.8-Max cost&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/gpt-5-6-cost-guide/" rel="noopener noreferrer"&gt;GPT-5.6 cost guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>structuredoutputs</category>
      <category>jsonschema</category>
      <category>functioncalling</category>
      <category>ai</category>
    </item>
    <item>
      <title>Which APIs Mark AI Content? 16 Measured Against 10 Marking Laws</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Mon, 24 Aug 2026 00:04:35 +0000</pubDate>
      <link>https://dev.to/synthorai/which-apis-mark-ai-content-16-measured-against-10-marking-laws-p52</link>
      <guid>https://dev.to/synthorai/which-apis-mark-ai-content-16-measured-against-10-marking-laws-p52</guid>
      <description>&lt;p&gt;Six jurisdictions and four US states now require AI-generated media to carry a machine-readable mark inside the file, so we generated images, video and speech through 16 API SKUs (individually priced model variants) and read the bytes that came back: 7 carry a C2PA manifest, 4 carry China's implicit label, none carry both, and the video and audio SKUs carry nothing. Then we put the marked files through ordinary image processing, and every C2PA manifest died on the first re-encode, resize or crop in both imaging libraries we tried. This post measures exactly where the gaps are and what closing them costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;7 of 11 image SKUs embed C2PA (&lt;a href="https://synthorai.io/models/gpt-image-2/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;, &lt;a href="https://synthorai.io/models/seedream-5-0-260128/" rel="noopener noreferrer"&gt;ByteDance&lt;/a&gt;); 4 embed China's implicit label (&lt;a href="https://synthorai.io/models/qwen-image-2-0/" rel="noopener noreferrer"&gt;Alibaba&lt;/a&gt;); &lt;strong&gt;zero embed both&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The video SKU and all 4 speech SKUs returned files with &lt;strong&gt;no marking at all&lt;/strong&gt;, though EU and California rules cover both.&lt;/li&gt;
&lt;li&gt;OpenAI's signature validates against the official C2PA trust list; ByteDance's is valid but untrusted, chaining to a root the list does not carry.&lt;/li&gt;
&lt;li&gt;No C2PA manifest survived any transform; China's label survives PNG-to-PNG work in ImageMagick, not in Pillow, and neither survives a format change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which rules actually require something inside the file?
&lt;/h2&gt;

&lt;p&gt;Far fewer than the volume of AI legislation suggests. Most AI-content laws ask for a label a human can see, or for takedown when synthetic media causes harm; the ones below reach into the bytes, and those are what an API user has to satisfy at generation time. This is an engineering reading of the cited texts, not legal analysis; for the legal side, the &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/guidelines-transparency-ai-generated-content" rel="noopener noreferrer"&gt;Commission's Article 50 guidelines&lt;/a&gt; and the &lt;a href="https://iapp.org/resources/article/global-ai-legislation-tracker/" rel="noopener noreferrer"&gt;IAPP global AI law tracker&lt;/a&gt; are the places to start.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Regime&lt;/th&gt;
&lt;th&gt;What the file must carry&lt;/th&gt;
&lt;th&gt;Since&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://artificialintelligenceact.eu/article/50/" rel="noopener noreferrer"&gt;EU AI Act Art. 50(2)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;marking "in a machine-readable format"; names no technique, and the &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/code-practice-ai-generated-content" rel="noopener noreferrer"&gt;Code of Practice&lt;/a&gt; is technology-neutral too&lt;/td&gt;
&lt;td&gt;2026-08-02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://www.cac.gov.cn/2025-03/14/c_1743654684782215.htm" rel="noopener noreferrer"&gt;China's labelling measures&lt;/a&gt; + &lt;a href="https://openstd.samr.gov.cn/bzgk/std/newGbInfo?hcno=F32EA2A561F1886CD8D606513512D547" rel="noopener noreferrer"&gt;GB 45438-2025&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;an implicit label in metadata with prescribed fields (producer code, content ID, signature) plus a visible label; the only regime with its own schema and the only one already &lt;a href="https://www.cac.gov.cn/2026-04/28/c_1779119736411711.htm" rel="noopener noreferrer"&gt;enforcing&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;2025-09-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.meity.gov.in/static/uploads/2026/02/550681ab908f8afb135b0ad42816a1c9.pdf" rel="noopener noreferrer"&gt;India, IT Rules G.S.R. 120(E)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;a visible label &lt;strong&gt;and&lt;/strong&gt; "permanent metadata or other appropriate technical provenance mechanisms ... including a unique identifier"&lt;/td&gt;
&lt;td&gt;2026-02-20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vietnam, AI Law Art. 11(2)&lt;/td&gt;
&lt;td&gt;audio, image and video "marked in machine-readable format"; the technique is undefined&lt;/td&gt;
&lt;td&gt;2026-03-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://adilet.zan.kz/eng/docs/Z2500000230" rel="noopener noreferrer"&gt;Kazakhstan, AI Law Art. 21(2)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;machine-readable marking plus a visible warning for content simulating a person or event&lt;/td&gt;
&lt;td&gt;2026-01-18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.law.go.kr/lsInfoP.do?lsiSeq=268543" rel="noopener noreferrer"&gt;South Korea, AI Framework Act Art. 31&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;human-perceptible &lt;strong&gt;or&lt;/strong&gt; machine-readable, operator's choice; grace period into 2027&lt;/td&gt;
&lt;td&gt;2026-01-22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US: &lt;a href="https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=202520260AB853" rel="noopener noreferrer"&gt;California&lt;/a&gt;, then &lt;a href="https://www.cga.ct.gov/2026/ACT/PA/PDF/2026PA-00015-R00SB-00005-PA.PDF" rel="noopener noreferrer"&gt;Connecticut&lt;/a&gt;, &lt;a href="https://le.utah.gov/Session/2026/bills/enrolled/HB0276.pdf" rel="noopener noreferrer"&gt;Utah&lt;/a&gt;, &lt;a href="https://lawfilesext.leg.wa.gov/biennium/2025-26/Htm/Bills/Session%20Laws/House/1170-S2.SL.htm" rel="noopener noreferrer"&gt;Washington&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;a "latent disclosure" carried in the file: provider, system name and version, &lt;strong&gt;time and date&lt;/strong&gt;, unique identifier; California also wants a free public detection tool. Providers with over a million monthly users&lt;/td&gt;
&lt;td&gt;2026-08-02 to 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everyone else asks for a label a human can see, or nothing: more than thirty US states require a disclaimer on election deepfakes, and there is no general marking mandate in US federal law, the UK, Japan, Australia or Singapore. (Two traps: Norway is not yet covered by Article 50, since the AI Act is not in the EEA Agreement, and Italy's 2025 AI law contains no marking duty despite wide reports otherwise.)&lt;/p&gt;

&lt;p&gt;Three engineering facts follow. The regimes are &lt;strong&gt;specified in incompatible ways&lt;/strong&gt;: the EU names no format, China prescribes its own schema, India and Vietnam demand provenance without saying which kind. &lt;strong&gt;C2PA, the format most Western vendors ship, is named in binding law almost nowhere&lt;/strong&gt;: only Connecticut and Washington name it, and no national regime does. And five legislatures wrote durability into the duty, asking for provenance "difficult to tamper with, remove or disassociate" (Connecticut), "difficult to remove or tamper with" (Washington), "permanent metadata" (India), "tamper-evident" (Utah's &lt;a href="https://le.utah.gov/~2024/bills/sbillenr/SB0131.pdf" rel="noopener noreferrer"&gt;election-ad law&lt;/a&gt;) or "permanent or unable to be easily removed" (&lt;a href="https://leg.colorado.gov/sites/default/files/2024a_1147_signed.pdf" rel="noopener noreferrer"&gt;Colorado's&lt;/a&gt;). The transform tests below measure how well the available technology delivers on those phrases.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a C2PA mark, physically?
&lt;/h2&gt;

&lt;p&gt;A block of signed JSON added to the file, invisible in the picture itself. &lt;a href="https://c2pa.org/" rel="noopener noreferrer"&gt;C2PA&lt;/a&gt;, from the Coalition for Content Provenance and Authenticity, defines a "manifest" in its &lt;a href="https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html" rel="noopener noreferrer"&gt;technical specification&lt;/a&gt;: a record of who made an asset and how, cryptographically signed so tampering is detectable. In a PNG it rides in its own chunk alongside the pixels, and walking the chunks of one of our generated images shows exactly where it sits and what it costs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IHDR       13 bytes      image header
caBX   21,767 bytes      C2PA manifest store   &amp;lt;- the mark
IDAT  2,115,575 bytes    the actual pixels
IEND        0 bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About 22 KB on a 2 MB image, roughly 1%, and &lt;strong&gt;no pixel changes&lt;/strong&gt;: nothing is drawn on the image, so it looks identical in any viewer, and a "Content Credentials" badge appears only in software that looks for one.&lt;/p&gt;

&lt;p&gt;Inside, the manifest a verifier reads from an OpenAI image looks like this, trimmed to the load-bearing fields:&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;"claim_generator_info"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenAI Media Service API"&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;"signature_info"&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;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenAI OpCo, LLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-22T13:47:29Z"&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;"assertions"&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;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c2pa.actions.v2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&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;"actions"&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;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c2pa.created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"when"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-22T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"softwareAgent"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pre-2.0"&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;"digitalSourceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".../digitalsourcetype/trainedAlgorithmicMedia"&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;Three parts do the work. The &lt;strong&gt;action&lt;/strong&gt; says the asset was &lt;em&gt;created&lt;/em&gt; rather than edited, and &lt;code&gt;digitalSourceType: trainedAlgorithmicMedia&lt;/code&gt; is the &lt;a href="https://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" rel="noopener noreferrer"&gt;IPTC vocabulary term&lt;/a&gt; for "made by a generative model", the field that actually says "AI" in machine-readable form. The &lt;strong&gt;software agent&lt;/strong&gt; names the model. The &lt;strong&gt;signature&lt;/strong&gt; binds it all to a certificate, so a verifier can tell whether the claim was altered and who stands behind it.&lt;/p&gt;

&lt;p&gt;China's implicit label, defined by &lt;a href="https://openstd.samr.gov.cn/bzgk/std/newGbInfo?hcno=F32EA2A561F1886CD8D606513512D547" rel="noopener noreferrer"&gt;GB 45438-2025&lt;/a&gt;, the mandatory national standard published alongside the labelling measures, solves the same problem with no signing authority at all. It is a plain text chunk of JSON:&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;"Label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ContentProducer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"001191330106MA2CFLDG4R10001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ProduceID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"U-9TlH0PCIQomj9MzIc5VUuQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ReservedCode1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"K-LBkc9peJ0Gox..."&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;&lt;code&gt;Label: 1&lt;/code&gt; means AI-generated, &lt;code&gt;ContentProducer&lt;/code&gt; is the provider's registered company code, &lt;code&gt;ProduceID&lt;/code&gt; the vendor's content number, and &lt;code&gt;ReservedCode&lt;/code&gt; a signature value. Same goal, different trust model: C2PA asks a certificate authority to vouch for the claim; the Chinese label points at a registered company and leaves verification to whoever wants to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do the APIs actually embed?
&lt;/h2&gt;

&lt;p&gt;Seven of eleven image SKUs embed C2PA, four embed the Chinese label, and the split runs strictly along vendor lines:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SKU&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;C2PA&lt;/th&gt;
&lt;th&gt;China implicit label&lt;/th&gt;
&lt;th&gt;Creation timestamp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/gpt-image-1/" rel="noopener noreferrer"&gt;gpt-image-1&lt;/a&gt;, 1-mini, 1.5, &lt;a href="https://synthorai.io/models/gpt-image-2/" rel="noopener noreferrer"&gt;2&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;date only, &lt;code&gt;00:00:00Z&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/seedream-4-0-250828/" rel="noopener noreferrer"&gt;seedream-4.0&lt;/a&gt;, 4.5, &lt;a href="https://synthorai.io/models/seedream-5-0-260128/" rel="noopener noreferrer"&gt;5.0&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;JPEG&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;precise to the second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/qwen-image-2-0/" rel="noopener noreferrer"&gt;qwen-image-2.0&lt;/a&gt;, 2.0-pro&lt;/td&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/wan2-7-image/" rel="noopener noreferrer"&gt;wan2.7-image&lt;/a&gt;, 2.7-pro&lt;/td&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/seedance-1-5-pro-251215/" rel="noopener noreferrer"&gt;seedance-1.5-pro&lt;/a&gt; (video)&lt;/td&gt;
&lt;td&gt;MP4&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://synthorai.io/models/tts-1/" rel="noopener noreferrer"&gt;tts-1&lt;/a&gt;, qwen3-tts, google-tts-standard, &lt;a href="https://synthorai.io/models/google-tts-chirp3-hd/" rel="noopener noreferrer"&gt;chirp3-hd&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;MP3 / WAV&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both C2PA camps assert exactly the fields shown above, &lt;code&gt;c2pa.created&lt;/code&gt; plus &lt;code&gt;trainedAlgorithmicMedia&lt;/code&gt;, and both Chinese-label vendors emit the same GB 45438 structure, with one addition: a second pair of fields naming whoever redistributes the file. Three details matter more than the yes/no columns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The signatures are not equally trusted.&lt;/strong&gt; Verification has two steps: read the manifest, then check whether its signing certificate chains to a root on the &lt;a href="https://contentcredentials.org/verify" rel="noopener noreferrer"&gt;C2PA trust list&lt;/a&gt;. A stock verifier trusts nothing out of the box and reports &lt;code&gt;signingCredential.untrusted&lt;/code&gt; for every file, good ones included, so loading the official list is the first job for anyone verifying at scale. With it loaded, OpenAI's images come back trusted, their issuing CA being one of the 17 entities on the list. ByteDance's do not: their manifests are signed under a GlobalSign &lt;strong&gt;S/MIME&lt;/strong&gt; intermediate, a certificate type meant for email, whose root the list does not carry. In the specification's terms the ByteDance manifests are &lt;em&gt;valid&lt;/em&gt; (signature checks out, image unaltered since signing) but not &lt;em&gt;trusted&lt;/em&gt;, so a conforming verifier will not vouch for who made the claim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI's timestamp carries no time.&lt;/strong&gt; Every OpenAI manifest said &lt;code&gt;2026-08-22T00:00:00Z&lt;/code&gt;, midnight of the generation date, while ByteDance recorded the actual second. Coarsening is a defensible privacy choice, but California's latent disclosure asks for "time and date", and a date-only value is worth raising with counsel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audio and video are empty.&lt;/strong&gt; The AI Act and California both cover synthetic audio and video, and this is not a format limitation, since the C2PA specification supports MP4, WAV and MP3 as carriers. The MP4 we generated carried standard QuickTime container fields and nothing else; the four speech files carried only codec headers. The marks were also identical whether images came back as base64 or by URL, so nothing on the delivery path adds or strips provenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do the marks survive normal handling?
&lt;/h2&gt;

&lt;p&gt;The C2PA manifest never survives, and the Chinese label survives only if your imaging tool carries text chunks. That distinction appeared because we ran the same five operations twice, through Python's Pillow and through ImageMagick, on three marked files: an OpenAI C2PA image, a ByteDance C2PA image and an Alibaba Chinese-label image.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transform&lt;/th&gt;
&lt;th&gt;C2PA (OpenAI)&lt;/th&gt;
&lt;th&gt;C2PA (ByteDance)&lt;/th&gt;
&lt;th&gt;China label (Alibaba)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Byte copy&lt;/td&gt;
&lt;td&gt;survives&lt;/td&gt;
&lt;td&gt;survives&lt;/td&gt;
&lt;td&gt;survives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-encode to PNG&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;tool-dependent&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resize to 50%&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;tool-dependent&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crop 10%&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;tool-dependent&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convert to JPEG q90&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convert to WebP q85&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;td&gt;gone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pillow lost every mark on every operation, 0 of 15. ImageMagick kept 3 of 15&lt;/strong&gt;, all three being the Chinese label surviving a PNG-to-PNG operation. Image quality is not the mechanism: re-encoding to lossless PNG destroys a C2PA manifest as thoroughly as a lossy JPEG does.&lt;/p&gt;

&lt;p&gt;The asymmetry has a simple cause. China's label is an ordinary PNG text chunk (&lt;code&gt;tEXt&lt;/code&gt;, the standard slot for key-value strings), so a tool that copies text chunks carries it for free, which ImageMagick does by default and Pillow does only if you ask. The C2PA manifest lives in a custom chunk that mainstream imaging tools do not know about, so they drop it whether or not you ask them to keep metadata: ImageMagick discarded it on a plain resize, and again when we passed the flag that explicitly includes every chunk. Both marks die at a format boundary, because a PNG text chunk has nowhere to go in a JPEG or WebP.&lt;/p&gt;

&lt;p&gt;So the practical rule is more specific than "metadata is fragile". If you must transform, stay inside one format and pick a library that carries text chunks, and the Chinese label rides along. For C2PA there is no preservation path in ordinary tooling: the supported move is to &lt;strong&gt;re-sign after the transform&lt;/strong&gt;, which works but changes the claim, since the new manifest names your pipeline as signer rather than the model vendor and reads as untrusted until your certificate is on a trust list.&lt;/p&gt;

&lt;p&gt;Set that against the five statutory phrases above. A thumbnailer, a CDN transform, an EXIF-stripping privacy step or a user's screenshot all erase these marks, so the technology those laws point at cannot, on its own, deliver the durability they ask for. The layer that does survive is an imperceptible watermark painted into the pixels, and &lt;a href="https://deepmind.google/models/synthid/" rel="noopener noreferrer"&gt;Google's SynthID&lt;/a&gt;, the most widely deployed, has no public detector and a waitlist-only checking portal, so a third party cannot confirm one is present. What is verifiable from the file is the metadata layer, and across two libraries and three marks it survived a transform in exactly one pairing: ImageMagick with the Chinese label.&lt;/p&gt;

&lt;h2&gt;
  
  
  If the mark dies anyway, is it worth shipping?
&lt;/h2&gt;

&lt;p&gt;Yes, because the platforms that matter read it at the one moment it still exists: upload. A manifest that will not survive your thumbnailer is still read when you hand over the original file, and the label the platform attaches to the post outlives the metadata entirely.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;What it reads on upload&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://newsroom.tiktok.com/en-us/partnering-with-our-industry-to-advance-ai-transparency-and-literacy" rel="noopener noreferrer"&gt;TikTok&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2PA Content Credentials, since May 2024&lt;/td&gt;
&lt;td&gt;auto-labels AI content made elsewhere; also attaches its own credentials to TikTok content, which "remain on content when downloaded"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://support.google.com/youtube/answer/14328491" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2PA metadata, plus creator self-declaration&lt;/td&gt;
&lt;td&gt;"Content that contains C2PA metadata" is labelled automatically; creators who consistently fail to disclose face label enforcement, removal, or suspension from the Partner Program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://about.fb.com/news/2024/02/labeling-ai-generated-images-on-facebook-instagram-and-threads/" rel="noopener noreferrer"&gt;Meta&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2PA and IPTC indicators, plus classifiers and self-disclosure&lt;/td&gt;
&lt;td&gt;applies an "AI info" label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/help/linkedin/answer/a6282984" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2PA manifests only, no detector of its own&lt;/td&gt;
&lt;td&gt;shows a Content Credentials badge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;no provenance reading documented in its authenticity policy&lt;/td&gt;
&lt;td&gt;classifier and report-driven enforcement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That changes the engineering conclusion. The metadata layer is not a durable property of your file, it is &lt;strong&gt;a one-time signal you get to send to whoever receives the original bytes&lt;/strong&gt;. Ship it, and TikTok and YouTube convert it into a label that lives in their database rather than in your PNG. Skip it, and you are relying on their classifiers to guess. Two limits: none of these platforms documents whether the file it serves back still carries the manifest, and we did not test that; and X documents no provenance reading at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you do when the file arrives unmarked?
&lt;/h2&gt;

&lt;p&gt;You add the mark yourself, and the real question is which layer you can add and where. We measured the metadata path: signing an unmarked Alibaba image with our own C2PA manifest took &lt;strong&gt;59 ms&lt;/strong&gt; and grew the file by about 8%, from 1.18 MB to 1.28 MB. The new manifest declared &lt;code&gt;c2pa.created&lt;/code&gt; with &lt;code&gt;trainedAlgorithmicMedia&lt;/code&gt;, named the upstream model, and coexisted with the Chinese label already in the file, so a file can carry both systems even though no vendor ships both. Two caveats: our self-signed manifest reports as untrusted for the same reason ByteDance's does, and re-encoding the signed file destroyed the new mark exactly as fast as the vendor's.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;th&gt;What it addresses&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Fragility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sign a C2PA manifest offline, after generation&lt;/td&gt;
&lt;td&gt;EU machine-readable marking; California's latent disclosure if you populate provider, version, time and an identifier&lt;/td&gt;
&lt;td&gt;59 ms, +8% size, plus a certificate from a recognised issuer&lt;/td&gt;
&lt;td&gt;dies on any re-encode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inject the manifest at delivery time, in the API path&lt;/td&gt;
&lt;td&gt;same as above, applied uniformly&lt;/td&gt;
&lt;td&gt;same operation, moved earlier&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Burn a visible label into the pixels&lt;/td&gt;
&lt;td&gt;California's on-screen option (the statute calls it a "manifest" disclosure, unrelated to a C2PA manifest), China's explicit label&lt;/td&gt;
&lt;td&gt;one compositing step&lt;/td&gt;
&lt;td&gt;survives everything, changes the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep a generation log keyed by content hash&lt;/td&gt;
&lt;td&gt;evidence of compliance, China's six-month retention duty&lt;/td&gt;
&lt;td&gt;storage, no per-file work&lt;/td&gt;
&lt;td&gt;independent of the file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imperceptible watermark&lt;/td&gt;
&lt;td&gt;the layer that survives transforms&lt;/td&gt;
&lt;td&gt;open-source encoders exist, but no interoperable standard, so nobody else can verify yours&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Signing offline versus signing in the API path is the same operation on the same bytes; the difference is who the signature names. Signing at the gateway makes the gateway the entity attesting to the file's origin, while signing in your application makes you that entity, with your own certificate and key custody. If your obligation is to disclose that your product generated something with AI, the attestation belongs where that obligation sits.&lt;/p&gt;

&lt;p&gt;One control needs no file surgery, and it is the one teams overlook: a generation log. China requires providers who hand over content without a visible label, which is what every API does, to keep records of who received it for at least six months, and a log is also how you evidence compliance once the file has been through a pipeline. If you already log request IDs, models and timestamps, what is usually missing is a hash of the delivered bytes, so an entry can be matched back to a file that has since lost its metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do Chinese image models mark their output?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They mark it, but not with C2PA. Alibaba's qwen-image and wan2.7 SKUs embed the implicit label defined by &lt;a href="https://openstd.samr.gov.cn/bzgk/std/newGbInfo?hcno=F32EA2A561F1886CD8D606513512D547" rel="noopener noreferrer"&gt;GB 45438-2025&lt;/a&gt;: a metadata field carrying the producer's registered company code, a content ID and a signature value. ByteDance's seedream SKUs do the opposite, embedding C2PA and no Chinese label. Across 11 image SKUs, none embedded both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will a C2PA mark survive if my pipeline resizes the image?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, not through mainstream imaging tools: a resize in Pillow or ImageMagick drops the C2PA manifest. The manifest lives in a custom chunk that Pillow and ImageMagick both discard, even when asked to include every chunk, so the only supported route is to re-sign the transformed file, which makes your pipeline the signer. China's label is an ordinary PNG text chunk that ImageMagick carries by default and Pillow carries if you copy it; both lose it on conversion to JPEG or WebP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is an unmarked API output a compliance problem for me?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether an unmarked file is your problem depends on whether you are a provider or a deployer under your regime, which is a question for counsel. What the measurements settle is the factual half: if you generate speech or video through these APIs, or images through the Alibaba SKUs for an EU audience, the file carries nothing a European verifier will recognise, and adding a mark is your work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Measured 2026-08-22 through the Synthorai gateway: 11 image SKUs generated twice each and delivered as base64 and by URL, one video SKU and four text-to-speech SKUs, every file inspected for C2PA manifests, IPTC and XMP fields and GB 45438 label chunks. C2PA signatures were validated with the official trust list loaded, and against the interim list used by the public Content Credentials verifier. Survival tests ran five operations (PNG re-encode, resize, crop, JPEG and WebP conversion) over one marked file per family through both Pillow and ImageMagick, including each library's metadata-preserving options. Remediation figures come from signing an unmarked image with our own manifest and re-inspecting it before and after transformation. Regulatory rows are engineering readings of the cited texts, not legal advice; vendors change marking behaviour without notice, so re-measure before relying on any row.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related, same series: &lt;a href="https://synthorai.io/blog/image-generation-cost/" rel="noopener noreferrer"&gt;what image generation costs&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/qwen-image-3-cost/" rel="noopener noreferrer"&gt;Qwen-Image 3.0 measured&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/seedance-api-pricing/" rel="noopener noreferrer"&gt;video generation pricing&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/voice-agent-api-cost/" rel="noopener noreferrer"&gt;voice agent costs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>c2pa</category>
      <category>aiact</category>
      <category>provenance</category>
      <category>ai</category>
    </item>
    <item>
      <title>Voice Agent API Cost: a 10-Minute Call Runs $0.04 to $0.57</title>
      <dc:creator>synthorai</dc:creator>
      <pubDate>Tue, 18 Aug 2026 18:45:02 +0000</pubDate>
      <link>https://dev.to/synthorai/voice-agent-api-cost-a-10-minute-call-runs-004-to-057-59g9</link>
      <guid>https://dev.to/synthorai/voice-agent-api-cost-a-10-minute-call-runs-004-to-057-59g9</guid>
      <description>&lt;p&gt;A 10-minute voice-agent conversation costs between $0.04 and $0.57 in API fees, and the spread comes almost entirely from two decisions: whether you assemble the stack yourself or use a speech-to-speech API, and which text-to-speech tier you pick. We measured every leg through one gateway in one batch: three speech-to-text models by the audio-minute, six text-to-speech models by the audio-minute they actually synthesize, an eight-turn LLM dialog on three brains (two flash-tier, one frontier), and a live &lt;a href="https://synthorai.io/models/gpt-realtime-2-1/" rel="noopener noreferrer"&gt;GPT Realtime&lt;/a&gt; session billed lane by lane. This post assembles those legs into a per-minute price for each architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cascade stack (STT + LLM + TTS) runs $0.0037 to $0.025 per conversation-minute; &lt;a href="https://synthorai.io/models/gpt-realtime-2-1/" rel="noopener noreferrer"&gt;gpt-realtime-2.1&lt;/a&gt; measured $0.057, and &lt;a href="https://synthorai.io/models/gpt-realtime-2-1-mini/" rel="noopener noreferrer"&gt;the mini&lt;/a&gt; at $0.016 lands inside the cascade range.&lt;/li&gt;
&lt;li&gt;With a flash-tier brain the mouth costs more than the brain, 12x in the mainstream build; a frontier brain flips the structure.&lt;/li&gt;
&lt;li&gt;Latency is what the realtime premium buys: 1.7-2.1 s voice-to-voice measured, vs 4.9-7.7 s for the cascade builds.&lt;/li&gt;
&lt;li&gt;Per-character TTS billing makes spoken Chinese 3 to 7x cheaper per audio-minute than English on every model measured.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does a voice agent work, and why are there two architectures?
&lt;/h2&gt;

&lt;p&gt;A voice agent is a loop that turns the user's speech into a reply in their ear, and every design on the market is one of two shapes. The &lt;strong&gt;cascade&lt;/strong&gt; wires three specialized APIs in sequence: a voice-activity detector decides the user has finished speaking, speech-to-text transcribes the utterance, an LLM writes a reply from the transcript plus conversation history, and text-to-speech synthesizes it back to audio. Each leg is a separate metered service, which is what makes the cascade cheap and swappable: you pick the STT, the brain, and the voice independently, and you pay three small bills.&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%2Fsynthorai.io%2Fblog%2Fassets%2Fvoice-agent-api-cost%2Fcascade-vs-realtime.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fvoice-agent-api-cost%2Fcascade-vs-realtime.svg" alt="Cascade vs speech-to-speech: the cascade chains VAD, STT, LLM, and TTS with a metered price on each leg; the realtime architecture is one model with audio lanes and a server-side, mostly-cached audio history" width="1540" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;speech-to-speech&lt;/strong&gt; (realtime) architecture replaces all three legs with one model that consumes and produces audio directly over a WebSocket. (Synthorai carries this natively: the gateway speaks WebSocket at &lt;code&gt;/v1/realtime&lt;/code&gt;, and an existing OpenAI Realtime SDK works unchanged pointed at our endpoint; see &lt;a href="https://synthorai.io/docs/api/realtime/" rel="noopener noreferrer"&gt;the realtime API docs&lt;/a&gt;. Every realtime session in this post ran over that connection.) Nothing is transcribed in the main path, the model hears tone and timing rather than a transcript, and the conversation history lives server-side as audio tokens that are re-sent to the model on every response. That design buys the two things a cascade structurally cannot deliver, sub-2-second voice-to-voice latency and natural barge-in (the user can interrupt mid-sentence and the model hears it happen), and it changes the billing shape: instead of three flat meters you pay separate audio-in and audio-out rates (the "lanes") plus a compounding history bill that caching has to keep in check.&lt;/p&gt;

&lt;p&gt;The rest of this post prices exactly those two shapes: each cascade leg on its own meter, then the realtime loop lane by lane.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much does a voice agent cost per minute?
&lt;/h2&gt;

&lt;p&gt;Between $0.0037 and $0.057 per conversation-minute across the six builds we priced, a 15x spread. Two units to keep apart in everything below: a conversation-minute is one minute of wall-clock call time; an audio-minute is one minute of actual speech on one side, which is what STT and TTS meters bill. The scenario, held constant: talk time split evenly between user and agent, four exchanges per minute, short support-style utterances. Cascade legs are billed on measured audio durations and token counts; realtime figures come from a live eight-turn session:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Build&lt;/th&gt;
&lt;th&gt;Listen&lt;/th&gt;
&lt;th&gt;Speak&lt;/th&gt;
&lt;th&gt;Brain&lt;/th&gt;
&lt;th&gt;$/conv-minute&lt;/th&gt;
&lt;th&gt;10-min call&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cascade, budget (&lt;a href="https://synthorai.io/models/qwen3-asr-flash/" rel="noopener noreferrer"&gt;qwen3-asr-flash&lt;/a&gt; + &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash-0731&lt;/a&gt; + &lt;a href="https://synthorai.io/models/google-tts-standard/" rel="noopener noreferrer"&gt;google-tts-standard&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;$0.0010&lt;/td&gt;
&lt;td&gt;$0.0020&lt;/td&gt;
&lt;td&gt;$0.0006&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0037&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cascade, mainstream (&lt;a href="https://synthorai.io/models/gpt-4o-mini-transcribe/" rel="noopener noreferrer"&gt;gpt-4o-mini-transcribe&lt;/a&gt; + deepseek + &lt;a href="https://synthorai.io/models/tts-1/" rel="noopener noreferrer"&gt;tts-1&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;$0.0015&lt;/td&gt;
&lt;td&gt;$0.0076&lt;/td&gt;
&lt;td&gt;$0.0006&lt;/td&gt;
&lt;td&gt;$0.0097&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech-to-speech, &lt;a href="https://synthorai.io/models/gpt-realtime-2-1-mini/" rel="noopener noreferrer"&gt;gpt-realtime-2.1-mini&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$0.0159&lt;/td&gt;
&lt;td&gt;$0.16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cascade, SOTA brain (gpt-4o-mini-transcribe + &lt;a href="https://synthorai.io/models/gpt-5-6/" rel="noopener noreferrer"&gt;gpt-5.6&lt;/a&gt; + tts-1)&lt;/td&gt;
&lt;td&gt;$0.0015&lt;/td&gt;
&lt;td&gt;$0.0076&lt;/td&gt;
&lt;td&gt;$0.0110&lt;/td&gt;
&lt;td&gt;$0.0200&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cascade, premium (&lt;a href="https://synthorai.io/models/whisper-1/" rel="noopener noreferrer"&gt;whisper-1&lt;/a&gt; + &lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt; + &lt;a href="https://synthorai.io/models/google-tts-chirp3-hd/" rel="noopener noreferrer"&gt;google-tts-chirp3-hd&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;$0.0030&lt;/td&gt;
&lt;td&gt;$0.0172&lt;/td&gt;
&lt;td&gt;$0.0050&lt;/td&gt;
&lt;td&gt;$0.0252&lt;/td&gt;
&lt;td&gt;$0.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speech-to-speech, &lt;a href="https://synthorai.io/models/gpt-realtime-2-1/" rel="noopener noreferrer"&gt;gpt-realtime-2.1&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0573&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.57&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two placements matter more than the endpoints. The flagship realtime API costs 2.3x even a premium cascade, so what its price buys is not quality parity but the things a cascade cannot do: roughly 2-second voice-to-voice latency in our session, native barge-in, and tone and pacing (prosody) that survive because audio never becomes text. The mini, though, lands between the mainstream and premium cascades, which makes "cascade vs realtime" a real price comparison only at the flagship tier; at the mini tier it is a latency-and-control decision, not a price one.&lt;/p&gt;

&lt;p&gt;One fairness check, because the other three cascades run flash-tier brains against OpenAI's flagship voice model: the SOTA-brain row gives the cascade the same vendor's frontier text model, &lt;a href="https://synthorai.io/models/gpt-5-6/" rel="noopener noreferrer"&gt;gpt-5.6&lt;/a&gt; at $5 in and $30 out per million. Even then the cascade lands at $0.0200 per conversation-minute, 2.9x below flagship realtime, because a text turn at frontier prices still moves two orders of magnitude fewer expensive tokens than an audio lane. Quality parity costs $0.010 of brain per minute; it does not close the architecture gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which leg of the cascade dominates the bill?
&lt;/h2&gt;

&lt;p&gt;The mouth, as long as the brain is a flash-tier model. In the mainstream build, a minute of conversation spends $0.0076 on TTS against $0.0006 on the LLM, a 12x gap; even in the budget build the speak leg is triple the brain. Upgrade the brain to &lt;a href="https://synthorai.io/models/gpt-5-6/" rel="noopener noreferrer"&gt;gpt-5.6&lt;/a&gt; and the structure flips: at $0.00274 per exchange, the brain becomes the biggest leg at $0.0110 per minute, 1.4x the tts-1 speak leg. Flash brains make voice agents mouth-dominated; frontier brains make them brain-dominated. Speech-to-text sits in between at $0.0010 to $0.0030 per conversation-minute (&lt;a href="https://synthorai.io/blog/speech-to-text-api/" rel="noopener noreferrer"&gt;per-minute rates from our 14-model sweep&lt;/a&gt;, re-verified this batch: qwen3-asr-flash $0.00198, gpt-4o-mini-transcribe $0.00294, whisper-1 $0.006 per audio-minute).&lt;/p&gt;

&lt;p&gt;The brain is nearly free until reasoning gets involved. Our eight-turn support dialog reached a steady state of about 310 input and 71 output tokens per turn on &lt;a href="https://synthorai.io/models/deepseek-v4-flash-0731/" rel="noopener noreferrer"&gt;deepseek-v4-flash-0731&lt;/a&gt;, or $0.00016 per exchange. On &lt;a href="https://synthorai.io/models/gemini-3-7-flash/" rel="noopener noreferrer"&gt;gemini-3.7-flash&lt;/a&gt; the same dialog cost $0.00126 per exchange, 8x more, and the reason is visible in the token split: 89 to 361 reasoning tokens per turn spent deliberating over a two-sentence reply. &lt;a href="https://synthorai.io/blog/gemini-3-7-flash-cost/" rel="noopener noreferrer"&gt;Gemini 3.7 Flash cannot turn thinking off&lt;/a&gt;, so a voice agent built on it pays a reasoning tax on every exchange; on models where &lt;a href="https://synthorai.io/blog/llm-thinking-controls/" rel="noopener noreferrer"&gt;the off switch works&lt;/a&gt;, a voice turn is exactly the single-step shape where disabling it is safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does text-to-speech cost per audio-minute?
&lt;/h2&gt;

&lt;p&gt;$0.004 to $0.034 per synthesized minute, an 8.4x spread that per-character price tags hide. Every model below bills per input character, so we synthesized fixed English and Chinese passages, measured the returned audio, and divided:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;List price&lt;/th&gt;
&lt;th&gt;EN $/audio-min&lt;/th&gt;
&lt;th&gt;ZH $/audio-min&lt;/th&gt;
&lt;th&gt;ZH vs EN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/google-tts-standard/" rel="noopener noreferrer"&gt;google-tts-standard&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$4/M chars&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0041&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.0007&lt;/td&gt;
&lt;td&gt;0.18x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/qwen3-tts-instruct-flash/" rel="noopener noreferrer"&gt;qwen3-tts-instruct-flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$11.5/M&lt;/td&gt;
&lt;td&gt;$0.0098&lt;/td&gt;
&lt;td&gt;$0.0033&lt;/td&gt;
&lt;td&gt;0.34x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/tts-1/" rel="noopener noreferrer"&gt;tts-1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$15/M&lt;/td&gt;
&lt;td&gt;$0.0151&lt;/td&gt;
&lt;td&gt;$0.0043&lt;/td&gt;
&lt;td&gt;0.28x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/google-tts-neural2/" rel="noopener noreferrer"&gt;google-tts-neural2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$16/M&lt;/td&gt;
&lt;td&gt;$0.0162&lt;/td&gt;
&lt;td&gt;$0.0030&lt;/td&gt;
&lt;td&gt;0.18x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/tts-1-hd/" rel="noopener noreferrer"&gt;tts-1-hd&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$30/M&lt;/td&gt;
&lt;td&gt;$0.0303&lt;/td&gt;
&lt;td&gt;$0.0085&lt;/td&gt;
&lt;td&gt;0.28x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://synthorai.io/models/google-tts-chirp3-hd/" rel="noopener noreferrer"&gt;google-tts-chirp3-hd&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$30/M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.0344&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.0052&lt;/td&gt;
&lt;td&gt;0.15x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Speaking rate is the hidden variable. &lt;a href="https://synthorai.io/models/tts-1-hd/" rel="noopener noreferrer"&gt;tts-1-hd&lt;/a&gt; and chirp3-hd carry the same $30 list price, but chirp3-hd speaks our English passage more quickly in fewer seconds of audio, so it costs 13% more per audio-minute; at the bottom of the table, google-tts-standard delivers a synthesized minute for less than half of anything else measured. The list price ranks the models; only the audio-minute rate prices them.&lt;/p&gt;

&lt;p&gt;The Chinese column is the finding we did not expect to be this large: a minute of spoken Chinese consumes 3 to 7x fewer billable characters than a minute of English, because each character carries far more speech. Under per-character billing, the speak leg of a Chinese-language voice agent is 66 to 85% cheaper than the same agent in English, which compounds with the &lt;a href="https://synthorai.io/blog/cheapest-llm-by-language/" rel="noopener noreferrer"&gt;per-language token spreads&lt;/a&gt; on the text side.&lt;/p&gt;

&lt;h2&gt;
  
  
  When is the realtime API worth its price?
&lt;/h2&gt;

&lt;p&gt;When the 2-second voice-to-voice loop and native interruption handling pay for themselves, because on price alone the flagship loses to every cascade we built. Both official audio conversions reproduced exactly in this batch: 30.0 seconds of input audio billed as 300 tokens (1 token per 100 ms) and 3.7 seconds of output as 74 tokens (1 per 50 ms), the same rates &lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;our July study&lt;/a&gt; measured. At &lt;a href="https://synthorai.io/models/gpt-realtime-2-1/" rel="noopener noreferrer"&gt;gpt-realtime-2.1&lt;/a&gt; list prices that is $0.0192 per minute just to listen and $0.0768 per minute to speak, before the conversation-history re-billing that makes long sessions compound.&lt;/p&gt;

&lt;p&gt;That compounding is tamer than it looks, and the reason is caching. In our eight-turn session, input grew from 72 to 643 tokens per response, but by turn eight 512 of those were cached at $0.40 per million; over the whole session 76% of input tokens billed at the cached rate. The measured all-in figure came to $0.0752 for a 1.31-minute exchange, or $0.0573 per conversation-minute. The lane split of that bill is worth seeing once: 66% audio out, 17% fresh audio in, and 16% text, because the model also emits a text rendering of every reply, billed at the $24-per-million text-output rate. About a sixth of a "speech-to-speech" bill is, in effect, a text model's invoice. Applying the same measured token profile to &lt;a href="https://synthorai.io/models/gpt-realtime-2-1-mini/" rel="noopener noreferrer"&gt;mini&lt;/a&gt; rates gives $0.0159, and that number is the more interesting one: it undercuts the premium cascade while keeping the latency and barge-in behavior the cascade architecture structurally cannot match.&lt;/p&gt;

&lt;p&gt;The remaining realtime tax is operational rather than per-token: sessions hard-stop at 60 minutes and cannot resume with audio history, so anything conversational past that boundary restarts with a cold cache. &lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;The July study&lt;/a&gt; covers those mechanics in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much faster is speech-to-speech than a cascade?
&lt;/h2&gt;

&lt;p&gt;Between 2.3x and 4.5x on the builds priced above, and the gap widens as the cascade gets fancier. Same six builds as the cost table, same unit per bar: one conversational turn, measured request-to-response-complete at a realistic shape (5-second utterance in, two-sentence reply out; cascade bars sum per-leg medians of three runs):&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%2Fsynthorai.io%2Fblog%2Fassets%2Fvoice-agent-api-cost%2Fturn-latency.svg" 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%2Fsynthorai.io%2Fblog%2Fassets%2Fvoice-agent-api-cost%2Fturn-latency.svg" alt="Turn latency by build: stacked bars show each cascade's STT, LLM, and TTS legs summing to 4.9-7.7 seconds, while both speech-to-speech models hold a 1.6-2.1 second band" width="1540" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In numbers: the cascade turns sum to 4.9 s (budget), 5.6 s (mainstream), 5.7 s (SOTA brain), and 7.7 s (premium), while both speech-to-speech tiers hold the same band, 1.6-2.1 s for &lt;a href="https://synthorai.io/models/gpt-realtime-2-1-mini/" rel="noopener noreferrer"&gt;gpt-realtime-2.1-mini&lt;/a&gt; over 4 live turns and 1.7-2.1 s for &lt;a href="https://synthorai.io/models/gpt-realtime-2-1/" rel="noopener noreferrer"&gt;gpt-realtime-2.1&lt;/a&gt; over 8.&lt;/p&gt;

&lt;p&gt;Read the chart against the cost table and the trade snaps into focus: on the cascade side, money and latency move in opposite directions. The budget build is both the cheapest and the fastest cascade; the premium build pays 6.8x the budget price and is 2.8 seconds slower, because the expensive parts (a deliberating brain, an HD voice) are also the slow parts. On the speech-to-speech side both models hold the same 2-second band regardless of tier, so the mini is simultaneously cheaper than two cascades and faster than all four.&lt;/p&gt;

&lt;p&gt;Three more things fall out of the numbers. First, the LLM is the latency bottleneck of every cascade, and mandatory reasoning nearly doubles it: gemini-3.7-flash spends 4.5 seconds deliberating over a two-sentence reply against deepseek's 2.6 and &lt;a href="https://synthorai.io/models/gpt-5-6/" rel="noopener noreferrer"&gt;gpt-5.6&lt;/a&gt;'s 2.7, so the same reasoning tax that costs 8x in tokens also buys the premium build its last-place finish. Second, cherry-picking the fastest measured part for every leg (gpt-4o-mini-transcribe, deepseek, google-tts-standard) still floors at 4.1 seconds, more than double the realtime band, before the voice-activity detector's end-of-speech wait and audio playback are added. Third, cascade rows are sequential, full-response wall times: a production cascade that streams the LLM into a streaming TTS overlaps the two biggest legs and can close much of the gap, but that overlap is engineering you build and tune, while the realtime API's 2 seconds arrive in the first WebSocket session you open.&lt;/p&gt;

&lt;p&gt;Where does a cascade turn's time actually go? Mostly into the three requests themselves, not the content inside them. The raw network is a minor part: a warm HTTPS round trip to the API edge measured about 0.09 seconds, so three serial legs carry roughly 0.3 seconds of pure network per turn (plus a 0.2-second TLS handshake whenever a connection is cold). The dominant cost is each request's fixed dispatch, which we isolated by re-running the fastest assembly's legs with near-empty payloads: a one-token LLM reply still took 2.5 seconds, a half-second clip still took 1.6 seconds to transcribe, and a two-word synthesis took 0.4 seconds. Those floors sum to 4.4 seconds against 4.1 seconds for the full-sized payloads, which is the same number inside measurement noise: essentially all of a cascade turn is per-request overhead, and the actual content (70 reply tokens instead of 1, a 10x longer clip) rides along nearly free. The practical reading cuts both ways: making a cascade's replies shorter will not make it faster, but anything that removes or overlaps a request (streaming legs into each other, persistent connections) attacks the real cost; the realtime API is the limit case of that logic, holding one socket so a turn never pays a fresh request cycle at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the cheapest way to run a voice agent?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The budget cascade: qwen3-asr-flash for listening, deepseek-v4-flash-0731 for the brain, google-tts-standard for speaking, at $0.0037 per conversation-minute or about $0.04 for a 10-minute call. It is 15x cheaper than flagship speech-to-speech; what you give up is voice-to-voice latency and natural interruption handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is GPT Realtime more expensive than a cascade stack?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The flagship is: gpt-realtime-2.1 measured $0.0573 per conversation-minute, 2.3x our premium cascade and 15x the budget one. gpt-realtime-2.1-mini is not: at $0.0159 per conversation-minute on the same token profile, it sits between the mainstream and premium cascades, so at the mini tier the choice is about latency and control rather than price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which part of a voice agent costs the most?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Text-to-speech, in every flash-brain cascade we priced: $0.002 to $0.017 per conversation-minute against $0.0006 to $0.005 for a flash LLM, 12x in the mainstream build. A frontier brain flips it, with gpt-5.6 at $0.0110 per minute against tts-1's $0.0076. Within TTS, model choice spans 8.4x per audio-minute, the biggest single lever measured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the language of the conversation change the cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the speak leg, dramatically: per-character billing makes a minute of spoken Chinese 3 to 7x cheaper than English on all six TTS models measured, because each character carries more speech. Speech-to-text rates were flat across the two languages on the three models we re-verified, and the text-side differences follow &lt;a href="https://synthorai.io/blog/cheapest-llm-by-language/" rel="noopener noreferrer"&gt;per-language tokenizer spreads&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Measured 2026-08-17 through the Synthorai gateway, all legs in one batch: six TTS models synthesizing fixed English and Chinese passages with audio durations read from the returned files (two runs each); three STT models on the standard fixture clips with per-minute cost from billing headers; an eight-turn scripted support dialog on three LLM brains (two flash-tier, one frontier) with per-turn usage recorded; a per-leg latency probe (5-second utterance to STT, steady-state dialog turn to the LLM, two-sentence reply to TTS, n=3, full-response walls), a minimal-payload floor probe on the same legs (one-token reply, half-second clip, two-word synthesis, n=3) with warm and cold round-trip timing to the API edge, and live GPT Realtime sessions (5-second utterances, eight turns on the flagship, four on the mini) billed lane by lane from response.done usage events, with the mini cost figure derived by applying the flagship session's measured token profile to mini list rates and the mini latency band measured from its own session. Cascade composites assume talk time split evenly and four exchanges per minute; rates are list prices from the model catalog at measurement time. seed-tts-2.0 is onboarded but excluded pending stable measurements. Prices and speaking rates change; re-measure before committing to an architecture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Related, same series: &lt;a href="https://synthorai.io/blog/speech-to-text-api/" rel="noopener noreferrer"&gt;speech-to-text pricing across 14 models&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/gpt-realtime-api-pricing/" rel="noopener noreferrer"&gt;GPT Realtime pricing mechanics&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/image-input-token-cost/" rel="noopener noreferrer"&gt;image input token costs&lt;/a&gt;, &lt;a href="https://synthorai.io/blog/seedance-api-pricing/" rel="noopener noreferrer"&gt;video generation pricing&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>voiceagents</category>
      <category>pricing</category>
      <category>gptrealtime</category>
      <category>tts</category>
    </item>
  </channel>
</rss>
