
图片审核 API 教程:Python 与 JavaScript 示例
图片审核 API 如何工作:哪些有害类别适用于图片、仅接受 URL 输入、按张计费、分数阈值设置,以及 Python 和 JavaScript 代码示例。
图片审核 API 接收一张图片,按一组有害类别逐项打分,再告诉你这张图该发布、暂缓还是拦截。对 omni-moderation-latest 这类通用模型来说,问题在于它返回的类别并不都会真正去看图片:OpenAI 的文档把 13 个类别中的 6 个标为 "Text and images",另外 7 个标为 "Text only"[1]。如果你只发一张不带配文的照片,那 7 个纯文本类别按设计就会返回 0,这并不代表照片是干净的[1]。
本文讲清楚这在实践中意味着什么:图片能依赖哪些类别、怎样发送图片(reAPI 只接受公网 URL)、请求如何计费、怎样把分数转换成处理决策,并给出一份可直接运行的 Python 和 JavaScript 示例,提交图片后轮询拿到审核结论。最后会说明 Sightengine、Hive、Azure AI Content Safety 和 Amazon Rekognition 这类专做图片的服务有何不同。
TL;DR
omni-moderation-latest对图片只评估 6 个类别:sexual、self-harm、self-harm/intent、self-harm/instructions、violence和violence/graphic。其余 7 个(包括sexual/minors)只针对文本[1]。- 在 reAPI 上,图片以
image_url块的形式传入,必须是公网 http(s) URL。Base64 和data:URI 会被拒绝[2]。 - 按审核单位计费:每张图片 1 个单位,文本每 1,000 词 1 个单位,每次请求至少 1 个单位[2]。当前价格见模型页面。
- 调用是异步的:先
POST /api/v1/moderations,再轮询GET /api/v1/tasks/{id},直到status变为completed[2]。 flagged是模型的默认判定。要落实你自己的策略,就按类别给category_scores(0 到 1)设阈值,并在模型更新后重新校准[1]。- OpenAI 自家接口是否免费,见OpenAI moderation API 免费吗?。
图片审核 API 能看到哪些有害类别
OpenAI 列出了 omni-moderation-latest 每个类别支持的输入类型[1]:
| 类别 | 输入 |
|---|---|
sexual | 文本和图片 |
self-harm、self-harm/intent、self-harm/instructions | 文本和图片 |
violence、violence/graphic | 文本和图片 |
sexual/minors | 仅文本 |
harassment、harassment/threatening | 仅文本 |
hate、hate/threatening | 仅文本 |
illicit、illicit/violent | 仅文本 |
对图片流水线来说,这有两个重要后果。
第一,0 分不一定是测出来的。OpenAI 说明,如果只发图片、不附带文本,模型会对纯文本类别返回 0 分[1]。表情包里的仇恨符号、截图里写着的威胁内容,在纯图片请求中都不会被 hate 或 harassment 分数抓到。响应里的 category_applied_input_types 会告诉你每个类别实际评估了哪些输入类型;在 OpenAI 的纯图片示例中,6 个图片类别列出的是 ["image"],其余类别是空数组[1]。把低分当作通过之前,先检查这个字段。
第二,sexual/minors 只针对文本[1]。OpenAI 的指南还明确要求不要把已知或疑似的儿童性虐待内容发给 Moderation API,因为它并非为 CSAM 检测而设计,也不能替代专门的儿童安全防护措施[1]。如果你的平台接受用户上传,请另外规划一道儿童安全管控。
OpenAI 文档写明该模型的图片文件上限为 20 MB[1]。
发送图片:只接受公网 URL
请求体只有一个内容字段 input。发送图片时,传入一个内容块数组[2]:
{
"model": "omni-moderation-latest",
"input": [
{ "type": "image_url", "image_url": { "url": "https://example.com/upload.jpg" } }
]
}OpenAI 自己的 API 参考写明,image_url.url 既可以是图片 URL,也可以是 base64 编码的图片数据[3]。reAPI 只接受前一种:image_url.url 必须是公网 http(s) URL,base64 或 data: URI 会校验失败并返回错误 20003[2]。这条规则适用于 reAPI 所有模型的媒体输入。
对用户上传来说,操作顺序因此是:先存储文件,拿到一个公网可抓取的 URL,再提交审核。签名 URL 也可以,只要任务执行时它仍然有效[2]。如果 URL 无法抓取,任务会以 80007 失败,费用自动退还[2]。在审核结论返回之前,文件保持私有、不要发布。
你也可以把配文和对应的图片放进同一个数组。reAPI 文档说明,内容块数组对整组输入只返回一个结果,模型会把文本和图片放在一起判断[2]。对于带配文的帖子,这正是你想要的。但对十张互不相关的上传图片就不合适了:一个合并的结论没法告诉你是哪张图触发的,这种情况应分开发送请求。
图片审核如何计费
reAPI 对 omni-moderation-latest 按审核单位计费[2]:
| 输入 | 单位 |
|---|---|
每个 image_url 块 | 1 个单位 |
| 文本 | 整个请求合计每 1,000 词 1 个单位;每条文本至少按 50 词计 |
| 任意请求 | 至少 1 个单位 |
每次请求只做一次单位到积分的换算并向上取整,轮询不收费,失败的请求自动退款[2]。一次请求最多 500 项[2]。单位价格见模型页面。各家价格与免费额度的对比,见OpenAI moderation API 免费吗?。
图片审核 API 示例:Python 与 JavaScript
两个示例做的是同一件事:提交一张图片,每 3 秒轮询一次任务,返回第一个结果。reAPI 的任务文档建议轮询间隔不要短于 2 到 3 秒,因为任务进行中时轮询接口有 5 秒缓存[4]。一次审核通常几秒内就能完成[2]。
Python
import time
import requests
API = "https://reapi.ai/api/v1"
HEADERS = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
}
def moderate_image(image_url, timeout_s=60):
submit = requests.post(
f"{API}/moderations",
headers=HEADERS,
json={
"model": "omni-moderation-latest",
"input": [{"type": "image_url", "image_url": {"url": image_url}}],
},
timeout=30,
)
submit.raise_for_status()
task_id = submit.json()["id"]
deadline = time.time() + timeout_s
while time.time() < deadline:
time.sleep(3)
task = requests.get(f"{API}/tasks/{task_id}", headers=HEADERS, timeout=30).json()
if task["status"] == "completed":
return task["output"]["moderation"]["results"][0]
if task["status"] == "failed":
raise RuntimeError(f'{task["error"]["code"]}: {task["error"]["message"]}')
raise TimeoutError(f"task {task_id} still processing")
result = moderate_image("https://example.com/upload.jpg")
print(result["flagged"], result["category_scores"]["violence"])JavaScript(Node.js 18+,保存为 .mjs 模块)
const API = "https://reapi.ai/api/v1";
const headers = {
Authorization: `Bearer ${process.env.REAPI_API_KEY}`,
"Content-Type": "application/json",
};
async function moderateImage(imageUrl, timeoutMs = 60_000) {
const submit = await fetch(`${API}/moderations`, {
method: "POST",
headers,
body: JSON.stringify({
model: "omni-moderation-latest",
input: [{ type: "image_url", image_url: { url: imageUrl } }],
}),
});
if (!submit.ok) throw new Error(`submit failed: ${submit.status} ${await submit.text()}`);
const { id } = await submit.json();
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
await new Promise((r) => setTimeout(r, 3000));
const task = await (await fetch(`${API}/tasks/${id}`, { headers })).json();
if (task.status === "completed") return task.output.moderation.results[0];
if (task.status === "failed") throw new Error(`${task.error.code}: ${task.error.message}`);
}
throw new Error(`task ${id} still processing`);
}
const result = await moderateImage("https://example.com/upload.jpg");
console.log(result.flagged, result.category_scores.violence);JavaScript 版本请在服务端运行,不要放进浏览器。API key 是 Bearer token,写进前端代码就等于暴露给任何打开开发者工具的人。下方常见问题里的 React 问题也是同样道理。完整的请求结构(包括文本和混合输入)见 API 文档。
解读结果与设置阈值
| 字段 | 含义 |
|---|---|
flagged | 模型认为输入至少在一个类别上有害时为 true |
categories | 模型对每个类别给出的 true/false 判定 |
category_scores | 模型对每个类别的置信度,取值 0 到 1 |
category_applied_input_types | 每个类别实际评估了哪些输入类型(text、image) |
flagged 适合做第一道筛选,但它体现的是模型的默认标准,可能比你的策略更严或更松[2]。OpenAI 的建议是把分数当作应用自身策略的信号,而不是自动拦截的依据,并在需要时把被标记的内容转人工审核[1]。
常见做法是对每个图片类别分三档:低于低阈值放行,中间段转人工审核,高于高阈值拦截。一个最小实现:
IMAGE_CATEGORIES = [
"sexual", "self-harm", "self-harm/intent", "self-harm/instructions",
"violence", "violence/graphic",
]
REVIEW_AT = 0.3 # example values only; calibrate on your own labeled images
BLOCK_AT = 0.8
def decide(result):
applied = result["category_applied_input_types"]
scores = result["category_scores"]
checked = [c for c in IMAGE_CATEGORIES if "image" in applied.get(c, [])]
top = max((scores[c] for c in checked), default=0.0)
if top >= BLOCK_AT:
return "block"
if top >= REVIEW_AT or result["flagged"]:
return "review"
return "allow"上面的数值只是示意,不是推荐值。选阈值的方法是拿几百张你已经标注好的图片跑一遍,看分数落在哪里。这个检查要定期重跑:OpenAI 表示会持续升级底层模型,基于 category_scores 构建的自定义策略可能需要随时间重新校准[1]。分数经过 reAPI 时不会被取整或重新映射[2],因此你校准一次的结果可以直接套用到代码读到的数值上。
专做图片的审核 API 有何不同
通用模型和图片专项服务回答的是不同的问题。omni-moderation-latest 评估 6 个视觉类别,并能把配文和图片放在一起判断[1]。图片专项 API 能识别多得多的视觉类别,例如武器、毒品、仇恨符号或图片中的文字,它们接收文件的方式和报告置信度的方式也各不相同。以下内容摘自各家文档:
| 服务 | 能在图片中识别什么 | 图片如何传入 | 输出 | 计费单位 |
|---|---|---|---|---|
reAPI 上的 omni-moderation-latest | sexual、self-harm(3 个)、violence(2 个)[1] | 公网 http(s) URL[2] | 每个类别一个布尔值 + 0–1 分数[1] | 按张计(审核单位)[2] |
| Sightengine | 29 个类别的裸露内容、暴力、武器、仇恨与冒犯性标志、血腥、自残、毒品、酒精、烟草、赌博、图中文字、二维码[5] | 直接上传或公网可访问的 URL[6] | 按所选模型分别返回结果 | Operations;同一组内的模型每次请求只计一次[7] |
| Hive Visual Moderation | 色情内容、暴力画面、毒品、仇恨图像及图片属性,细分为具名类别[8] | 公开或签名 URL,或本地文件上传[9] | 每个类别 0–1 置信度[9] | 年度合同;Hive 引导较小的客户使用其自助式 VLM[8] |
| Azure AI Content Safety(Analyze Image) | Hate、SelfHarm、Sexual、Violence[10] | Base64 字节或 blob URL,二选一[10] | 每个类别严重程度 0、2、4 或 6[11] | 按提交的图片张数[12] |
| Amazon Rekognition(DetectModerationLabels) | 三级标签体系;顶层包括 Explicit、Violence、Visually Disturbing、Drugs & Tobacco、Alcohol、Rude Gestures、Gambling 和 Hate Symbols[13] | Base64 图片字节或 Amazon S3 对象;JPEG 或 PNG[14] | 带置信度的标签;MinConfidence 默认 50[14] | 每次 API 调用按图片计[15] |
通常由三点差异决定怎么选。
视觉覆盖面。 如果你需要识别武器、毒品、仇恨符号或印在图片上的文字,专项服务都明确列出了这些类别[5][8][13]。omni-moderation-latest 没有针对它们的图片类别[1]。
分数形式。 Hive 对每个类别返回 0–1 置信度,并建议从 0.90 左右开始作为标记阈值[8]。Rekognition 会丢弃低于 MinConfidence 的标签,该值在 0–100 刻度上默认为 50[14]。Azure 对图片返回的是粗粒度的严重程度:0、2、4 或 6[11]。在一个服务上调好的阈值,不能直接搬到另一个服务。
输入方式。 Azure 和 Rekognition 接受 base64 字节[10][14],Sightengine 和 Hive 接受直接上传文件[6][9]。reAPI 只接受 URL[2],适合上传文件本来就落在对象存储里的流水线。
如果你的内容以文本为主、附带图片,或者这 6 个视觉类别正好符合你的策略,又或者你已经在用同一个 key 通过 reAPI 调用其他模型,那么 omni-moderation-latest 是合适的选择。按模态和使用场景的更全面对比,见最佳内容审核 API。
常见问题
图片审核 API 免费
OpenAI 表示其自家的 moderation 接口可免费使用[1]。在 reAPI 上,omni-moderation-latest 按量付费,每张图片 1 个单位,失败的请求会退款[2]。各家的免费额度和速率限制对比见OpenAI moderation API 免费吗?。
上传图片审核免费 API
审核上传图片分三步:把文件私有存储,生成一个 API 可抓取的 URL(签名 URL 在有效期内即可),然后提交该 URL,拿到结论后再发布[2]。reAPI 不直接接受文件字节或 base64 字符串[2]。哪些服务有免费额度,见OpenAI moderation API 免费吗?。
OpenAI 图片审核 API
可以,OpenAI 的审核模型能处理图片。omni-moderation-latest 接受文本和图片输入,不对音频分类,对图片只评估 sexual、self-harm 和 violence 这几类[1]。在 reAPI 上模型 ID 相同,仍是 omni-moderation-latest,通过异步任务接口调用[2]。
图片审核 API Python
上面的 Python 示例是完整的:它向 /api/v1/moderations 提交一个 image_url 块,轮询 /api/v1/tasks/{id},并返回 output.moderation.results[0]。只需要 requests 这一个包。API 文档里还有同一调用的 cURL、Node.js 和 Go 版本。
图片审核 API React
请从后端调用审核 API,不要在 React 组件里调用。React 应用把文件上传到你的服务器或存储,由服务器带着 key 调用 API,客户端只拿到处理决策。把 Bearer key 放进浏览器代码,就等于暴露给每一个访问者。
ChatGPT API 能分析图片吗?
能。OpenAI 具备视觉能力的模型可以通过 Responses API 和 Chat Completions API 分析图片,图片可以是 URL、base64 data URL 或文件 ID[16]。这属于开放式的图片理解。如果需要一组固定的有害类别和 0–1 分数,专门为此设计的是 moderation 接口[1]。
最好的图片审核 API
取决于你需要识别什么。omni-moderation-latest 这样的通用模型覆盖图片中的色情、自残和暴力内容,并为配文提供文本类别[1];图片专项服务覆盖更多视觉类别(见上表)。完整的选型指南见最佳内容审核 API。
把图片审核接入上传流程
一套可用的图片审核 API 方案并不复杂:上传到私有存储,审核 URL,根据分数处理,然后发布。使用 omni-moderation-latest 时要记住,只有 6 个类别会看像素,所以如果你在意图片里的文字,就在请求中附上配文或 OCR 文本,并为儿童安全另设一道管控。先用 flagged 起步,有了标注数据后再改为按类别设阈值,模型变化时重新检查这些阈值。
想试一下,可以把图片 URL 粘贴到内容审核模型页面的 playground 里,然后把上面的 Python 或 JavaScript 示例搬进你的后端。这个图片审核 API 接受的全部字段见 API 文档。
参考资料
- OpenAI. Moderation. 2026 年 10 月检索自 developers.openai.com/api/docs/guides/moderation
- reAPI. omni-moderation-latest API docs. reapi.ai/docs/content-moderation
- OpenAI. Moderations API reference. 2026 年 10 月检索自 developers.openai.com/api/reference/resources/moderations
- reAPI. Tasks API reference. reapi.ai/docs/api/tasks
- Sightengine. Visual Moderation models. 2026 年 10 月检索自 sightengine.com/docs/models
- Sightengine. What are the ways to send an image to the API? 2026 年 10 月检索自 sightengine.com/faq/ways-to-send-image-to-api
- Sightengine. What is an operation? 2026 年 10 月检索自 sightengine.com/faq/what-is-an-operation
- Hive. Visual Moderation - Overview. 2026 年 10 月检索自 docs.thehive.ai/docs/visual-content-moderation
- Hive. Using Hive's Visual Moderation API. 2026 年 10 月检索自 docs.thehive.ai/docs/visual-moderation-api
- Microsoft. Image Operations - Analyze Image (REST API). 2026 年 10 月检索自 learn.microsoft.com/en-us/rest/api/contentsafety/image-operations/analyze-image
- Microsoft. Harm categories in Azure AI Content Safety. 2026 年 10 月检索自 learn.microsoft.com/en-us/azure/ai-services/content-safety/concepts/harm-categories
- Microsoft. Azure AI Content Safety pricing. 2026 年 10 月检索自 azure.microsoft.com/en-us/pricing/details/content-safety
- Amazon Web Services. Using the image and video moderation APIs. 2026 年 10 月检索自 docs.aws.amazon.com/rekognition/latest/dg/moderation-api.html
- Amazon Web Services. DetectModerationLabels. 2026 年 10 月检索自 docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectModerationLabels.html
- Amazon Web Services. Amazon Rekognition pricing. 2026 年 10 月检索自 aws.amazon.com/rekognition/pricing
- OpenAI. Images and vision. 2026 年 10 月检索自 developers.openai.com/api/docs/guides/images-vision
更多文章

Wan 3.0 vs Wan 2.7:时长、输入、编辑和价格
对比 Wan 3.0 和 Wan 2.7 在生成时长、分辨率、文档输入、参考素材、视频编辑、计费规则与应用场景中的差异,帮助选择适合的模型。


Midjourney 有 API 吗?V8.2 无需 Discord 的选项
Midjourney 是否有公开 API?了解官方答案、V8.2 的变更、为什么账户自动化有风险,以及如何评估合法的 API 选项。


2026 年最佳 WaveSpeed 替代方案:5 个平台对比
正在寻找 2026 年的 WaveSpeed 替代方案?从模型范围、价格、速度和 API 设计对比 fal.ai、Replicate、Together AI、RunPod 与 reAPI。
