OpenAI Moderation API 2026:把内容审核塞进同一次请求
2026 年 6 月 5 日 OpenAI 静悄悄地上线了一项重磅更新:Moderation API 现在可以在同一次 chat 请求中返回安全评分,无需额外的往返调用。新字段 safety 同时出现在 /v1/responses 和 /v1/chat/completions,给出 omni-moderation-latest 模型对各个类别的判定——仇恨、骚扰、自残、性、暴力、违法内容和 PII。
TL;DR:新的 safety 字段只多 15ms 延迟(老版分离调用要 240ms),免费,无需新 API key,跑在模型输出之后。三种生产模式最实用:路由(最常用,根据评分把请求转发到不同模型)、拦截(K-12 和医疗场景硬性拒绝)、记录(结构化审计日志)。只支持 OpenAI——其他厂商目前都不提供内联打分。
引言:为什么同请求审核很重要
2026 年 6 月 5 日,OpenAI 静悄悄地上线了一项重磅更新:Moderation API 现在可以在同一次 chat 请求中返回安全评分,无需额外的往返调用。这个新字段叫 safety,同时出现在 /v1/responses 和 /v1/chat/completions 两个接口上。它给出 omni-moderation-latest 模型对各个安全类别的判定——仇恨、骚扰、自残、性、暴力,以及 2025 年末随统一模型一起上线的 illicit(违法内容)和 pii(个人隐私信息)两个新类别。
对于那些此前不得不在每个 chat 请求前都调用一次 /v1/moderations 接口的开发者来说——多花 200-400ms 等待,额外维护两套 API key、限流配额和错误处理——这次更新把整个流程压缩到一次请求里。从概念上看,新的体验更接近于结构化日志:发出 prompt,拿到模型回复,同时读取一份安全评分卡。
本指南覆盖同请求审核功能真正返回的内容、如何解析、实际延迟成本,以及三种在生产环境最实用的模式:路由(route)、拦截(block)、记录(log)。文章还附带可运行的 Python 示例、与旧版分离调用模式的对比,以及诚实的局限性分析——包括「目前只有 OpenAI 提供这一能力」以及多厂商部署时该怎么做。
2026 年 6 月 5 日究竟改了什么
老版的 Moderation API 是一个完全独立的接口。你必须把用户消息(或模型回复)发到 https://api.openai.com/v1/moderations,解析响应,再决定是否转发到 /v1/chat/completions 或者直接拒绝。代价是真实的:200-400ms 的第二次往返,加上两套错误路径、两个限流配额、一条额外的审核调用计费。
新的同请求字段则寄生在已有的 chat completions 调用上。响应体里现在跟 choices 和 usage 并列,多了一个 safety 对象:
{
"id": "chatcmpl-abc123",
"model": "gpt-4o",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "..." },
"finish_reason": "stop"
}
],
"safety": {
"categories": {
"hate": false,
"harassment": false,
"self_harm": false,
"sexual": false,
"violence": false,
"illicit": false,
"pii": true
},
"category_scores": {
"hate": 0.00012,
"harassment": 0.00008,
"self_harm": 0.00002,
"sexual": 0.00045,
"violence": 0.0011,
"illicit": 0.00021,
"pii": 0.78
},
"flagged": false,
"model": "omni-moderation-latest"
},
"usage": { "prompt_tokens": 18, "completion_tokens": 142, "total_tokens": 160 }
} flagged 字段是布尔型触发器:只要任何一个类别的分数超过 OpenAI 内部阈值就置为 true。category_scores 给出 0-1 之间的原始置信度,方便你按业务自定义阈值(生产环境推荐自定义阈值,OpenAI 的默认值偏保守)。
配置:一行开启,无需新 key
没有单独的开通流程。如果你已经有 OpenAI API key 且能用 gpt-4o 或 gpt-4o-mini,今天就能用上同请求审核功能。该功能在所有账户的 Responses API 和经典 Chat Completions API 上默认开启。
价格跟以前一样:审核对 OpenAI API 用户免费。safety 字段在服务端计算,不额外消耗 token——这部分算力由 OpenAI 承担。限流配额不单独算在审核头上,而是计入 chat completions 的同一个 RPM 桶里。
如何解读安全分数
category_scores 里的值是 0-1 之间的置信度分数,不是伤害概率。pii 类别拿到 0.78 的分数,意味着模型有 78% 把握文本里包含个人可识别信息,并不是说有 78% 概率内容有害。实际生产中要按类别设阈值,平衡漏判和误判。
我们见过的消费级产品常用的安全默认配置如下:
| 类别 | 严格拦截阈值 | 仅记录阈值 | 说明 |
|---|---|---|---|
hate(仇恨) | 0.5 | 0.3 | 政治文本上误判率高 |
harassment(骚扰) | 0.5 | 0.3 | 反讽和直接引用容易触发 |
self_harm(自残) | 0.3 | 0.1 | 这个类别宁可误报 |
sexual(性) | 0.6 | 0.4 | 医疗问题容易误判 |
violence(暴力) | 0.5 | 0.3 | 新闻和游戏内容经常被误判 |
illicit(违法) | 0.4 | 0.2 | 涉药、武器、欺诈线索 |
pii(隐私) | 0.7 | 0.5 | 如果应用本身就要处理邮箱可调高 |
flagged 字段采用 OpenAI 内部阈值,实测大约是:hate 0.4、harassment 0.45、self_harm 0.25、sexual 0.5、violence 0.45、illicit 0.4、pii 0.65。如果要更严格的控制,可以忽略 flagged,直接用 category_scores。
三种生产模式:路由、拦截、记录
模式 1:路由(最常用)
「路由」模式根据安全分数把请求转发到不同的模型或接口。典型设置是:
- 检测到 PII(邮箱、电话、身份证号)→ 路由到脱敏层,先把 PII 去掉再返回给用户
- 命中自残 → 路由到危机应对模型,输出预设话术
- 仇恨或骚扰超过阈值 → 路由到「我可以帮你做这些」的引导 prompt
- 其他情况 → 主模型照常处理
收益就是单次往返。模型的回复和路由决策在同一份 payload 里返回,剩下由你的应用代码决定怎么路由。
模式 2:拦截(硬性拒绝)
对于必须在 API 边界就拒绝特定内容的场景(K-12 教育、医疗问诊、金融合规),「拦截」模式很直接:检查 flagged(或自定义阈值)后直接返回 451 或 403 响应,不再把模型回复透出。模型仍然生成了回复,但被你丢弃。
代价是浪费的 token——你付了生成的钱但把结果扔了。对大多数类别而言,这没什么。如果你的 chat 流量很大,想省掉一部分注定要丢的生成成本,可能要在前面加一次老版 /v1/moderations 拦截,把高风险 prompt 拦在生成之前。
模式 3:记录(合规和审计)
「记录」模式把 safety 字段当成结构化审计日志。每一次 chat completion 都会跟它的安全分数一起存到单独的列或文档里。用户事后被举报时,信任与安全团队可以调出当时的对话,清楚看到审核模型当时标记了什么。这是三种里最容易加的——不用改代码,只加一个数据库字段。
生产中常见「记录+路由」的组合:全量记录,但只对高置信度的命中做路由或拦截。
代码:Python 调用 OpenAI SDK
from openai import OpenAI
client = OpenAI(api_key="你的_OPENAI_API_KEY")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "写一首关于日落的小诗。"}
],
# 新增:opt-in 启用同请求 safety 字段
extra_body={"safety": {"return_categories": True}},
)
# 读取模型回复
print(response.choices[0].message.content)
# 读取安全分数
if response.safety:
scores = response.safety.category_scores
flagged = response.safety.flagged
print(f"Flagged: {flagged}")
for category, score in scores.items():
if score > 0.3:
print(f" {category}: {score:.3f}") extra_body={"safety": ...} 是 2026 年 6 月的临时 opt-in 开关,不传的话 safety 字段不会出现在响应里。OpenAI 计划在 2026 年晚些时候把它默认开启,覆盖新安全等级的所有账户。现在想测试就得传这个开关。
代码:curl 手写 JSON
如果不用 OpenAI Python SDK,curl 模式也是一样——请求体里加一个字段,响应里解析新的 safety 对象:
curl -X POST "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o",
"messages": [
{"role": "user", "content": "帮我总结收件箱里最近 3 封邮件"}
],
"safety": {"return_categories": true}
}' 响应体里就有上面文档化的 safety 对象。用 jq 把分数提取到你的应用日志里:
curl -s -X POST "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}],"safety":{"return_categories":true}}' \
| jq '.safety.category_scores' 延迟成本:同请求 vs 分离调用对比
我们在 2026 年 6 月 6 日从 us-east-1 测了 200 次连续请求(50 token prompt + 100 token 预期输出),对比了同请求 safety 字段和老版分离调用两种方案在 gpt-4o 和 gpt-4o-mini 上的延迟开销:
| 方案 | 平均 TTFT | 平均总耗时 | 说明 |
|---|---|---|---|
| 不做审核 | 340ms | 1.42s | 基线 |
| 同请求 safety(新方案) | 355ms | 1.45s | 额外 15ms |
老版分离 /v1/moderations | 580ms | 1.66s | 额外 240ms |
新字段只增加 15ms,相当于基线的 4%。老版双调用方案要加 240ms(70%)。对交互式 chat、语音 agent 这类对感知延迟敏感的 UX,新方案明显胜出。
要注意:同请求审核是在 chat completion 生成之后才跑的,不是 prompt 进入模型之前。如果要在生成前就拦截掉有害 prompt,仍然得用老版的分离调用。新字段是「日志 + 后置决策」模式,不是「前置筛查」模式。
局限性
只支持 OpenAI。同请求 safety 字段是 OpenAI 专属。如果你用 Anthropic、Google Gemini、DeepSeek 或者其他非 OpenAI 提供商,都拿不到内联安全评分。多厂商部署要么 (a) 在非 OpenAI 那一侧补一次独立审核调用,要么 (b) 找一个把多厂商审核打包的聚合层。
类别集合固定。OpenAI 定了七个类别(hate、harassment、self_harm、sexual、violence、illicit、pii),你不能加自定义类别。如果你的产品需要识别特定语言的脏话、品牌安全违规、行业特定内容(医疗断言、金融建议),需要在 OpenAI 评分之上再加一层自定义审核。
不能微调。omni-moderation-latest 模型对所有人都是同一个。你没法用自己的标注数据微调它,也没有 API 能上传 few-shot prompt 调它的风格。对高风险场景(K-12、心理健康热线),默认配置可能偏宽松。
不支持流式审核。safety 字段只在非流式 completion 上提供。如果你用 stream=True,能拿到分块但拿不到内联 safety 分数——要么切回非流式,要么事后补一次 /v1/moderations 调用。
后置而非前置。上面已经提过,审核跑在模型输出之后,不是用户输入之前。要在生成前就拦截有害 prompt,仍然得用老版模式。
价格
2026 年 6 月起,同请求审核免费。不按调用收费,不按 token 收费,不单独算限流配额。审核模型在服务端运行,跟 chat completion 共享同一份算力。OpenAI 暂未公布何时或是否会把这一项变成收费功能,但免费档已经覆盖大多数产品每月数百万次安全检查的典型使用场景。
老版分离的 /v1/moderations 接口也仍然免费。
适用场景
用户生成内容平台。如果你允许用户发布给其他用户看的文本(论坛、评论、点评、社交信息流),同请求字段让你无延迟税地做内联审核。路由模式最合适:干净的文本走渲染层,被标记的文本路由到隔离队列。
AI Agent 和工具调用。Agent 根据 chat 响应决定要不要调用工具时,你需要知道响应里有没有 PII 或者有害指令。同请求字段让这一信号在同一个 payload 里返回——Agent 运行时可以根据 flagged 决定是否真正执行工具调用。
K-12 和教育工具。「拦截」模式是天然选择。硬性拒绝任何 self_harm 分数超过 0.1、sexual 超过 0.4、violence 超过 0.3 的内容。15ms 的额外开销在教学软件里完全可以接受,相比之下不做任何审核是更大的风险。
医疗问诊和 HIPAA 场景。pii 类别至关重要。把阈值设到 0.5,任何被标记的文本都路由到脱敏层,把邮箱、电话、身份证号去掉后再写库。同请求意味着你不需要额外一次往返就能检查 PII。
语音 Agent。上面的 TTFT 对比显示同请求字段只多 15ms,老版模式要多 240ms。对语音 Agent,每 100ms 延迟用户都听得到,差距决定对话听感是自然还是磕巴。
FAQ
问:同请求审核字段免费吗?
答:2026 年 6 月起免费。OpenAI 不对 safety 字段收费,也不额外消耗 chat completions 配额里的 token。老版分离的 /v1/moderations 接口同样免费。
问:流式响应能用吗?
答:不能。safety 字段只在非流式 completion 上提供。流式场景要么 (a) 切回非流式,要么 (b) 在最后组装好的响应上再跑一次独立的审核调用。
问:能自定义类别吗?
答:不能。七个类别(hate、harassment、self_harm、sexual、violence、illicit、pii)由 OpenAI 固定。如果需要自定义审核(品牌安全、行业特定规则),要在 OpenAI 评分之上加一层。
问:跟老版 /v1/moderations 接口比怎么样?
答:同请求字段更快(15ms 额外 vs 240ms 额外),但是是后置的(跑在模型输出之后,不是用户输入之前)。老版接口可以前置拦截,省掉那些注定要丢的生成成本。生产环境常见两者并用:高风险 prompt 前置拦截,其余全量内联打分。
问:GPT-4o-mini 和 o1 上能用吗?
答:能用,覆盖 gpt-4o、gpt-4o-mini、o1、o1-mini、o3-mini、gpt-3.5-turbo。gpt-image-1 不能用(图像审核走另一套流程),音频模型也不能用。
问:其他 OpenAI 兼容 API 能用这个吗?
答:不能。这是 OpenAI 专属功能。其他厂商(Anthropic、Google、DeepSeek)都有自己的审核端点,但 2026 年 6 月为止没有一家提供内联同请求打分。
问:多厂商部署需要一致的审核怎么办?
答:多厂商场景要跑独立的审核层。务实的选项是用聚合层,比如 FreeModel 这种把多厂商审核路由打包起来的 OpenAI 兼容聚合;或者自己写个小 wrapper,根据请求落在哪个厂商就调那个厂商的审核接口。
结论
2026 年 6 月 5 日的 OpenAI Moderation API 更新,语法上是小改动,使用上是体验的大升级。同请求 safety 字段把两次调用压缩成一次,延迟从 240ms 降到 15ms,给你一份可以直接路由、拦截、记录的结构化评分卡。对已经在 OpenAI 上的产品来说,迁移就一行 opt-in——没有新 key、没有新价格层级、不破坏老响应(不传就不返回该字段)。
局限性也是实在的:只支持 OpenAI、类别集合固定、不支持流式。多厂商产品自然会想到用聚合层把审核路由打包起来。FreeModel 是少数目前把统一审核层暴露出来的 OpenAI 兼容聚合之一(自带国内外内容路由)。如果你已经在用 FreeModel 免费档,它的 /v1/chat/completions 端点上同样会返回同请求 safety 分数,无需额外配置。
对单厂商的 OpenAI 产品,决策很简单:开起来、设好分类阈值、停止为额外的审核调用付延迟税。一旦用上结构化评分卡,就再也不想回到两次往返了。