上传审核收到疑似 AI 生成的图片或音频,但你的系统只有“通过/拦截”两个状态?
本周建议动作:把 OpenAI 内容来源验证 API 接入上传审核旁路,核验受支持的 OpenAI 来源信号;它不是通用 AI 检测器,not_detected 不能证明内容不是 AI 生成。
负责内容审核或事实核查产品的开发者,可参考下面的调用与结果处理流程。
规划图片来源核验的技术负责人,可据此安排审核节点与记录字段。
维护媒体上传服务的工程师,可重点看文件类型、信号覆盖和异常分流。
接入前先确认:API 能验证哪些来源信号
先把产品需求说窄:你要核验的是文件里有没有受支持的 OpenAI 来源信号,而不是判断任意图片或音频是否由 AI 制作。官方说明列出两类信号:图片中的 C2PA Content Credentials(内容凭证),以及图片、音频中的 SynthID 水印。接口检查适用的信号,不适用的检查项可能不会出现在返回结果中。你可以先对照OpenAI 内容来源 API 指南和创建核验请求的接口参考。
这两类信号不是同一种证据。C2PA 是签名元数据,可提供签发者等来源信息;编辑、转换或分享文件时,元数据可能丢失。SynthID 是嵌入媒体的水印,提供的是水印检测结果,不等于完整创作记录。C2PA 规范也说明,内容凭证可能与媒体资产分离或因元数据损坏而无法读取,详见内容凭证规范中的处理说明。
| 信号 | 适用媒体 | 返回结果能支持什么判断 | 不能据此判断什么 |
|---|---|---|---|
| C2PA Content Credentials | 图片 | 是否检测到受支持的签名凭证,以及可用时的签发者、模型、生成时间和验证状态 | 不能单独证明图片内容真实,也不能证明语境正确 |
| SynthID | 图片、音频 | 是否检测到受支持的水印 | 未检出不能排除 AI 生成或编辑,也不能推断创作者身份 |
其他 AI 工具生成的图片不在通用检测范围内
不要把该接口当作跨厂商检测器。它检查受支持的 OpenAI 来源信号,不负责识别其他 AI 系统生成的内容。若业务需要跨来源判断,应把本接口定位为来源核验的一环,再由其他证据和人工审核补足,不能把一次检测结果包装成“AI 识别结论”。
接入范围也要按当前文档而非产品宣传推断。支持的产品、模型、媒体类型和处理路径会影响信号是否存在;文件被压缩、裁切、截图或转换格式,也可能让元数据消失或水印变弱。不要把“支持图片和音频”扩写成“支持所有图片和音频来源”。
进入实现阶段:选定上传、审核或发布节点
核验应尽可能拿到原始文件。若你在压缩、裁切、转码或生成预览图之后才提交检测,来源信息可能已经被处理链改变。较稳妥的流程是:服务端暂存原始上传件,调用来源核验,再进入常规内容审核。若业务必须先转码,就记录被核验的是原件还是衍生文件。
| 官方文档列出的输入 | 支持格式 | 接入时要注意 |
|---|---|---|
| 图片 | PNG、JPEG、WebP | 为上传文件设置正确媒体类型;优先核验原始文件 |
| 音频 | MP3、Opus、AAC、FLAC、WAV、PCM | 解码后时长不超过 60 秒;Opus 示例使用 audio/ogg 媒体类型 |
| 单次上传 | 一个文件 | 单文件不超过 50 MiB;每个请求只提交一个文件 |
官方指南还列出了 SDK 版本要求:Python 2.52.0、Go 3.49.0、Ruby 0.75.0 或更高版本。格式、大小、音频时长和 SDK 版本都可能随文档调整;部署前应重新核对现行 API 指南。
确定调用节点时,先回答三个工程问题:请求失败时上传是否继续?来源核验是否阻塞发布?哪些字段需要留给后续复核?如果高风险内容必须有人确认,可让上传进入“待复核”,但不要把暂时拿不到检测结果的请求默认归入“未发现 AI 信号”。
⚠️ 来源核验会接触用户媒体。官方文档说明,该检查目前不符合 Zero Data Retention 条件。上线前确认数据处理告知、内部权限、存储期限和日志策略,避免把原始媒体或凭证写进不必要的应用日志。
第一步:提交媒体文件并解析结果
使用服务端 SDK,把文件作为 file 参数提交。SDK 会构造 multipart 请求,并从服务端环境变量读取 API 密钥;不要把密钥暴露在浏览器端。以下是 JavaScript 示例,文件名与 MIME 类型应符合实际输入:
import { createReadStream } from "node:fs";
import OpenAI, { toStreamingFile } from "openai";
const client = new OpenAI();
const result = await client.contentProvenanceChecks.create({
file: toStreamingFile(
createReadStream("./upload.png"),
"upload.png",
{ type: "image/png" }
),
});
for (const signal of result.results) {
console.log(signal.type, signal.outcome, signal.validation_state);
}
调用成功后,接口会在同一响应中返回核验结果,不需要创建后台任务再轮询,也不需要先上传到 Files API。图片结果可能包含 c2pa 与 synthid;音频对应 SynthID 结果。字段 outcome 表示信号是否检测到;C2PA 结果还可能包含 validation_state、issuer、model 和 generated_at。这些可选字段可能为空,业务代码要处理缺失值,不能假设每个响应都含完整来源信息。
逐项检查 results,按照 type 区分信号,再将结果映射到自己的业务状态。C2PA 的 validation_state 与 outcome 说的是不同层面的信息;不要只读取一个布尔值,就把文件归类为“真实”或“伪造”。
建议仅保存足够复核的记录:业务内容 ID、核验时间、媒体类型、信号类型、outcome、可用的验证状态和接口错误码。原始文件是否留存应由业务与隐私规则决定;不要把 API 密钥、完整媒体内容或无关个人信息写进调试日志。需要查询站内支持信息时,可从 VPSSpark 帮助中心查找入口。
第二步:把信号结果映射为审核状态
让审核系统表达“证据状态”,不要直接输出“真图/假图”。detected 表示文件含有相应受支持信号;它不能证明文件没有编辑、内容属实或发布语境准确。not_detected 表示本次检查没有找到相应受支持信号,不排除元数据已丢失、水印退化、旧模型输出或来源属于其他 AI 工具。官方帮助中心也说明了 OpenAI 生成内容中来源信号的范围与边界,参阅OpenAI 对来源信号的说明。
| 接口情况 | 建议的产品状态 | 后续动作 |
|---|---|---|
| 检测到受支持信号,且 C2PA 验证状态可用 | 发现来源信号 | 展示信号类型和可用来源字段;按内容政策继续审核 |
not_detected |
未发现受支持信号 | 保持来源未知;不得标记为“非 AI 生成” |
| 文件不支持、请求格式错误或权限不足 | 核验失败/不适用 | 进入降级流程,提示补交原文件或转人工 |
| 超时、限流或服务端错误 | 暂时无法核验 | 有限重试或转人工,不得改写成“未检出” |
未检出受支持信号,不等于图片不是 AI 生成
not_detected 只表示当前文件没有检出该接口支持的来源信号,不排除元数据被剥离、水印退化、旧模型输出或其他 AI 来源。特别是图片经过截图、压缩或格式转换后,输入可能已经不是原始媒体;如果争议较大,应请求原文件并结合来源记录、上下文和人工复核。
可按下面的条件分支设计产品:
- ✅ 若你只需要核验受支持的 OpenAI 来源信号,就接入 Content Provenance API,并把结果作为审核证据。
- ✅ 若结果为
detected,就记录具体信号与可用字段,再按内容政策继续审核;不要自动判定内容真实。 - ⚠️ 若结果为
not_detected,就标记“未发现受支持信号”,而不是“人类创作”或“非 AI”。 - ⚠️ 若请求失败、文件不支持或响应结构无法识别,就回退到“待复核/来源未知”;不要沿用“通过”状态。
- ❌ 若需求是识别所有厂商、所有模型产生的图片或音频,就不要单靠此接口;应先设计更广泛的证据与复核方案。
上线前验收:让每种失败都有明确去向
调用成功只是接入的一半。你还需要在测试环境逐项验证文件入口、预处理、接口请求、结果持久化、审核页面展示和失败回退。重点不是追求未经证实的“准确率”,而是确认每种状态都不会被误读。
- 校验上传输入。 对照官方文档核对格式、媒体类型、体积与音频时长限制;拒绝不支持的输入,或明确转入其他审核路径。
- 确认核验对象。 在业务记录中区分原始文件与处理后的文件,避免把缩略图或转码副本当成原件。
- 覆盖结果组合。 测试
detected、not_detected、缺少字段、空结果,以及不适用信号未返回的情况。没有c2pa结果,不等于明确得到 C2PA 的not_detected。 - 设置超时与失败回退。 区分网络超时、上传失败、无权限、限流和服务端错误。限流时检查
Retry-After,并按官方错误码说明处理;账单或配额问题不能靠重复重试解决。若需细化限流策略,再参阅官方速率限制指南。 - 验收人工复核出口。 确认审核人员能区分“发现信号”“未发现受支持信号”“核验失败”,并能查看必要来源字段与原始文件状态。
- 控制记录与凭证访问。 密钥只放在服务端;日志仅保留必要业务状态,设置访问权限与保留策略。接口字段变化时,再对照创建核验请求的接口参考。
经验提醒:把“无结果”“请求错误”和
not_detected设计成三个不同状态。它们分别代表没有可用结果、调用未完成、以及调用完成但未检出受支持信号;合并成一个“非 AI”标签,会让故障直接变成错误审核结论。
让测试环境与媒体链路保持一致
在本地开发时,文件上传、SDK 版本和服务端密钥管理往往由不同成员负责;临时测试环境也可能因文件访问路径或权限不一致,让你误以为问题来自接口。若你需要跨设备复现上传审核流程,可先比较本地开发与远程 Mac 环境:本地设备更适合已有设备、固定工作负载和需要本地接口的团队;远程环境适合短期联调、隔离测试或临时并行验证,但仍要评估网络、文件传输、权限和持续使用成本。
如果团队还在搭建审核链路,可从 VPSSpark 帮助中心了解站内环境支持信息。需要长期运行的开发环境时,再评估 VPSSpark 的云端 Mac 方式是否适合你的测试工作流;若任务长期稳定、负载持续或依赖本地物理接口,自购设备可能更合适。选择之前,先确认远程访问方式、文件流转和权限管理是否符合团队要求。
OpenAI 内容来源验证 API 的价值,是把具体来源信号纳入审核流程,而不是替代审核判断。相比只依赖人工查看或简单的“AI/非 AI”标签,核验结果能给审核人员更多可追溯的信号;但未检出、调用失败与来源不明仍需分别处理。若你需要临时搭建隔离的联调环境,可对照本机方案与云端 Mac 的管理边界后再选择;VPSSpark 的远程 Mac 方式是否合适,取决于任务时长、持续负载和文件访问要求。
为内容审核流程准备一台远程 Mac
用 VPSSpark Mac 云端服务器搭建和验证上传审核流程,远程接入,减少本地环境依赖。
按天、按周、按月或按季选择计费周期,先按项目节奏配置,控制开发成本。