实测 Claude Fable 5 vs Claude Sonnet 5:别只看模型名,先看 API 返回是否真的可用

摘要

这篇文章记录一次 claude-fable-5claude-sonnet-5 的 API 实测对比。

重点不是做“大模型排行榜”,也不是判断哪个模型绝对更强,而是从开发者接入角度看几个更实际的问题:

  • 模型 ID 是否真的出现在当前 /v1/models 列表里
  • OpenAI-compatible Chat Completions 是否能正常调用
  • HTTP 200 后,返回内容是否真的可用
  • 同一个结构化 JSON 任务下,两个模型的输出形态有什么差异
  • 生产环境里应该如何做 content、finish_reason 和 JSON 解析校验

测试时间:2026-07-03。
测试接口:Crazyrouter OpenAI-compatible API。
Base URL:https://cn.crazyrouter.com/v1

结论先说:这次小样本实测中,claude-fable-5claude-sonnet-5 都能在模型列表中看到,也都能通过最小 exact-output 测试。但在同一个紧凑 JSON 任务里,claude-fable-5 返回了可见 JSON,claude-sonnet-5 返回 HTTP 200 和 finish_reason: stop,但 visible content 为空。生产环境不能只判断 HTTP 200。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


一、为什么要做这个测试

新模型上线后,很多文章会直接讨论:

  • 哪个模型更聪明
  • 哪个模型适合写代码
  • 哪个模型适合写作
  • 哪个模型性价比更高

这些问题当然重要,但真正接入业务时,第一层问题往往更基础:

  1. 这个模型 ID 现在是不是真的可用?
  2. 我用当前 API endpoint 能不能调通?
  3. 返回 HTTP 200 之后,choices[0].message.content 是否有内容?
  4. 如果要求模型返回 JSON,能不能被程序稳定解析?
  5. 失败时能不能自动 fallback,而不是悄悄把空结果写进业务库?

所以本文更像一次“生产接入前的探活记录”,不是完整 benchmark。


二、测试环境

本次测试使用 OpenAI-compatible 接口。

Base URL: https://cn.crazyrouter.com/v1
Test date: 2026-07-03

Endpoints:
- GET /v1/models
- POST /v1/chat/completions

Models:
- claude-fable-5
- claude-sonnet-5

注意:API endpoint 不应该带 UTM 或其他跟踪参数。
比如:

正确: https://cn.crazyrouter.com/v1
错误: 在 API Base URL 后面拼接 UTM 或其他跟踪参数

三、先查模型列表,不要直接相信旧文档

新模型、别名模型、路由模型上线时,第一步建议先查模型列表。

本次通过:

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

确认到了两个模型:

claude-fable-5
claude-sonnet-5

并且两者都显示支持:

supported_endpoint_types: anthropic, openai
public_endpoint_types: anthropic, openai

这一步很重要,因为“我在某篇文章里看到这个模型名”和“当前生产 API 里能调用这个模型”不是同一件事。

建议上线前至少做三层确认:

检查项 目的
/v1/models 是否包含模型 ID 确认当前 endpoint 可见
最小 prompt 是否返回可见文本 确认不是只在列表里
真实业务 prompt 是否满足格式契约 确认能进生产链路

四、测试 1:最小 exact-output 请求

第一组测试很简单:让模型返回指定文本。
这种测试不能代表模型能力,但可以快速确认模型能否正常完成一次 Chat Completions。

1. Claude Fable 5

请求体:

{
  "model": "claude-fable-5",
  "messages": [
    {
      "role": "user",
      "content": "Return exactly: Claude Fable 5 test OK"
    }
  ],
  "max_tokens": 30
}

返回结果:

HTTP: 200
Response ID: msg_01MPuZqzZwj6ysEuzamkxdUC
Output: Claude Fable 5 test OK
Finish reason: stop
Prompt tokens: 24
Completion tokens: 14
Total tokens: 38

2. Claude Sonnet 5

请求体:

{
  "model": "claude-sonnet-5",
  "messages": [
    {
      "role": "user",
      "content": "Return exactly: Claude Sonnet 5 test OK"
    }
  ],
  "max_tokens": 30
}

返回结果:

HTTP: 200
Response ID: msg_0195uVQqkDHcxNFgnJYiPTNV
Output: Claude Sonnet 5 test OK
Finish reason: stop
Prompt tokens: 91
Completion tokens: 16
Total tokens: 107

这一轮结论很明确:两个模型都通过了最小 exact-output 测试。


五、测试 2:同一个 JSON 输出任务

第二组测试更接近实际业务。
很多后端系统会要求模型返回结构化 JSON,然后进入下一步解析。

本次使用同一个 prompt:

Return compact JSON with keys choice and reason.
Task: choose between a creative writing model and an engineering coding model for drafting a product launch story.

这个任务并不复杂,预期输出是一个包含 choicereason 的紧凑 JSON。


