跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
RustSaaSAI大前端

基于 egui 构建 AI Agent 工作流在线编辑器

综述由AI生成基于 Rust 的 egui 库构建 AI Agent 工作流在线编辑器的全过程。文章首先对比了 Dify、Coze 和 ComfyUI 等现有工具的优缺点,确立了兼顾全局视图与单节点调试的设计目标。随后阐述了系统的架构设计,包括 Go 语言编写的后端服务与 Rust 编写的跨端前端界面。重点解析了插件配置 JSON 结构,展示了如何通过 Schema 动态渲染不同类型的 UI 控件。最后补充了动态表单渲染、状态同步及性能优化等技术实现细节,说明了该框架支持 BaaS 模式,既可用于本地设计,也可直接在生产环境通过 API 调用执行。

abccba发布于 2025/2/7更新于 2026/6/519 浏览
基于 egui 构建 AI Agent 工作流在线编辑器

前言

在构建 AI Agent 框架的过程中,基础节点的实现与 gRPC 服务的暴露只是第一步。手动编辑文本配置 Workflow 不仅效率低下,且容易出错。为了提升开发体验与运维效率,我们需要一个可视化的 Web UI 来自动生成和管理 Workflow。

本文将详细介绍如何基于 Rust 的 egui 库,从零开始设计并实现一个支持 Agent/Workflow 的在线编辑器,涵盖界面设计、插件系统架构及核心功能实现。

竞品分析与设计目标

在设计之前,我们分析了现有的主流工具,以明确我们的差异化优势。

Dify 的 UI

Dify 提供了丰富的功能节点,支持多种模型和工具的集成。其优点在于能够打开单个节点的详细内容,并提供 Debug 能力,让用户看到执行细节。但缺点是只能一次查看一个节点的详情,难以把握整体流程。

Coze 的 UI

Coze 的界面交互更加丝滑,支持在编辑页直接查看节点细节,Debug 信息也绑定在节点上。然而,当节点数量增多时,操作难度显著增加,视觉负担较重。

ComfyUI (Stable Diffusion)

ComfyUI 采用了更自由的节点设计,变量间相互链接而非单纯的流转。这种模式灵活性极高,但也带来了维护困难的问题,节点多了之后极难梳理逻辑。

设计目标

综合上述分析,本项目的 UI 设计遵循以下原则:

  1. 全局视图:能够清晰看到整体节点的流转关系,同时每个界面可以单独打开或关闭(参考 Dify)。
  2. 调试能力:必须提供 Debug 功能,最好像 Coze 一样直接绑定到节点上,实时反馈执行状态。
  3. 开放定义:节点的界面设计采用开放式结构,允许用户随意定义输入输出参数及 UI 组件类型(参考 ComfyUI)。

功能预览与操作指南

服务启动后,主要包含以下几个核心区域:

  • 顶边控制栏:包含 Project、Setting、About 菜单。点击 Project 会在左侧生成控制界面,用于加载项目的 Service 节点。
  • 编辑窗口:
    • FlowChart、LLM Script、Workflow 均为具体的服务节点。
    • 红色 Clean:清理所有已生成的节点。
    • 红色 Reset:重置整个界面状态。
    • 绿色 Save:保存配置,默认 30 秒自动保存,时间可在 Project 界面调整。
    • 绿色 Debug:执行一次流程调试。
  • 右侧节点列表:展示所有可用节点,可在此打开/关闭节点视图或删除节点。
  • 底部日志区:显示运行日志,支持展开查看详情。

此外,提供两个关键视图:

  • Work-flow-view:查看节点间的流转关系图。
  • Plan-text-view:查看执行计划,支持下载所有生成的节点配置,或上传节点配置(会覆盖当前配置)。

窗口设计与数据结构

窗口的结构目前固定为五部分,未来可扩展。每个节点包含以下元数据:

  • 节点编号与描述
  • Service 类型
  • Input(输入参数结构)
  • Output(输出参数结构)
  • Goto(向哪些节点流转)
  • Debug(调试信息)

插件配置示例

所有的视图配置都在 webui/server/plugin 目录下。当点击 Project -> LOAD 按钮时,系统会默认加载该目录下的全部配置。

以下是一个 OpenAI LLM 节点的 JSON 配置示例,展示了如何通过 Schema 定义 UI 控件:

{
    "plugin_list": [
        {
            "code": "openai-LLM",
            "class": "LLM",
            "desc": "openai LLM chat",
            "ui_type": "window",
            "service_type": "openai_llm",
            "input_vars": {
                "model": {
                    "type": "string",
                    "default": "gpt-3.5-turbo",
                    "ui_type": "enum",
                    "ui_extend_enum": [
                        "gpt-4o",
                        "gpt-4-turbo",
                        "gpt-4",
                        "gpt-3.5-turbo"
                    ]
                },
                "temperature": {
                    "type": "f32",
                    "default": 0.7,
                    "desc": "The randomness of the model generated responses",
                    "ui_extend_slider": {
                        "max": 2.0,
                        "min": 0.0,
                        "speed": 0.01
                    }
                },
                "max_tokens": {
                    "type": "number",
                    "default": 512,
                    "desc": "answer max tokens",
                    "ui_extend_slider": {
                        "max": 512,
                        "min": 0,
                        "speed": 1
                    }
                },
                "prompt": {
                    "type": "string",
                    "default": "",
                    "ui_type": "text_edit_multi"
                },
                "query": {
                    "type": "string",
                    "default": "",
                    "required": true
                },
                "tools": {
                    "type": "list"
                },
                "context": {
                    "type": "list"
                },
                "extend": {
                    "type": "object"
                }
            },
            "output_vars": {
                "answer": "this is text",
                "tools": [
                    {
                        "function_name": "tool name",
                        "args": "function call args"
                    }
                ]
            }
        }
    ]
}

