Skill: shawn233/tencentcloud-aigc-recog-image (version 1.0.8)

--- name: tencentcloud-aigc-recog-image description: 腾讯云 AI 生成图片识别 (TencentCloud Image AIGC Detection) 技能。适用于 AI 生成图片检测、图片真伪鉴别、AI 绘画检测、Deepfake 检测等场景。TencentCloud Image AIGC Detection is an AI-generated content detection service by Tencent Cloud, supporting aigc detection, AI-generated image identification, and image authenticity review. --- # 腾讯云 AI 生成图片识别 Skill ## 功能描述 本技能用于检测图像是否由AIGC生成，支持对 Stable Diffusion、Midjourney、GPT‑4o 等主流模型生成的图像进行识别。 **TencentCloud Image AIGC Detection** (also referred to as **TencentCloud AIGC Detection** for images or **AI-generated image detection**) is Tencent Cloud's image moderation capability for **aigc detection** and **AI-generated image identification**. It enables AI artwork review, image authenticity screening, synthetic media checks, and other TencentCloud image analysis workflows. ### 🎯 核心能力 - **AI 生成图片判定**：分析输入图片，给出是否为 AI 生成的判定结果 - **风险评分**：返回 0-100 的置信度评分，分数越高越可能是 AI 生成 - **处置建议**：返回 `Pass`（真实图片）、`Review`（存疑）、`Block`（AI 生成）三级建议 - **详细结果**：返回命中标签、子标签等详细信息 ### 支持的输入方式 | 方式 | 说明 | |------|------| | 图片 URL | 传入图片的网络地址 | | 本地文件 | 传入本地图片文件路径，自动读取并 Base64 编码 | ### 限制 - 图片文件大小上限：**5MB** - 支持格式：**PNG、JPG、JPEG、BMP、GIF、WEBP** - API 调用频率上限：以控制台配额为准 ## 环境配置指引 ### 密钥配置 本 Skill 需要腾讯云 API 密钥才能正常工作。 #### Step 1: 开通图片内容安全服务 🔗 **[腾讯云内容安全生成识别控制台](https://console.cloud.tencent.com/cms/clouds/LLM)** - 开通服务: 登录[腾讯云内容安全生成识别控制台](https://console.cloud.tencent.com/cms/clouds/LLM)，单击AI生成图片检测，跳转后单击初始化配置，立即体验。 #### Step 2: 获取 API 密钥 🔗 **[腾讯云 API 密钥管理](https://console.cloud.tencent.com/cam/capi)** #### Step 3: 获取审核策略编号（BizType） 🔗 **[腾讯云内容安全策略管理](https://console.cloud.tencent.com/cms/clouds/manage)** - 获取安全策略：单击"应用管理"，找到"AI 生成检测配套策略"，其中图片内容安全的 BizType 字段对应的值 #### Step 4: 设置环境变量 **Linux / macOS：** ```bash export TENCENTCLOUD_SECRET_ID="你的SecretId" export TENCENTCLOUD_SECRET_KEY="你的SecretKey" export TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE="你的BizType" ``` 如需持久化： ```bash echo 'export TENCENTCLOUD_SECRET_ID="你的SecretId"' >> ~/.zshrc echo 'export TENCENTCLOUD_SECRET_KEY="你的SecretKey"' >> ~/.zshrc echo 'export TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE="你的BizType"' >> ~/.zshrc source ~/.zshrc ``` **Windows (PowerShell)：** ```powershell $env:TENCENTCLOUD_SECRET_ID = "你的SecretId" $env:TENCENTCLOUD_SECRET_KEY = "你的SecretKey" $env:TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE = "你的BizType" ``` > ⚠️ **安全提示**：切勿将密钥硬编码在代码中。如使用临时凭证（STS Token），还需设置 `TENCENTCLOUD_TOKEN` 环境变量。 > ⚠️ **必需配置**：[REDACTED_SECRET] 为必需环境变量，未配置时脚本将报错退出。 ## Agent 执行指令（必读） > ⚠️ **本节是 Agent（AI 模型）的核心执行规范。当用户请求检测图片是否为 AI 生成时，Agent 必须严格按照以下步骤自主执行，无需询问用户确认。** ### 🔑 通用执行规则 1. **触发条件**：用户意图为检测图片是否为 AI 生成，包括但不限于以下表述： - "检测这张图片是不是 AI 生成的" - "判断一下图片是不是 AI 画的" - "AIGC 图片检测" - "这是真实照片还是 AI 生成的" - "图片真伪鉴别" - "deepfake 检测" 2. **首次使用环境检查**：如果脚本返回 `CREDENTIALS_NOT_CONFIGURED` 或 `BIZ_TYPE_NOT_CONFIGURED` 错误，Agent 必须向用户展示完整的环境配置指引（包括开通服务、获取密钥、获取 BizType、设置环境变量的全部步骤），确保用户能一次性完成所有配置。 3. **安装依赖**：技能依赖需 Agent 手动安装。 4. **禁止使用大模型自身能力替代AIGC识别（最高优先级规则）**： - 只能从脚本返回的结果中来获取识别结果。 - 识别脚本调用失败时，Agent 严禁自行猜测或编造识别内容。 - 如果调用失败，Agent 必须向用户返回清晰的错误说明。 5. 不要输出总结分析的语句，直接给脚本的输出。 --- ### 📌 调用方式 ```bash # Option 1: Run TencentCloud AIGC detection with an image URL python3 <SKILL_DIR>/scripts/main.py "https://example.com/image.jpg" # Option 2: Run AI-generated image detection with a local image file python3 <SKILL_DIR>/scripts/main.py /path/to/image.png # Option 3: Specify the image URL explicitly for TencentCloud image analysis python3 <SKILL_DIR>/scripts/main.py --url "https://example.com/image.jpg" # Option 4: Specify a local file for AI image authenticity review python3 <SKILL_DIR>/scripts/main.py --file /path/to/image.png # Option 5: Attach optional metadata for the image moderation workflow python3 <SKILL_DIR>/scripts/main.py --data-id "business_123" /path/to/image.png ``` ### 可选参数 | 参数 | 说明 | |------|------| | `--url <url>` | 指定图片 URL | | `--file <path>` | 指定本地图片文件路径 | | `--data-id <id>` | 业务数据标识，用于关联检测结果（最长 128 字符） | ### 环境变量 | 环境变量 | 必需 | 说明 | |---------|------|------| | `TENCENTCLOUD_SECRET_ID` | ✅ | 腾讯云 API SecretId | | `TENCENTCLOUD_SECRET_KEY` | ✅ | 腾讯云 API SecretKey | | [REDACTED_SECRET] | ✅ | 自定义审核策略编号（在腾讯云控制台创建，每个用户需使用自己的 BizType） | | `TENCENTCLOUD_TOKEN` | ❌ | 临时凭证 STS Token（可选） | --- ### 输出示例 **正常检测结果：** ```json { "suggestion": "Block", "label": "GeneratedContentRisk", "score": 95, "sub_label": "AIImageGenerated", "detail_results": [ { "label": "GeneratedContentRisk", "suggestion": "Block", "score": 95, "sub_label": "AIImageGenerated" } ], "request_id": [REDACTED_SECRET] } ``` **凭证未配置时的错误输出：** ```json { "error": "CREDENTIALS_NOT_CONFIGURED", "message": "缺少环境变量: TENCENTCLOUD_SECRET_ID, TENCENTCLOUD_SECRET_KEY", "guide": { "step1": "开通AI生成图片检测服务: https://console.cloud.tencent.com/cms/clouds/LLM", "step2": "获取 API 密钥: https://console.cloud.tencent.com/cam/capi", "step3_linux": "export TENCENTCLOUD_SECRET_ID=\"your_secret_id\"\nexport TENCENTCLOUD_SECRET_KEY=\"your_secret_key\"", "step3_windows": "$env:TENCENTCLOUD_SECRET_ID = \"your_secret_id\"\n$env:TENCENTCLOUD_SECRET_KEY = \"your_secret_key\"" } } ``` - 请向用户展示完整的环境配置指引（参考本文档「环境配置指引」一节的全部步骤） **BizType 未配置时的错误输出：** ```json { "error": "BIZ_TYPE_NOT_CONFIGURED", "message": "缺少环境变量: TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE", "guide": { "step1": "在腾讯云控制台获取图片AI生成检测配套策略: https://console.cloud.tencent.com/cms/clouds/manage", "step2_linux": "export TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE=\"your_biz_type\"", "step2_windows": "$env:TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE = \"your_biz_type\"" } } ``` - 请向用户展示完整的环境配置指引（参考本文档「环境配置指引」一节的全部步骤），特别要包含 BizType 的获取方式 --- ### 📋 结果字段解读 Agent 收到脚本输出后，按以下方式向用户简单解读结果即可，不要长篇大论、甚至加入自己的解读： | 字段 | 含义 | 向用户呈现方式 | |------|------|---------------| | `suggestion` | 处置建议 | `Pass` → "该图片大概率为**真实图片**"<br>`Review` → "该图片**存疑**，建议人工复审"<br>`Block` → "该图片大概率为 **AI 生成**" | | `label` | 风险标签 | 当为 `Normal` 时表示无其他内容风险, `GeneratedContentRisk` 表示为 AIGC 生成内容 | | `score` | 置信度（0-100） | 分数越高越可能是 AI 生成。0-60 低风险、60-80 中风险、80-100 高风险 | | `detail_results` | 详细检测结果 | 如有多个维度，逐一说明 | --- ### ❌ Agent 须避免的行为 - **禁止自行猜测或编造检测结果** — 必须通过 API 调用获取真实结果 - **禁止在 API 调用失败时忽略错误** — 必须向用户返回清晰的错误说明 - **禁止跳过依赖安装** — 首次使用时需确保依赖已安装 - **禁止只打印脚本路径而不执行** — 应直接运行脚本并返回结果 ## API 参考文档 详细的接口参数、输出说明、错误码等信息请参阅： - [ImageModeration API 参考](references/image_moderation_api.md)（[原始文档](https://cloud.tencent.com/document/product/1125/53273)） - [SDK 调用指引](https://cloud.tencent.com/document/product/1124/100983) ## 核心脚本 - `scripts/main.py` — AI 生成图片识别，调用 ImageModeration 接口（`Type=IMAGE_AIGC`）。 ## 依赖 - Python 3.7+ - `tencentcloud-sdk-python`（腾讯云 SDK） 安装依赖（Agent 需手动安装）： ```bash pip install tencentcloud-sdk-python ```

