Claude Opus 5 vs Claude Fable 5:7 项真实 API 测试,速度、过滤与生产路由怎么选?

Claude 模型 API 对比

Claude Opus 5 和 Claude Fable 5 应该怎么选?

如果只看一次成功回答,两款模型都能给出不错的数学推导。真正影响生产体验的,往往是另外三个问题:

  1. 同一类任务能不能稳定交付;
  2. 延迟是否适合在线交互;
  3. 发生过滤、空正文或异常回答后,系统能不能自动恢复。

2026 年 7 月 25 日,我通过同一个 OpenAI-compatible API,使用相同提示词和参数,对 claude-opus-5claude-fable-5 做了 7 类任务测试。

先说结论:

  • claude-fable-5 在双方都成功的任务上更快,输出也更短;
  • claude-opus-5 主测试完成 6/7,重试后完成 7/7;
  • Fable 5 在普通 Python 代码审查和事故 JSON 提示词上连续触发 content_filter
  • Opus 5 的物理题前两次虽然返回 HTTP 200,却只回复了问候语,第 3 次才恢复正常。

所以,这次测试最重要的结论不是“谁绝对更强”,而是:两款模型的失败形态不同,生产系统不能只配置一个模型 ID,也不能只检查 HTTP 状态码。

一、测试环境

测试前先调用模型列表接口,确认两个模型 ID 都存在:

GET https://cn.crazyrouter.com/v1/models

claude-opus-5
claude-fable-5

正式请求统一使用:

POST https://cn.crazyrouter.com/v1/chat/completions

公共参数:

相同 system prompt
相同 user prompt
temperature = 1
每道题使用相同 max_tokens
stream = true
不使用工具,不联网

统一 system prompt:

Answer the user's task accurately. Follow every requested output format and length constraint exactly. Do not use external tools.

这次测试不把 HTTP 200 自动算作成功。每个请求还会检查:

  • finish_reason
  • 可见正文是否为空;
  • 是否包含题目要求的关键字段;
  • 数学和物理数值是否命中参考值;
  • JSON 是否可以直接解析;
  • 代码分析是否指出真实 bug;
  • response ID、returned model、首 token 时间和总延迟。

需要说明的是:这是通过 API 网关完成的端到端测试,没有固定单一上游渠道。因此结果同时反映模型、上游过滤、路由和当时渠道状态,不能当成纯离线模型排行榜。

二、7 项任务结果

Claude API 行为与输出测试

测试维度 Claude Opus 5 Claude Fable 5 生产影响
精确数学:马尔可夫链 通过 通过 两者均得到正确的一阶矩、二阶矩与方差
数值物理:耦合振子 前两次仅回复问候语,第 3 次通过 首轮通过 Opus 需要内容验收和重试
约束搜索 通过 通过 两者均找到唯一解
统计纠错 通过 通过 两者均拒绝错误前提并给出正确上界
Python 代码审查 通过 连续 3 次 content_filter Fable 当前不适合未经回归的代码审查流量
严格 JSON 事故摘要 通过 连续 3 次 content_filter Fable 当前不适合这类事故文本
实验设计 通过 通过 两者都能识别未配对样本和难度混杂

主测试一次交付率:

Claude Opus 5: 6 / 7 = 85.7%
Claude Fable 5: 5 / 7 = 71.4%

加入异常复测后:

Claude Opus 5: 7 / 7
Claude Fable 5: 5 / 7

这里的“交付”指业务拿到了可用答案。以下情况即使 HTTP 状态是 200,也仍然判定失败:

  • 正文为空;
  • finish_reason=content_filter
  • 输出被截断;
  • 只返回通用问候语;
  • 缺少任务要求的字段;
  • 代码或计算结果没有通过独立检查。

三、数学与约束推理:两款模型都通过

数学题使用三状态马尔可夫链,要求计算从状态 1 首次到达状态 3 的等待时间:

E1[τ]
E1[τ²]
Var1(τ)

两款模型都给出了正确结果:

E1[τ] = 5
E1[τ²] = 43
Var1(τ) = 18

两者也都写出了暂态矩阵 Q,并用一阶矩和二阶矩方程完成验证。这一题没有出现“最终数字正确,但中间推导自相矛盾”的情况。

约束搜索题要求把 A、B、C、D、E 五场演讲放入五个时段,同时满足:

