import os
import json
import base64
import requests
from datetime import datetime
from flask import Flask, request, jsonify, render_template_string
from threading import Lock
app = Flask(__name__)
moderation_data = {}
data_lock = Lock()
NVIDIA_API_KEY = os.environ.get("NVIDIA_API_KEY", "")
NVIDIA_ENDPOINT = "https://integrate.api.nvidia.com/v1/chat/completions"
MODEL_NAME = "qwen/qwen3.5-397b-a17b"
SYSTEM_PROMPT = """你是一个图片内容审核AI助手。请分析用户提供的图片内容,判断是否包含以下违规内容:
1. 色情/低俗内容
2. 暴力/血腥内容
3. 政治敏感内容
4. 恐怖/惊悚内容
5. 赌博/诈骗内容
6. 其他违反法律法规的内容
请基于图片分析结果,严格判断:
- 如果图片内容安全,不包含任何违规元素,返回 "TRUE"
- 如果图片包含任何违规内容或无法确定安全性,返回 "FALSE"
注意:只返回TRUE或FALSE,不要返回其他内容。"""
HTML_TEMPLATE = """
图片审核系统
🖼️ 图片审核系统
🔌 API 接口文档
审核图片: POST /api/moderate
人工通过: POST /api/approve/{id}
人工拒绝: POST /api/reject/{id}
查看详情: GET /api/status/{id}
"""
def encode_image_to_base64(image_data):
try:
return base64.b64decode(image_data)
except:
return None
def call_nvidia_api(image_base64):
if not NVIDIA_API_KEY:
return None, "API密钥未配置,请在Space设置中添加NVIDIA_API_KEY环境变量"
headers = {
"Authorization": f"Bearer {NVIDIA_API_KEY}",
"Content-Type": "application/json",
}
payload = {
"model": MODEL_NAME,
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": SYSTEM_PROMPT},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_base64}"},
},
],
}
],
"max_tokens": 10,
"thinking": {"type": "off"},
}
try:
response = requests.post(
NVIDIA_ENDPOINT, headers=headers, json=payload, timeout=120
)
if response.status_code == 200:
result = response.json()
content = result["choices"][0]["message"]["content"].strip().upper()
return content, None
else:
return None, f"API错误: {response.status_code} - {response.text}"
except Exception as e:
return None, str(e)
@app.route("/")
def index():
return render_template_string(HTML_TEMPLATE)
@app.route("/api/moderate", methods=["POST"])
def moderate():
data = request.json
image_data = data.get("image", "")
if not image_data:
return jsonify({"error": "没有图片数据"}), 400
image_bytes = encode_image_to_base64(image_data)
if not image_bytes:
return jsonify({"error": "图片格式错误"}), 400
ai_result, error = call_nvidia_api(image_data)
if error:
return jsonify({"error": error}), 500
with data_lock:
import uuid
item_id = str(uuid.uuid4())[:8]
status = "ai-pass" if ai_result == "TRUE" else "ai-reject"
moderation_data[item_id] = {
"id": item_id,
"image": f"data:image/jpeg;base64,{image_data}",
"ai_result": ai_result,
"status": status,
"final_status": None,
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
return jsonify({"id": item_id, "ai_result": ai_result, "status": status})
@app.route("/api/approve/", methods=["POST"])
def approve(item_id):
with data_lock:
if item_id in moderation_data:
moderation_data[item_id]["status"] = "approved"
moderation_data[item_id]["final_status"] = "approved"
return jsonify({"success": True, "status": "approved"})
return jsonify({"error": "未找到记录"}), 404
@app.route("/api/reject/", methods=["POST"])
def reject(item_id):
with data_lock:
if item_id in moderation_data:
moderation_data[item_id]["status"] = "rejected"
moderation_data[item_id]["final_status"] = "rejected"
return jsonify({"success": True, "status": "rejected"})
return jsonify({"error": "未找到记录"}), 404
@app.route("/api/status/", methods=["GET"])
def get_status(item_id):
with data_lock:
if item_id in moderation_data:
item = moderation_data[item_id]
return jsonify(
{
"id": item["id"],
"ai_result": item["ai_result"],
"status": item["final_status"]
if item["final_status"]
else item["status"],
"time": item["time"],
}
)
return jsonify({"error": "未找到记录"}), 404
@app.route("/api/history", methods=["GET"])
def history():
with data_lock:
items = list(moderation_data.values())[-20:][::-1]
status_text = {
"ai-pass": "AI通过",
"ai-reject": "待复审",
"approved": "人工通过",
"rejected": "人工拒绝",
}
return jsonify(
{
"items": [
{
"id": item["id"],
"image": item["image"],
"ai_result": item["ai_result"],
"status": item["final_status"]
if item["final_status"]
else item["status"],
"status_text": status_text.get(
item["final_status"]
if item["final_status"]
else item["status"],
"未知",
),
"time": item["time"],
}
for item in items
]
}
)
if __name__ == "__main__":
port = int(os.environ.get("PORT", 7860))
app.run(host="0.0.0.0", port=port)