简短回答
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 已打码):- 原生 · 非流式
- 原生 · 流式
- OpenAI 兼容 · 非流式
- OpenAI 兼容 · 流式
POST /v1/messages,stream: false:拒答也可能发生在流式输出的中途:先输出了一部分正文,最后以
stop_reason: "refusal" 结束。这时已输出的部分是不完整的,应当丢弃。拒答类别
stop_details.category 目前有五个取值:
拒答对应不到具体类别时,
category 和 explanation 都是 null,这是正常值。explanation 的文字随时可能变化,只适合展示,不要拿来做字符串匹配。
常见触发场景
category: "cyber"(网络安全)是开发者最常遇到的一类。Claude 对网络安全相关请求有一层实时防护,下面这些任务都可能触发:
- 让模型寻找代码漏洞、判断一段代码「是否存在漏洞」、给出漏洞类型(CWE)
- 编写或补全漏洞利用代码(exploit)、渗透测试步骤
- 分析、改写恶意代码
计费规则
按原厂规则(截至 2026 年 9 月,原厂可能根据误拦率调整):
无论是否计费,拒答请求都会计入速率限制。
usage 里照常显示 token 数,这是计数,不代表一定扣费。
如何识别与处理
1
先判断 stop_reason,再取内容
原生格式看
stop_reason == "refusal",OpenAI 兼容格式看 finish_reason == "refusal"。确认不是拒答之后,再去读 content。2
把拒答当作一类结果记录
拒答是一次成功的调用,不是网络错误。评测类任务建议单独记为「拒答」,连同
stop_details.category 一起存档,而不是计入失败重试。3
不要原样重试
同一内容原样重试,大概率还是同样的拒答,还会占用速率限制;部分类别每次都会产生输入费用。
4
多轮对话要先重置上下文
多轮对话里某一轮被拒答后,要删掉或改写触发拒答的那一轮,或者清空历史,再继续对话。不重置的话,后续请求会持续被拒答。
5
定期分析拒答集中在哪类内容
按
category 统计,就能看出是哪类任务在触发。再决定这部分内容是否改用其他模型处理。- Anthropic SDK
- OpenAI SDK
合规的安全研究怎么办
拒答说明里提到的 Cyber Verification Program(网络安全验证计划),是原厂面向合规安全研究的免费申请计划:通过身份验证后,漏洞利用、攻防工具开发这类「高风险两用」任务可以放宽。但勒索软件开发、大规模数据窃取这类「禁止用途」,任何情况下都会被拦截。 这个计划由组织管理员以原厂账号申请。通过第三方平台调用时,原厂说明「并非所有平台都参与」,API易 目前不提供该计划的接入。 所以通过 API易 调用时,对被拒答的样本:- 在评测结果里如实记为「拒答」,连同类别一起统计;
- 或改用其他模型处理这部分内容。
与 OpenAI 拒答的区别
OpenAI 模型的拒答形态详见 OpenAI 模型拒答长什么样?。
常见问题
被拒答也会扣费吗?
被拒答也会扣费吗?
看类别和时机。输出前被拒答、类别为
cyber、general_harms 或 null 的不计费;bio、frontier_llm、reasoning_extraction 按输入计费;流式中途被拒按输入加已输出部分计费。详见上文「计费规则」。能关闭拒答吗?
能关闭拒答吗?
不能。拒答由原厂模型根据其安全策略决定,API易 无法关闭,也无法调整它的尺度。被拒答的内容建议记为拒答结果,或改用其他模型处理。
同一个数据集,为什么有的样本被拒、有的正常?
同一个数据集,为什么有的样本被拒、有的正常?
防护按每一条请求的内容单独判断。代码片段本身的特征、提示词的问法都会影响结果,所以同一个数据集里通常只有一部分样本被拒。实测同一条被拒的样本连续重发,结果基本稳定一致。
拒答时 usage 里的 output_tokens 为什么是 0?
拒答时 usage 里的 output_tokens 为什么是 0?
模型没有生成任何内容就结束了,所以输出为 0,只有输入被计数。这也是区分「拒答」和「被 max_tokens 截断」的方法:后者
stop_reason 是 max_tokens,且输出 tokens 等于你设置的上限。相关文档
Claude 响应数据处理
流式与非流式响应结构、stop_reason 取值
OpenAI 模型拒答长什么样?
GPT 系列拒答的形态与识别方法
内容安全如何合规性?
平台内容安全与合规政策