path: scripts/main.py
content: # -*- coding: utf-8 -*-
"""
tencentcloud-aigc-recog-image: Tencent Cloud AI-Generated Image Detection Skill
Calls the ImageModeration API with Type=IMAGE_AIGC to detect whether an image
is generated by AI.

Usage:
  python main.py "https://example.com/image.jpg"
  python main.py /path/to/image.png
  python main.py --url "https://example.com/image.jpg"
  python main.py --file /path/to/image.png
  python main.py --data-id my_id /path/to/image.png
"""

import json
import os
import sys
import base64  # noqa: E402

try:
    from tencentcloud.common import credential  # noqa: E402
    from tencentcloud.common.profile.client_profile import ClientProfile  # noqa: E402
    from tencentcloud.common.profile.http_profile import HttpProfile  # noqa: E402
    from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException  # noqa: E402
    from tencentcloud.ims.v20201229 import ims_client, models  # noqa: E402
except ImportError:
    print("错误: 缺少依赖 tencentcloud-sdk-python，请执行: pip install tencentcloud-sdk-python", file=sys.stderr)
    sys.exit(1)

# Maximum file size: 5MB
MAX_FILE_SIZE = 5 * 1024 * 1024

# Supported image extensions
SUPPORTED_EXTENSIONS = {".png", ".jpg", ".jpeg", ".bmp", ".gif", ".webp"}


