feat: 新增智能体与工作流选项卡(预制/自定义、画布编辑器、执行引擎);约定每次改动提交推送并打新 tag

This commit is contained in:
xianrenge
2026-08-16 23:28:55 +08:00
parent 10ecf526ec
commit 9b9e810ff1
24 changed files with 3550 additions and 118 deletions
+41 -9
View File
@@ -12,8 +12,8 @@
```
xianren_studio/
├── apps/desktop/ Tauri 桌面壳(Rust 命令层、tauri.conf.json、推荐模型默认 JSON
├── crates/core/ 领域核心:SQLite(模型注册表、会话、消息、设置)
├── apps/desktop/ Tauri 桌面壳(Rust 命令层、tauri.conf.json、推荐模型/预制智能体/预制工作流默认 JSON、工作流执行引擎 workflow.rs
├── crates/core/ 领域核心:SQLite(模型注册表、智能体、工作流、会话、消息、设置)
├── crates/engine/ llama-server 生命周期 + 流式/非流式聊天(本地与远程 OpenAI 兼容)
├── crates/download/ 分片断点续传下载器
├── crates/api/ OpenAI 兼容本地 API 服务(axum
@@ -33,7 +33,7 @@ React UIui/src
apps/desktop/src/commands.rs ← 所有 Tauri 命令(invoke_handler 注册于 lib.rs
├── crates/coreSQLitemodels / sessions / settings
├── crates/coreSQLitemodels / agents / workflows / sessions / settings
├── crates/enginellama-server 子进程 / 远程 OpenAI API
├── crates/download(下载任务)
└── crates/api(本地 API 服务)
@@ -48,13 +48,17 @@ apps/desktop/src/commands.rs ← 所有 Tauri 命令(invoke_handler 注册于
```
ui/src/
├── main.tsx 入口
├── App.tsx 导航栏、路由(7 个页面)、全局事件订阅(引擎/下载/模型/建议)
├── App.tsx 导航栏、路由(9 个页面)、全局事件订阅(引擎/下载/模型/建议)
├── api.ts Tauri invoke 封装 + 全部请求/事件 TypeScript 类型
├── store.ts zustand 全局状态(见下)
├── styles.css 全局样式
├── components/Icon.tsx SVG 图标库
└── pages/
├── ChatPage.tsx 对话页(最大的页面,含会话快照、消息气泡、模型下拉、建议标签)
├── AgentsPage.tsx 智能体列表(预制/自定义分组、新建/编辑/删除/恢复预制)
├── AgentChatPage.tsx 智能体会话页(按路由加载智能体并渲染 ChatPage 智能体模式)
├── WorkflowsPage.tsx 工作流列表(预制/自定义分组、新建/删除/恢复预制)
├── WorkflowCanvasPage.tsx 工作流画布(节点拖拽/连线、节点编辑、运行与结果展示)
├── ModelsPage.tsx 模型管理(本地部署 + 在线 API 启用开关)
├── ModelPlazaPage.tsx 模型广场(HF/ModelScope 搜索与下载)
├── TasksPage.tsx 任务(下载/部署进度)
@@ -69,6 +73,9 @@ ui/src/
| 字段 | 说明 |
| --- | --- |
| `agents` / `agentsLoaded` | 智能体列表(预制 + 自定义)与加载标记 |
| `agentConversations` | 智能体 id → 会话列表(各智能体会话隔离,key 为智能体 id) |
| `workflows` / `workflowsLoaded` | 工作流列表(预制 + 自定义)与加载标记 |
| `models` | 模型列表(含 `enabled``kind``file_name` 等) |
| `engine` | 引擎状态(running / model / port |
| `deployStates` / `deployProgress` | 各模型部署状态(loading/ready/error)与进度 |
@@ -94,10 +101,12 @@ ui/src/
| 分组 | 命令 |
| --- | --- |
| 智能体 | `list_agents``add_agent``update_agent``remove_agent``set_agent_enabled``restore_preset_agents` |
| 工作流 | `list_workflows``add_workflow``update_workflow``remove_workflow``set_workflow_enabled``restore_preset_workflows``run_workflow` |
| 应用/设置 | `app_info``settings_get``settings_set` |
| 模型 | `list_models``import_model``remove_model``set_model_enabled``scan_models``add_remote_model` |
| 模型广场 | `search_models``list_model_files``list_recommended_models``import_recommendations``fetch_model_page` |
| 会话 | `list_conversations``create_conversation``rename_conversation``set_conversation_pinned``set_conversation_favorite``import_conversation``set_conversation_tools``delete_conversation``get_messages` |
| 会话 | `list_conversations`(可按 `agent_id` 过滤)`create_conversation`(可选 `agent_id`,自动继承智能体系统提示词与默认模型)`rename_conversation``set_conversation_pinned``set_conversation_favorite``import_conversation``set_conversation_tools``delete_conversation``get_messages` |
| 消息 | `chat_send``chat_stop``regenerate_message``edit_message``list_message_versions``apply_message_version` |
| 引擎 | `engine_start``engine_stop``engine_status``deploy_model` |
| 工具 | `web_search`Tavily)、`list_skills``add_skill``update_skill``remove_skill``set_skill_enabled``test_skill``list_mcp_servers``add_mcp_server``update_mcp_server``remove_mcp_server``set_mcp_server_enabled``mcp_test_server``mcp_list_tools``mcp_call_tool` |
@@ -109,9 +118,19 @@ ui/src/
- `chat_send`:写入用户消息 → 构建历史 → 拉起后台生成任务。
- `run_generation_and_stream`:统一生成入口(本地引擎 / 远程 API),流式转发 token、统计用量、写库、发 `chat://done`,随后触发标题生成与建议生成。
- `inject_system_prompts`:把会话/智能体系统提示词(`conversations.system_prompt`)与工具说明统一注入消息历史最前;`chat_send` / `regenerate_message` / `edit_message` 三条链路共用。
- `maybe_generate_suggestions``call_suggestion_model``parse_suggestions`:回答完成后预测用户接下来可能说的话。统一要求模型输出 JSON 数组;最多重试 3 次;过滤元信息行与回答原文片段;每条 ≤ 30 字。
- `maybe_generate_conversation_title`:首轮对话自动生成标题。
- `create_conversation`:先查找空会话(`find_empty_conversation`)复用,没有才新建。
- `create_conversation`:先在指定作用域(普通对话或某智能体)查找空会话(`find_empty_conversation`)复用,没有才新建;智能体会话写入该智能体的系统提示词与默认模型
- `seed_preset_agents`:启动时首次写入 `default_agents.json` 中的预制智能体(`settings.preset_agents_seeded` 标记只执行一次);`restore_preset_agents` 命令可随时补齐缺失预制体。
- `run_workflow`:加载工作流节点/连线 → 交给 `workflow.rs` 执行引擎按拓扑顺序运行;LLM 节点经 `resolve_workflow_node_model` 解析模型(节点 → 工作流默认 → 运行参数 → 自动回退),`call_model_text` 非流式调用本地引擎或远程 API,逐节点推送 `workflow://node-status` 事件。
- `seed_preset_workflows`:启动时首次写入 `default_workflows.json` 中的预制工作流(`settings.preset_workflows_seeded` 标记只执行一次);`restore_preset_workflows` 命令可随时补齐缺失预制体。
**工作流执行引擎(`apps/desktop/src/workflow.rs`):**
- `topo_order`:Kahn 拓扑排序,检测循环 / 未知节点 / 自连。
- `resolve_template`:解析 `{{input}}``{{节点id}}` 变量。
- `execute_workflow`:按拓扑顺序执行 start / text / llm / end 节点,收集各节点输出并汇总最终结果;通过注入的 `call_model` 闭包调用模型,与具体模型解耦(单元测试用假模型跑通 5 个案例,另有真实模型端到端测试 `real_model_translation_workflow_e2e`)。
**工具协议(技能 / MCP):**
@@ -135,13 +154,15 @@ ui/src/
| --- | --- | --- |
| `models` | `kind`local/remote)、`enabled``file_name``file_path``status``base_url``api_key``api_model``meta_json` | 模型注册表;`enabled` 决定在线 API 模型是否出现在聊天页可选列表 |
| `settings` | `key`/`value` | 键值设置 |
| `conversations` | `title``model_id``pinned``favorite``tools_json` | 会话 |
| `conversations` | `title``model_id``system_prompt``agent_id``pinned``favorite``tools_json` | 会话`agent_id` 为空表示普通对话,否则属于对应智能体 |
| `agents` | `kind`preset/custom)、`name``icon``description``system_prompt``model_id``enabled` | 智能体(预制 + 自定义) |
| `workflows` | `kind`preset/custom)、`name``icon``description``nodes_json``edges_json``model_id``enabled` | 工作流(节点/连线以 JSON 存储,节点含 type/label/position/data |
| `messages` | `role``model_id``content``tokens_in/out``elapsed_ms``first_token_ms``images_json` | 消息;`model_id` 记录该回答所用模型(回答下方展示模型名) |
| `message_versions` | `content``tokens_out``seq` | 重新生成前的旧版本 |
| `skills` | `name``description``content``enabled` | 技能工具库 |
| `mcp_servers` | `name``description``url``auth_token``enabled` | MCP 服务配置 |
迁移清单(`ensure_column`):`models.kind/base_url/api_key/api_model/enabled``messages.elapsed_ms/first_token_ms/images_json/model_id``conversations.pinned/favorite/tools_json`
迁移清单(`ensure_column`):`models.kind/base_url/api_key/api_model/enabled``messages.elapsed_ms/first_token_ms/images_json/model_id``conversations.pinned/favorite/tools_json/agent_id`
### 5.3 `models.rs`
@@ -151,10 +172,18 @@ ui/src/
会话/消息/版本 CRUD`find_empty_conversation`(新建对话复用空会话);`import_message`(导入对话用,可指定创建时间)。
### 5.5 `settings.rs`
### 5.5 `agents.rs`
智能体 CRUD`list/get/insert/update/delete/set_enabled`)与预制体批量写入 `insert_presets_if_missing`(按 id 忽略已存在,供首次种子与「恢复预制智能体」复用)。
### 5.6 `settings.rs`
`get/set/insert_default/all`
### 5.7 `workflows.rs`
工作流 CRUD`list/get/insert/update/delete/set_enabled`)与预制体批量写入 `insert_presets_if_missing`(按 id 忽略已存在);节点 `WorkflowNode`type=start/llm/text/end、position、data)与连线 `WorkflowEdge` 以 JSON 列存储,序列化/反序列化在读写时完成。
---
## 6. 引擎与远程调用(`crates/engine`
@@ -197,6 +226,7 @@ ui/src/
| `models://updated` | 后端→前端 | 模型列表变化 |
| `download://started/progress/done/error` | 后端→前端 | 下载任务进度 |
| `server://status` | 后端→前端 | 本地 API 服务状态 |
| `workflow://node-status` | 后端→前端 | 工作流节点运行状态(running/done/error)与输出文本 |
---
@@ -218,6 +248,8 @@ ui/src/
| `tavily_api_key` | (内置演示值) | 联网搜索 API Key |
| `tool_web_search_enabled` | true | 联网搜索工具开关 |
| `recommend_dir` | 数据目录/recommendations | 推荐列表目录 |
| `preset_agents_seeded` | 首次启动后为 `1` | 预制智能体是否已写入(内部标记,避免覆盖用户删除) |
| `preset_workflows_seeded` | 首次启动后为 `1` | 预制工作流是否已写入(内部标记,避免覆盖用户删除) |
---