该配置定义了模型的枚举选择、温度参数的滑块范围、Token 数量的数值输入以及 Prompt 的多行文本框。系统根据 ui_type 字段动态渲染对应的 egui 控件。

代码实现架构

本项目采用前后端分离的架构,具体实现如下:

  1. 后端服务 (webui/server):

    • 使用 Go 语言编写,作为一个微小的服务端存在。
    • 负责插件加载、配置管理以及 Debug 调用的路由分发。
    • 通过 go run main.go 即可启动服务。
  2. 前端界面 (webui):

    • 基于 Rust 的 egui 库开发,实现了跨平台桌面应用。
    • 支持作为原生应用打开,也可编译为 WASM 在浏览器中运行(需使用 trunk 启动)。
    • 界面逻辑主要通过 update 循环驱动,根据状态机更新 UI 元素。
  3. 通信协议:

    • 前端与后端通过 HTTP/gRPC 进行通信,传递节点配置与执行结果。
    • 插件配置采用 JSON Schema 标准,确保扩展性。

技术难点与解决方案

动态表单渲染

由于不同节点需要不同的输入控件(如 Enum、Slider、Text),我们设计了通用的解析器。前端读取 input_vars 中的 ui_type 字段,映射到 egui 的标准控件。例如,ui_extend_slider 定义了最小值、最大值和步进速度,解析器据此创建带范围的滑动条。

状态同步

为了保证多节点间的状态一致性,我们引入了中央状态管理器。任何节点的修改都会触发全局状态更新,并通过 WebSocket 或轮询机制通知其他相关节点刷新。这解决了传统工作流编辑器中常见的状态不一致问题。

性能优化

当节点数量较多时,重绘开销巨大。我们采用了局部更新策略,仅重新绘制发生变化的节点区域,并利用 egui 的内存池机制减少分配次数,确保流畅度。

总结与展望

目前实现的 UI 版本已经具备基本可用性,简洁高效。整个 ai_agent 框架在设计思路上参考了 BaaS Solution 理念,即在 Web UI 上设计好流程后,生产环境部署时无需依赖 Web UI,直接通过 API 调用执行。

当然,如果你觉得当前界面风格无法满足需求,架构本身是开放的,开发者可以自行替换 UI 层,只需保持插件配置格式一致即可。未来我们将进一步优化节点连接体验,引入更多可视化调试工具,并支持自定义脚本节点的嵌入。

通过这套方案,我们成功将复杂的 Agent 编排过程图形化,降低了使用门槛,同时保留了高度的灵活性与可扩展性。

目录

  1. 前言
  2. 竞品分析与设计目标
  3. Dify 的 UI
  4. Coze 的 UI
  5. ComfyUI (Stable Diffusion)
  6. 设计目标
  7. 功能预览与操作指南
  8. 窗口设计与数据结构
  9. 插件配置示例
  10. 代码实现架构
  11. 技术难点与解决方案
  12. 动态表单渲染
  13. 状态同步
  14. 性能优化
  15. 总结与展望
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • pyEIT 电阻抗断层成像算法完整解析
  • 宇树 G1 机器人基于 FAST-LIO 的建图与配置实战
  • GitHub Copilot 学生身份认证教程(非校园网)
  • Python AI 开发环境搭建指南:Anaconda、PyCharm 与 Claude Code 配置
  • OpenClaw SOUL.md:用自然语言定义 AI Agent 的身份与边界
  • 多模态大模型垂直微调实战:Qwen3-VL-4B-Thinking 与 Llama Factory
  • MySQL 8.0 Windows 详细安装配置指南
  • 无人机视觉任务常用数据集汇总:检测与分割资源整理
  • MySQL 8.4 在 Windows 下的免安装版配置指南
  • OpenPI π0 源码深度剖析:从模型架构、扩散策略到 C/S 部署实战
  • Layui 框架下 Unity WebGL Tab 切换黑屏问题解决方案
  • C++ 二叉搜索树详解与实现
  • 前端开发:如何使用浏览器开发者工具查看接口请求与响应
  • MySQL MVCC 原理详解:从零理解并发控制
  • 企业级大模型构建指南:知识库驱动的业务智能化
  • Linux 进程控制:进程终止与等待及 waitpid 参数解析
  • 六大 AI 代理工具深度解析:Claude Code、OpenCode 与 OpenClaw
  • 渐进式 AIGC 系统:多模态大模型私有化部署与智能体开发实战
  • FPGA 开发环境搭建:Vivado 与 Vitis 2023.1 安装详解
  • sscom软件

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online