# ============================================================
# Part 1: Credential checking
# ============================================================

def get_credentials():
    """
    Check Tencent Cloud API credential environment variables.
    Supports TENCENTCLOUD_TOKEN for temporary credentials (STS Token).
    Outputs a configuration guide and exits if missing.
    """
    secret_id = os.getenv("TENCENTCLOUD_SECRET_ID")
    secret_key = os.getenv("TENCENTCLOUD_SECRET_KEY")
    [REDACTED_SECRET]"TENCENTCLOUD_TOKEN")

    if not secret_id or not secret_key:
        missing = []
        if not secret_id:
            missing.append("TENCENTCLOUD_SECRET_ID")
        if not secret_key:
            missing.append("TENCENTCLOUD_SECRET_KEY")
        error_msg = {
            "error": "CREDENTIALS_NOT_CONFIGURED",
            "message": f"缺少环境变量: {', '.join(missing)}",
            "guide": {
                "step1": "开通AI生成图片检测服务: https://console.cloud.tencent.com/cms/clouds/LLM",
                "step2": "获取 API 密钥: https://console.cloud.tencent.com/cam/capi",
                "step3_linux": (
                    'export TENCENTCLOUD_SECRET_ID="your_secret_id"\n'
                    'export TENCENTCLOUD_SECRET_KEY="your_secret_key"'
                ),
                "step3_windows": (
                    '$env:TENCENTCLOUD_SECRET_ID = "your_secret_id"\n'
                    '$env:TENCENTCLOUD_SECRET_KEY = "your_secret_key"'
                ),
            },
        }
        print(json.dumps(error_msg, ensure_ascii=False, indent=2))
        sys.exit(1)

    # Support temporary credentials (STS Token)
    if token:
        cred = credential.Credential(secret_id, secret_key, token)
    else:
        cred = credential.Credential(secret_id, secret_key)

    return cred