C 紧跟 A
B 在 D 之前
E 不能在第一或最后
D 恰好在 E 后两个时段
B 不能与 A 相邻

两款模型都找到唯一顺序:

A, C, E, B, D

统计纠错题故意给出一个错误前提:

E[X] = 10
Var(X) = 4
所以 P(X >= 14) = 0.5

Opus 5 和 Fable 5 都指出,仅凭均值和方差无法唯一确定尾概率,并使用单侧 Chebyshev/Cantelli 不等式得到:

P(X >= 14) <= 0.2

这三类题说明,在结构明确、输出较短、验收标准清晰的数学与逻辑任务上,Fable 5 的速度优势并不是靠明显牺牲正确性换来的。

四、物理题:Fable 首轮成功,Opus 第三次恢复

物理题是带接地阻尼和耦合阻尼的二自由度振子。模型需要计算:

  • 两个无阻尼固有频率;
  • ω=8 rad/s 时两个质量块的振幅;
  • 两个响应相对外力的相位。

参考值:

ω1 = 10.0204 rad/s
ω2 = 16.2149 rad/s
|X1| = 0.14929 m, phase = -12.15°
|X2| = 0.07174 m, phase = -13.90°

Fable 5 首轮返回的六个数值全部正确。

Opus 5 的前两次调用则出现一个值得关注的异常:

HTTP 200
finish_reason = stop
content = "Hi! How can I help you today?"
prompt_tokens = 10

真实题目显然不止 10 个 prompt tokens,因此这更像某次请求路径没有正常携带用户输入,而不是模型计算错误。

使用完全相同的参数执行第 3 次请求后,Opus 5 在 34.901 秒内完整返回,所有数值均通过检查。

这类问题不能靠检查 status_code == 200 发现。调用端至少应该检查:

required_terms = ("ω1", "ω2", "X1", "X2")
valid = all(term in answer for term in required_terms)

缺少任一字段就重试或切换模型。

五、代码审查与严格 JSON:Fable 连续触发过滤

代码题要求审查下面的 DFS 环检测逻辑:

def has_cycle(graph):
    visiting, visited = set(), set()

    def dfs(node):
        if node in visiting:
            return True
        if node in visited:
            return False

        visiting.add(node)
        for nxt in graph.get(node, []):
            if dfs(nxt):
                return True

        visited.add(node)
        return False

    return any(dfs(node) for node in graph)

bug 是节点完成 DFS 后没有从 visiting 删除。visiting 本应只表示当前递归栈,却逐渐变成“所有访问过的节点”,最终会把某些 DAG 误判为有环。

Opus 5 给出的最小修复正确:

visiting.discard(node)
visited.add(node)
return False

Fable 5 没有返回分析,而是:

HTTP 200
finish_reason = content_filter
content = ""

为了排除偶发问题,我分别执行了原始测试、清洁 system prompt 复测和独立单题重试,三次结果都是 content_filter

严格 JSON 题也出现同样情况。输入只是 15 分钟内的请求总数、失败数、渠道归因、重试恢复数和处置动作,要求模型返回一个 JSON 对象。

Opus 5 返回的 JSON 可以直接解析;Fable 5 连续三次被过滤。

两次独立复测 response ID:

代码审查:gen-1784915384-vGI1PtuNXZG0IJ2YiaCz
事故 JSON:gen-1784915390-buOWZQSnqjgHeJ6nUogF

这两个提示词没有要求执行攻击、绕过权限或生成危险代码。因此,本轮更合理的判断是上游过滤误报,而不是合理拒答。

对 API 使用者来说,安全过滤也是模型的生产能力之一。如果正常代码审查或事故复盘文本会稳定触发过滤,就不能让该模型直接接管所有业务流量。

六、延迟和输出长度

为了避免把失败请求的短耗时误算成速度优势,这里只比较两款模型都成功的四项任务:

  • 马尔可夫链;
  • 约束搜索;
  • 统计纠错;
  • 实验设计。

单次延迟:

任务 Opus 5 Fable 5
精确数学 16.588 s 20.307 s
约束搜索 10.617 s 8.357 s
统计纠错 10.841 s 7.937 s
实验设计 8.311 s 7.143 s

汇总:

指标 Opus 5 Fable 5
P50 总延迟 10.729 s 8.147 s
P50 首个可见 token 8.376 s 6.974 s
平均可见 completion tokens 797.5 452.3

