Layer 2:工作流执行引擎——ComfyUI 的核心逻辑,Rust 实现
这是 media_agent 的“心脏”完全用 Rust 重写了 ComfyUI 的执行引擎Validator对工作流进行拓扑排序检测循环依赖输出缺失节点列表。PromptQueue基于二叉堆的优先级队列支持队首插入和历史缓存。PromptExecutor逐节点执行工作流管理缓存命中和事件推送。HierarchicalCache基于节点指纹的层级缓存——指纹由节点类型、输入参数和 IS_CHANGED 函数返回值联合哈希计算最大化复用已有计算结果。事件系统通过 WebSocket 实时推送执行进度、中间预览图、完成或错误事件。执行引擎的异步运行时基于 Tokio充分利用 Rust 的无 GIL 原生并发特性多个节点可以真正并行执行——这是 Python 版 ComfyUI 的 asyncio 无法做到的。四、Layer 1四后端混合推理media_agent 不绑定单一推理引擎而是设计了一个后端路由器根据模型类型自动选择最优后端模型类型推理后端说明扩散主干 (SD1.5/SDXL/SD3/Flux)stable-diffusion.cppGPU 推理 (CUDA/Vulkan)支持 Flash AttentionLLM 文本编码器 (T5/Qwen)llama.cpp GGUF高效 LLM 推理CLIP/VAE本地处理器轻量组件本地执行PyTorch 模型预留接口显存充足时可切换后端路由器会根据当前 GPU 显存、模型大小等因素自动决策。例如显存小于 12GB 时优先使用 stable-diffusion.cpp 而非 PyTorch避免 OOM。五、Gliding Horse 为 media_agent 注入了什么media_agent 的智能编排层本质上就是 Gliding Horse 的 Agent 能力在图片生成领域的垂直应用。具体来说动态 PDCA 编排复杂任务自动拆解为 Plan→Do→Check→Act 循环不合格自动重试调参。JSON‑LD DAG 工作流29 个预置模板和运行时编译的 DAG 都使用 JSON‑LD 表达支持 SPARQL 查询和语义推理。上下文管理多轮对话的上下文不膨胀历史摘要通过 IRI 索引LLM 需要细节时按需检索。工具调用门参数填充器和后端路由器的调用经过 Schema 校验确保不会传入非法参数。可以说Gliding Horse 是 Agent 操作系统media_agent 是跑在这个系统上的图片生成应用。六、与 Python 版 ComfyUI 的对比维度Python 版 ComfyUImedia_agent工作流编排手动拖拽自然语言 LLM 自动编排流程适应性静态改需求重搭PDCA 动态调整自动纠错推理后端PyTorchstable-diffusion.cpp llama.cpp 混合并发模型asyncio (单线程)Tokio (真正多线程无 GIL)缓存策略HierarchicalCache同算法Rust 实现更快节点定义Python 类继承Rust Trait编译期类型检查部署方式Docker 单容器Docker Compose 多服务media_agent 不是在替代 ComfyUI而是在它成熟的节点思想之上增加了一个“大脑”同时用 Rust 重写了执行引擎以获得更好的性能和安全性。八、实战用 media_agent 生成一张赛博朋克图片下面通过一个完整的 Rust 代码示例展示如何调用 media_agent 的 API 完成从自然语言描述到图片生成的完整流程。use media_agent::client::MediaAgentClient; use media_agent::types::{GenerationRequest, ProgressEvent}; use std::path::PathBuf; use tokio::time::{sleep, Duration}; #[tokio::main] async fn main() - Result(), Boxdyn std::error::Error { // 1. 初始化客户端连接 media_agent 服务 let client MediaAgentClient::new(http://127.0.0.1:8080)?; // 2. 构造自然语言生成请求 let request GenerationRequest::builder() .prompt(赛博朋克城市夜景霓虹灯闪烁雨夜街道高对比度4K) .negative_prompt(模糊低质量水印文字) .model(sd3.5-medium) // 使用 SD3.5 模型 .width(1024) .height(1024) .steps(30) .cfg_scale(7.0) .seed(42) // 固定种子保证可复现 .build()?; // 3. 提交任务获取任务 ID let task_id client.submit_generation(request).await?; println!(任务已提交ID: {}, task_id); // 4. 轮询进度事件实时展示生成状态 loop { match client.poll_progress(task_id).await? { ProgressEvent::Queued { position } { println!(排队中当前第 {} 位, position); } ProgressEvent::Running { progress, stage } { println!(生成中{}% - {}, progress, stage); } ProgressEvent::Preview { image_base64 } { // 中间预览图可选可展示给用户 println!(收到中间预览{} 字节, image_base64.len()); } ProgressEvent::Completed { image_url } { println!(生成完成图片地址: {}, image_url); // 5. 保存结果到本地文件 let output_path PathBuf::from(cyberpunk_result.png); client.download_image(image_url, output_path).await?; println!(图片已保存至: {:?}, output_path); break; } ProgressEvent::Failed { error } { eprintln!(生成失败: {}, error); return Err(error.into()); } } sleep(Duration::from_millis(500)).await; } Ok(()) }代码要点说明MediaAgentClient封装了与 media_agent 服务通信的 HTTP 和 WebSocket 接口自动处理 JSON‑LD 工作流的序列化与反序列化。GenerationRequest构建器模式将自然语言描述转换为 LLM 编排层可理解的意图结构底层自动触发模板选择、参数填充和工作流校验。进度事件通过poll_progress轮询获取实时状态支持排队、运行中百分比、中间预览和最终结果。保存结果download_image方法将生成的图片从服务端缓存下载到本地文件系统。运行这段代码前请确保 media_agent 服务已启动