def get_biz_type():
    """
    Get the BizType from TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE environment variable.
    Each user must use their own BizType; exits with error if empty.
    """
    biz_type = os.getenv("TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE", "").strip()

    if not biz_type:
        error_msg = {
            "error": "BIZ_TYPE_NOT_CONFIGURED",
            "message": "缺少环境变量: TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE",
            "guide": {
                "step1": "在腾讯云控制台获取图片AI生成检测配套策略: https://console.cloud.tencent.com/cms/clouds/manage",
                "step2_linux": 'export TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE="your_biz_type"',
                "step2_windows": '$env:TENCENTCLOUD_AIGC_RECOG_IMAGE_BIZ_TYPE = "your_biz_type"',
            },
        }
        print(json.dumps(error_msg, ensure_ascii=False, indent=2))
        sys.exit(1)

    return biz_type


# ============================================================
# Part 2: Command-line argument parsing
# ============================================================

def parse_args():
    """
    Parse command-line arguments.
    Supports: positional arg (URL or file path), --url, --file, --data-id
    """
    import argparse

    parser = argparse.ArgumentParser(
        description="Tencent Cloud AI-Generated Image Detection (ImageModeration IMAGE_AIGC)"
    )
    parser.add_argument(
        "image", nargs="?", default=None,
        help="Image URL or local file path (auto-detected)"
    )
    parser.add_argument(
        "--url", dest="image_url", default=None,
        help="Specify image URL"
    )
    parser.add_argument(
        "--file", dest="file_path", default=None,
        help="Specify local image file path"
    )
    parser.add_argument(
        "--data-id", dest="data_id", default=None,
        help="Business data identifier for correlating results (optional, max 128 chars)"
    )

    args = parser.parse_args()
    return args


def is_url(s):
    """Check if a string looks like a URL."""
    return s.startswith("http://") or s.startswith("https://")