在这个小样本里:

  • Fable 5 的 P50 总延迟低约 24%;
  • 首个可见 token 时间低约 17%;
  • 可见输出平均短约 43%。

这对在线聊天、批量摘要和高频结构化任务有实际意义。但四道题的中位数不能当成 SLA。正式上线前,应该用真实业务提示词重复 20~50 次,再统计任务成功率、过滤率、P50、P95、P99 和成本。

Fable 5 的响应提供了 cost 字段,本轮 7 次主请求合计约 0.24596 美元。Opus 5 的响应没有提供同口径 cost 字段,因此本文不做美元价格排名。字段缺失不代表免费,也不应该用未经核实的价格补齐。

七、生产路由建议

Claude 模型生产路由

结合本轮结果,更合理的分工是:

Fable 5 作为已验证任务的第一跳

适合:

  • 已做过提示词回归的数学与约束任务;
  • 对首 token 和总延迟敏感的在线交互;
  • 希望减少输出长度和后处理开销的任务。

但调用端必须检查:

finish_reason == content_filter
正文为空
必需字段缺失
JSON 解析失败

Opus 5 作为高覆盖回退

适合:

  • 输入类型不可预测;
  • 代码审查、严格 JSON 和复杂物理任务;
  • Fable 5 触发过滤后,需要自动恢复的请求。

Opus 5 同样不能免检。本轮的通用问候语异常说明,HTTP 200 和 finish_reason=stop 仍然可能没有业务答案。

OpenAI-compatible 路由代码

下面的示例先调用 Fable 5,遇到过滤、空正文或验收失败时回退 Opus 5。Opus 如果只返回问候语,再重试一次。

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://cn.crazyrouter.com/v1",
)


def valid_answer(text: str, required_terms: tuple[str, ...]) -> bool:
    text = (text or "").strip()
    if not text:
        return False
    if text.lower().startswith("hi! how can i help"):
        return False
    return all(term in text for term in required_terms)


def call_model(model: str, prompt: str):
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        temperature=1,
        max_tokens=3000,
    )
    choice = response.choices[0]
    return choice.message.content or "", choice.finish_reason


def routed_completion(prompt: str, required_terms=()):
    routes = (
        ("claude-fable-5", 1),
        ("claude-opus-5", 2),
    )

    for model, attempts in routes:
        for _ in range(attempts):
            text, finish_reason = call_model(model, prompt)

            if finish_reason == "content_filter":
                break

            if valid_answer(text, required_terms):
                return {
                    "model": model,
                    "content": text,
                }

    raise RuntimeError("No model produced a valid business answer")


result = routed_completion(
    "Return a JSON incident summary with total, failed and recovered.",
    required_terms=('"total"', '"failed"', '"recovered"'),
)

print(result)

实际项目还应该记录:

requested model
returned model
response ID
finish_reason
首 token 时间
总延迟
验收失败原因
是否发生回退

这样才能区分模型算错、输出截断、内容过滤和路由异常,而不是把它们都归入一个模糊的“模型失败”。

八、最终结论

本轮测试中,两款模型的特点很清晰:

Claude Fable 5

优点:

  • 共同成功任务的中位延迟更低;
  • 输出更短;
  • 数学、约束、统计纠错和实验设计均通过。

风险:

  • 普通代码审查和事故 JSON 连续触发过滤;
  • 不适合在没有提示词回归和模型回退的情况下接管全部流量。

Claude Opus 5

优点:

  • 主测试覆盖更广;
  • 代码审查和严格 JSON 成功;
  • 物理题重试后完整通过。

风险:

  • 两次物理请求只返回通用问候语;
  • 输出通常更长;
  • 仍然需要关键字段验收和自动重试。

最终建议不是二选一,而是:

已验证的高频任务:Fable 5 优先
content_filter / 空正文 / 验收失败:回退 Opus 5
Opus 返回问候语或字段缺失:重试一次
仍失败:切换渠道并报警

只有把模型选择、内容验收、重试和回退放在一起,模型对比结果才会真正转化成生产可靠性。

完整测试原文与更多 response ID:

https://crazyrouter.com/zh/blog/claude-opus-5-vs-claude-fable-5-api-benchmark-2026?utm_source=csdn&utm_medium=article&utm_campaign=claude_opus5_fable5_benchmark_20260725&utm_content=csdn_claude_opus5_fable5__source

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