模型拒答与违规处理
每个模型都有提供方的内容策略。请求违反内容策略时,模型可能拒绝作答,请求也可能直接被拒收。我们把这类情况统一称为违规,每次违规都会收取一笔固定的违规处理费;同一天内计次违规过多时,系统会自动对账号限流,严重时临时封禁。
本页说明哪些情况算违规、怎么收费、处置阶梯怎么走,以及如何查询和申诉。对应的条款见服务条款第 4、5、10 条。
先看结论
- 每次违规收取 $0.20 违规处理费,在正常使用费之外另收,从余额扣,订阅用户也一样,可以扣成负数;不退还。
- 当天第 4 次计次违规起限流 2 小时,第 11 次起临时封禁 24 小时;30 天内第 3 次被临时封禁后禁用账号。
- 次数按北京时间自然日计算。客户端遇到拒答后不要自动重试,每次重试都会再算一次。
什么算违规
一共四种,其中拒答和提供方审核拒绝是计次违规,会计入处置阶梯的次数;另外两种只收违规处理费,不计次。
| 违规 | 你会看到 | 计次 |
|---|---|---|
| 模型拒答 | HTTP 200,回复正常结束,但模型拒绝作答 | 是 |
| 提供方审核拒绝 | 请求被模型提供方的内容审核拒收,返回报错 | 是 |
| 网络安全策略拦截 | 报错里带 cyber_policy | 否 |
| 输出被内容过滤 | HTTP 400,报错为 Output blocked by content filtering policy | 否 |
模型拒答
拒答以 HTTP 200 返回,看起来和正常回复一样,区别在结束原因上。三种接口的识别方式如下。
Anthropic Messages:stop_reason 为 refusal,可能还带 stop_details,里面有拒答类别和说明。
{
"type": "message",
"role": "assistant",
"content": [],
"stop_reason": "refusal",
"stop_details": { "category": "cyber", "explanation": "..." },
"usage": { "input_tokens": 1520, "output_tokens": 0 }
}OpenAI Chat Completions:finish_reason 为 content_filter。message.refusal(流式下是 delta.refusal)里通常有拒答文本;不带拒答文本也算拒答。
{
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": null, "refusal": "I can't help with that." },
"finish_reason": "content_filter"
}
]
}OpenAI Responses:输出里出现 type 为 refusal 的内容块,流式下是 response.refusal.delta / response.refusal.done 事件;或者响应因内容过滤而未完成,incomplete_details.reason 为 content_filter。
{
"status": "completed",
"output": [
{
"type": "message",
"role": "assistant",
"content": [{ "type": "refusal", "refusal": "I can't help with that." }]
}
]
}{ "status": "incomplete", "incomplete_details": { "reason": "content_filter" } }流式响应
拒答通常出现在流的末尾。流式响应里,拒答之前已经发给你的内容不会撤回,但这次请求仍然算一次拒答。
提供方审核拒绝、网络安全策略拦截、输出被过滤
这三种以报错返回。非流式请求一律返回 HTTP 400,报错原文保留,并在 message 末尾追加一段中英双语说明;流式请求如果已经开始输出,报错会以流里的一条错误事件出现。
怎么知道某次请求违规了
响应头:违规的响应带下面三个响应头。流式拒答通常发生在响应头已经发出之后,所以多半带不上,请以使用记录为准。
X-Policy-Violation: refusal # 违规种类:refusal / provider_moderation / cyber_policy / output_filtered
X-Policy-Violation-Fee: 0.20 # 本次违规处理费(美元)
X-Policy-Violation-Info: https://doc.jmds.dev/guide/violations报错末尾的说明:HTTP 400 的违规报错,message 末尾会追加类似下面的一段:
[Policy violation: output filtered; a $0.20 violation fee is charged. 本次请求被判定为违规(输出被过滤),收取 $0.20 违规处理费,重复违规会被限流或封禁。 https://doc.jmds.dev/guide/violations]这段说明不会插进模型的回复正文,所以不会进入你的对话历史。
使用记录:使用记录页面有「违规处理费」一列,标出违规种类,计次违规另带「计次」标记;每条记录的 request_id 可以复制,申诉时用得上。
控制台横幅:当天有计次违规时,控制台顶部会显示「今日违规 N 次」和阈值;被限流或封禁时,横幅会显示处置级别、原因和预计恢复时间。
违规处理费
- 金额:每次违规固定收取 $0.20,四种违规都收。
- 另收,不打折:在正常的使用费之外另收,不乘分组倍率或任何倍率。拒答请求已经消耗的 token 照常计费。
- 从余额扣:一律从账户余额扣,订阅用户也一样,余额不够时可以扣成负数。
- 单独记账:处理费不并进 token 费,在使用记录里单独一列。报错类违规(审核拒绝等)没有 token 消耗,会单独记一条零 token 的记录,处理费挂在这一条上。
- 不退还:违规处理费不予退款,见退款政策第 2 条。
负余额
余额小于 0 时,所有请求都会被拒绝,包括使用订阅套餐的请求:
- 订阅请求返回 403
NEGATIVE_BALANCE,响应里的balance是当前余额; - 只用余额付费的请求,返回原有的余额不足报错(
INSUFFICIENT_BALANCE)。
充值把余额补到 0 或以上,就会立即恢复。
处置阶梯
处置只看计次违规(拒答、提供方审核拒绝),按用户、按北京时间自然日累计次数,每天 0 点清零。网络安全策略拦截和输出被过滤不计次。
下面是当前的默认值,可能调整,以控制台横幅里显示的阈值为准。
| 当天计次违规 | 处置 | 持续 | 期间的报错 |
|---|---|---|---|
| 第 4 次起 | 临时限流:并发 1、每分钟 10 次请求 | 2 小时 | 超出时返回 429 VIOLATION_RATE_LIMITED |
| 第 11 次起 | 临时封禁:所有 API 请求直接被拒绝 | 24 小时 | 403 VIOLATION_SUSPENDED |
| 30 天内第 3 次临时封禁 | 禁用账号 | 直到人工恢复 | 账号未激活(USER_INACTIVE) |
- 自动施加、到期自动解除:限流和临时封禁都由系统自动施加,到期自动恢复,不需要联系任何人。
- 限流期间再违规会延长:限流期间每再发生一次计次违规,到期时间就重置为从那一刻起再满 2 小时(只延长,不叠加)。限流不会因为过了 0 点而提前结束。
- 报错里有恢复时间:
VIOLATION_RATE_LIMITED带throttled_until、rpm_limit、concurrency,超过每分钟次数时还带Retry-After响应头;VIOLATION_SUSPENDED带suspended_until和reason。时间都是 UTC,格式为 RFC 3339。 - 封禁期间不计费:被临时封禁时,请求不会发给模型,也不收费。
- 禁用需要人工恢复:账号被禁用后,请联系支持申请复核。
严重违规(例如涉及未成年人的性剥削内容、攻击本服务或他人、欺诈)可以不经上面的阶梯,直接暂停或终止账号,见服务条款第 10 条。
如何避免
- 遵守可接受使用政策:服务条款第 4 条列出了禁止的用途。常见的拒答原因包括:试图套取模型的思考过程或系统提示词,用模型输出训练或蒸馏竞争模型、批量采集输出,编写恶意代码或实施网络攻击,以及其他有害内容。
- 拒答后不要自动重试:同一个请求重试多少次,就算多少次违规。在代码里遇到上面的结束原因或
X-Policy-Violation响应头时,应停止重试并调整请求内容。 - 给自动化任务设上限:批量任务、Agent 循环容易在短时间内反复触发拒答,建议在客户端限制失败重试次数,并留意控制台的「今日违规」提示。
如何申诉
认为被误判时,在控制台提交工单,或发邮件到 [email protected],附上:
- 注册邮箱;
- 被判违规请求的 request_id(在使用记录里复制),以及报错里的
ref(如有); - 发生时间和使用的客户端。
每份申诉都会由人工复核。复核认定误判的,我们会提前解除限流或封禁,或恢复被禁用的账号。违规处理费不退还。