def get_image_input(args):
    """
    Determine image input based on command-line arguments.
    Returns a tuple: (image_url, file_content_base64)
    Exactly one of them will be non-None.

    Priority: --url > --file > positional arg (auto-detect URL vs file path)
    """
    image_url = None
    file_content_base64 = None

    if args.image_url:
        # Explicit URL via --url
        image_url = args.image_url

    elif args.file_path:
        # Explicit file via --file
        file_content_base64 = read_image_file(args.file_path)

    elif args.image is not None:
        # Positional arg: auto-detect URL vs file path
        if is_url(args.image):
            image_url = args.image
        elif os.path.isfile(args.image):
            file_content_base64 = read_image_file(args.image)
        else:
            # Treat as URL if not a local file
            image_url = args.image

    else:
        # No input provided
        print(json.dumps({
            "error": "NO_INPUT",
            "message": "未提供待检测图片。",
            "usage": {
                "url": 'python main.py "https://example.com/image.jpg"',
                "file": "python main.py /path/to/image.png",
                "url_flag": 'python main.py --url "https://example.com/image.jpg"',
                "file_flag": "python main.py --file /path/to/image.png",
            },
        }, ensure_ascii=False, indent=2))
        sys.exit(1)

    return image_url, file_content_base64


def read_image_file(file_path):
    """
    Read a local image file and return its Base64-encoded content.
    Validates file existence, extension, and size.
    """
    if not os.path.isfile(file_path):
        print(json.dumps({
            "error": "FILE_NOT_FOUND",
            "message": f"指定的文件不存在: {file_path}",
        }, ensure_ascii=False, indent=2))
        sys.exit(1)

    # Check file extension
    _, ext = os.path.splitext(file_path)
    if ext.lower() not in SUPPORTED_EXTENSIONS:
        print(json.dumps({
            "error": "UNSUPPORTED_FORMAT",
            "message": f"不支持的图片格式: {ext}。支持的格式: {', '.join(sorted(SUPPORTED_EXTENSIONS))}",
        }, ensure_ascii=False, indent=2))
        sys.exit(1)

    # Check file size
    file_size = os.path.getsize(file_path)
    if file_size > MAX_FILE_SIZE:
        print(json.dumps({
            "error": "FILE_TOO_LARGE",
            "message": f"图片文件大小为 {file_size / 1024 / 1024:.2f}MB，超过 API 限制的 5MB。",
        }, ensure_ascii=False, indent=2))
        sys.exit(1)

    if file_size == 0:
        print(json.dumps({
            "error": "EMPTY_FILE",
            "message": "图片文件为空，请提供有效的图片文件。",
        }, ensure_ascii=False, indent=2))
        sys.exit(1)

    with open(file_path, "rb") as f:
        content = f.read()

    return base64.b64encode(content).decode("utf-8")


# ============================================================
# Part 3: API call and result output
# ============================================================

def call_image_moderation(cred, image_url=None, file_content=None,
                          data_id=None, biz_type=None):
    """
    Call Tencent Cloud ImageModeration API with Type=IMAGE_AIGC
    for AI-generated image detection.
    Returns the parsed API response.
    """
    # Configure HTTP Profile
    http_profile = HttpProfile()
    http_profile.endpoint = "ims.tencentcloudapi.com"

    # Configure Client Profile
    client_profile = ClientProfile()
    client_profile.httpProfile = http_profile

    # Create client (Region: Guangzhou, default for IMS service)
    client = ims_client.ImsClient(cred, "ap-guangzhou", client_profile)

    # Build request
    req = models.ImageModerationRequest()

    # Set image input: URL or Base64 content
    if image_url:
        req.FileUrl = image_url
    elif file_content:
        req.FileContent = file_content

    # Set detection type to AI-generated image
    req.Type = "IMAGE_AIGC"

    # Optional parameters
    if data_id:
        req.DataId = data_id
    if biz_type:
        req.BizType = biz_type

    # Send request
    resp = client.ImageModeration(req)
    return resp


