课程
更新(2026 年 7 月 1 日):对 Claude Fable 5 的访问已恢复,现已在 Claude Platform、Claude.ai、Claude Code 和 Claude Cowork 全球开放,因出口管制令已解除。Mythos 5 仍仅限审核通过的 Project Glasswing 合作伙伴使用。
更新(2026 年 9 月 2 日): Anthropic 已发布 Fable 5 的后继模型。建议阅读我们的 Claude Fable 5.1 指南了解详情。
当我通过 API 测试一款新模型时,我更关心需要接到代码里的部分,而不是发布说明:API 调用长什么样、与上一代模型有何不同、成本多少、安全层拒绝时会发生什么?
我们的Claude Fable 5 概览文章介绍了发布情况、基准测试结果,以及让 Fable 5 与众不同的安全设置。下面的代码在此基础上展开。具体来说,我们将使用一个开发者任务助手,接受软件功能需求并返回结构化的实现计划,然后加入流式输出、工具使用、成本跟踪和 FastAPI 端点。
我们将依次完成:
- 发起一次 Fable 5 API 调用并读取响应
- 用 system 提示引导模型
- 使用结构化输出返回 JSON
- 将长响应流式传输到终端或 Web 客户端
- 连接一个简单工具并运行工具循环
- 在每次请求前后估算并跟踪 Token 成本
- 在不导致应用崩溃的情况下处理拒绝
- 处理用于 UI 评审或视觉分析的图像输入
- 通过 FastAPI 端点提供完整工作流
什么是 Claude Fable 5?
Claude Fable 5 是 Anthropic 于 2026 年 6 月 9 日发布的模型,对应的 API 模型字符串为 claude-fable-5。Anthropic 将其描述为与 Claude Mythos 5 共享相同基础模型,但应用了安全分类器以便广泛发布。Mythos 5 仍限于 Project Glasswing,这是面向可信安全组织的受限计划。
对开发者而言,相关 API 细节包括:
-
100 万 Token 的上下文窗口,以及每次请求最多 128k 的输出 Token
-
价格为每百万输入 Token 10 美元、每百万输出 Token 50 美元,是 Opus 4.8 的两倍
-
自适应思考始终开启,无法禁用。
effort参数用于控制深度;无论您是否展示,模型的内部推理都会生成并计费 -
这是“受覆盖模型(Covered Model)”,意味着必须保留数据 30 天。该模型不支持零数据保留。
我不会把它用于所有 API 调用。它更适合需要在架构、边界情况与实现细节间进行推理的任务。对于更简单的工作,Sonnet 4.6 或 Haiku 4.5 很可能就够了。
用 Fable 5 构建什么:开发者任务助手
我们要构建的助手接受一条软件功能需求并返回结构化计划:技术概要、按序实施步骤、可能修改的文件、风险与测试。
我选择这个示例,是因为它迫使我们处理真实集成中常见的 API 细节:结构化输出、流式传输、工具调用、成本与拒绝处理。示例虽小,但不只是 Hello World。
下面的章节将这些部件逐一搭建。

功能需求转为结构化计划。图片来源:作者。
主要代码位于本地脚本的 task_assistant.py 与 FastAPI 端点的 app.py。
前置条件
要跟着做,您需要:
-
Python 3.9 或更高版本(本教程使用 3.10+ 的特性,如 Pydantic 模型中的内置类型标注,但 SDK 本身支持 3.9+)
-
具有
claude-fable-5访问权限的 Anthropic API 密钥 -
对环境变量、JSON 和 HTTP API 的基础了解
-
一个终端和代码编辑器
项目设置
先创建项目文件夹和虚拟环境。
mkdir task-assistant
cd task-assistant
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
安装 Anthropic SDK、FastAPI 和一些辅助库。
pip install anthropic fastapi uvicorn python-dotenv pydantic
在项目根目录创建 .env 文件并写入您的 API 密钥。切勿将该文件提交到版本控制。
ANTHROPIC_API_KEY=sk-ant-...
在脚本顶部加载它。Anthropic() 会自动从环境读取 ANTHROPIC_API_KEY。
from dotenv import load_dotenv
from anthropic import Anthropic
load_dotenv()
client = Anthropic()
在模块级初始化一次客户端,并在整个教程中复用。
在 Python 中发起您的首次 Claude Fable 5 API 调用
在添加项目逻辑前,我喜欢先发送一个最小请求确认环境无误。Messages API 需要模型字符串、max_tokens 上限,以及一组 messages。max_tokens 是必填;若省略,SDK 会抛出 TypeError。
MODEL = "claude-fable-5"
def get_text(response):
"""Return the first text block, skipping thinking or tool blocks."""
return next((b.text for b in response.content if b.type == "text"), "")
response = client.messages.create(
model=MODEL,
max_tokens=512,
messages=[{"role": "user", "content": "Reply in one sentence to confirm the API connection is working."}]
)
print(get_text(response))
print(f"Model: {response.model}")
print(f"Input tokens: {response.usage.input_tokens}")
print(f"Output tokens: {response.usage.output_tokens}")

