<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>成本优化 on 搬砖程序员带你飞</title>
        <link>https://lpflpf.cn/tags/%E6%88%90%E6%9C%AC%E4%BC%98%E5%8C%96/</link>
        <description>Recent content in 成本优化 on 搬砖程序员带你飞</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <managingEditor>lipengfei634626165@163.com (lpflpf)</managingEditor>
        <webMaster>lipengfei634626165@163.com (lpflpf)</webMaster>
        <lastBuildDate>Wed, 23 Sep 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://lpflpf.cn/tags/%E6%88%90%E6%9C%AC%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Opus 5.5 便宜了 40%，但你那套 Opus 5 的调用代码可能先报 400</title>
            <link>https://lpflpf.cn/posts/claude-opus-5-5-migration-audit-2026-09-23/</link>
            <pubDate>Wed, 23 Sep 2026 09:00:00 +0800</pubDate><author>lipengfei634626165@163.com (lpflpf)</author>
            <guid>https://lpflpf.cn/posts/claude-opus-5-5-migration-audit-2026-09-23/</guid>
            <description>&lt;img src=&#34;https://cdn.lpflpf.cn/covers/claude-opus-5-5-migration-audit-2026-09-23-plain.jpg&#34; alt=&#34;Featured image of post Opus 5.5 便宜了 40%，但你那套 Opus 5 的调用代码可能先报 400&#34; /&gt;&lt;p&gt;上周五你为了省成本，在 agent 里写了一行 &lt;code&gt;thinking: {&amp;quot;type&amp;quot;: &amp;quot;disabled&amp;quot;}&lt;/code&gt;，把模型的思考关掉，只让它调工具。这周一 Opus 5.5 上线，你把 model ID 改成 &lt;code&gt;claude-opus-5-5&lt;/code&gt;，跑第一次请求——&lt;code&gt;400 invalid_request_error&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;不是变慢，不是变贵，是请求根本发不出去。官方 migration guide 里列了 &lt;strong&gt;4 处会直接返回 400 的请求形态&lt;/strong&gt;，还有 &lt;strong&gt;1 处不报任何错、但你的流式进度条会静默变哑&lt;/strong&gt;。这篇不做跑分搬运，只做一件事：把升级动作从&amp;quot;改模型 ID&amp;quot;改成&amp;quot;审计你自己的调用代码和成本结构&amp;quot;，并说清 40% 到底从哪来、哪些工作流吃不到。&lt;/p&gt;&#xA;&lt;p&gt;适用人群：在 Go/Python/Java 后端里用 Claude API 或 Claude Code 跑 agent 的工程师，尤其是手上已经有一套按 Opus 5 写的请求代码、打算这周升级的人。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先别改-model-id四个会让请求直接-400-的形态&#34;&gt;先别改 model ID：四个会让请求直接 400 的形态&#xA;&lt;/h2&gt;&lt;p&gt;这四处有个共同点：它们不是&amp;quot;性能退化&amp;quot;，是硬失败——只要代码里有，升级当天就会断。而且错误串是分得清的，照着 grep 一遍就能定位。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第一处，关闭思考。&lt;/strong&gt; &lt;code&gt;thinking: {&amp;quot;type&amp;quot;: &amp;quot;disabled&amp;quot;}&lt;/code&gt; 直接 400。同一处还有 &lt;code&gt;thinking: {&amp;quot;type&amp;quot;: &amp;quot;enabled&amp;quot;, &amp;quot;budget_tokens&amp;quot;: N}&lt;/code&gt;——手动指定思考预算的写法也不再接受。Opus 5.5 的 thinking 是恒开的，接受的值只有 &lt;code&gt;adaptive&lt;/code&gt; 或者干脆省略字段。控制思考深度的唯一旋钮换成了 &lt;code&gt;output_config.effort&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第二处，强制工具调用。&lt;/strong&gt; &lt;code&gt;tool_choice: {&amp;quot;type&amp;quot;: &amp;quot;any&amp;quot;}&lt;/code&gt; 和 &lt;code&gt;tool_choice: {&amp;quot;type&amp;quot;: &amp;quot;tool&amp;quot;, &amp;quot;name&amp;quot;: ...}&lt;/code&gt; 都返回 400，错误串写得很直白：&lt;code&gt;tool_choice: type &amp;quot;tool&amp;quot; and &amp;quot;any&amp;quot; are not supported for this model.&lt;/code&gt;。如果你习惯用强制 tool_choice 来拿结构化 JSON，这条会命中。替代路径是把 &lt;code&gt;tool_choice&lt;/code&gt; 设回 &lt;code&gt;auto&lt;/code&gt;，在工具定义里加 &lt;code&gt;strict: true&lt;/code&gt;（strict tool use），或者改用 structured outputs，同时在 prompt 里明确写清什么时候该调这个工具——把&amp;quot;强制&amp;quot;从 API 参数挪到指令里。顺带一句：token counting 端点做同样的校验，所以你的预计算 token 那一步也会一起挂。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第三处，编辑历史后重放 thinking 块。&lt;/strong&gt; thinking 块现在绑模型也绑会话。Opus 5.5 能读 Opus 5 及更早的 Opus/Sonnet/Haiku 块，读不了 Fable/Mythos 的；反过来，在 Claude API 上只有 Fable 5.1 / Mythos 5.1 能读它的块。更需要注意的是账号时间线：&lt;strong&gt;2026-08-31 00:00 UTC 及之后创建的账号&lt;/strong&gt;，如果 system prompt、tools 或更早的消息被改动过、又重放了 thinking 块，默认返回 400。如果你做的是&amp;quot;多轮里改一句 system prompt 再继续&amp;quot;的批处理，这基本必中。绕过方式是用 &lt;code&gt;thinking-binding-controls-2026-08-01&lt;/code&gt; beta 头配合 &lt;code&gt;prefix_mismatch_behavior: &amp;quot;drop_block&amp;quot;&lt;/code&gt;，把不匹配的块丢掉而不是报错。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第四处，旧版 computer use 工具。&lt;/strong&gt; &lt;code&gt;computer_20251124&lt;/code&gt; 在 Claude API 和 Google Cloud 上被拒，得声明 &lt;code&gt;computer_toolset_20260801&lt;/code&gt; 工具集。但 Amazon Bedrock 上旧工具仍然可用——这类平台差异后面还会再出现一次，别用一套配置打天下。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;四处 400 的共同修法是同一个动作：把请求形态和模型解耦。别把控制逻辑藏在 API 参数里，参数会被版本改掉，指令不会。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;工具调用之间的那行旁白不见了而这次不会报错&#34;&gt;工具调用之间的那行旁白不见了，而这次不会报错&#xA;&lt;/h2&gt;&lt;p&gt;四处 400 好歹会炸给你看。真正该优先排查的是第五处，因为它不报错。&lt;/p&gt;&#xA;&lt;p&gt;Opus 5.5 把工具调用之间的旁白文本，从 &lt;code&gt;text&lt;/code&gt; 块挪进了 progress-update 的 &lt;code&gt;thinking&lt;/code&gt; 块。而 &lt;code&gt;thinking&lt;/code&gt; 块默认 &lt;code&gt;display: &amp;quot;omitted&amp;quot;&lt;/code&gt;——这时候它的文本是空的。结果就是：你的 agent 逻辑一切正常，工具照调，但流式进度 UI 上那句&amp;quot;正在查数据库……&amp;ldquo;没了，前端静默变哑。日志里没有任何异常，只有用户体验悄悄掉一档。&lt;/p&gt;&#xA;&lt;p&gt;修法是把 &lt;code&gt;display&lt;/code&gt; 显式设成 &lt;code&gt;&amp;quot;updates&amp;quot;&lt;/code&gt; 或 &lt;code&gt;&amp;quot;summarized&amp;quot;&lt;/code&gt;。这个改动很小，但它暴露了一个容易被忽略的区分：&lt;strong&gt;400 是开发期就能发现的错误，静默失效是上线后靠用户反馈才能发现的错误&lt;/strong&gt;。升级前先跑一遍完整的工具调用循环、盯着流式输出看，比盯着错误日志有用。&lt;/p&gt;&#xA;&lt;p&gt;顺带说一个连带的写法变化。既然 thinking 块现在绑会话、改历史就报错，那&amp;quot;在历史中间插一句话&amp;quot;的会话操作要改成 append-only：需要中途改指令时，走 mid-conversation system messages，而不是回头编辑早先的消息。以及读响应时别再按位置取块——&lt;code&gt;content[0]&lt;/code&gt; 这种写法在块类型会变的模型上迟早出问题，按 &lt;code&gt;type&lt;/code&gt; 字段挑。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Opus 5.5 请求形态审计：四处返回 400 的写法、一处静默失效，以及各自的替换写法&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;353px&#34; data-flex-grow=&#34;147&#34; height=&#34;951&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://cdn.lpflpf.cn/images/posts/claude-opus-5-5-request-form-audit.png&#34; srcset=&#34;https://cdn.lpflpf.cn/claude-opus-5-5-request-form-audit_2556428589935402461_hu_2dac3010f9fba88c.png 800w, https://cdn.lpflpf.cn/images/posts/claude-opus-5-5-request-form-audit.png 1400w&#34; width=&#34;1400&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;上面这张图把这一节和上一节的内容压成了一张对照表：左边是你照着 Opus 5 写的请求形态，中间是它在 Opus 5.5 上的结果，右边是替换写法。前三行是 400，第四行是平台差异，第五行不报错——&lt;strong&gt;只有第五行需要你跑起来才知道&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;40-不是价目表上的数字缓存读取才是账单大头&#34;&gt;40% 不是价目表上的数字：缓存读取才是账单大头&#xA;&lt;/h2&gt;&lt;p&gt;说完成本之外的部分，回来说钱。官方发布页上写的是&amp;quot;default settings 下 typical workloads 便宜 40%&amp;quot;，但同一页也写着 input/output 降 20%。这两个数字对不上，差在哪？&lt;/p&gt;&#xA;&lt;p&gt;先把价目表摆出来。Opus 5.5 是 &lt;strong&gt;$4 / $20 per MTok&lt;/strong&gt;（Opus 5 是 $5 / $25），这是 20% 的来源。真正的变化在缓存：&lt;strong&gt;cache read 从 Opus 5 的 $0.50 降到 $0.20，降幅 60%&lt;/strong&gt;，相当于 base input 的 0.05x——而此前各代 Opus 一直是 0.1x。cache write 也降了，5 分钟写入 $5（原 $6.25），1 小时写入 $8。Batch 是 $2/$10，Fast mode $8/$40 且只在 Claude API 和 Claude Code 上有。&lt;/p&gt;&#xA;&lt;p&gt;40% 的构成，官方没有拆分。官方给出的两句话是&amp;quot;cache reads 占 agentic 与 coding 成本的大部分&amp;rdquo;，以及&amp;quot;Opus 5.5 每任务用更少 token&amp;quot;。把这两句和上面的乘数放在一起，可以做一个合理推断：&lt;strong&gt;综合降幅 = 缓存读取单价腰斩 + 每任务 token 变少，纯单价只解释 20%&lt;/strong&gt;。这个推断是我的，不是官方口径，写出来是为了让你知道该往哪算，而不是让你引用一个数字。&lt;/p&gt;&#xA;&lt;p&gt;算给你看。假设一个 agent 会话一天用掉 20M 缓存读取 token、200K 新输入、200K 缓存写入（5 分钟档）、150K 输出：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Opus 5：20M × $0.50/MTok = $10.00，加 200K × $5 = $1.00，加 200K × $6.25 = $1.25，加 150K × $25 = $3.75，&lt;strong&gt;合计 $16.00&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Opus 5.5：20M × $0.20 = $4.00，加 200K × $4 = $0.80，加 200K × $5 = $1.00，加 150K × $20 = $3.00，&lt;strong&gt;合计 $8.80&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;同 token 量下约省 45%——注意这是&lt;strong&gt;按官方价目表的推演示例，不是实测&lt;/strong&gt;，你的实际比例取决于缓存读取占比。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;同一 token 用量下的账单构成对比：Opus 5 与 Opus 5.5 按缓存读取、新输入、缓存写入、输出四项拆分&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;385px&#34; data-flex-grow=&#34;160&#34; height=&#34;959&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://cdn.lpflpf.cn/images/posts/claude-opus-5-5-cost-breakdown.png&#34; srcset=&#34;https://cdn.lpflpf.cn/claude-opus-5-5-cost-breakdown_14864120015438186611_hu_c28eb4e37dee6031.png 800w, https://cdn.lpflpf.cn/images/posts/claude-opus-5-5-cost-breakdown.png 1540w&#34; width=&#34;1540&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;两根柱子的总高度是账单，四段是构成。&lt;strong&gt;最下面那段（缓存读取）在两根柱子里的占比都接近三分之二，而它的单价降了 60%&lt;/strong&gt;——这就是 20% 的单价降幅能变成 45% 的原因。反过来看，如果你账单里最下面那段很短，那这次升级对你就是 20%，跑不掉。&lt;/p&gt;&#xA;&lt;p&gt;这里就是关键判断：&lt;strong&gt;缓存读取占比越高，你离 40% 越近；越低，你就只吃到 20%。&lt;/strong&gt; 纯 chat、没有缓存复用的工作流，拿到的就是价目表上那 20%。而 agent 场景之所以能吃到更多，是因为系统提示词、工具定义、长历史这些前缀在每轮都被重复读取——它们越稳定，命中率越高。&lt;/p&gt;&#xA;&lt;p&gt;反过来说，如果你现在的 agent 每次都把变化的上下文塞进前缀（比如把时间戳、随机 ID、用户输入拼在 system prompt 前面），那缓存命中率本来就低，换模型省不了多少。官方定价页给的一个参照是：&lt;strong&gt;5 分钟缓存写入在 1 次读取后回本，1 小时写入在 2 次读取后回本&lt;/strong&gt;——这是判断&amp;quot;该不该开缓存&amp;quot;的硬口径。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;这次降价最值得做的动作，不是换模型 ID，是查一眼自己的缓存命中率。命中率低的话，重构 prompt 结构的收益比升级模型大。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;默认-effort-掉了一档而拉满不必然更好重跑你的扫描&#34;&gt;默认 effort 掉了一档，而拉满不必然更好：重跑你的扫描&#xA;&lt;/h2&gt;&lt;p&gt;最后一处变化最容易被漏掉，因为它不改代码也能跑。&lt;/p&gt;&#xA;&lt;p&gt;Opus 5.5 的默认 effort 从 &lt;code&gt;high&lt;/code&gt; 变成了 &lt;code&gt;medium&lt;/code&gt;，而且&lt;strong&gt;同样 effort 下每轮思考更多&lt;/strong&gt;（官方说这个现象在 xhigh 和 max 档最明显）。两件事叠起来，意味着你的账单和延迟都会变——如果你从来没在代码里显式设过 effort，那这次升级等于静默给你降了一档。这可能让你更便宜，也可能让你的任务质量不达标，取决于你原来靠什么达标。&lt;/p&gt;&#xA;&lt;p&gt;官方 migration guide 的第一条建议就是&amp;quot;Re-run your effort sweep&amp;quot;。为什么？因为官方自己的数据也不支持&amp;quot;拉满更好&amp;quot;这个直觉。FrontierCode v1.1 main 上，默认 medium 跑出 54.6%，而表里 max 档读数是 54.4%——&lt;strong&gt;medium 反超&lt;/strong&gt;。Terminal-Bench 4.0 那个 66.4% 是 xhigh 档跑出来的，max 反而略低。CursorBench 4.0 的曲线倒是正常（medium 52.5% 到 max 57.8%）。&lt;/p&gt;&#xA;&lt;p&gt;厂商自测数据得打折看，而且官方自己在同一页写着&amp;quot;benchmark margins have become a less reliable guide to real-world differences&amp;quot;，Terminal-Bench 的标准误是 ±2.6 分——意味着上面那些零点几个百分点的差距根本在噪声里。所以这几行数据的正确用法不是&amp;quot;选 medium&amp;quot;，而是：&lt;strong&gt;这个级别的跑分已经不足以指导选型，你得用自己的任务集重跑一遍。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;具体怎么跑：从你线上真实任务里抽 20–30 条，覆盖你依赖的能力（工具调用、长上下文检索、结构化输出、代码编辑），把 effort 设成 low / medium / high / xhigh 各跑一遍，同时记 token 消耗和耗时，然后在&amp;quot;质量达标的最低档&amp;quot;上定住。这样定出来的档位才是你的，不是厂商表格里的。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;升级的正确终点不是抄一张跑分表，是在自己的任务集上重新定档。默认值变了，等于你的成本曲线被人悄悄调了参数。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;grep-五个词盯一次工具调用拆上个月账单&#34;&gt;grep 五个词、盯一次工具调用、拆上个月账单&#xA;&lt;/h2&gt;&lt;p&gt;第一件，花十分钟 grep 一遍代码，把会 400 的形态清掉。搜这几个词：&lt;code&gt;thinking&lt;/code&gt;、&lt;code&gt;budget_tokens&lt;/code&gt;、&lt;code&gt;tool_choice&lt;/code&gt;、&lt;code&gt;computer_20251124&lt;/code&gt;、以及按位置取内容块的 &lt;code&gt;content[0]&lt;/code&gt;。命中 &lt;code&gt;{&amp;quot;type&amp;quot;: &amp;quot;disabled&amp;quot;}&lt;/code&gt; 或 &lt;code&gt;{&amp;quot;type&amp;quot;: &amp;quot;any&amp;quot;}&lt;/code&gt; / &lt;code&gt;{&amp;quot;type&amp;quot;: &amp;quot;tool&amp;quot;&lt;/code&gt; 的，按前面写的替换写法改。&lt;/p&gt;&#xA;&lt;p&gt;第二件，跑一次完整的工具调用循环，盯流式输出。看工具调用之间那行旁白还在不在。不在就把 &lt;code&gt;display&lt;/code&gt; 设成 &lt;code&gt;&amp;quot;updates&amp;quot;&lt;/code&gt; 或 &lt;code&gt;&amp;quot;summarized&amp;quot;&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;第三件，把上个月账单里的 token 构成拉出来，算一下缓存读取占多少。占比高的，这次升级你能拿到接近 40%；占比低的，先改 prompt 结构——&lt;strong&gt;把稳定前缀（system prompt、工具定义、固定指令）和不稳定的动态内容彻底分开&lt;/strong&gt;，让前缀能命中缓存，再谈升级。&lt;/p&gt;&#xA;&lt;p&gt;至于升级本身的账，有两点得说全。一是&lt;strong&gt;平台差异&lt;/strong&gt;：旧版 &lt;code&gt;computer_20251124&lt;/code&gt; 在 Bedrock 上还能用，Fast mode 只在 Claude API 和 Claude Code 上有，Bedrock / Google Cloud / Foundry 上都没有——同一份代码在不同平台的行为不一样，别按一套配置推。二是&lt;strong&gt;安全侧的改派&lt;/strong&gt;：官方称多数网络安全任务会被改派到 Opus 4.8，生物学与前沿 LLM 开发任务改派到 Opus 5，而且新增了 &lt;code&gt;reasoning_extraction&lt;/code&gt; 拒绝类别、服务端 fallback 不会重试这个类别。做这几个方向的团队，升级之后实际拿到的是降级——这条值得在升级前先确认一遍。&lt;/p&gt;&#xA;&lt;h2 id=&#34;文中数字的出处&#34;&gt;文中数字的出处&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;Claude Opus 5.5 新特性与破坏性变更（4 处 400、thinking 绑定规则、computer use 工具集变更）：https://platform.claude.com/docs/en/models/opus-5-5/whats-new-opus-5-5 ，访问日期 2026-09-23&lt;/li&gt;&#xA;&lt;li&gt;迁移指南（默认 effort high→medium、Re-run your effort sweep、前缀不匹配行为）：https://platform.claude.com/docs/en/models/opus-5-5/migration-guide ，访问日期 2026-09-23&lt;/li&gt;&#xA;&lt;li&gt;官方发布页（价格、40% 口径、FrontierCode / Terminal-Bench / CursorBench 数据、安全任务改派）：https://www.anthropic.com/claude-opus-5-5 ，访问日期 2026-09-23&lt;/li&gt;&#xA;&lt;li&gt;定价页（缓存乘数、5 分钟与 1 小时缓存写入回本口径）：https://platform.claude.com/docs/en/about-claude/pricing ，访问日期 2026-09-23&lt;/li&gt;&#xA;&lt;li&gt;模型概览（$4/$20 per MTok、Batch 与 Fast mode 价格）：https://platform.claude.com/docs/en/models/opus-5-5/overview ，访问日期 2026-09-23&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;文中 $16.00 与 $8.80 的对比为按官方价目表与假设 token 用量（20M 缓存读取 / 200K 新输入 / 200K 缓存写入 / 150K 输出）的&lt;strong&gt;推演示例，非实测&lt;/strong&gt;；&amp;ldquo;40% 主要来自缓存与每任务 token 更少&amp;quot;属基于官方表述与价格乘数的推断，官方未拆分该数字的构成。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