def format_output(resp):
    """
    Parse API response and output structured JSON result.
    """
    # Convert response to dict
    resp_dict = json.loads(resp.to_json_string())

    result = {
        "suggestion": resp_dict.get("Suggestion", ""),
        "label": resp_dict.get("Label", ""),
        "score": resp_dict.get("Score", 0),
    }

    # Sub-label
    sub_label = resp_dict.get("SubLabel")
    if sub_label:
        result["sub_label"] = sub_label

    # Detailed detection results (LabelResults)
    label_results = resp_dict.get("LabelResults")
    if label_results:
        result["detail_results"] = []
        for item in label_results:
            detail = {
                "label": item.get("Label", ""),
                "suggestion": item.get("Suggestion", ""),
                "score": item.get("Score", 0),
            }
            sub = item.get("SubLabel")
            if sub:
                detail["sub_label"] = sub
            result["detail_results"].append(detail)

    # Object detection results (ObjectResults)
    object_results = resp_dict.get("ObjectResults")
    if object_results:
        result["object_results"] = []
        for item in object_results:
            obj = {
                "label": item.get("Label", ""),
                "suggestion": item.get("Suggestion", ""),
                "score": item.get("Score", 0),
            }
            sub = item.get("SubLabel")
            if sub:
                obj["sub_label"] = sub
            names = item.get("Names")
            if names:
                obj["names"] = names
            result["object_results"].append(obj)

    # OCR results (OcrResults)
    ocr_results = resp_dict.get("OcrResults")
    if ocr_results:
        result["ocr_results"] = []
        for item in ocr_results:
            ocr = {
                "label": item.get("Label", ""),
                "suggestion": item.get("Suggestion", ""),
                "score": item.get("Score", 0),
            }
            text = item.get("Text")
            if text:
                ocr["text"] = text
            result["ocr_results"].append(ocr)

    # Extra info
    extra = resp_dict.get("Extra")
    if extra:
        result["extra"] = extra

    # DataId passthrough
    data_id = resp_dict.get("DataId")
    if data_id:
        result["data_id"] = data_id

    # Request ID
    result["request_id"] = resp_dict.get("RequestId", "")

    return result


# ============================================================
# Main function
# ============================================================

def main():
    args = parse_args()
    image_url, file_content = get_image_input(args)
    cred = get_credentials()
    biz_type = get_biz_type()

    try:
        resp = call_image_moderation(
            cred,
            image_url=image_url,
            file_content=file_content,
            data_id=args.data_id,
            biz_type=biz_type,
        )
        result = format_output(resp)
        print(json.dumps(result, ensure_ascii=False, indent=2))

    except TencentCloudSDKException as err:
        print(json.dumps({
            "error": "API_ERROR",
            "code": err.code,
            "message": err.message,
            "request_id": err.requestId or "",
        }, ensure_ascii=False, indent=2))
        sys.exit(1)

    except Exception as err:
        print(json.dumps({
            "error": "UNEXPECTED_ERROR",
            "message": str(err),
        }, ensure_ascii=False, indent=2))
        sys.exit(1)


if __name__ == "__main__":
    main()


path: references/image_moderation_api.md
content: # ImageModeration API 参考文档

