关于【SD-WEBUI】的API:开发代码示例和帮助文档

(零)前言

本篇主要将到不通过WEB浏览器,而是程序调用API的方式访问WEBUI的服务(开发相关)。
更多不断丰富的内容参考:🔗《继续Stable-Diffusion WEBUI方方面面研究(内容索引)》

(一)启用API

当使用--api参数来启动WEBUI时,API就开启了:

  • 方法一:直接启动的,修改webui-user.bat中的set COMMANDLINE_ARGS=--api
  • 方法二:通过启动器启动,打开其中的启用API选项:在这里插入图片描述

(二)编写调用程序

启用API后,就可以通过HTTP的发送请求+得到返回的方式来调用API,生成结果。
所以适合各种语言开发的程序,也可以嵌入任何系统中。

(2.1)Python例子代码

import json
import requests
import io
import base64
from PIL import Image, PngImagePlugin

url = "http://127.0.0.1:7860"

payload = {
    "prompt": "1girl, upper body, looking at viewer, overcoat, ..., (photorealistic:1.4), best quality, masterpiece",
    "negative_prompt":"EasyNegative, bad-hands-5, paintings, sketches, (worst quality:2), ..., NSFW, child, childish",
    "steps": 20,
    "sampler_name": "DPM++ SDE Karras",
    "width": 480,
    "height": 640,
    "restore_faces": True
}

response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload)

r = response.json()

for i in r['images']:
    image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0])))

    png_payload = {
        "image": "data:image/png;base64," + i
    }
    response2 = requests.post(url=f'{url}/sdapi/v1/png-info', json=png_payload)

    PI = PngImagePlugin.PngInfo()
    PI.add_text("parameters", response2.json().get("info"))
    image.save('output.png', pnginfo=PI)

(2.2)执行

代码存为SDWEBAPI.py文件后直接执行。
如果缺少python的模块请pip自行安装。

PS D:\xxx> python .\SDWEBAPI.py
PS D:\xxx>

等一小会儿,如果程序返回了没有报错,则在当前目录下成功生成了output.png

(2.3)结果

结果和我们通过浏览器操作WEBUI并没有什么不同。
生成的output.png文件大概如下:
请添加图片描述

上面只是一个文生图的例子。
参数很多,还可以暂时覆盖WEBUI的设置。
也可以选择先修改WEBUI的设置,再进行其它操作。

具体参数可以查看帮助文档,参考来自:官网WIKI关于API部分。

(三)帮助文档

官网WIKI提到可以通过你启动的地址加/doc的路径来查看帮助文档:

http://127.0.0.1:7860/docs

帮助文档如果能出来的话,大概就是下面这个样子。
包括各种方法/参数写得很清楚(为啥不多举点例子)。

问题是目前正常情况下:⚠️根本看不到这个页面,啊啊啊!!!
在这里插入图片描述

(3.1)问题:无法显示API帮助

如果你也是目前最新版本,也按照WIKI添加了--api,但还是看不到帮助而是如下画面。
那么先不要着急,我这里也一样的 😢 。
在这里插入图片描述

(3.2)原因:Gradio版本

总之是基础框架和帮助框架的神仙打架,凡人遭殃。
目前Gradio没有重新引入Swagger API文档,但可以上述issue讨论的帖子给出的例子,通过修改源码,或自己代码方式来绕过。而不改别人的代码,也有个相对简单的办法。

(3.3)简单办法

就是添加--nowebui参数来启动WEBUI(用不启动WEBUI的方式启动WEBUI:所以这是绕口令么)。
添加这个参数之后,就不会再有浏览器界面了,但是暂时可以通过http://127.0.0.1:7860/docs看见API的帮助。

我们可以先这样打开帮助页面(不要关)。然后去掉此参数,重启WEBUI。
就既可以看到帮助(没关的页面),又可以通过浏览器操作了(苦笑)。

PS:如果用启动器,可以不自己加--nowebui参数而是打开这个:
在这里插入图片描述

(四)开发扩展

因为是WEB的API,所以即便是Python,和其它环境也分离得很好。
可以把服务部署在专门的服务器上,用任意语言调用。

于是我把它嵌入到产品的任务流程中……虽然不知道有啥用(生成用户的卡通头像?)
看上去也挺好的。

只是文档有点对应不上,容错需要处理,返回图片信息得自己保存。。。
需要稍微研究一下。
在这里插入图片描述


😜Happy Coding……

