跳至内容

Claude Fable 5 API 教程:用 Python 构建开发者任务助手

将 Claude Fable 5 API 连接到 Python 项目,构建带结构化 JSON 输出、流式传输、工具使用、拒绝处理与 FastAPI 端点的开发者任务助手。
已更新 2026年10月6日  · 13分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

更新(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。

下面的章节将这些部件逐一搭建。

图示展示功能需求流入 Claude Fable 5,并返回带可选工具使用的结构化计划

功能需求转为结构化计划。图片来源:作者。

主要代码位于本地脚本的 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}")

终端展示 Claude Fable 5 API 的响应与 Token 使用计数

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"。

Claude 工具使用循环流程图,从工具请求到最终答案

从请求到答案的工具循环。图片来源:作者。

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 中进行测试。

FastAPI 文档确认端点可用。视频来源:作者。

切勿从前端请求体接收 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。下面的录屏展示了工作流。

Streamlit 应用以流式方式输出计划。视频来源:作者。

结语

至此,文首的开发者任务助手已分别通过本地脚本与 FastAPI 路由接入 Claude API。

同样的请求模式也适用于其他助手设计。若是代码评审助手,替换 system 提示并将文件工具指向 diff;若是重构代理,则将会话历史纳入工具循环。

对于长会话,将 system 提示与工具定义一并缓存,以减少重复输入成本。

想了解更多 Claude 与 Anthropic API 的背景,请参阅我们的 Claude 模型入门课程。若想练习编码端,参阅我们的 用 Cursor 进行软件开发课程,涵盖提示、重构、测试与代理工作流。


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

我是一名数据工程师兼社区建设者,专注于数据管道、云端与 AI 工具链,同时为 DataCamp 和新兴开发者撰写实用且高影响力的教程。

常见问题

如果工具调用被截断怎么办?

如果 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 评审任务并不需要数百张截图。

主题
人工智能

与 DataCamp 一起学习

课程

Claude Code 101

3 小时
27.7K
Learn how to use Claude Code effectively in your daily development workflows.
查看详情Right Arrow
开始课程
查看更多Right Arrow