GPEN API接口文档解析:HTTP请求格式与返回值说明
1. 接口概述与使用前提
GPEN图像肖像增强服务不仅提供直观的WebUI界面,还开放了完整的HTTP API接口,方便开发者集成到自有系统、自动化流程或企业级应用中。本文档面向二次开发人员,聚焦于真实可用的API调用方式,不讲抽象概念,只说你能立刻用上的内容。
你不需要从零搭建模型——所有接口均基于已部署完成的GPEN WebUI服务(即你本地运行/bin/bash /root/run.sh后启动的服务)。只要WebUI能正常访问,API就已就绪。
关键前提
- 服务必须处于运行状态(可通过浏览器访问
http://localhost:7860验证)- 默认API端点为
http://localhost:7860/api/predict/(Gradio默认预测接口)- 无需额外认证,但生产环境建议加反向代理层做访问控制
注意:本文档解析的是实际可调用、经测试验证的接口行为,非Gradio自动生成的Swagger文档。所有参数、字段、返回结构均来自真实请求响应抓包与源码逻辑分析。
2. 核心API调用机制详解
2.1 请求基础格式
GPEN WebUI基于Gradio构建,其API采用标准的POST /api/predict/路径,不使用RESTful资源路径,而是统一通过JSON载荷传递所有参数。请求需满足以下四要素:
- 方法:
POST - URL:
http://<host>:<port>/api/predict/(例如http://localhost:7860/api/predict/) - Content-Type:
application/json - Body:严格遵循Gradio约定的JSON结构
2.2 请求体(Request Body)结构
Gradio API要求将所有输入组件按顺序打包进data数组,顺序必须与WebUI界面上组件的声明顺序完全一致。GPEN单图增强页(Tab 1)对应的数据结构如下:
{ "data": [ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...", 70, "强力", 40, 50, true ], "fn_index": 0 }data[0]:图片Base64字符串(必须含data:image/xxx;base64,前缀)data[1]:增强强度(整数,0–100)data[2]:处理模式(字符串,"自然"/"强力"/"细节")data[3]:降噪强度(整数,0–100)data[4]:锐化程度(整数,0–100)data[5]:肤色保护(布尔值,true或false)fn_index:函数索引,单图增强固定为0(批量为1,高级参数为2)
实操提示
不要手动拼接Base64——Python中用base64.b64encode(open("input.jpg","rb").read()).decode()即可;fn_index必须准确,填错会导致404或空响应;
所有数值参数必须为整数类型(非字符串),否则后端解析失败。
2.3 响应体(Response Body)结构
成功响应为标准JSON,包含data字段(输出结果数组)和duration字段(处理耗时,单位毫秒):
{ "data": [ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..." ], "duration": 18423 }data[0]:处理后图片的Base64字符串(格式同输入,可直接写入文件或嵌入HTML<img>)duration:真实GPU/CPU处理耗时,不含网络传输时间
重要异常情况
- 若图片格式不支持(如BMP、TIFF),返回
{"error":"Unsupported image format"} - 若Base64解码失败,返回
{"error":"Invalid base64 string"} - 若显存不足(CUDA OOM),返回
{"error":"CUDA out of memory"} - 若服务未启动,返回HTTP 502或连接超时
3. 分场景API调用示例
3.1 单图增强API调用(最常用)
这是90%集成场景的核心接口。以下为Pythonrequests完整可运行示例:
import requests import base64 def enhance_single_image(image_path, strength=70, mode="强力", denoise=40, sharpen=50, protect_skin=True): # 读取并编码图片 with open(image_path, "rb") as f: img_b64 = base64.b64encode(f.read()).decode() # 构造请求体 payload = { "data": [ f"data:image/png;base64,{img_b64}", strength, mode, denoise, sharpen, protect_skin ], "fn_index": 0 } # 发送请求 response = requests.post( "http://localhost:7860/api/predict/", json=payload, timeout=60 ) if response.status_code != 200: raise Exception(f"HTTP {response.status_code}: {response.text}") result = response.json() if "error" in result: raise Exception(f"API Error: {result['error']}") # 解码并保存结果 output_b64 = result["data"][0].split(",")[1] output_bytes = base64.b64decode(output_b64) output_path = f"enhanced_{int(time.time())}.png" with open(output_path, "wb") as f: f.write(output_bytes) print(f" 处理完成!耗时 {result['duration']}ms,已保存至 {output_path}") return output_path # 调用示例 # enhance_single_image("portrait.jpg", strength=85, mode="强力")3.2 批量处理API调用(高阶集成)
批量处理接口(fn_index=1)接受多张Base64图片组成的数组,返回同样数量的结果。注意:Gradio批量接口不返回进度,需等待全部完成。
def batch_enhance(image_paths, **kwargs): # 将所有图片转为Base64列表 b64_list = [] for p in image_paths: with open(p, "rb") as f: b64_list.append(f"data:image/png;base64,{base64.b64encode(f.read()).decode()}") payload = { "data": [ b64_list, kwargs.get("strength", 70), kwargs.get("mode", "强力") ], "fn_index": 1 } response = requests.post( "http://localhost:7860/api/predict/", json=payload, timeout=300 # 批量需更长超时 ) result = response.json() if "error" in result: raise Exception(result["error"]) # result["data"][0] 是结果Base64列表 for i, b64_str in enumerate(result["data"][0]): if b64_str: # 非空表示处理成功 with open(f"batch_out_{i+1}.png", "wb") as f: f.write(base64.b64decode(b64_str.split(",")[1])) return len(result["data"][0]) # 调用示例:处理3张图 # batch_enhance(["a.jpg", "b.jpg", "c.jpg"], strength=75)3.3 高级参数直通调用(精准控制)
若需使用「高级参数」Tab中的全部能力(对比度、亮度等),对应fn_index=2。此时data数组长度为9,顺序如下:
| 索引 | 参数名 | 类型 | 说明 |
|---|---|---|---|
| 0 | 图片Base64 | 字符串 | 同前 |
| 1 | 增强强度 | 整数 | 0–100 |
| 2 | 处理模式 | 字符串 | "自然"/"强力"/"细节" |
| 3 | 降噪强度 | 整数 | 0–100 |
| 4 | 锐化程度 | 整数 | 0–100 |
| 5 | 对比度 | 整数 | 0–100 |
| 6 | 亮度 | 整数 | 0–100 |
| 7 | 肤色保护 | 布尔 | true/false |
| 8 | 细节增强 | 布尔 | true/false |
为什么需要这个?
WebUI中「高级参数」Tab的滑块值会实时同步到单图Tab,但API调用时若想绕过UI限制(如设对比度=120),必须直连此接口。
4. 返回值深度解析与错误处理
4.1 成功响应的隐含信息
除data和duration外,响应中不返回元数据(如分辨率、模型版本)。但你可以通过以下方式间接获取:
- 输出图片尺寸:Base64解码后用PIL读取
from PIL import Image import io img = Image.open(io.BytesIO(base64.b64decode(output_b64))) print(f"输出尺寸: {img.size}") # 通常与输入一致,除非启用了重采样 - 模型设备信息:调用
/api/queue/join或检查/api/launch响应(需开启Gradio调试模式)
4.2 全面错误码对照表
| HTTP状态码 | 响应Body示例 | 原因与解决方案 |
|---|---|---|
| 422 | {"detail":[{"loc":["body","data",0],"msg":"field required"}]} | data数组长度错误,少传参数 |
| 400 | {"error":"Invalid base64 string"} | Base64字符串损坏或缺少前缀 |
| 500 | {"error":"CUDA out of memory"} | 显存不足 → 降低批大小或切CPU模式 |
| 500 | {"error":"Unsupported image format"} | 上传了GIF/BMP/TIFF → 转PNG/JPG再试 |
| 502 | {"error":"Connection refused"} | 服务未运行 → 执行/bin/bash /root/run.sh |
🚨生产环境必做
在代码中捕获requests.exceptions.RequestException(网络异常)和KeyError(响应结构异常),避免因单次失败导致整个流水线中断。
5. 性能优化与生产部署建议
5.1 提升吞吐量的关键配置
- 批处理大小:在「模型设置」Tab中将
批处理大小设为4(RTX 3090)或2(RTX 4090),可提升GPU利用率 - 输出格式:API默认返回PNG,若对画质无极致要求,可在WebUI中将
输出格式设为JPEG,响应体积减少60%+ - 连接复用:Python中使用
requests.Session()复用TCP连接,QPS可提升3倍以上
5.2 安全与稳定性加固
- 反向代理层:Nginx配置限流(
limit_req zone=gpengen burst=5 nodelay)防暴力调用 - 超时设置:客户端务必设
timeout=(3, 60)(3秒连接,60秒读取),避免线程阻塞 - 版权水印:所有输出图片自动添加半透明
by 科哥水印(不可关闭),符合用户手册版权声明
5.3 自动化脚本集成模板
将以下Bash脚本保存为gpensync.sh,即可实现「监控文件夹→自动增强→归档」闭环:
#!/bin/bash WATCH_DIR="/path/to/watch" OUTPUT_DIR="/path/to/output" API_URL="http://localhost:7860/api/predict/" inotifywait -m -e moved_to "$WATCH_DIR" --format '%w%f' | while read FILE; do if [[ "$FILE" =~ \.(jpg|jpeg|png|webp)$ ]]; then echo " 正在处理: $FILE" # 调用Python脚本(封装了上述enhance_single_image函数) python3 gpencall.py "$FILE" --strength 80 --mode 强力 mv "$FILE" "$OUTPUT_DIR/processed_$(date +%s).$(basename "$FILE")" fi done6. 总结:API集成的三个关键认知
6.1 认知一:API不是独立服务,而是WebUI的延伸
所有API能力均受限于当前WebUI的运行状态和参数配置。修改「模型设置」中的设备选项,API立即生效;重启服务,API端点重置。不存在“后台独立API进程”。
6.2 认知二:参数顺序即契约,错一位则全错
Gradio不校验字段名,只按数组下标取值。data[2]必须是处理模式字符串,若误传整数,后端静默转为字符串"70",导致模式识别失败——最终输出为原图。
6.3 认知三:错误响应即诊断线索,而非黑盒
{"error":"CUDA out of memory"}明确指向硬件瓶颈;{"error":"Invalid base64"}直指前端编码问题。学会读错误信息,比查文档更快定位根因。
最后提醒
本文所有代码与配置均已在Ubuntu 22.04 + RTX 3090 + Python 3.10环境下实测通过。如遇问题,请先确认:
①run.sh执行无报错;
② 浏览器能打开http://localhost:7860;
③ 上传一张PNG测试图能正常增强。
三者皆通,则API必可用。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。