Fable 5 的 API 响应与 Token。图片来源:作者。
response.content 是内容块列表,而不是纯字符串。由于上文提到的自适应思考行为,首个块常常是思考块,直接访问 content[0].text 可能触发 AttributeError。get_text 助手函数改为按 block.type == "text" 过滤。
此外,usage 对象提供每次请求的输入与输出 Token 计数。 response.model 会报告实际响应的模型,这在配置了回退时尤为重要。
用 effort 控制推理深度
参数 effort 在 output_config 内传入,用于控制推理深度。
response = client.messages.create(
model=MODEL,
max_tokens=2048,
output_config={"effort": "high"}, # low | medium | high | xhigh | max
messages=[{"role": "user", "content": feature_request}]
)
默认值为 "high"。建议从此开始;当延迟更重要时用 "low" 或 "medium" ;而遇到更长的问题时用 "xhigh" 或 "max"。Effort 改变的是模型生成的思考 Token 数量,而不是是否生成。
为助手角色添加 System 提示
参数 system 是请求的顶层字段,独立于 messages 数组。它适用于每一轮对话,因此每个字的作用都比单轮指令更大。
对开发者任务助手,我把 system 提示保持得很收敛:返回简明的工程计划,而非泛泛而谈的分析。
SYSTEM_PROMPT = """You are a senior software engineer who reviews feature requests and returns
implementation plans. For every request:
- Write a one sentence technical summary
- List the implementation steps in order
- Name the files or components most likely to change
- Call out at most three risks or edge cases
- Suggest concrete tests
Do not narrate options you won't pursue. Act on what you know; ask only when key details are missing."""
最后这条指令很重要。Fable 5 在简单需求上可能会过度规划,因此用提示先对输出设定边界,避免跑偏。
在每次调用时一并传入 system 提示。
response = client.messages.create(
model=MODEL,
max_tokens=2048,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": feature_request}]
)
Fable 5 不支持预填充助手轮。如果您有较旧的 Claude 代码用 {"role": "assistant", "content": "{"} 开启助手轮以强制输出 JSON,请移除。该模式在 Fable 5 上会返回 400,这是移植旧代码时容易踩的坑。
构建功能规划工作流
规划一个功能意味着要在一次响应中兼顾架构、失效模式与测试策略。这是一个很好的入门工作流:足够小便于审查,但并非玩具级提示。
feature = (
"Add password reset to our Django app. "
"Users should receive a token via email and land on a form to set a new password."
)
response = client.messages.create(
model=MODEL,
max_tokens=2048,
output_config={"effort": "high"},
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": feature}]
)
print(get_text(response))
典型响应会在同一轮中覆盖 Token 生成、邮件发送、表单处理与过期清理。
用 Claude Fable 5 返回结构化 JSON 输出
纯文本在终端中尚可。一旦计划要落地成应用数据,结构化输出更易处理。Claude API 通过 client.messages.parse() 搭配 Pydantic 模型支持结构化输出,且可用于 claude-fable-5。
将期望的输出结构定义为 Pydantic 模型。
from pydantic import BaseModel
class FeaturePlan(BaseModel):
summary: str
steps: list[str]
files: list[str]
risks: list[str]
tests: list[str]
将该类作为 output_format 传入。SDK 会将其转为 JSON 架构,在 Anthropic 服务器上进行受限解码,并在 response.parsed_output 返回类型化对象。
response = client.messages.parse(
model=MODEL,
max_tokens=2048,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": feature}],
output_format=FeaturePlan
)
plan = response.parsed_output
if plan is not None:
print(f"Summary: {plan.summary}")
print(f"Steps: {plan.steps}")
在使用前检查 parsed_output 是否为 None。在流式过程中发生拒绝或提前 max_tokens 截断都可能令其为空。此路径也可避免思考块的问题,因为您读取的是 parsed_output,而不是深入 content。
若您需要在不支持结构化输出的模型上实现类似能力,可在提示中要求返回 JSON,并用 FeaturePlan.model_validate_json(text) 校验,失败时重试一次。不要将结构化输出与助手轮预填充同时使用;Fable 5 会对此返回 400。
从 Claude Fable 5 进行流式响应
同样的自适应思考行为会在复杂提示上增加首 Token 等待时间。流式传输可在文本到达时立即打印分片。
使用 client.messages.stream() 上下文管理器。stream.text_stream 会产出文本分片并自动跳过思考块。
with client.messages.stream(
model=MODEL,
max_tokens=2048,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": feature}]
) as stream:
for chunk in stream.text_stream:
print(chunk, end="", flush=True)
final = stream.get_final_message()
print(f"\nInput tokens: {final.usage.input_tokens}")
print(f"Output tokens: {final.usage.output_tokens}")
在 with 块结束后再调用 get_final_message()。停用原因与用量统计在此处提供。
流式与结构化输出可以共存,但需先累积完整响应再解析。部分 JSON 并非有效 JSON。
添加工具使用(函数调用)
工具使用让模型可以请求信息,而不只依赖提示。我先从一个很小的工具开始: read_project_file。模型请求读取文件,您的代码执行读取,模型再利用结果。
工具循环有固定形状:当模型想调用工具时,会返回 stop_reason: "tool_use";您执行工具并返回一个 tool_result 块;循环继续,直到 stop_reason 为 "end_turn" 或 "refusal"。