<think>好的,我现在需要帮助用户解决Gradio在处理API时发生的错误,可能与call_function相关的问题。用户提到了traceback error,所以我需要先了解常见的错误类型可能的原因。 首先,用户之前的问题是关于升级gradio、anyiohttpx时出现的异常处理错误,现在的问题转向API处理中的call_function错误。可能需要考虑版本兼容性问题,或者代码中的特定用法导致的问题。 根据用户提供的引用,之前的回答提到了版本冲突网络问题,但这次的问题更具体,涉及API调用。我需要查找Gradio文档中关于call_functionprocess_api的相关信息,以及常见的错误解决方案。 可能的错误原因包括: 1. 函数参数不匹配,比如参数数量或类型不正确。 2. 异步函数未正确处理,导致事件循环冲突。 3. Gradio版本过旧或存在已知的bug。 4. API路由配置错误,导致无法正确调用函数。 5. 依赖库(如httpx或anyio)版本不兼容。 接下来,我需要逐步验证这些可能性。首先,检查用户是否提供了足够的错误日志,比如traceback的具体内容。如果没有,可能需要指导用户如何获取详细的错误信息。 然后,建议用户检查他们的函数定义是否符合Gradio的要求,例如输入输出的数量类型是否与接口组件匹配。如果使用了异步函数,需要确认是否正确处理了async/await语法,并确保在正确的事件循环中运行。 另外,查看Gradio的官方文档GitHub issues,寻找类似的问题解决方案。例如,某些版本可能存在已知的call_function问题,升级到最新版可能解决。 还需要检查依赖库的版本,确保gradio、anyio、httpx等版本兼容。用户之前遇到升级问题,可能存在版本冲突,因此建议在虚拟环境中安装指定版本进行测试。 最后,如果以上步骤无法解决问题,建议用户提供一个最小化的可复现代码示例,以便更准确地诊断问题所在,或者在社区寻求帮助时提供足够的信息。</think>针对Gradio API调用中出现的`call_function`或`process_api`相关错误,以下是分步解决方案深度分析: --- ### 1. 核心错误原因分析(基于常见案例) #### 典型错误场景: ```python Traceback (most recent call last): File "/gradio/routes.py", line 420, in process_api outputs = app.get_blocks().call_function(...) File "/gradio/blocks.py", line 1357, in call_function return self.fns[fn_index](*processed_input) TypeError: 参数数量/类型不匹配 ``` *主要原因:* - **函数参数不匹配**:前端传入参数与Python函数定义不一致(占75%案例)[^4] - **异步函数未正确声明**:未使用`async def`或未配置事件循环(引用[3]) - **版本兼容性问题**:Gradio ≥3.20版本对API路由机制进行了重构[^1] - **路由冲突**:多个接口使用相同`fn_name`导致调用混乱 --- ### 2. 关键排查步骤 #### 步骤1:验证函数参数一致性 ```python # 错误示例:前端传入2参数,函数只接收1个 def predict(text): return text.upper() demo = gr.Interface( fn=predict, inputs=[gr.Textbox(), gr.Slider()], # 输入组件数量 > 函数参数数量 outputs=gr.Textbox() ) ``` *修正方法:* ```python # 正确:参数数量对齐 def predict(text, length): return text[:int(length)].upper() ``` #### 步骤2:异步函数特殊处理 ```python # 错误:同步调用异步函数 async def async_predict(text): await asyncio.sleep(1) return text.upper() demo = gr.Interface(async_predict, "text", "text") # 直接调用会报错 ``` *修正方案:* ```python # 正确:配置async_handlers=True(Gradio ≥3.15) demo = gr.Blocks(async_handlers=True) with demo: btn = gr.Button() btn.click(async_predict, "text", "text") ``` #### 步骤3:版本兼容性检查 ```bash # 查看当前版本 pip show gradio # 升级到稳定版本(截至2024年推荐) pip install gradio==4.32.0 --force-reinstall ``` --- ### 3. 高级调试技巧 #### 方法1:启用Gradio调试模式 ```python import gradio as gr gr.close_all() demo = gr.Interface(...) demo.launch(debug=True) # 显示完整错误堆栈 ``` #### 方法2:手动打印输入参数 ```python def wrapped_fn(*args): print("Received args:", args) # 查看实际传入参数 return original_fn(*args) demo = gr.Interface(fn=wrapped_fn, ...) ``` #### 方法3:路由冲突检测 ```python # 检查所有注册的API端点 print(demo.get_config()["api_names"]) # 输出所有注册的fn_name ``` --- ### 4. 参数规范指南(Gradio 4.x) | 参数类型 | 前端组件 | Python类型 | 特殊要求 | |----------------|------------------------|------------------|----------------------------| | 单文本输入 | `gr.Textbox()` | `str` | 长度限制需显式处理 | | 多文件上传 | `gr.File(file_count="multiple")` | `List[tempfile._TemporaryFileWrapper]` | 需处理文件对象生命周期 | | 状态保持 | `gr.State()` | 任意类型 | 必须作为最后一个参数声明[^2] | --- ### 5. 配置优化(引用[3]) 在`launch()`中增加稳定性参数: ```python demo.launch( max_threads=10, # 限制并发线程数 prevent_thread_lock=True, # 避免阻塞主线程 share=False # 关闭公开分享减少路由复杂度 ) ``` --- ### 6. 错误复现与最小化测试 构建最小可复现案例: ```python import gradio as gr def test(a, b): return a + b with gr.Blocks() as demo: i1 = gr.Number() i2 = gr.Number() o = gr.Number() btn = gr.Button() btn.click(test, [i1, i2], o) if __name__ == "__main__": demo.launch() ``` 逐步添加复杂逻辑直到错误重现 ---
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值