我用 Rust 写了个 AI 媒体管家:Gliding Horse 赋能 media_agent,让 ComfyUI 工作流彻底自动化
摘要:本文深入介绍如何用 Rust 构建 AI Agent 操作系统 Gliding Horse,并将其能力注入 ComfyUI 图片生成领域,打造出 media_agent 自动化工作流系统。文章详细解析了动态 PDCA 编排、JSON‑LD 语义总线、33+ 自定义节点、13 种模型架构支持等核心技术,并通过与传统 ComfyUI 的对比,展示 Agent 驱动的图片/视频生成如何从"手工作坊"进化为"自动化流水线"。适合对 Stable Diffusion、AI Agent、Rust 系统开发感兴趣的读者。
关键词:Rust, AI Agent, ComfyUI, Gliding Horse, media_agent, Stable Diffusion, PDCA, 工作流自动化, 图片生成, 视频生成, JSON-LD, 模型管理
玩过 Stable Diffusion 的朋友都知道,搭工作流是个体力活。文生图、图生图、ControlNet、LoRA 叠加......光是把节点连对就能耗掉一个下午。更别提视频生成、模型管理这些高级需求,一旦流程复杂起来,ComfyUI 那满屏的蜘蛛网简直让人头皮发麻。
我就想:能不能让 AI 自己来搭工作流?于是我把自己之前写的 Gliding Horse(流马)------一个完整的 AI Agent 操作系统 ------的能力注入到了图片生成领域,做出了 media_agent。它是一个用 Rust 从零写的 ComfyUI Agent,不仅能跑图,还能自己规划、执行、检查生成任务,把 PDCA 循环和 JSON‑LD 语义工作流带到了图像生成场景。
一、Gliding Horse:给 Agent 配上一套"操作系统"
先简单介绍下 Gliding Horse。它是一个用 Rust 构建的 AI Agent 操作系统,核心思想是把 LLM 当成 CPU,给它配上缓存、内存、文件系统和权限管理。它最大的特色是动态 PDCA 编排 和JSON‑LD 语义总线:
- 动态 PDCA:SA(调度器)根据任务的 5W2H 自动决定执行拓扑------简单任务直接交给 DA 执行,复杂任务自动拆解为计划、执行、检查、决策的循环,甚至并行调度多个 Agent。
- JSON‑LD DAG:所有的任务步骤、技能依赖、中间产物都用 JSON‑LD 表达,通过 SPARQL 查询实时编译成可执行的有向无环图,Agent 不再依赖预设的静态流程。
传统 ComfyUI 工作流是一个静态的 JSON 文件,节点之间的连接是死的。而 Gliding Horse 让工作流活起来:Agent 可以根据用户意图自动选择合适的模型、采样器、后处理步骤,并动态组装出执行图。
二、media_agent:把 Agent 能力注入 ComfyUI
media_agent 就是基于 Gliding Horse 内核开发的增强智能图片/视频生成工作流系统 。它完全用 Rust 编写,在底层集成了 stable-diffusion.cpp 和 llama.cpp 作为推理引擎,支持 13 种模型类型、33+ 自定义节点以及 29 个预置工作流模板。
整个系统的架构长这样:
#mermaid-svg-5Xg2TNrF3XqaZpYD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5Xg2TNrF3XqaZpYD .error-icon{fill:#552222;}#mermaid-svg-5Xg2TNrF3XqaZpYD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5Xg2TNrF3XqaZpYD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .marker.cross{stroke:#333333;}#mermaid-svg-5Xg2TNrF3XqaZpYD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5Xg2TNrF3XqaZpYD p{margin:0;}#mermaid-svg-5Xg2TNrF3XqaZpYD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .cluster-label text{fill:#333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .cluster-label span{color:#333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .cluster-label span p{background-color:transparent;}#mermaid-svg-5Xg2TNrF3XqaZpYD .label text,#mermaid-svg-5Xg2TNrF3XqaZpYD span{fill:#333;color:#333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .node rect,#mermaid-svg-5Xg2TNrF3XqaZpYD .node circle,#mermaid-svg-5Xg2TNrF3XqaZpYD .node ellipse,#mermaid-svg-5Xg2TNrF3XqaZpYD .node polygon,#mermaid-svg-5Xg2TNrF3XqaZpYD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5Xg2TNrF3XqaZpYD .rough-node .label text,#mermaid-svg-5Xg2TNrF3XqaZpYD .node .label text,#mermaid-svg-5Xg2TNrF3XqaZpYD .image-shape .label,#mermaid-svg-5Xg2TNrF3XqaZpYD .icon-shape .label{text-anchor:middle;}#mermaid-svg-5Xg2TNrF3XqaZpYD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5Xg2TNrF3XqaZpYD .rough-node .label,#mermaid-svg-5Xg2TNrF3XqaZpYD .node .label,#mermaid-svg-5Xg2TNrF3XqaZpYD .image-shape .label,#mermaid-svg-5Xg2TNrF3XqaZpYD .icon-shape .label{text-align:center;}#mermaid-svg-5Xg2TNrF3XqaZpYD .node.clickable{cursor:pointer;}#mermaid-svg-5Xg2TNrF3XqaZpYD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .arrowheadPath{fill:#333333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5Xg2TNrF3XqaZpYD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5Xg2TNrF3XqaZpYD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5Xg2TNrF3XqaZpYD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5Xg2TNrF3XqaZpYD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5Xg2TNrF3XqaZpYD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5Xg2TNrF3XqaZpYD .cluster text{fill:#333;}#mermaid-svg-5Xg2TNrF3XqaZpYD .cluster span{color:#333;}#mermaid-svg-5Xg2TNrF3XqaZpYD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5Xg2TNrF3XqaZpYD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5Xg2TNrF3XqaZpYD rect.text{fill:none;stroke-width:0;}#mermaid-svg-5Xg2TNrF3XqaZpYD .icon-shape,#mermaid-svg-5Xg2TNrF3XqaZpYD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5Xg2TNrF3XqaZpYD .icon-shape p,#mermaid-svg-5Xg2TNrF3XqaZpYD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5Xg2TNrF3XqaZpYD .icon-shape .label rect,#mermaid-svg-5Xg2TNrF3XqaZpYD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5Xg2TNrF3XqaZpYD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5Xg2TNrF3XqaZpYD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5Xg2TNrF3XqaZpYD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} API 层
HTTP Server (Axum)
WebSocket 实时推送
模型管理器
自动扫描索引
双层 LRU 缓存
(VRAM + RAM)
推理后端
stable-diffusion.cpp
GPU 推理
llama.cpp
LLM 文本编码
本地处理器
VAE 编解码
工作流引擎
PDCA 模式 (默认)
JSON-LD DAG 模式 (复杂任务)
节点并行执行器
Agent 编排层 (来自 Gliding Horse)
SA 调度器
PDCA 动态编排
JSON-LD DAG 编译器
工作流图编译
上下文管理引擎
IRI 索引 / Token 控制
你可以看到,media_agent 在普通的推理引擎之上架设了一层Agent 编排层 ,这正是 Gliding Horse 的核心价值:它让图片/视频生成不再只是"按图索骥"地执行一个固定 JSON,而是变成了一个可决策、可纠错、可复用的认知流程。
三、PDCA 如何让出图更靠谱?
举个实际的例子:用户输入"把这张照片变成吉卜力风格,分辨率 2K"。
传统做法是手动选择图生图节点,调整 ControlNet 和 LoRA 权重,一遍遍抽卡。而 media_agent 的处理流程是:
- Plan :PA(计划 Agent)解析需求,识别出需要"图像加载→风格迁移→超分"三个步骤,并从技能图谱里找到最适合的 ControlNet 模型(
control_v11p_sd15_softedge)和风格 LoRA(ghibli_style_offset.safetensors)。 - Do:DA(执行 Agent)调用对应的节点执行,实时通过 WebSocket 推送预览图。
- Check:CA(检查 Agent)拿生成结果和用户需求比对,如果色彩偏差太大或细节丢失,自动标记为不合格。
- Act:AA(决策 Agent)根据检查结果决定是否调整参数重试,或者将合格的图片存入知识图谱。
整个过程都是 Agent 自动驱动的,用户只需要说一句话。
对于更复杂的任务,media_agent 还可以启用 JSON‑LD DAG 模式。工作流被编译成有向无环图,利用 Gliding Horse 的 SPARQL 查询引擎在运行时动态加载模型依赖,实现真正的"工作流即数据"。
四、富的节点与模型生态
media_agent 目前内置了 33+ 自定义节点,覆盖了:
- 模型加载:Checkpoint、UNET、CLIP、VAE、LoRA、ControlNet 等 8 种加载器
- 采样器:KSampler、高级采样器、自定义采样器、噪声注入
- 图片处理:缩放、超分、混合、裁剪、旋转、翻转、色彩调整、滤镜
- 视频处理:SVD 图转视频、帧插值、AnimateDiff 动画
支持 13 种模型架构,从经典的 SD1.5 到最新的 SD3.5、Flux、SVD、CogVideo 全部覆盖。模型管理器会自动扫描指定目录,建立索引,并提供双层 LRU 缓存(VRAM 优先,RAM 兜底),大幅降低重复加载开销。
实时预览通过 WebSocket 推送,每隔几步采样就发一张中间结果,让你在浏览器里就能看到出图过程,不用死等。
五、与传统 ComfyUI 的对比
| 特性 | ComfyUI | media_agent |
|---|---|---|
| 工作流定义 | 手动拖拽节点 JSON | 自然语言 + Agent 自动编排 |
| 流程适应性 | 静态,改需求要重搭 | PDCA 动态调整,自动纠错 |
| 模型管理 | 依赖路径配置 | 自动发现索引 + LRU 缓存 |
| 后端扩展 | Python 插件 | Rust 多后端池,GPU 推理高效 |
| 工作流复用 | 导出 JSON | JSON‑LD 语义图,可查询、可推导 |
| 实时交互 | WebSocket 预览 | 同支持,且 Agent 可实时响应反馈 |
media_agent 不是在重复造轮子,而是在 ComfyUI 成熟的节点思想之上,增加了一个"大脑"。这个大脑由 Gliding Horse 提供,让图片生成从"手工作坊"进化到了"自动化流水线"。
六、开源与未来
media_agent 和 Gliding Horse 都已经在 GitHub 开源:
- media_agent:https://github.com/doiito/media_agent
- Gliding Horse:https://github.com/doiito/gliding_horse
media_agent 目前已经完成了 188 个单元测试,覆盖模型管理、多后端、节点系统、工作流引擎等核心模块。如果你既对 Stable Diffusion 感兴趣,又想探索 AI Agent 的落地实践,这两个项目绝对值得一看。
未来我计划为 media_agent 增加 WebUI 前端、分布式推理支持,以及更多视频生成模型的集成。但更让我兴奋的是:Agent OS 的思路正在从一个抽象概念,变成可以跑图、可以写代码、可以管工作流的实际工具。这或许就是 AI 工程化的下一站。
欢迎 star,欢迎提 issue,更欢迎一起把 Agent 从"玩具"变成"生产力"。