- 人工智能
- AI Agent
- 流程编排
- 后端
- 前端
【免费下载链接】PaiAgent
🔥轻量级的AI工作流编排系统,类似dify、n8n,全程使用Vibe Coding,AI工具为Qoder+CLI。涉及到的技术栈包括SpringAI、LangGraph4J、SSE、MinIO、DAG自定引擎等。
PaiAgent 是一个基于 Spring Boot 3.4.1 + Java 21 + React 18 的企业级 AI 工作流可视化编排平台,通过拖拽式界面即可完成多模型、多工具节点的组合调度。本文以项目根目录 README.md 为主线,结合后端引擎、LangGraph4j 集成、Skills 技能系统与前端工作流 API 的真实源码,系统讲解其双引擎架构原理、技能系统设计与从零部署运行的完整实战流程。读完本文,你将掌握 PaiAgent 的 DAG / LangGraph 双引擎切换机制、SKILL.md 声明式技能定义与三级加载策略、SSE 实时调试链路,并能独立完成数据库初始化、环境变量配置、前后端启动与首个工作流的编排调试。
一、项目定位与核心价值
PaiAgent 定位为"企业级 AI 工作流可视化编排平台",核心理念是让 AI 能力的组合与调度变得简单高效:开发者和业务人员无需编写代码,仅通过可视化拖拽即可构建复杂的 AI 处理流程,实现多种大模型的协同工作。其项目教程、用户使用指南与开发进度分别记录在 docs/USER_GUIDE.md、docs/PROGRESS.md 与 docs/SUMMARY.md 中。
项目的主要优势体现在六个方面:
- 零代码编排:可视化拖拽界面,无需编程即可构建复杂 AI 工作流;
- 双引擎驱动:自研 DAG 引擎 + LangGraph4j 状态图引擎,按需切换,兼顾简洁与复杂场景;
- 多模型统一:基于 Spring AI 框架,统一接入 OpenAI、DeepSeek、通义千问、智谱 GLM 等主流大模型;
- Skills 技能系统:内置提示词工程技能框架,支持 YAML 前置声明式技能定义与三级渐进式加载;
- 灵活扩展:基于插件化设计(节点执行器工厂),轻松开发自定义节点;
- 实时调试:内置调试面板,支持 SSE 流式输出,可视化执行过程。
二、技术架构与选型
2.1 分层架构
README 给出完整的分层架构视图,自顶向下依次为:
┌─────────────────────────────────────────────────────────┐ │ 前端层 (Frontend) │ │ React 18 + TypeScript + ReactFlow + Ant Design │ │ • 可视化编辑器 • 节点面板 • 调试工具 │ └────────────────────┬────────────────────────────────────┘ │ REST API / SSE ┌────────────────────┴────────────────────────────────────┐ │ 应用层 (Backend) │ │ Spring Boot 3.4.1 + Java 21 │ │ • Controller • Service • Interceptor │ └────────────────────┬────────────────────────────────────┘ │ ┌────────────────────┴────────────────────────────────────┐ │ 核心引擎层 (Engine) │ │ • EngineSelector: 引擎路由(DAG / LangGraph) │ │ • DAGParser: 拓扑排序 + 循环检测 │ │ • LangGraph4j: 状态图编排 + 条件路由 │ │ • SkillRegistry: 技能注册中心 + 渐进式加载 │ │ • NodeExecutor: 节点执行器工厂 │ └────────────────────┬────────────────────────────────────┘ │ ┌────────────────────┴────────────────────────────────────┐ │ AI 模型层 (Spring AI) │ │ • Spring AI: OpenAI/DeepSeek/智谱 等兼容接口 │ │ • Spring AI Alibaba: 通义千问 DashScope 原生支持 │ │ • ChatClientFactory: 统一的 ChatClient 动态工厂 │ └────────────────────┬────────────────────────────────────┘ │ ┌────────────────────┴────────────────────────────────────┐ │ 数据层 (Data & Storage) │ │ • MySQL: 工作流配置、执行记录 │ │ • MinIO: 文件存储 (可选) │ └─────────────────────────────────────────────────────────┘2.2 技术栈详情
| 层级 | 技术选型 | 版本要求 | 说明 |
|---|---|---|---|
| 前端 | React | 18.x | 现代化 UI 框架 |
| 前端 | TypeScript | 5.x | 类型安全保障 |
| 前端 | Vite | 5.x | 高性能构建工具 |
| 前端 | ReactFlow | 最新版 | 专业流程图库 |
| 前端 | Ant Design + Tailwind CSS | - | 企业级 UI 组件 |
| 前端 | Zustand | 最新版 | 轻量级状态管理 |
| 后端 | Spring Boot | 3.4.1 | 企业级 Java 框架 |
| 后端 | Java | 21+ | LTS 长期支持版本 |
| 后端 | MyBatis-Plus | 3.5.5 | 增强版 ORM 框架 |
| 后端 | Spring AI | 1.0.0-M5 | AI 模型统一调用框架 |
| 后端 | Spring AI Alibaba | 1.0.0-M6.1 | 通义千问 DashScope 原生支持 |
| 后端 | MySQL | 8.0+ | 关系型数据库 |
| 后端 | FastJSON2 | 最新版 | 高性能 JSON 库 |
| 后端 | MinIO | 可选 | 对象存储服务 |
| 核心引擎 | 自研 DAG 引擎 | - | 拓扑排序 + 循环检测 |
| 核心引擎 | LangGraph4j Core | 1.1.5 | 状态图工作流引擎 |
| 核心引擎 | LangGraph4j Spring AI | 1.8.0-beta3 | LangGraph4j 与 Spring AI 集成桥接 |
| 核心引擎 | Skills 技能系统 | - | 声明式提示词工程框架 |
| 核心引擎 | EngineSelector | - | 双引擎动态路由选择 |
| 核心引擎 | Spring AI ChatClient | - | 统一 AI 模型调用接口 |
| 核心引擎 | ChatClientFactory | - | 动态创建不同模型客户端 |
数据库初始化脚本与核心配置分别位于 backend/src/main/resources/schema.sql 与 backend/src/main/resources/application.yml。workflow表通过engine_type字段(默认dag)记录每个工作流使用的引擎类型,execution_record、execution_snapshot、execution_variable三张表分别承载执行记录、断点快照与执行变量(用于断点续执行)。
三、核心特性详解
3.1 可视化流程编辑器
基于 ReactFlow 构建的专业流程图编辑器,前端核心组件为 frontend/src/components/FlowCanvas.tsx(画布)、frontend/src/components/NodePanel.tsx(可拖拽节点面板)与 frontend/src/components/DebugDrawer.tsx(调试抽屉),支持节点拖拽、连线配置、参数编辑等完整功能。
3.2 多大模型节点支持
基于 Spring AI + Spring AI Alibaba 框架统一接入:
- OpenAI 节点:GPT 系列模型(Spring AI OpenAI 接口)
- DeepSeek 节点:国产大模型(OpenAI 兼容接口)
- 通义千问节点:阿里云千问系列(Spring AI Alibaba DashScope 原生支持)
- 智谱 AI 节点:GLM 系列模型(OpenAI 兼容接口)
- AIPing 节点:第三方模型代理(OpenAI 兼容接口)
schema.sql中预置的节点定义还包含step(阶跃星辰)、react_agent(ReAct Agent)与tts(超拟人音频合成)等节点,并给出了每个节点的input_schema/output_schema/config_schema(JSON Schema),例如 OpenAI 节点默认模型gpt-3.5-turbo、temperature 默认0.7。
3.3 工具节点生态
- TTS 音频合成:支持通义 Qwen3 TTS 与阶跃星辰 StepAudio 的超拟人语音生成(
tts节点默认模型qwen3-tts-flash、默认音色Cherry、默认采样率24000); - 输入/输出节点:灵活的数据输入输出;
- 条件分支节点:
condition节点基于上游输出的 JSON 字段做条件判断,支持eq/neq/gt/gte/lt/lte/contains/notContains/startsWith/endsWith/isEmpty/isNotEmpty共 12 种操作符; - 自定义扩展:基于统一接口开发专属节点。
四、DAG 工作流引擎机制(源码级解析)
4.1 工作流解析与执行流程
DAG 引擎的核心位于 backend/src/main/java/com/paiagent/engine/WorkflowEngine.java 与 backend/src/main/java/com/paiagent/engine/dag/DAGParser.java,其执行流水线为:
- JSON 解析:
WorkflowConfigParser.parse(flowData)将前端配置解析为WorkflowConfig对象(节点 + 边); - 拓扑排序:
DAGParser.parse(config)使用 Kahn 算法确定节点执行顺序; - 循环检测:DFS 深度优先搜索检测循环依赖,一旦发现立即抛出
"工作流存在循环依赖,节点: xxx"异常; - 节点调度:按拓扑顺序依次执行节点,
NodeExecutorFactory根据node.getType()分发到对应执行器; - 数据传递:
resolveNodeInput会优先聚合所有已执行前驱节点的输出作为当前节点输入,否则回退到{input: inputData}; - 结果记录:保存每个节点的执行结果和日志,同时写入
ExecutionSnapshot快照(供断点续执行)。
4.2 Kahn 拓扑排序与 DFS 循环检测
在DAGParser中,算法分三步实现:
- 构建依赖图:遍历边集合,构造
dependencies(节点 → 其前置节点列表)与dependents(节点 → 其后继节点列表); - DFS 循环检测:借助
visited与recStack(递归栈)两个集合做深度优先搜索,若递归过程中再次遇到递归栈中的节点即判定存在环; - Kahn 拓扑排序:统计每个节点的入度,将所有入度为 0 的节点入队;每弹出一个节点,将其所有后继节点的入度减 1,减为 0 时入队。若最终排序结果数量小于节点总数,说明图中仍有环,抛出运行时异常。
// 节点执行器接口(简化自 backend/src/main/java/com/paiagent/engine/executor/NodeExecutor.java) public interface NodeExecutor { Map<String, Object> execute(WorkflowNode node, Map<String, Object> input) throws Exception; default Map<String, Object> execute(WorkflowNode node, Map<String, Object> input, Consumer<ExecutionEvent> progressCallback) throws Exception { return execute(node, input); } String getSupportedNodeType(); }4.3 数据传递与条件分支路由
DAG 引擎支持一对多、多对一的连接方式,并自动检测循环依赖防止死锁。当执行到condition节点时,ConditionNodeExecutor 会在输出中写入__selectedBranch__字段(未匹配任何条件时为"default"),随后WorkflowEngine.markSkippedNodes依据条件节点出边的sourceHandle与选中分支的匹配关系,递归标记未选中分支下游的所有节点为跳过状态——只有所有入边都来自已跳过节点时才跳过,避免误伤多入边汇聚节点。
4.4 断点续执行
DAG 引擎还支持断点续执行:resumeExecution会根据执行快照找到第一个FAILED(或未完成)的节点作为恢复起点,支持通过ResumeExecutionRequest指定startNodeId、skipSuccessNodes(跳过已成功节点)与modifiedVariables(修改执行变量后重跑),执行变量表execution_variable记录用户修改过的变量及类型(STRING/NUMBER/BOOLEAN/JSON)。前端对应 API 封装在 frontend/src/api/workflow.ts 的resumeWorkflowExecution中,默认开启skipSuccessNodes: true与useSnapshotVariables: true。
五、LangGraph4j 状态图引擎机制
5.1 双引擎选择与路由
EngineSelector 根据工作流的engineType字段自动选择执行引擎:dag路由到WorkflowEngine,langgraph路由到LangGraphWorkflowEngine,未设置或为空时默认使用 DAG 引擎以确保向后兼容。两个引擎均实现统一的 WorkflowExecutor 接口(execute/executeWithCallback/getEngineType),因此引擎切换对上层 Controller 完全透明。
// 引擎路由逻辑(简化自 EngineSelector.selectEngine) // engineType = "dag" → WorkflowEngine(DAG 引擎) // engineType = "langgraph" → LangGraphWorkflowEngine // engineType = null → DAG 引擎(默认,向后兼容)5.2 LangGraph4j 执行流程
LangGraphWorkflowEngine 的完整执行流程如下:
- 配置解析:
WorkflowConfigParser.parse将WorkflowConfig传入 GraphBuilder; - 状态图构建:GraphBuilder 将节点/边转换为 LangGraph4j
StateGraph:为每个WorkflowNodeaddNode,为每条边addEdge,并通过查找"无前置节点的节点 / 无后继节点的节点"自动设置START与END入口出口; - 状态初始化:StateManager 的
initializeState初始化inputData、currentInput、nodeOutputs、status、startTime五类状态键; - 异步执行:
compiledGraph.invoke(initialStateData)驱动图执行; - 事件驱动:执行过程触发
ExecutionEvent回调(workflowStart / nodeStart / nodeSuccess / nodeError / workflowComplete); - 结果收集:
stateManager.extractNodeResults从nodeOutputs汇总所有节点输出,构建ExecutionResponse,并写入ExecutionRecord。
5.3 NodeAdapter:零改动复用既有节点执行器
NodeAdapter 是 LangGraph 引擎与既有节点执行器之间的桥接层。它通过适配器模式将NodeExecutor包装为 LangGraph4j 的AsyncNodeAction<AgentState>:
- 节点开始前触发
nodeStart事件; - 从状态中取出
currentInput作为节点输入,为output节点额外注入__nodeOutputs__以便汇总所有节点输出; - 执行
executor.execute(node, currentInput, eventCallback)后,将输出写回状态的nodeOutputs,并更新currentInput为当前节点输出(传递给下一个节点)、currentNodeId为当前节点; - 节点异常时把状态标记为
FAILED并写入errorMessage,同时触发nodeError事件。
由于节点执行逻辑完全复用,LangGraph 引擎上线无需重写任何业务代码。该设计的正确性可参考测试 backend/src/test/java/com/paiagent/engine/langgraph/LangGraphWorkflowEngineTest.java 与 backend/src/test/java/com/paiagent/engine/ConditionBranchRoutingTest.java。
5.4 状态模型
WorkflowState 统一管理工作流上下文,核心状态键包括:
| 状态键 | 含义 |
|---|---|
inputData | 原始输入数据(字符串) |
currentInput | 当前节点输入,节点间数据传递的载体 |
nodeOutputs | 节点 ID → 节点输出 的映射 |
globalContext | 全局上下文 |
status | 运行状态(RUNNING / SUCCESS / FAILED) |
currentNodeId | 当前执行节点 ID |
六、Skills 技能系统详解
6.1 技能文件结构
每个技能是一个独立目录,包含SKILL.md主文件和可选的reference子目录。仓库内置示例技能ai-podcast(AI 播客脚本生成),位于 backend/src/main/resources/skills/ai-podcast/:
skills/ └── ai-podcast/ ├── SKILL.md # 技能主文件(YAML Frontmatter + Markdown) └── reference/ # 引用文档目录 ├── script-template.md # 脚本模板 └── voice-guide.md # 语音风格指南6.2 SKILL.md 格式示例
--- name: ai-podcast description: 生成专业播客脚本,包含开场白、话题展开、问答环节和结尾。适用于创建音频内容、播客脚本、对话式内容。 --- # AI 播客脚本生成 ## 执行规则 **重要**:你必须直接根据用户的提示词生成播客脚本,**绝对不要反问用户任何问题**。 ## 固定参数(不可更改) | 参数 | 固定值 | |------|--------| | 播客风格 | **双人对话**(主持人A和主持人B) | | 时长要求 | **1分钟**(约150-180字) | | 目标听众 | **程序员/技术人员** |SkillLoader 使用正则^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$解析 YAML Frontmatter 与正文,name为必填字段,Frontmatter 支持简单的key: value键值对(自动剥离引号)。若缺少 Frontmatter 或name为空,会抛出Invalid SKILL.md format异常。
6.3 三级渐进式加载
SkillRegistry 在应用启动时(@PostConstruct init())自动扫描 classpath(classpath*:skills/*/SKILL.md)与文件系统目录(paiagent.skills.path,默认skills,支持多路径回退查找),注册到ConcurrentHashMap缓存。技能内容按需加载,节省 Token 开销:
- 第一级 - 摘要:仅加载技能名称和描述(
getSkillSummaries()返回SkillSummary(name, description)),用于列表展示; - 第二级 - 详情:加载完整 SKILL.md 内容(
Skill.getFullContent()),用于技能执行; - 第三级 - 引用:按需加载 reference 目录下的文档(
SkillRegistry.loadReference),并对 reference 名做白名单校验(^[a-zA-Z0-9._-]+$)与路径穿越防护(startsWith(referenceDir)校验),结果同样缓存。
在 LLM 节点执行器中,AbstractLLMNodeExecutor 对已关联技能采用"直接打包"策略:通过skillRegistry.loadAllReferences一次加载全部引用文档,再以Skill.getFullExecutionPrompt(references)生成完整执行 Prompt 嵌入系统提示词,避免 LLM 多轮函数调用,一次调用即可拿到全部上下文。
6.4 LLM Function 集成与 REST API
技能系统通过 Spring AIFunctionCallback暴露给大模型自主调用(LoadSkillDetailFunction的load_skill_detail与LoadSkillReferenceFunction的load_skill_reference),实现"渐进式披露"——大模型先看到技能摘要,需要时再调用函数拉取详情与引用文档。前端 SkillSelector 组件支持在工作流节点中选择并应用技能。
技能 REST API 由 SkillController 提供:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/skills | 获取所有技能摘要列表 |
| GET | /api/skills/{name} | 获取指定技能详细内容 |
| GET | /api/skills/{name}/references/{ref} | 获取技能引用文档 |
七、LLM 节点与多模型统一调用层
7.1 ChatClient 动态工厂
ChatClientFactory 根据节点配置在运行时动态实例化不同厂商的ChatClient,支持多租户场景下每个节点独立配置 API Key / API URL / 模型的能力。其核心设计:
- 提供商标识归一化:
normalizeProvider将"open ai"、"通义千问"、"智谱"、"阶跃星辰"、"火山方舟"、"skyclaw"等别名统一映射为内部标识(openai/deepseek/qwen/step/zhipu/ai_ping/agnes/apifree/volcengine_agent_plan); - URL 智能归一化:
normalizeBaseUrl自动剥离/v1/chat/completions、/v1后缀与尾部斜杠,兼容用户误填完整接口地址的情况; - 定制 ChatModel:OpenAI 兼容厂商统一走
OpenAiChatModel;apifree(SkyClaw)额外放宽text/plain响应类型;volcengine_agent_plan显式覆盖为/api/plan/v3/chat/completions路径; - 函数注册:
createClientWithFunctions通过builder.defaultFunctions(...)将 FunctionCallback 注册进 ChatClient。
// 动态创建 ChatClient(简化自 ChatClientFactory) ChatClient chatClient = chatClientFactory.createClientWithFunctions( provider, apiUrl, apiKey, model, temperature, functions); String response = chatClient.prompt().user(prompt).call().content();7.2 AbstractLLMNodeExecutor 抽象基类
AbstractLLMNodeExecutor 采用模板方法模式,将 5 个 LLM 节点执行器的公共逻辑收敛到一处:配置提取(优先使用全局配置configId,回退节点级配置)→ 配置校验 → Skill 关联 → 系统提示构建 → 模板替换 → ChatClient 创建 → 三种执行模式(普通 / 流式 / 带函数调用,函数调用最多迭代 5 轮)→ Token 统计与输出构建。子类只需实现getNodeType()即可,例如OpenAINodeExecutor返回"openai"、DeepSeekNodeExecutor返回"deepseek"、QwenNodeExecutor返回"qwen"、ZhiPuNodeExecutor返回"zhipu"。
该执行器还支持 RAG 增强:当节点开启memoryEnabled或配置了knowledgeBaseId时,会先调用agentMemoryService.retrieve/knowledgeBaseService.searchRuntime召回记忆与知识库上下文(memoryTopK、knowledgeTopK默认 5,knowledgeScoreThreshold默认 0.2),拼接到用户提示词之前。
7.3 Prompt 模板处理
PromptTemplateService 统一处理{{variable}}模板变量替换与上下游节点参数引用映射,支持两种输入参数类型:
- input 静态值:直接从节点配置的
value字段取值; - reference 动态引用:从上游节点输出中按
referenceNode(如llm_1.output,取.后段作为键名)动态取值,并兼容user_input存储为input键的旧格式。
// 模板替换示例 String userPrompt = promptTemplateService.processTemplate( config.getPromptTemplate(), config.getInputParams(), input);八、SSE 实时流式调试
8.1 后端事件推送链路
ExecutionController 提供GET /api/workflows/{id}/execute/stream接口,基于SseEmitter(超时 300 秒)实现实时反馈。执行线程将Consumer<ExecutionEvent>回调注册给引擎,引擎在每个节点启动、成功、出错以及工作流完成时回调,控制器将事件按SseEmitter.event().name(event.getEventType()).data(event)推送给前端。
ExecutionEvent 定义了五类事件,字段包含eventType、nodeId、nodeName、status、message、data、timestamp:
| 事件类型 | 触发时机 | 状态 |
|---|---|---|
WORKFLOW_START | 工作流开始执行 | - |
NODE_START | 节点开始执行 | RUNNING |
NODE_PROGRESS | 流式生成中(携带chunk与累计文本) | RUNNING |
NODE_SUCCESS | 节点执行成功(携带输出与耗时) | SUCCESS |
NODE_ERROR | 节点执行失败 | FAILED |
WORKFLOW_COMPLETE | 工作流执行完成(携带总耗时) | SUCCESS / FAILED |
8.2 前端 EventSource 消费
前端 frontend/src/api/workflow.ts 的executeWorkflowStream使用浏览器原生EventSource订阅上述事件,将每个事件实时渲染到 DebugDrawer 调试抽屉中,实现"输入文本 → LLM 生成 → TTS 合成 → 输出播放"全流程的可视化追踪。该接口还处理了鉴权失败(跳转登录页)与连接中断的兜底逻辑。
九、快速开始(一键启动指南)
9.1 环境要求
| 工具 | 版本要求 | 说明 |
|---|---|---|
| Java | 21+ | 推荐使用 OpenJDK 或 Oracle JDK |
| Node.js | 18+ | 包含 npm 包管理器 |
| MySQL | 8.0+ | 数据库服务 |
| Maven | 3.8+ | Java 项目构建工具 |
9.2 克隆项目与数据库初始化
git clone https://gitcode.com/javabetter/PaiAgent cd PaiAgent创建数据库并导入初始化脚本(backend/src/main/resources/schema.sql 同时创建workflow、node_definition、execution_record、execution_snapshot、execution_variable、llm_global_config、agent_memory、mcp_tool_config、knowledge_base等表,并预置全部节点定义数据):
mysql -u root -pCREATE DATABASE paiagent DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;mysql -u root -p paiagent < backend/src/main/resources/schema.sql9.3 配置环境变量
项目使用环境变量管理敏感配置,application.yml通过spring.config.import: optional:file:.env[.properties]与optional:file:backend/.env[.properties]自动导入.env文件。复制模板并编辑:
cd backend cp .env.example .env# 必填:数据库密码(生产环境必须使用强密码) MYSQL_PASSWORD=your_strong_password_here # 其他配置按需修改 MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USERNAME=root MYSQL_DATABASE=paiagent # JWT 密钥(生产环境必须修改!) JWT_SECRET=your_jwt_secret_key_minimum_32_characters # MinIO 凭证(如使用对象存储) MINIO_ACCESS_KEY=your_access_key MINIO_SECRET_KEY=your_secret_key安全提示:
.env文件已加入.gitignore,不会提交到版本库;.env.example是配置模板,不包含真实敏感信息;生产环境建议通过系统环境变量或配置中心注入。application.yml中还内置了 JWT 密钥兜底逻辑——本地开发未配置JWT_SECRET时会自动生成临时强密钥,但生产环境务必显式配置。
9.4 启动后端服务
cd backend ./mvnw spring-boot:run启动成功后控制台输出Started PaiAgentApplication in X.XXX seconds。后端服务地址为http://localhost:8084(默认端口,可在.env的SERVER_PORT或 application.yml 中修改)。项目内置spring-boot-devtools,修改代码触发编译后应用会自动热重启;启动后可访问http://localhost:8084/swagger-ui.html查看 API 文档。
9.5 启动前端服务
cd frontend cp .env.example .env.local npm install npm run dev前端通过 Vite 环境变量VITE_API_BASE_URL连接后端,默认http://localhost:8084。启动成功后可看到:
➜ Local: http://localhost:5173/前端不能直接读取 Spring Boot 的application.yml,因此若后端端口变化,需同步调整frontend/.env.local。
9.6 首次登录与快速演示
开发环境默认账户(可在.env中通过APP_AUTH_DEFAULT_USERNAME/APP_AUTH_DEFAULT_PASSWORD修改):
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 用户名 | admin | 通过APP_AUTH_DEFAULT_USERNAME配置 |
| 密码 | admin123 | 通过APP_AUTH_DEFAULT_PASSWORD配置 |
⚠️ 安全提示:默认账户仅用于开发测试,生产环境必须修改或禁用(将两个变量都设为空值即可禁用默认账户)。
创建第一个工作流的操作路径:
- 登录系统:使用默认凭证登录;
- 创建工作流:点击「新建工作流」按钮;
- 拖拽节点:从左侧节点面板拖拽「输入节点」→「OpenAI节点」→「输出节点」到画布;
- 连接节点:按顺序连接各个节点;
- 配置参数:点击 OpenAI 节点,配置 API Key 和提示词;
- 执行调试:点击「调试」按钮,通过 SSE 实时查看执行结果。
示例:文本转语音工作流
[输入节点] → [OpenAI节点] → [TTS节点] → [输出节点] 输入文本 生成脚本 语音合成 播放音频十、节点扩展开发指南
方式一:开发普通工具节点。实现NodeExecutor接口,注册到 NodeExecutorFactory(工厂在构造时通过@Autowired List<NodeExecutor>自动收集所有执行器并按getSupportedNodeType()注册):
public class CustomNodeExecutor implements NodeExecutor { @Override public Map<String, Object> execute(WorkflowNode node, Map<String, Object> input) { // 自定义逻辑 return output; } @Override public String getSupportedNodeType() { return "custom"; } }方式二:开发 LLM 节点(推荐)。继承AbstractLLMNodeExecutor,自动获得 Spring AI 能力与配置提取、模板替换、流式输出等全部基础能力:
@Component public class CustomLLMNodeExecutor extends AbstractLLMNodeExecutor { @Override protected String getNodeType() { return "custom_llm"; } }前端添加节点定义(在节点面板注册,参考 frontend/src/components/NodePanel.tsx):
const customNode = { type: 'custom', label: '自定义节点', category: 'tool' };十一、开发路线图
11.1 已完成功能(v1.0,当前完成度 98%)
- 基础架构搭建(Spring Boot + React + TypeScript)
- 用户认证系统(Token 认证 + AuthInterceptor 拦截器)
- 可视化流程编辑器(ReactFlow 集成)
- DAG 工作流引擎(拓扑排序 + 循环检测)
- Spring AI 框架集成(v1.0.0-M5):统一 ChatClient 调用接口,支持 OpenAI 兼容协议
- Spring AI Alibaba 集成(v1.0.0-M6.1):通义千问 DashScope 原生支持
- 多大模型节点:OpenAI / DeepSeek / 通义千问 / 智谱 / AIPing
- 工具节点:输入/输出、TTS 音频合成、音频播放器组件
- SSE 实时流式输出(调试抽屉 + 日志输出 + 结果展示)
- 工作流 CRUD 管理与执行记录查询
- LangGraph4j 状态图引擎:StateGraph 第二执行引擎、EngineSelector 双引擎路由、NodeAdapter 零改动复用、StateManager 统一状态管理
- Skills 技能系统:YAML Frontmatter + Markdown 声明式定义、SkillRegistry 自动扫描缓存、三级渐进式加载、Spring AI FunctionCallback 集成、前端 SkillSelector、REST API
- 条件分支节点(IF/ELSE 逻辑)与断点续执行能力
11.2 规划中功能
- v1.1(近期):循环执行节点(FOR/WHILE)、更多 LLM 节点(Claude、Gemini、本地模型)、更多内置技能、集成测试完善、执行性能监控
- v1.5(中期):子工作流调用、定时任务调度(Cron 表达式)、工作流版本管理(Git 风格)、工作流模板市场、更多工具节点(图像处理、文档解析、Web 爬虫)
- v2.0(远期):多租户与权限管理、协作与分享、性能监控与告警、国际化支持、插件市场
十二、项目文档导航
| 文档类型 | 文档链接 | 说明 |
|---|---|---|
| 📖 使用指南 | docs/USER_GUIDE.md | 详细使用说明和最佳实践 |
| 📊 开发进度 | docs/PROGRESS.md | 项目开发阶段和完成情况 |
| 📝 项目总结 | docs/SUMMARY.md | 技术选型和实现总结 |
| 📋 完成报告 | docs/PROJECT_COMPLETION_REPORT.md | 项目交付报告 |
| 🏗️ 架构设计 | docs/mermaid.md | 系统架构可视化图表 |
| 🤖 开发指南 | AGENTS.md | AI Agent 开发指引 |
PaiAgent 采用 MIT License 开源。如需深入了解引擎实现细节,可直接阅读 EngineSelector、DAGParser、LangGraphWorkflowEngine、SkillRegistry 与 ChatClientFactory 等核心源码,以及 LangGraphWorkflowEngineTest、ConditionNodeExecutorTest 等测试用例作为行为规范参考。
- 人工智能
- AI Agent
- 流程编排
- 后端
- 前端
【免费下载链接】PaiAgent
🔥轻量级的AI工作流编排系统,类似dify、n8n,全程使用Vibe Coding,AI工具为Qoder+CLI。涉及到的技术栈包括SpringAI、LangGraph4J、SSE、MinIO、DAG自定引擎等。
相关推荐
PaiAgent 项目架构与开发指南:基于 DAG/LangGraph 双引擎的 AI 工作流编排平台
PaiAgent 项目架构与开发指南:基于 DAG/LangGraph 双引擎的 AI 工作流编排平台 PaiAgent 是一个轻量级的企业级 AI 工作流编排
人工智能AI Agent流程编排后端前端RuoYi-flowable工作流引擎企业级部署实战指南
RuoYi flowable工作流引擎企业级部署实战指南 前言:数字化转型中的流程管理挑战 在企业数字化转型浪潮中,传统人工审批流程已无法满足现代业务需求。Ru
Magic Flow可视化编排:构建企业级AI工作流的完整指南
Magic Flow可视化编排:构建企业级AI工作流的完整指南 Magic Flow作为开源AI生产力平台的核心组件,为企业用户提供了零代码构建复杂AI工作流的
AI AgentAI 应用后端前端企业应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考