> 原始文档：[图片内容安全 - 图片内容检测](https://cloud.tencent.com/document/product/1125/53273)
>
> SDK 调用指引：[图片内容安全 - SDK 调用指引](https://cloud.tencent.com/document/product/1124/100983)

## 接口概述

- **接口名称**：ImageModeration
- **服务端点**：`ims.tencentcloudapi.com`
- **API 版本**：`2020-12-29`
- **SDK 模块**：`tencentcloud.ims.v20201229`
- **功能说明**：图片内容检测接口，支持对图片进行多维度安全检测，包括 AI 生成图片识别（`Type=IMAGE_AIGC`）。

---

## 核心输入参数

| 参数名称 | 必选 | 类型 | 描述 |
|---------|------|------|------|
| BizType | 否 | String | 自定义审核策略的编号。不填默认使用默认策略。在腾讯云内容安全控制台中可创建自定义策略。 |
| DataId | 否 | String | 业务数据标识，可用于将检测结果与业务数据进行关联，长度限制 128 字符。 |
| FileContent | 否 | String | 图片文件内容的 **Base64 编码**（与 FileUrl 二选一，同时存在时使用 FileContent）。 |
| FileUrl | 否 | String | 图片文件的访问 **URL**（与 FileContent 二选一）。 |
| Interval | 否 | Integer | GIF 图片截帧间隔（单位：帧数），默认为 0 表示只取第一帧。 |
| MaxFrames | 否 | Integer | GIF 图片最大截帧数量，默认为 1。 |
| Type | 否 | String | 检测类型。设置为 `IMAGE_AIGC` 时进行 AI 生成图片识别判定。不传或留空时为常规内容安全检测。 |

### 图片输入说明

- `FileContent` 和 `FileUrl` **二选一**，同时存在时优先使用 `FileContent`
- 支持格式：**PNG、JPG、JPEG、BMP、GIF、WEBP**
- 图片大小限制：**不超过 5MB**
- 图片分辨率建议：**不低于 256x256**

---

## 核心输出参数

| 参数名称 | 类型 | 描述 |
|---------|------|------|
| Suggestion | String | 处置建议：`Block`（建议打击）、`Review`（建议人工复审）、`Pass`（建议通过） |
| Label | String | 恶意标签，当 `Suggestion=Pass` 时为 `Normal`。可能值包括：`Normal`（正常）、`Porn`（色情）、`Abuse`（谩骂）、`Ad`（广告）、`Custom`（自定义违规）、`GeneratedContentRisk`（AI 生成内容风险）等 |
| SubLabel | String | 二级标签分类 |
| Score | Integer | 风险置信度评分，范围 0-100。分数越高表示风险越大：<br>• 0-60：低风险<br>• 60-80：中风险<br>• 80-100：高风险 |
| LabelResults | Array of [LabelResult](#labelresult-对象) | 分类模型检测结果，包含各检测维度的具体信息 |
| ObjectResults | Array of [ObjectResult](#objectresult-对象) | 物体检测结果 |
| OcrResults | Array of [OcrResult](#ocrresult-对象) | OCR 检测结果 |
| Extra | String | 附加信息，JSON 字符串格式 |
| DataId | String | 请求时传入的 DataId |
| BizType | String | 使用的审核策略编号 |
| RequestId | String | 唯一请求 ID |

### LabelResult 对象

| 参数名称 | 类型 | 描述 |
|---------|------|------|
| Scene | String | 检测场景，如 `Porn`、`Terrorism` 等 |
| Label | String | 恶意标签 |
| Suggestion | String | 处置建议 |
| Score | Integer | 置信度评分 0-100 |
| SubLabel | String | 二级标签 |
| Details | Array of [LabelDetailItem](#labeldetailitem-对象) | 详细标签信息 |

### LabelDetailItem 对象

| 参数名称 | 类型 | 描述 |
|---------|------|------|
| Id | Integer | 序号 |
| Name | String | 标签名称 |
| Score | Integer | 置信度评分 |

### ObjectResult 对象

| 参数名称 | 类型 | 描述 |
|---------|------|------|
| Scene | String | 检测场景 |
| Label | String | 恶意标签 |
| Suggestion | String | 处置建议 |
| Score | Integer | 置信度评分 0-100 |
| SubLabel | String | 二级标签 |
| Names | Array of String | 物体名称列表 |
| Location | [Location](#location-对象) | 物体位置 |

### OcrResult 对象

| 参数名称 | 类型 | 描述 |
|---------|------|------|
| Scene | String | 检测场景 |
| Label | String | 恶意标签 |
| Suggestion | String | 处置建议 |
| Score | Integer | 置信度评分 0-100 |
| SubLabel | String | 二级标签 |
| Text | String | OCR 识别的文本内容 |
| Details | Array of [OcrTextDetail](#ocrtextdetail-对象) | OCR 详细信息 |

### OcrTextDetail 对象

| 参数名称 | 类型 | 描述 |
|---------|------|------|
| Text | String | 识别到的文本 |
| Label | String | 恶意标签 |
| Keywords | Array of String | 命中的关键词列表 |
| Score | Integer | 置信度评分 |
| Location | [Location](#location-对象) | 文本位置 |

### Location 对象

| 参数名称 | 类型 | 描述 |
|---------|------|------|
| X | Float | 左上角 X 坐标 |
| Y | Float | 左上角 Y 坐标 |
| Width | Float | 宽度 |
| Height | Float | 高度 |
| Rotate | Float | 旋转角度 |

---

## AIGC 检测说明

当设置 `Type=IMAGE_AIGC` 时，接口会对输入图片进行 AI 生成内容的判定：

- **Score**：AIGC 风险分值，分数越高表示图片越可能是 AI 生成
- **Label**：当判定为 AI 生成时，Label 会反映相应标签（如 `GeneratedContentRisk`）
- **Suggestion**：
  - `Pass`：图片大概率为真实图片
  - `Review`：存疑，建议人工复审
  - `Block`：图片大概率为 AI 生成

---

## 请求频率限制

| 检测类型 | 默认 QPS 上限 |
|---------|-------------|
| IMAGE_AIGC（AI 生成图片识别） | 以控制台配额为准 |
| 常规图片内容安全检测 | 以控制台配额为准 |

> 超过频率限制会返回 `RequestLimitExceeded` 错误。如需提升配额，请联系腾讯云商务或提工单申请。

---

## 常见错误码

| 错误码 | 描述 | 处理建议 |
|-------|------|---------|
| AuthFailure | 鉴权失败 | 检查 SecretId 和 SecretKey 是否正确 |
| AuthFailure.SignatureExpire | 签名过期 | 检查系统时间是否准确 |
| InternalError | 内部错误 | 稍后重试 |
| InvalidParameter | 参数错误 | 检查请求参数是否符合规范 |
| InvalidParameterValue | 参数取值错误 | 检查图片 URL 或 Base64 编码是否正确 |
| InvalidParameterValue.ImageSizeExceed | 图片大小超限 | 压缩图片至 5MB 以内 |
| MissingParameter | 缺少参数 | 检查必填参数是否传入 |
| RequestLimitExceeded | 请求频率超限 | 降低请求频率或申请提升配额 |
| ResourceNotFound | 资源不存在 | 检查 BizType 是否正确 |
| UnauthorizedOperation | 未授权操作 | 确认账号已开通图片内容安全服务 |
| UnsupportedOperation | 不支持的操作 | 检查 API 版本和接口名称 |

---

## 调用示例（Python SDK）

```python
import base64
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.ims.v20201229 import ims_client, models

# Create credentials
cred = credential.Credential("your-secret-id", "your-secret-key")

# Configure HTTP and Client profiles
httpProfile = HttpProfile()
httpProfile.endpoint = "ims.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile

# Create client
client = ims_client.ImsClient(cred, "ap-guangzhou", clientProfile)

# Build request - using URL
req = models.ImageModerationRequest()
req.FileUrl = "https://example.com/image.jpg"
req.Type = "IMAGE_AIGC"

# Send request
resp = client.ImageModeration(req)
print(json.loads(resp.to_json_string()))

# Alternative: using local file with Base64
with open("image.png", "rb") as f:
    content = base64.b64encode(f.read()).decode("utf-8")
req2 = models.ImageModerationRequest()
req2.FileContent = content
req2.Type = "IMAGE_AIGC"
resp2 = client.ImageModeration(req2)
print(json.loads(resp2.to_json_string()))
```


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)