从请求到答案的工具循环。图片来源:作者。
READ_FILE_TOOL = {
"name": "read_project_file",
"description": "Read the contents of a file in the project.",
"input_schema": {
"type": "object",
"properties": {
"path": {"type": "string", "description": "Relative path to the file"}
},
"required": ["path"]
}
}
messages = [{"role": "user", "content": feature}]
while True:
response = client.messages.create(
model=MODEL,
max_tokens=2048,
system=SYSTEM_PROMPT,
tools=[READ_FILE_TOOL],
messages=messages
)
if response.stop_reason in ("end_turn", "refusal"):
break
if response.stop_reason == "tool_use":
tool_block = next(b for b in response.content if b.type == "tool_use")
# Execute the tool locally
try:
with open(tool_block.input["path"]) as f:
result = f.read()[:2000]
except FileNotFoundError:
result = f"File not found: {tool_block.input['path']}"
messages.append({"role": "assistant", "content": response.content})
messages.append({
"role": "user",
"content": [{
"type": "tool_result",
"tool_use_id": tool_block.id,
"content": result
}]
})
# Read the final answer
text_block = next((b for b in response.content if b.type == "text"), None)
print(text_block.text if text_block else "No text in final response")
模型不会执行这段代码。它会发出包含工具名称与 JSON 入参的结构化请求;您的应用负责读文件。不要在包含 tool_result 块的同一用户轮中追加对话文本,否则模型可能停止而不继续计划。
估算 Claude Fable 5 的 Token 使用与 API 成本
在将其做成应用之前,先看看成本结构。Fable 5 的价格为每百万输入 Token 10 美元、每百万输出 Token 50 美元。输出通常占大头:仅 2,000 Token 的计划,输出成本就有 0.10 美元。
下表是 Anthropic 家族的价格。
|
模型 |
输入(每百万 Token) |
输出(每百万 Token) |
备注 |
|
Haiku 4.5 |
$1 |
$5 |
最快,接近前沿质量 |
|
Sonnet 4.6 |
$3 |
$15 |
速度与深度的良好平衡 |
|
Opus 4.8 |
$5 |
$25 |
Opus 顶级档 |
|
Fable 5 |
$10 |
$50 |
最强大的广泛发布模型 |
提示缓存可以降低重复读取 system 提示的成本。一旦该块被缓存,重复读取的价格变为每百万 Token 1 美元而非 10 美元。Claude API 上可缓存的最小块为 512 Token。
# Count tokens before sending an expensive request
count = client.messages.count_tokens(
model=MODEL,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": feature}]
)
print(f"Estimated input tokens: {count.input_tokens}")
# Calculate actual cost after each request
INPUT_PRICE = 10.0 / 1_000_000
OUTPUT_PRICE = 50.0 / 1_000_000
response = client.messages.create(...)
cost = (
response.usage.input_tokens * INPUT_PRICE +
response.usage.output_tokens * OUTPUT_PRICE
)
print(f"Total cost: ${cost:.6f}")
count_tokens 不收费,也不计入输出速率限制。用它来拦截高成本请求。对于无需交互的作业,Batch API 可将输入与输出价格各减半。
Fable 5 使用 Opus 4.7 引入的分词器,相比旧版 Claude 模型,在同样文本上大约会多出 30% 的 Token。将此因素纳入从 Claude 4.6 的迁移考量。
处理拒绝与模型回退
Fable 5 在生成过程中并行运行安全分类器。一旦触发,API 会返回成功的 HTTP 200,而不是错误;唯一的信号是 stop_reason: "refusal"。只捕获异常的错误处理将完全漏掉拒绝,您的应用会悄无声息地返回空结果。
务必检查停用原因(stop reason)。
response = client.messages.create(
model=MODEL,
max_tokens=2048,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": user_input}]
)
if response.stop_reason == "refusal":
category = (
response.stop_details.category
if response.stop_details else "policy"
)
print(f"Request declined ({category}). Please rephrase and try again.")
else:
print(get_text(response))
在我的测试中,Fable 5 常会用普通文本拒绝边缘请求,并返回正常的 end_turn。而硬性分类器拒绝(stop_reason: "refusal" 且 content 为空)更少见。上述检查可覆盖该路径,避免应用静默返回空。
stop_details.category 可能为 "cyber"、"bio" 或 "reasoning_extraction"。最后一个在提示试图提取模型内部思维链时触发。若您在开发者工具中检查网络安全扫描器或生物数据管线,可能遇到分类器误报。将任务表述得更偏防御性,通常可以解决。
在部署系统中,您可以在 Claude API 与 Claude Platform on AWS 上通过 fallbacks beta 配置自动回退到 Opus 4.8,这是在服务器端运行的。它不同于 Amazon Bedrock:在 Bedrock、Vertex AI 与 Foundry 上,回退逻辑需要由您的应用实现。
response = client.beta.messages.create(
model=MODEL,
max_tokens=2048,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": user_input}],
fallbacks=[{"model": "claude-opus-4-8"}],
betas=["server-side-fallback-2026-06-01"]
)
完全未生成输出的被拒请求不计费。中途被拒则会为分类器触发前已生成的内容计费。
将图像(视觉)输入用于 Claude Fable 5
如果您的应用只处理文本,可以跳过本节。本部分独立于规划流程,但使用相同的 Messages API 结构。Fable 5 接受 base64 编码块或 URL 形式的图像输入。一个用例是将 UI 截图与功能需求进行对照评审。
import base64
with open("login_form.png", "rb") as f:
img_data = base64.standard_b64encode(f.read()).decode("utf-8")
response = client.messages.create(
model=MODEL,
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": img_data
}
},
{
"type": "text",
"text": "Review this UI against the requirement: add a 'Forgot password' link below the login button. Is it present? If not, describe what needs to change."
}
]
}]
)
print(get_text(response))
完整尺寸图像的成本大约为 4,784 个输入 Token,与图像内容无关,因此若不需要全分辨率,请先缩放或压缩。Fable 5 可处理宽度最高 2,576 像素的图像,更大的会被缩小。支持 JPEG、PNG、GIF 与 WebP。
将工作流封装为 FastAPI 端点
此时,本地脚本已具备完整工作流。将助手封装进一个 FastAPI 路由,便于前端或服务调用。在异步路由中使用 AsyncAnthropic,因为同步客户端会阻塞事件循环。只在启动时初始化一次,而不是每个请求都初始化。
from contextlib import asynccontextmanager
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from anthropic import AsyncAnthropic
client_instance: AsyncAnthropic | None = None
@asynccontextmanager
async def lifespan(app: FastAPI):
global client_instance
client_instance = AsyncAnthropic()
yield
await client_instance.close()
app = FastAPI(lifespan=lifespan)
class PlanRequest(BaseModel):
feature_request: str
@app.post("/plan")
async def create_plan(body: PlanRequest):
response = await client_instance.messages.create(
model="claude-fable-5",
max_tokens=2048,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": body.feature_request}]
)
if response.stop_reason == "refusal":
raise HTTPException(status_code=400, detail="Request declined by safety classifier.")
return {
"plan": get_text(response),
"input_tokens": response.usage.input_tokens,
"output_tokens": response.usage.output_tokens
}
使用 uvicorn app:app --reload 启动,并通过 /plan 端点在 FastAPI 文档 http://localhost:8000/docs 中进行测试。
切勿从前端请求体接收 API 密钥。密钥应保存在服务器上,从环境读取,绝不出现在客户端代码中。
Claude API 的部署注意事项
上述端点在本地可用。将同样的模式部署前,请检查以下事项。
-
密钥与机密。 API 密钥应作为服务器的环境变量存在,切勿放入代码库或提交的配置文件中。
-
速率限制与重试。 HTTP 429 表示触发了速率限制;HTTP 529 表示 Anthropic 基础设施过载。SDK 默认重试两次;部署系统中应加入抖动,并将尝试上限设为 4–5 次。
-
成本控制。 记录每次请求的输入与输出 Token 计数。
-
拒绝处理。 将
stop_reason: "refusal"视为应用状态,而非错误。跟踪触发误报的提示模式。 -
上下文管理。上下文窗口很大,但长时间的工具会话会快速积累历史。监控每次请求的
input_tokens,并在不再需要时考虑裁剪旧的工具结果。 -
数据保留。模型详情部分提到 Fable 5 是受覆盖模型,必须保留 30 天数据。若这带来合规问题,请改用其他模型。
-
结构化输出校验。索引前请检查
response.parsed_output非None。如自行校验 JSON,用model_validate_json包一层 try/except,并在ValidationError时重试一次。 -
请求 ID。 为每次 Fable 5 调用记录
response._request_id。支持团队需要它来追踪具体请求。
何时应使用 Claude Fable 5?
即便搭好了工作流,模型选择仍是独立决策。我的原则:仅在错误或浅显的答案代价高于请求成本时,才使用 Fable 5。
Fable 5 适合由多部分相互关联的任务。Anthropic 报告早期部署曾在一天内完成对 5,000 万行代码库的迁移。这类说法并不意味着所有应用都应路由到 Fable 5,而是表明该模型面向需要长上下文与规划并重的工作。其他用例包括:
- 多步骤的软件规划,一旦架构出错代价高昂
- 长上下文的文档审阅,章节之间存在依赖关系
- 需要多次工具调用的代理式编码任务
- 需要沿着间接影响追踪根因的调试
- 错误答案的代价高于请求成本的任务
我会避免用于:
- 基础摘要或分类
- 简短 FAQ 回答
- 成本在每天数千次请求中复利叠加的流水线
Cognition.ai 的代码评估显示,在 xhigh effort 下,Fable 5 在其评测集上得分 29.3%,而 Opus 4.8 为 13.4%。这只是一个基准。更有意义的测试是当您更换模型后任务是否改善;我们的 Claude Fable 5 与 GPT-5.5 对比 将该取舍单独展开。
此仓库中的 Streamlit 应用可以让您用自己的提示进行对比:粘贴一条功能需求,观察计划的流式返回并查看 Token 成本。源码在 GitHub。下面的录屏展示了工作流。
结语
至此,文首的开发者任务助手已分别通过本地脚本与 FastAPI 路由接入 Claude API。
同样的请求模式也适用于其他助手设计。若是代码评审助手,替换 system 提示并将文件工具指向 diff;若是重构代理,则将会话历史纳入工具循环。
对于长会话,将 system 提示与工具定义一并缓存,以减少重复输入成本。
想了解更多 Claude 与 Anthropic API 的背景,请参阅我们的 Claude 模型入门课程。若想练习编码端,参阅我们的 用 Cursor 进行软件开发课程,涵盖提示、重构、测试与代理工作流。
常见问题
如果工具调用被截断怎么办?
如果 stop_reason 是 "max_tokens" 且模型正构造 tool_use 块,请不要运行不完整的工具输入。用更高的 max_tokens 值或更窄的提示重试。在执行本地工具前我会做此检查,因为半成型的 JSON 比不调用工具更糟。
提示缓存能缓解速率限制吗?
会,但只覆盖限制的一部分。缓存读取按正常输入价格的 10% 计费,且对当前 Claude 模型,不计入每分钟输入 Token 限制。您仍需关注每分钟请求数与每分钟输出 Token。记录 cache_creation_input_tokens 与 cache_read_input_tokens,便于在自有统计中体现。
可以在 Batch API 中使用回退吗?
不能。Fable 5 支持消息批处理(Message Batches),批处理请求会将输入与输出价格各减半,但 fallbacks 参数在其中不受支持。对批处理作业,将每条结果视为独立记录,并检查输出中的 stop_reason: "refusal"。
调试 API 调用时应记录什么?
调试 API 调用时记录请求 ID、模型名称、停用原因、输入 Token、输出 Token,以及缓存 Token 字段。针对速率限制,还要保留 429 响应的 retry-after 值,以及客户端暴露的任意 anthropic-ratelimit-* 头。听起来枯燥,但在事后解释一次昂贵或失败的请求时很关键。
我最多能发送多少张图片?
视觉文档支持多种图像来源,包括 base64 块、URL 与 Files API。文档还写明每次请求最多可发 600 张图,但我仍建议先从小规模开始。图像 Token 累积很快,大多数 UI 评审任务并不需要数百张截图。
