Claude Fable 5 在工程接入上最反直觉的一点,是它的扩展思考(extended thinking)始终开启、不可关闭。你拿不到一个"纯直答"的 Fable 5,思考是它的固有工作方式。这听起来像是失去了一个开关,但实际上 Anthropic 把控制权换了个维度交还给你——用 output_config.effort 调节思考的深度与开销。本文聚焦这一对机制:始终思考意味着什么、effort 怎么用、以及如何在深度和成本之间找到合适的平衡点。

始终思考:不是开关,而是前提

在一些上一代模型里,扩展思考是个可选项,你可以为了省 token 或降延迟把它关掉。Fable 5 不行。思考是默认且不可关闭的前提条件。

这背后的取向很清晰:Fable 5 被设计为一个"会先想再答"的模型,它在难任务上的优势恰恰来自这段推理过程,强行关掉等于废掉它的核心能力。所以正确的心态不是"怎么把思考关了省钱",而是"针对这个任务,我该让它想多深"。

一个直接的工程后果是:难任务上 Fable 5 的单轮推理可能跑数分钟。调用方必须把超时阈值、流式等待、用户侧的进度反馈都按"它会思考很久"来设计,不能套用过去几秒内返回的假设。

effort:把思考深度变成一个可调参数

你能控制的是思考投入多少,通过 output_config.effort 设置,取值为 low / medium / high / xhigh / max 五档。档位越高,模型投入的思考越深、消耗的 thinking token 越多,单次调用也越贵越慢。

1
2
3
4
5
6
response = client.messages.create(
model="claude-fable-5",
max_tokens=8192,
output_config={"effort": "medium"},
messages=[{"role": "user", "content": "..."}],
)

需要强调的是,在 Fable 5 上 effort 的影响比以往更大。它不是一个"调了也看不出区别"的微调旋钮,而是会实质性改变行为质量和成本结构的关键参数。同一个任务,从 lowmax,你看到的可能是从"勉强应付"到"稳定做对、但贵很多"的区别。正因为影响显著,它也更值得针对任务类型专门调试,而不是全局写死一个值。

怎么选 effort:按任务难度分层

没有放之四海皆准的最佳档位,合理的做法是按任务难度分层:

  • 简单、高频、格式化任务(分类、抽取、短改写):用 lowmedium。这类任务不需要深推理,高 effort 只是白白烧钱拖慢响应。
  • 中等复杂任务(多步推理、带约束的生成):high 通常是性价比拐点。
  • 困难、高价值、长程任务(复杂代码、深度分析、自治 agent 的关键决策):xhighmax。这里一次想对的收益远高于成本,省思考反而是亏的。

换句话说,effort 的选择本质是一道 ROI 题:思考越深,单次越贵,但试错和返工越少。把高 effort 留给"做错代价大"的环节。

成本:effort 之外,还有分词器和定价两重放大

谈 effort 的成本平衡,绕不开 Fable 5 的两个底层变化,它们会放大每一档 effort 的实际花费。

第一是定价本身偏高:输入 $10 / 百万 token,输出 $50 / 百万 token,明确高于 Opus 档。而 thinking token 属于产出侧的开销,effort 越高,这部分越大。

第二是新分词器。Fable 5 换了分词器,同样内容的 token 数比 Opus 档约多 30%。这意味着你过去对"一段内容大概多少 token、大概多少钱"的直觉全部失真,且是系统性偏高。

两者叠加,effort 提升带来的成本增长会比你凭经验预估的更陡。所以在为某个任务定 effort 之前,建议用 count_tokens 对真实负载实测 token 量,再结合定价把"low vs high"的真实成本差算出来,而不是拍脑袋。

1
2
3
4
5
6
# 实测真实负载的 token 数,再据此估算不同 effort 的成本
count = client.messages.count_tokens(
model="claude-fable-5",
messages=[{"role": "user", "content": payload}],
)
print(count.input_tokens)

受保护思维链:你调了深度,但看不到过程

这里有个和 effort 直接相关的约束需要交代:Fable 5 的原始思维链永不返回。无论你把 effort 调到多高,API 给你的都只是思考摘要(display: "summarized"),拿不到逐字的内部推理。

由此引出多轮场景的硬性要求:与同一模型多轮对话时,必须把上一轮返回的 thinking block 原样回传,不要丢弃或改写。这一点在搭建会复用上下文的 agent 时尤其关键——你看不到完整思考,但模型需要它来延续推理,缺了会导致行为异常。

refusal:高 effort 也救不了被分类器拦截

最后提一个和"想得深不深"无关、但同属响应处理的要点。Fable 5 的安全分类器可能拒答,返回 HTTP 200 加 stop_reason: "refusal",主要针对生物、网络安全等高风险领域。这与 effort 无关——再高的思考深度也不会绕过安全拦截。

处理上要先判 stop_reason 再读 content,必要时回退到 claude-opus-4-8

1
2
3
4
5
6
7
resp = client.messages.create(
model="claude-fable-5",
output_config={"effort": "high"},
...
)
if resp.stop_reason == "refusal":
resp = client.messages.create(model="claude-opus-4-8", ...)

总结

Fable 5 把"要不要思考"变成了既定前提,把"思考多深"交给 effort——而真正的工程功力,在于结合任务难度、偏高的定价和约多 30% 的分词器开销,为每类任务选出那个既做得对又不浪费的档位。