Anthropic 于 2026 年 6 月 9 日正式发布了 Claude Fable 5。对于开发者而言,最关注的莫过于其 API 接口。好消息是,它依然基于大家熟悉的 Messages API,因此唯一实质性的变化就是模型标识符变为了 claude-fable-5。本指南将从一条简单的 curl 命令开始,逐步深入到流式传输、工具调用、错误处理以及成本计算——确保你能顺利运行代码并获取真实响应。如果你此前使用过 Claude 进行开发,会发现整体结构非常熟悉。如果是旧模型迁移,那么迁移过程基本上只需更换模型字符串,如同从 Claude Opus 4.8 API 迁移一样简单。
快速入门(TL;DR)
首先前往 Anthropic Console 获取 API 密钥,将其设置为环境变量 ANTHROPIC_API_KEY,然后向 Messages API 发送一个 POST 请求,请求体包含 model: "claude-fable-5"、max_tokens 值以及 messages 数组。推荐直接使用官方的 Anthropic Python 或 TypeScript SDK,当然你也可以直接使用原始 HTTP 请求。如果输出内容较长,采用流式传输能有效避免超时。价格方面:每百万输入 tokens 10 美元,每百万输出 tokens 50 美元。

关键的三个 Header 分别是:x-api-key 携带你的 API 密钥;anthropic-version 固定 API 版本(当前稳定版为 2023-06-01);content-type 告知服务器你发送的是 JSON 格式数据。请求体必须包含三个字段:model、max_tokens 和 messages。这些就是完整的交互规范。
响应将以 JSON 对象的形式返回。你最需要关注的是 content 字段,它是一个内容块列表:
{"id": "msg_01ABC...","type": "message","role": "assistant","model": "claude-fable-5","content": [{ "type": "text", "text": "- Predictable, resource-oriented URLs..." }],"stop_reason": "end_turn","usage": { "input_tokens": 18, "output_tokens": 96 }}
注意 content 是一个列表而非字符串,这是因为单个响应中可能混合了文本块、工具调用块以及思考块。在读取 text 之前,必须遍历列表并检查每个块的 type。stop_reason 字段指示模型停止的原因(end_turn 表示正常结束),usage 则提供了后续计算成本所需的 token 数量。
使用 Python 调用 Claude Fable 5 API
官方 Anthropic Python SDK 帮你省去了设置 Header 和 JSON 的样板代码。先安装它:
pip install anthropic
基础调用代码如下所示。客户端会自动从环境中读取你的密钥,代码里无需手动传递:
import anthropic
client = anthropic.Anthropic() # 从环境变量读取 ANTHROPIC_API_KEY
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "Summarize what makes a good REST API."}
],
)
for block in response.content:
if block.type == "text":
print(block.text)
这个模式与 curl 调用完全一致。你传入 model、max_tokens 和 messages,得到一个 content 为块列表的响应。循环中使用 block.type == "text" 做保护,确保不会在非文本块上出错。
添加系统提示词(System Prompt)
系统提示词用于设定模型扮演的角色以及整个对话的基本准则。将其作为 system 字段传入,与 messages 分开:
response = client.messages.create(
model="claude-fable-5",
max_tokens=2048,
system="You are a senior backend engineer. Be concise and use code examples.",
messages=[
{"role": "user", "content": "Write a Flask route that validates a JSON body."}
],
)
for block in response.content:
if block.type == "text":
print(block.text)
系统提示词是定义人设、输出格式规则以及每次对话都要保持的约束条件的最佳方式。尽量保持稳定——每次请求中频繁修改会导致后续的提示词缓存失效。
流式传输长输出
任何会产生长回复的任务,都建议采用流式传输。流式传输会在 token 生成时立刻发送过来,这样你能即时显示进度,同时避免大型非流式响应可能导致的请求超时。Fable 5 处理长期任务的能力很强,因此流式传输应该是实际工作负载的默认选择:
with client.messages.stream(
model="claude-fable-5",
max_tokens=4096,
messages=[
{"role": "user", "content": "Explain idempotency keys for payment APIs."}
],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
print(f"\n\nTokens: {final.usage.output_tokens}")
stream.text_stream 会在文本块到达时逐个产出。flush=True 很关键,这样每个块都会立即打印,而不是先缓存起来。流结束后,stream.get_final_message() 会返回完整的组装消息,包括最终的 usage 数据——用户体验是实时的,又无需二次请求即可拿到完整对象。
在 TypeScript / Node.js 中调用 Claude Fable 5 API
Node SDK 结构几乎相同。安装它:
npm install @anthropic-ai/sdk
然后直接发起调用。客户端同样会自动读取 ANTHROPIC_API_KEY:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // 读取 ANTHROPIC_API_KEY
const msg = await client.messages.create({
model: "claude-fable-5",
max_tokens: 1024,
messages: [{ role: "user", content: "List 3 common API security mistakes." }],
});
console.log(msg.content);
msg.content 与之前在 Python 和 curl 中看到的块列表完全一致。要提取纯文本,按块类型过滤即可:
const text = msg.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);
流式传输的工作方式也与 Python 相同。使用 client.messages.stream({...}) 然后迭代事件,或者等 finalMessage() 拿到组装结果。如果对接的是前端聊天界面,从服务器路由做流式传输,然后将数据块转发到浏览器即可。
Claude Fable 5 的工具调用(Function Calling)
工具调用让 Fable 5 可以执行你定义的函数。你通过 JSON schema 描述一个工具,模型决定何时使用它,然后你运行实际的函数,再将结果返回给模型。Fable 5 在工具调用上表现非常强劲,这也是它特别适合智能体循环的原因。
定义一个包含名称、描述和 input_schema 的工具:
tools = [
{
"name": "get_order_status",
"description": "Look up the status of a customer order by ID.",
"input_schema": {
"type": "object",
"properties": {
"order_id": {"type": "string"}
},
"required": ["order_id"],
},
}
]
将 tools 像 messages 一样传递给请求:
messages = [
{"role": "user", "content": "What's the status of order A1855?"}
]
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
tools=tools,
messages=messages,
)
当模型想调用工具时,响应中的 stop_reason == "tool_use",并且会包含一个携带工具名称和所选输入的 tool_use 块。处理逻辑很直观:将助手的响应追加进去,执行工具,然后在新的用户轮次中以 tool_result 块的形式将结果发回:
if response.stop_reason == "tool_use":
tool_use = next(b for b in response.content if b.type == "tool_use")
# 用模型选择的输入运行你真实的函数
result = lookup_order(tool_use.input["order_id"])
# 你的代码
messages.append({"role": "assistant", "content": response.content})
messages.append({
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": result,
}
],
})
# 将结果发回;模型现在会利用这个结果来回答
followup = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
tools=tools,
messages=messages,
)
关键点是 tool_use_id:tool_result 块必须引用 tool_use 块中确切的 id,这样模型才知道结果对应哪个调用。对于多步智能体,你可以将其封装在一个循环中,直到 stop_reason 变为 end_turn。Python SDK 还提供了一个工具运行器来自动处理这个循环,但上述手动版本展示了底层原理,也方便你加入审批环节或日志记录。
自适应思考与输出努力度(Adaptive Thinking and Effort)
Fable 5 支持自适应思考——模型可以自主决定在回答之前进行多深的推理。这是可选的。通过传入 thinking 参数开启,然后用 output_config 调整整体深度和 token 消耗:
response = client.messages.create(
model="claude-fable-5",
max_tokens=4096,
thinking={"type": "adaptive"},
output_config={"effort": "high"}, # low | medium | high
messages=[
{"role": "user", "content": "Design a retry strategy for a flaky webhook receiver."}
],
)
effort 控制模型的工作量:低 effort 意味着更简洁、更快速的响应;高 effort 意味着更彻底的推理,但 token 成本也更高。对于简单的查询和简短的回答,关掉这两个选项即可——额外推理浪费 token。对于复杂、多步骤的问题(也就是 Fable 5 专为设计的长期规划任务),才启用它们。开始时保持简单;一旦发现某个路径需要更强的推理能力,再添加 thinking。
错误处理与安全回退机制
实际的集成必须能优雅地处理失败。SDK 会抛出类型化的异常,所以最好捕获特定的类,而不是去匹配错误字符串。你最常遇到的三个异常对应 HTTP 401、429 和 400:
import anthropic
client = anthropic.Anthropic()
try:
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "Explain CORS preflight requests."}
],
)
except anthropic.AuthenticationError:
# 401: API 密钥错误或缺失。检查 ANTHROPIC_API_KEY。
print("Invalid API key. Rotate it in the Console and re-export.")
except anthropic.RateLimitError as e:
# 429: 请求太多。稍后重试。
retry_after = e.response.headers.get("retry-after", "60")
print(f"Rate limited. Retry after {retry_after}s.")
except anthropic.BadRequestError as e:
# 400: 请求格式错误(参数错误、消息为空、结构错误)。
print(f"Bad request: {e.message}")
每个错误的含义和解决办法:
- 401(
AuthenticationError):密钥缺失、格式不对或已撤销。确认ANTHROPIC_API_KEY已在代码运行的环境中设置好,且密钥在 Console 中仍然有效。 - 429(
RateLimitError):你超过了每分钟请求次数或每分钟 token 数限制。SDK 已经会自动用指数退避重试 429 和 5xx 错误(默认重试两次)。如果要加自定义退避逻辑,读取retry-afterHeader。 - 400(
BadRequestError):请求格式有问题。常见原因包括messages数组为空、缺少max_tokens,或消息角色没有正确交替。错误消息通常会指明具体的字段。
关于安全回退:Fable 5 会针对一小部分敏感查询(网络安全、生物化学、蒸馏尝试)路由到 Claude Opus 4.8 去回答。这种情况发生在不到 5% 的会话中。这不是错误,你的请求仍然会成功,但响应可能会标记为不同的模型。如果你对 response.model 做日志或断言,发现它不是 claude-fable-5 时不要直接报错——请求已被处理,只是底层换成了另一个模型。如果你的应用程序严格要求识别回答模型的名称,从返回的对象中读取 response.model,而不是假设它与你传入的一致。
估算单次 API 请求成本
价格是每百万 input tokens 10 美元,每百万 output tokens 50 美元。每个响应都在 usage 中提供了确切的计数,因此你可以精确计算出每次请求的成本,无需猜测:
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "Write a SQL query to find duplicate emails."}
],
)
input_tokens = response.usage.input_tokens
output_tokens = response.usage.output_tokens
input_cost = input_tokens / 1_000_000 * 10
output_cost = output_tokens / 1_000_000 * 50
total = input_cost + output_cost
print(f"Input: {input_tokens} tokens = ${input_cost:.6f}")
print(f"Output: {output_tokens} tokens = ${output_cost:.6f}")
print(f"Total: ${total:.6f}")
Output tokens 的成本是 input tokens 的五倍,因此让响应简洁是降低成本最有效的方法。一个 2,000 input tokens + 500 output tokens 的请求,成本为 2000 / 1M * $10 + 500 / 1M * $50,即 $0.02 + $0.025 = $0.045。乘以你的请求量即可估算预算。如果 output 成本占了大头,限制 max_tokens,并在系统提示词中要求简洁回答。Output 的定价逻辑与 Claude Opus 4.8 一致,只是换成了 Fable 5 的具体数值。
