> ## Documentation Index
> Fetch the complete documentation index at: https://docs.inputapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 内容审核

> 检查文本审核结果，并处理失败与人工复核。

审核模型需要部署单独支持。使用 [Moderations API](/zh/api-reference/moderations)检查文本；不要把对话模型的拒答或网关关键词规则当作同一个接口。明确设置审核模型 ID，不依赖网关历史默认模型。

## 运行批量文本审核

在文档目录按 [Python 指南](/zh/guides/python)安装依赖，替换服务地址、令牌和审核模型。脚本提交两条固定文本，按输入顺序输出 `allow` 或 `review`，不打印原文和评分。

```sh theme={null}
export API_BASE_URL="https://gateway.example.com/v1"
export API_KEY="YOUR_API_KEY"
export API_MODEL="YOUR_MODEL_ID"
.venv/bin/python examples/moderations.py
```

`examples/moderations.py` 使用 SDK 通用 HTTP 方法读取原始字典，避免把缺失字段或字符串布尔值当作有效决定。

```python theme={null}
import math
import os
from openai import OpenAI, APIConnectionError, APIStatusError

texts = ["A friendly greeting.", "An invitation to a community picnic."]
with OpenAI(base_url=os.environ["API_BASE_URL"].rstrip("/"),
            api_key=os.environ["API_KEY"], timeout=60.0, max_retries=0) as client:
    try:
        result = client.post("/moderations", cast_to=dict, body={
            "model": os.environ["API_MODEL"], "input": texts,
        })
        if not isinstance(result, dict) or result.get("error"):
            raise ValueError("Invalid moderation response.")
        rows = result.get("results")
        if not isinstance(rows, list) or len(rows) != len(texts):
            raise ValueError("Missing moderation results.")
        decisions = []
        for row in rows:
            if not isinstance(row, dict) or type(row.get("flagged")) is not bool:
                raise ValueError("Missing moderation decision.")
            categories, scores = row.get("categories"), row.get("category_scores")
            if not isinstance(categories, dict) or not categories or not isinstance(scores, dict):
                raise ValueError("Missing moderation categories.")
            if categories.keys() != scores.keys():
                raise ValueError("Category keys do not match.")
            if any(type(value) is not bool for value in categories.values()):
                raise ValueError("Invalid category decision.")
            if any(type(value) not in (int, float) or not math.isfinite(value)
                   or not 0 <= value <= 1 for value in scores.values()):
                raise ValueError("Invalid moderation score.")
            # This application sends any positive signal to review.
            decisions.append("review" if row["flagged"] or any(categories.values()) else "allow")
        for index, decision in enumerate(decisions):
            print(f"{index}: {decision}")
    except APIStatusError as error:
        raise SystemExit(f"Request failed (HTTP {error.status_code}). No automatic retry.")
    except APIConnectionError:
        raise SystemExit("Connection failed. No moderation decision available.")
    except (ValueError, TypeError, AttributeError):
        raise SystemExit("Invalid moderation response. No moderation decision available.")
```

## 如何应用结果

* `results` 对应输入顺序；没有可替代输入位置的文档索引。示例验证结果数量，全部校验后才输出决定。
* `flagged` 是总体信号，`categories` 是分类信号，`category_scores` 是置信评分。示例只演示“任一正向信号进入复核”的应用策略；`allow` 不代表内容绝对安全。
* 分类集合可能随模型变化，不固定枚举；评分阈值需要在目标语言、场景和模型上评估，不直接沿用其他模型的阈值。字段含义参考 [OpenAI 审核指南](https://developers.openai.com/api/docs/guides/moderation)。
* HTTP 错误、空结果和非法评分都表示“没有可用审核结论”，不要解释为审核通过。示例非零退出，由应用决定排队复核、暂缓发布或提示稍后重试。

## 输入与输出审核

对用户输入审核后再决定是否调用生成模型；对生成内容审核后再决定是否发布。需要先审核完整输出的场景，应先在服务端缓冲输出，再发布，不能假设已经展示的流式片段可以撤回。

图片审核需另行确认模型、渠道以及内容块格式；本文和示例仅覆盖文本与文本批量。审核不代替权限校验、工具执行授权或 RAG 资料访问控制。

## 网关适配注意

当前 OpenAI 适配路径在启用渠道 `ForceFormat` 时可能按通用文本结构重建响应，导致审核专有 `results` 丢失。出现 HTTP 200 但没有结果时，请管理员检查渠道响应格式设置与上游原始结构。路由已注册不代表每个渠道都能保留审核字段。

[错误与重试](/zh/guides/errors) · [生产接入](/zh/guides/production)

[Read in English](/en/guides/moderations)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.