六、JSON 任务结果对比

测试项 claude-fable-5 claude-sonnet-5
是否在 /v1/models 中可见
exact-output 测试 通过 通过
exact-output response ID msg_01MPuZqzZwj6ysEuzamkxdUC msg_0195uVQqkDHcxNFgnJYiPTNV
JSON 任务 HTTP 200 200
JSON 任务 response ID msg_018ht1NoiLUSdhnSAw7ScQ8g chatcompl_01VV1nUDJdqUwjgH2zBfVUp7
JSON 任务可见内容 返回 JSON visible content 为空
JSON 任务 finish_reason stop stop
JSON 任务耗时 4199 ms 4072 ms
JSON 任务 total tokens 130 115

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


七、Claude Fable 5 的 JSON 任务结果

claude-fable-5 返回:

HTTP: 200
Elapsed: 4199 ms
Response ID: msg_018ht1NoiLUSdhnSAw7ScQ8g
Finish reason: stop
Prompt tokens: 52
Completion tokens: 78
Total tokens: 130

可见输出:

{
  "choice": "creative writing model",
  "reason": "A product launch story requires narrative flair, engaging tone, and persuasive storytelling, which a creative writing model handles better than a coding-focused model."
}

这次结果对程序比较友好:

  • content 非空
  • JSON 字段符合预期
  • finish_reasonstop
  • 可以继续进入 JSON parse 和 schema 校验

八、Claude Sonnet 5 的 JSON 任务结果

claude-sonnet-5 返回:

HTTP: 200
Elapsed: 4072 ms
Response ID: chatcompl_01VV1nUDJdqUwjgH2zBfVUp7
Finish reason: stop
Prompt tokens: 114
Completion tokens: 1
Total tokens: 115
Cached tokens: 186
Visible output: empty

这里最容易踩坑。

如果代码只判断:

if response.status_code == 200:
    mark_success()

那这次调用会被错误地标记为成功。
但从业务角度看,如果下游需要 JSON,这次响应其实不可用,因为可见内容为空。

这不代表 claude-sonnet-5 一定“不行”,也不能据此下能力结论。它只说明在这个测试窗口、这个 endpoint、这个 prompt 下,返回结果不满足这次业务契约。


九、HTTP 200 不等于业务成功

AI API 接入里,一个常见问题是“半成功”:

  • HTTP status 是 200
  • SDK 没有抛异常
  • finish_reason 看起来正常
  • 但是 content 为空
  • 或者 content 不是合法 JSON
  • 或者 JSON 字段缺失
  • 或者 usage 异常

所以生产环境不要只判断 HTTP 200。

更稳的判断方式是:

HTTP 200
+ choices 存在
+ message.content 非空
+ finish_reason 符合预期
+ 输出格式符合业务契约
= 业务可用响应

如果业务要求 JSON,还应该继续做:

  • json.loads() 解析
  • JSON schema 校验
  • 关键字段校验
  • parse 失败重试
  • fallback model
  • 异常日志记录

十、Python 调用示例

下面是一个最小 OpenAI SDK 风格调用示例:

from openai import OpenAI

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

resp = client.chat.completions.create(
    model="claude-fable-5",
    messages=[
        {
            "role": "user",
            "content": "Return compact JSON with keys choice and reason."
        }
    ],
    max_tokens=120,
)

choice = resp.choices[0]
content = choice.message.content or ""

print("response id:", resp.id)
print("finish_reason:", choice.finish_reason)
print("content:", content)
print("usage:", resp.usage)

但生产环境里,只打印结果不够,建议加上强校验。


十一、生产环境推荐的校验代码

如果模型输出是自然语言,至少校验 content 和 finish_reason:

def validate_text_response(resp):
    if not resp.choices:
        raise RuntimeError("empty choices")

    choice = resp.choices[0]
    content = choice.message.content or ""

    if not content.strip():
        raise RuntimeError(
            f"empty model output, response_id={resp.id}, finish_reason={choice.finish_reason}"
        )

    if choice.finish_reason not in ("stop", "tool_calls"):
        raise RuntimeError(
            f"unexpected finish_reason={choice.finish_reason}, response_id={resp.id}"
        )

    return content

如果模型输出是 JSON,再加一层解析:

import json
import re


def parse_model_json(content: str) -> dict:
    if not content or not content.strip():
        raise ValueError("empty model output")

    text = content.strip()

    # 兼容模型返回 ```json ... ```的情况
    match = re.match(r"^```(?:json)?\s*(.*?)\s*```$", text, re.DOTALL)
    if match:
        text = match.group(1).strip()

    data = json.loads(text)

    for key in ("choice", "reason"):
        if key not in data:
            raise ValueError(f"missing key: {key}")

    return data

实际业务里还可以继续加 JSON schema、字段类型、枚举值范围等校验。


