服务器定义了一系列 get 和 post 方法,
这些方法可以通过在 server.py 中搜索 @routes 找到。当你在网页客户端提交工作流时,
它会被发送到 /prompt 端点,该端点会验证提示并将其添加到执行队列中,
返回 prompt_id 和 number(队列中的位置),如果验证失败则返回 error 和 node_errors。
提示队列定义在 execution.py 中,该文件还定义了 PromptExecutor 类。
内置路由
server.py 定义了以下路由:
核心 API 路由
| 路径 | get/post/ws | 用途 |
|---|
/ | get | 加载 Comfy 网页 |
/ws | websocket | 用于与服务器进行实时通信的 WebSocket 端点 |
/embeddings | get | 获取可用的嵌入模型名称列表 |
/extensions | get | 获取注册了 WEB_DIRECTORY 的扩展列表 |
/features | get | 获取服务器功能和能力 |
/models | get | 获取可用模型类型列表 |
/models/{folder} | get | 获取特定文件夹中的模型 |
/workflow_templates | get | 获取自定义节点模块及其关联模板工作流的映射 |
/api/assets | get | 列出资产,支持过滤和分页(推荐) |
/api/assets | post | 上传新资产,支持标签和元数据(推荐) |
/api/assets/{id} | get | 按 ID 获取资产详情(推荐) |
/api/assets/{id}/content | get | 下载资产内容 |
/api/tags | get | 列出所有标签 |
/upload/image | post | 上传图片(旧版) |
/upload/mask | post | 上传蒙版(旧版) |
/view | get | 查看图片(旧版)。参见 server.py 中的 @routes.get("/view") |
/view_metadata/ | get | 获取模型的元数据 |
/system_stats | get | 获取系统信息(Python 版本、设备、显存等) |
/prompt | get | 获取当前队列状态和执行信息 |
/prompt | post | 提交提示到队列 |
/object_info | get | 获取所有节点类型的详细信息 |
/object_info/{node_class} | get | 获取特定节点类型的详细信息 |
/history | get | 获取队列历史记录 |
/history/{prompt_id} | get | 获取特定提示的队列历史记录 |
/history | post | 清除历史记录或删除历史记录项 |
/queue | get | 获取执行队列的当前状态 |
/queue | post | 管理队列操作(清除待处理/运行中的任务) |
/interrupt | post | 停止当前工作流执行 |
/free | post | 通过卸载指定模型释放内存 |
/userdata | get | 列出指定目录中的用户数据文件 |
/v2/userdata | get | 增强版本,以结构化格式列出文件和目录 |
/userdata/{file} | get | 获取特定的用户数据文件 |
/userdata/{file} | post | 上传或更新用户数据文件 |
/userdata/{file} | delete | 删除特定的用户数据文件 |
/userdata/{file}/move/{dest} | post | 移动或重命名用户数据文件 |
/users | get | 获取用户信息 |
/users | post | 创建新用户(仅限多用户模式) |
Assets API
Assets API (/api/assets) 提供了一个统一的、基于标签的文件管理系统(图片、模型、输出),支持内容寻址存储和元数据。这是上传、组织和检索文件的推荐方式。
列出资产
GET /api/assets 返回一个分页的资产列表,支持可选的过滤:
| 参数 | 类型 | 描述 |
|---|
include_tags | string | 过滤包含所有这些标签的资产(逗号分隔) |
exclude_tags | string | 排除包含任何这些标签的资产(逗号分隔) |
name_contains | string | 按名称子字符串过滤(不区分大小写) |
sort | string | 排序字段:name、created_at(默认)、updated_at、size |
order | string | 排序方向:asc、desc(默认) |
limit | integer | 返回的最大条目数(1-500,默认:20) |
offset | integer | 跳过的条目数(默认:0) |
响应:
{
"assets": [
{
"id": "asset-uuid",
"name": "my-image.png",
"hash": "blake3:abc123...",
"size_bytes": 102400,
"mime_type": "image/png",
"tags": ["output", "image"],
"created_at": "2024-01-29T12:00:00Z",
"preview_url": "/api/assets/asset-uuid/content"
}
],
"total": 42,
"offset": 0,
"limit": 20
}
上传资产
POST /api/assets 上传新资产(multipart/form-data):
| 字段 | 类型 | 描述 |
|---|
file | file | 要上传的文件(必需) |
name | string | 资产的显示名称 |
tags | string | 逗号分隔的标签(例如 input,reference) |
user_metadata | string | 自定义 JSON 元数据 |
获取资产详情
GET /api/assets/{id} 返回特定资产的完整详情。
下载资产内容
GET /api/assets/{id}/content 下载资产文件,带有适当的 Content-Type 和 Content-Disposition 头。
Assets API 使用 Blake3 哈希的内容寻址存储,这意味着相同的文件会自动去重。标签提供了灵活的组织方式,无需严格的文件夹层次结构。
WebSocket 通信
/ws 端点提供客户端与服务器之间的实时双向通信。用于:
- 接收执行进度更新
- 实时获取节点执行状态
- 接收错误消息和调试信息
- 队列状态变化时的实时更新
WebSocket 连接发送不同类型的 JSON 消息,例如:
status - 整体系统状态更新
execution_start - 当提示执行开始时
execution_cached - 当使用缓存结果时
executing - 节点执行期间的更新
progress - 长时间运行操作的进度更新
executed - 当节点完成执行时
自定义路由
如果你想在执行过程中从客户端向服务器发送消息,你需要在服务器中添加一个自定义路由。
对于复杂的情况,你需要深入研究 aiohttp 框架文档,但大多数情况可以按以下方式处理:
from server import PromptServer
from aiohttp import web
routes = PromptServer.instance.routes
@routes.post('/my_new_path')
async def my_function(request):
the_data = await request.post()
# the_data now holds a dictionary of the values sent
MyClass.handle_my_message(the_data)
return web.json_response({})
除非你确切知道自己在做什么,否则不要尝试在类中定义 my_function。
@routes.post 装饰器做了很多工作!相反,应该像上面那样定义函数,
然后调用一个类方法。
如果你不需要修改任何内容,也可以定义 @routes.get。
客户端可以通过发送 FormData 对象来使用这个新路由,代码如下所示,
这将导致上面代码中的 the_data 包含 message 和 node_id 键:
import { api } from "../../scripts/api.js";
function send_message(node_id, message) {
const body = new FormData();
body.append('message',message);
body.append('node_id', node_id);
api.fetchApi("/my_new_path", { method: "POST", body, });
}