Skip to main content

简短回答

Claude 遇到触发原厂安全策略的请求时,不会报错。接口照常返回 HTTP 200,但:
  • content 是空数组 [],output_tokens 为 0;
  • stop_reason 是 refusal;
  • stop_details 里写明拒答的类别(如 cyber 网络安全)和一段英文说明。
这是模型本身的行为,不是接口故障。代码里如果直接取 message.content[0],就会抛出 IndexError;用 OpenAI 兼容格式调用时,拿到的是空字符串,finish_reason 为 refusal。 拒答通常在 1~2 秒内返回。是否计费取决于拒答类别:cyber 等类别在输出前被拒答时不计费,详见下文「计费规则」。

拒答的输出体

下面是同一条触发网络安全拒答的请求,在四种调用方式下的实测返回(2026-09-29 实测,id 已打码):
POST /v1/messages,stream: false:
拒答也可能发生在流式输出的中途:先输出了一部分正文,最后以 stop_reason: "refusal" 结束。这时已输出的部分是不完整的,应当丢弃。

拒答类别

stop_details.category 目前有五个取值: 拒答对应不到具体类别时,category 和 explanation 都是 null,这是正常值。explanation 的文字随时可能变化,只适合展示,不要拿来做字符串匹配。

常见触发场景

category: "cyber"(网络安全)是开发者最常遇到的一类。Claude 对网络安全相关请求有一层实时防护,下面这些任务都可能触发:
  • 让模型寻找代码漏洞、判断一段代码「是否存在漏洞」、给出漏洞类型(CWE)
  • 编写或补全漏洞利用代码(exploit)、渗透测试步骤
  • 分析、改写恶意代码
批量评测和数据集蒸馏最容易踩到。 例如用一整个漏洞数据集逐条让模型判断,往往会有相当一部分样本被拒答。脚本如果默认 content[0] 一定存在,就会在拒答那一条上直接崩溃,看起来像「接口时好时坏」。

计费规则

按原厂规则(截至 2026 年 9 月,原厂可能根据误拦率调整): 无论是否计费,拒答请求都会计入速率限制。usage 里照常显示 token 数,这是计数,不代表一定扣费。

如何识别与处理

1

先判断 stop_reason,再取内容

原生格式看 stop_reason == "refusal",OpenAI 兼容格式看 finish_reason == "refusal"。确认不是拒答之后,再去读 content。
2

把拒答当作一类结果记录

拒答是一次成功的调用,不是网络错误。评测类任务建议单独记为「拒答」,连同 stop_details.category 一起存档,而不是计入失败重试。
3

不要原样重试

同一内容原样重试,大概率还是同样的拒答,还会占用速率限制;部分类别每次都会产生输入费用。
4

多轮对话要先重置上下文

多轮对话里某一轮被拒答后,要删掉或改写触发拒答的那一轮,或者清空历史,再继续对话。不重置的话,后续请求会持续被拒答。
5

定期分析拒答集中在哪类内容

按 category 统计,就能看出是哪类任务在触发。再决定这部分内容是否改用其他模型处理。
需要知道拒答类别,请用原生 /v1/messages 格式调用。OpenAI 兼容格式只保留了 finish_reason: "refusal",没有 stop_details。

合规的安全研究怎么办

拒答说明里提到的 Cyber Verification Program(网络安全验证计划),是原厂面向合规安全研究的免费申请计划:通过身份验证后,漏洞利用、攻防工具开发这类「高风险两用」任务可以放宽。但勒索软件开发、大规模数据窃取这类「禁止用途」,任何情况下都会被拦截。 这个计划由组织管理员以原厂账号申请。通过第三方平台调用时,原厂说明「并非所有平台都参与」,API易 目前不提供该计划的接入。 所以通过 API易 调用时,对被拒答的样本:
  • 在评测结果里如实记为「拒答」,连同类别一起统计;
  • 或改用其他模型处理这部分内容。
API易 不会也无法调整原厂的安全策略。

与 OpenAI 拒答的区别

OpenAI 模型的拒答形态详见 OpenAI 模型拒答长什么样?。

常见问题

看类别和时机。输出前被拒答、类别为 cyber、general_harms 或 null 的不计费;bio、frontier_llm、reasoning_extraction 按输入计费;流式中途被拒按输入加已输出部分计费。详见上文「计费规则」。
不能。拒答由原厂模型根据其安全策略决定,API易 无法关闭,也无法调整它的尺度。被拒答的内容建议记为拒答结果,或改用其他模型处理。
防护按每一条请求的内容单独判断。代码片段本身的特征、提示词的问法都会影响结果,所以同一个数据集里通常只有一部分样本被拒。实测同一条被拒的样本连续重发,结果基本稳定一致。
模型没有生成任何内容就结束了,所以输出为 0,只有输入被计数。这也是区分「拒答」和「被 max_tokens 截断」的方法:后者 stop_reason 是 max_tokens,且输出 tokens 等于你设置的上限。

相关文档

Claude 响应数据处理

流式与非流式响应结构、stop_reason 取值

OpenAI 模型拒答长什么样?

GPT 系列拒答的形态与识别方法

内容安全如何合规性?

平台内容安全与合规政策