十二、怎么选择 Claude Fable 5 和 Claude Sonnet 5

基于这次小样本测试,我会这样看:

1. 偏创意、文案、产品故事

可以优先测试 claude-fable-5

适合场景:

  • 产品发布故事
  • 品牌语气改写
  • 创意写作
  • 营销文案
  • 需要自然语言质量的短结构化输出

这次测试中,claude-fable-5 在 exact-output 和 JSON 任务里都返回了可见内容。

2. 偏通用分析、工程任务、代码理解

可以把 claude-sonnet-5 放进候选。

适合场景:

  • 技术解释
  • 代码 review
  • 工程分析
  • 多步骤推理
  • 生产助手类工作流

但这次 JSON 任务也提醒我们:接入时必须校验可见内容和输出形态,不能因为模型名是 Sonnet 就默认结果可用。

3. 严格 JSON 工作流

不要只靠 prompt。

建议做:

模型输出 -> content 非空校验 -> JSON normalize -> json.loads -> schema 校验 -> 失败重试 / fallback

如果你的业务链路里 JSON parse 失败会导致任务中断,最好把 parse failure rate 单独做成监控指标。


十三、生产路由建议

一个比较稳的策略是按任务类型路由,而不是按模型名信仰路由。

创意写作 / 品牌文案 / 产品故事
-> 优先 claude-fable-5,失败 fallback 到其他写作模型

工程分析 / 代码 review / 技术解释
-> claude-sonnet-5 进入候选,但必须做输出校验

严格 JSON / 工作流参数生成
-> 所有模型都必须经过 JSON parse 和 schema 校验

线上默认模型
-> 小流量 canary + p95 latency + parse failure rate + fallback

建议至少记录这些字段:

字段 用途
response id 排查单次请求
model 确认实际路由
finish_reason 判断是否正常结束
content empty 判断是否有可见输出
parse success 判断是否满足业务格式
prompt_tokens / completion_tokens 成本和异常监控
latency 性能监控

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


十四、这次测试不能说明什么

为了避免误读,这里也写清楚边界。

这次测试不能说明:

  • claude-fable-5 在所有任务上都强于 claude-sonnet-5
  • claude-sonnet-5 不适合 JSON
  • 两个模型的长期稳定性
  • 两个模型的价格优势
  • 两个模型在真实复杂业务中的完整表现

这次测试只能说明:

  • 两个模型在测试窗口都出现在 /v1/models
  • 两个模型都通过最小 exact-output 请求
  • 同一个 JSON prompt 下,Fable 5 返回可见 JSON,Sonnet 5 这次返回空 visible content
  • 生产环境应该检查 output shape,而不是只看 HTTP 200

模型能力是一个问题,接口返回是否满足业务契约是另一个问题。
工程接入时,后者通常更先影响线上稳定性。


十五、总结

本次实测结论如下:

  • claude-fable-5claude-sonnet-5 都出现在 Crazyrouter /v1/models 中。
  • 两者都支持 anthropicopenai endpoint types。
  • 两者都能通过 OpenAI-compatible Chat Completions 的 exact-output 测试。
  • claude-fable-5 exact-output response ID:msg_01MPuZqzZwj6ysEuzamkxdUC
  • claude-sonnet-5 exact-output response ID:msg_0195uVQqkDHcxNFgnJYiPTNV
  • 同一个 JSON 任务里,claude-fable-5 返回可见 JSON,response ID:msg_018ht1NoiLUSdhnSAw7ScQ8g
  • 同一个 JSON 任务里,claude-sonnet-5 返回 HTTP 200 和 finish_reason: stop,但 visible content 为空,response ID:chatcompl_01VV1nUDJdqUwjgH2zBfVUp7
  • 生产环境必须校验 content、finish_reason、JSON parse 和 schema,不要只判断 HTTP 200。

如果只是体验模型,两个都可以试。
如果要接入生产,建议先用自己的真实 prompt 跑一组最小评估,再决定默认路由和 fallback 策略。

模型发布是新闻,模型可用性是工程事实。
中间最好隔一层自己的测试脚本。


参考链接

  • Crazyrouter 模型列表与 API 入口:https://crazyrouter.com/models?utm_source=csdn&utm_medium=article&utm_campaign=claude_fable_vs_sonnet_20260703&utm_content=csdn_model_list
  • 原始英文实测文章:https://crazyrouter.com/blog/claude-fable-5-vs-claude-sonnet-5-api-test-2026?utm_source=csdn&utm_medium=article&utm_campaign=claude_fable_vs_sonnet_20260703&utm_content=csdn_original_article
  • Anthropic Claude Fable 5 / Mythos 5 公告:https://www.anthropic.com/news/claude-fable-5-mythos-5
  • Anthropic Claude Sonnet 5 公告:https://www.anthropic.com/news/claude-sonnet-5
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