我用 Rust 写了个 AI 媒体管家:Gliding Horse 赋能 media_agent,目标是让 ComfyUI 工作流彻底自动化

我用 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.cppllama.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 的处理流程是:

  1. Plan :PA(计划 Agent)解析需求,识别出需要"图像加载→风格迁移→超分"三个步骤,并从技能图谱里找到最适合的 ControlNet 模型(control_v11p_sd15_softedge)和风格 LoRA(ghibli_style_offset.safetensors)。
  2. Do:DA(执行 Agent)调用对应的节点执行,实时通过 WebSocket 推送预览图。
  3. Check:CA(检查 Agent)拿生成结果和用户需求比对,如果色彩偏差太大或细节丢失,自动标记为不合格。
  4. 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 目前已经完成了 188 个单元测试,覆盖模型管理、多后端、节点系统、工作流引擎等核心模块。如果你既对 Stable Diffusion 感兴趣,又想探索 AI Agent 的落地实践,这两个项目绝对值得一看。

未来我计划为 media_agent 增加 WebUI 前端、分布式推理支持,以及更多视频生成模型的集成。但更让我兴奋的是:Agent OS 的思路正在从一个抽象概念,变成可以跑图、可以写代码、可以管工作流的实际工具。这或许就是 AI 工程化的下一站。

欢迎 star,欢迎提 issue,更欢迎一起把 Agent 从"玩具"变成"生产力"。

相关推荐
qcx231 小时前
Agentic RAG不止能回答问题,已经能自动修复真实CVE漏洞了
人工智能·机器学习·ai·llm·脑信号
用户39483951075531 小时前
用一个 MCP 给你的 AI 装上长期记忆——从原理到配置全流程
人工智能
TanYYF1 小时前
spring ai入门教程一
java·人工智能·spring
jaychouchannel1 小时前
RecursiveCharacterTextSplitter 中文切分隐形缺陷:重叠、断语义、列表割裂完整复现与修复
人工智能·机器学习
用户938515635071 小时前
手把手教你实现一个 MCP 文件读取服务器:从协议到代码的深度解析
javascript·人工智能
Xiaoda111 小时前
vLLM Scheduler:为什么 Continuous Batching 是 LLM Serving 的核心?
架构
matlab代码1 小时前
基于CNN卷积神经网络手写汉字识别系统 (GUI界面)【源码38期】
人工智能·神经网络·cnn·汉字识别
用户938515635071 小时前
RAG 实战:从零搭建语义搜索系统,彻底告别关键词匹配的尴尬
javascript·人工智能
EMA2 小时前
Rag中Query改写的实践方案总结
人工智能