实测 Claude Fable 5 vs Claude Sonnet 5:别只看模型名,先看 API 返回是否真的可用
实测 Claude Fable 5 vs Claude Sonnet 5:别只看模型名,先看 API 返回是否真的可用
摘要
这篇文章记录一次 claude-fable-5 和 claude-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-5和claude-sonnet-5都能在模型列表中看到,也都能通过最小 exact-output 测试。但在同一个紧凑 JSON 任务里,claude-fable-5返回了可见 JSON,claude-sonnet-5返回 HTTP 200 和finish_reason: stop,但 visible content 为空。生产环境不能只判断 HTTP 200。

一、为什么要做这个测试
新模型上线后,很多文章会直接讨论:
- 哪个模型更聪明
- 哪个模型适合写代码
- 哪个模型适合写作
- 哪个模型性价比更高
这些问题当然重要,但真正接入业务时,第一层问题往往更基础:
- 这个模型 ID 现在是不是真的可用?
- 我用当前 API endpoint 能不能调通?
- 返回 HTTP 200 之后,
choices[0].message.content是否有内容? - 如果要求模型返回 JSON,能不能被程序稳定解析?
- 失败时能不能自动 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.
这个任务并不复杂,预期输出是一个包含 choice 和 reason 的紧凑 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_reason是stop- 可以继续进入 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-5claude-sonnet-5不适合 JSON- 两个模型的长期稳定性
- 两个模型的价格优势
- 两个模型在真实复杂业务中的完整表现
这次测试只能说明:
- 两个模型在测试窗口都出现在
/v1/models - 两个模型都通过最小 exact-output 请求
- 同一个 JSON prompt 下,Fable 5 返回可见 JSON,Sonnet 5 这次返回空 visible content
- 生产环境应该检查 output shape,而不是只看 HTTP 200
模型能力是一个问题,接口返回是否满足业务契约是另一个问题。
工程接入时,后者通常更先影响线上稳定性。
十五、总结
本次实测结论如下:
claude-fable-5和claude-sonnet-5都出现在 Crazyrouter/v1/models中。- 两者都支持
anthropic和openaiendpoint types。 - 两者都能通过 OpenAI-compatible Chat Completions 的 exact-output 测试。
claude-fable-5exact-output response ID:msg_01MPuZqzZwj6ysEuzamkxdUC。claude-sonnet-5exact-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
更多推荐

所有评论(0)