GPT Image 2.5 is live — OpenAI's newest image model, targeted edits that leave the rest of the frame alone
图片审核 API 教程:Python 与 JavaScript 示例
2026/10/07

图片审核 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 文档。

解读结果与设置阈值

每个结果包含四个字段[1][2]:

字段含义
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-latestsexual、self-harm(3 个)、violence(2 个)[1]公网 http(s) URL[2]每个类别一个布尔值 + 0–1 分数[1]按张计(审核单位)[2]
Sightengine29 个类别的裸露内容、暴力、武器、仇恨与冒犯性标志、血腥、自残、毒品、酒精、烟草、赌博、图中文字、二维码[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 文档。

参考资料

  1. OpenAI. Moderation. 2026 年 10 月检索自 developers.openai.com/api/docs/guides/moderation
  2. reAPI. omni-moderation-latest API docs. reapi.ai/docs/content-moderation
  3. OpenAI. Moderations API reference. 2026 年 10 月检索自 developers.openai.com/api/reference/resources/moderations
  4. reAPI. Tasks API reference. reapi.ai/docs/api/tasks
  5. Sightengine. Visual Moderation models. 2026 年 10 月检索自 sightengine.com/docs/models
  6. Sightengine. What are the ways to send an image to the API? 2026 年 10 月检索自 sightengine.com/faq/ways-to-send-image-to-api
  7. Sightengine. What is an operation? 2026 年 10 月检索自 sightengine.com/faq/what-is-an-operation
  8. Hive. Visual Moderation - Overview. 2026 年 10 月检索自 docs.thehive.ai/docs/visual-content-moderation
  9. Hive. Using Hive's Visual Moderation API. 2026 年 10 月检索自 docs.thehive.ai/docs/visual-moderation-api
  10. Microsoft. Image Operations - Analyze Image (REST API). 2026 年 10 月检索自 learn.microsoft.com/en-us/rest/api/contentsafety/image-operations/analyze-image
  11. Microsoft. Harm categories in Azure AI Content Safety. 2026 年 10 月检索自 learn.microsoft.com/en-us/azure/ai-services/content-safety/concepts/harm-categories
  12. Microsoft. Azure AI Content Safety pricing. 2026 年 10 月检索自 azure.microsoft.com/en-us/pricing/details/content-safety
  13. Amazon Web Services. Using the image and video moderation APIs. 2026 年 10 月检索自 docs.aws.amazon.com/rekognition/latest/dg/moderation-api.html
  14. Amazon Web Services. DetectModerationLabels. 2026 年 10 月检索自 docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectModerationLabels.html
  15. Amazon Web Services. Amazon Rekognition pricing. 2026 年 10 月检索自 aws.amazon.com/rekognition/pricing
  16. OpenAI. Images and vision. 2026 年 10 月检索自 developers.openai.com/api/docs/guides/images-vision