feat: 新增智能体与工作流选项卡(预制/自定义、画布编辑器、执行引擎);约定每次改动提交推送并打新 tag
This commit is contained in:
+41
-9
@@ -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 UI(ui/src)
|
||||
▼
|
||||
apps/desktop/src/commands.rs ← 所有 Tauri 命令(invoke_handler 注册于 lib.rs)
|
||||
│
|
||||
├── crates/core(SQLite:models / sessions / settings)
|
||||
├── crates/core(SQLite:models / agents / workflows / sessions / settings)
|
||||
├── crates/engine(llama-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` | 预制工作流是否已写入(内部标记,避免覆盖用户删除) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
+57
-8
@@ -12,11 +12,13 @@
|
||||
|
||||
## 1. 页面总览
|
||||
|
||||
应用共 7 个选项卡(导航左侧栏):
|
||||
应用共 9 个选项卡(导航左侧栏):
|
||||
|
||||
| 选项卡 | 路由 | 页面 |
|
||||
| --- | --- | --- |
|
||||
| 对话 | `/chat` | `ui/src/pages/ChatPage.tsx` |
|
||||
| 智能体 | `/agents`、`/agents/:agentId` | `ui/src/pages/AgentsPage.tsx`、`ui/src/pages/AgentChatPage.tsx` |
|
||||
| 工作流 | `/workflows`、`/workflows/:workflowId` | `ui/src/pages/WorkflowsPage.tsx`、`ui/src/pages/WorkflowCanvasPage.tsx` |
|
||||
| 模型管理 | `/` | `ui/src/pages/ModelsPage.tsx` |
|
||||
| 模型广场 | `/plaza` | `ui/src/pages/ModelPlazaPage.tsx` |
|
||||
| 任务 | `/tasks` | `ui/src/pages/TasksPage.tsx` |
|
||||
@@ -77,7 +79,52 @@
|
||||
|
||||
---
|
||||
|
||||
## 3. 模型管理页(`/`)
|
||||
## 3. 智能体页(`/agents`)
|
||||
|
||||
### 3.1 智能体列表
|
||||
|
||||
- 左侧导航新增「智能体」选项卡,页面分为「预制智能体」与「自定义智能体」两组。
|
||||
- **预制智能体**:随应用内置 6 个(通用助手、代码专家、写作助手、翻译官、数据分析师、提示词优化师),首次启动自动写入数据库(`settings` 键 `preset_agents_seeded` 标记,之后尊重用户删除);可通过「恢复预制智能体」一键找回已删除的预制体。
|
||||
- **自定义智能体**:支持新增 / 编辑 / 删除 / 启用停用。字段:名称、图标(emoji)、描述、系统提示词、默认大模型(可选)、启用开关。
|
||||
- 删除智能体会同时删除其名下所有会话(消息随外键级联删除)。
|
||||
|
||||
### 3.2 智能体会话
|
||||
|
||||
- 点击智能体卡片「开始对话」进入 `/agents/:agentId`,该页面复用聊天页完整能力(流式输出、重新生成、版本历史、工具、预测建议等)。
|
||||
- **会话隔离**:`conversations` 表新增 `agent_id` 字段。普通对话页只显示 `agent_id` 为空的会话,每个智能体只显示属于自己的会话,互不干扰。
|
||||
- 新建智能体会话时自动写入该智能体的**系统提示词**(人设)与默认大模型;对话时仍可在右侧参数面板切换任意可用大模型(本地 / 在线 API 均可)。
|
||||
- 系统提示词在 `chat_send` / `regenerate_message` / `edit_message` 三条链路统一注入到消息历史最前(工具说明紧随其后),重新生成与编辑重提同样生效。
|
||||
|
||||
---
|
||||
|
||||
## 4. 工作流页(`/workflows`)
|
||||
|
||||
### 4.1 工作流列表
|
||||
|
||||
- 左侧导航新增「工作流」选项卡,页面分为「预制工作流」与「自定义工作流」两组,支持新建 / 删除 / 启用停用 / 恢复预制。
|
||||
- **预制工作流**:随应用内置 4 个(翻译助手、内容总结、两步润色、写作助手),首次启动自动写入数据库(`settings` 键 `preset_workflows_seeded` 标记,之后尊重用户删除);「恢复预制工作流」可一键找回。
|
||||
- 新建工作流会生成「开始 → 大模型 → 输出」的默认画布,随后进入画布编辑器。
|
||||
|
||||
### 4.2 画布编辑器(`/workflows/:workflowId`)
|
||||
|
||||
- 左侧节点面板可添加 4 类节点:
|
||||
- **开始**:工作流入口,提供运行输入(提示词中可用 `{{input}}` 引用);
|
||||
- **大模型**:配置提示词模板、节点级大模型(可选)、temperature、max_tokens,提示词可用 `{{input}}` 与 `{{节点id}}` 引用上游节点输出;
|
||||
- **文本**:静态文本内容(如风格要求),可被其他节点引用;
|
||||
- **输出**:决定最终输出(模板留空时自动取上游输出)。
|
||||
- 节点可拖动布局;点击节点右侧圆点拖到另一节点左侧圆点建立连线(数据流),点击连线删除;删除节点时自动清理相关连线。
|
||||
- 右侧面板:运行工作流(输入内容 + 可选大模型)、节点设置、工作流设置(图标/描述/默认大模型/启用)、各节点输出列表。
|
||||
- 运行前自动保存画布;后端按拓扑顺序执行,`workflow://node-status` 事件实时推送每个节点 running/done 状态与输出。
|
||||
|
||||
### 4.3 执行引擎
|
||||
|
||||
- `apps/desktop/src/workflow.rs`:DAG 拓扑排序(Kahn,检测循环/未知节点/自连)、模板变量解析(`{{input}}`、`{{节点id}}`)、逐节点执行与结果收集;不依赖具体模型,通过注入的 `call_model` 闭包调用模型,便于单元测试。
|
||||
- LLM 节点模型解析顺序:节点配置 → 工作流默认模型 → 运行参数模型 → 第一个本地模型 / 第一个已启用在线模型。
|
||||
- 已内置 5 个执行引擎单元测试(单节点、链式传参、文本节点组合、循环检测、缺失变量报错)与 1 个真实模型端到端测试(`real_model_translation_workflow_e2e`,用本机已配置的在线模型跑通「翻译」工作流,默认忽略、显式运行)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 模型管理页(`/`)
|
||||
|
||||
- **本地模型**:启动时自动扫描模型目录(可手动重新扫描);支持导入本地 GGUF 文件;可「部署」(后台加载 llama-server 并显示进度)或「停止」;可打开所在目录、移除。
|
||||
- **在线 API 模型**(OpenAI 兼容):添加时填写显示名称、Base URL、API Key(可选)、上游模型 ID。
|
||||
@@ -86,7 +133,7 @@
|
||||
|
||||
---
|
||||
|
||||
## 4. 模型广场页(`/plaza`)
|
||||
## 6. 模型广场页(`/plaza`)
|
||||
|
||||
- 搜索 Hugging Face / ModelScope 上的 GGUF 模型,支持热门榜(空关键词)。
|
||||
- 查看仓库的 GGUF 量化版本文件列表,选择版本一键下载(ModelScope 文件自动附带 SHA256 校验)。
|
||||
@@ -95,14 +142,14 @@
|
||||
|
||||
---
|
||||
|
||||
## 5. 任务页(`/tasks`)
|
||||
## 7. 任务页(`/tasks`)
|
||||
|
||||
- 展示下载任务与部署任务的实时进度、状态(进行中 / 完成 / 失败)。
|
||||
- 空状态提示:暂无任务时引导去模型广场下载或部署本地模型。
|
||||
|
||||
---
|
||||
|
||||
## 6. 工具页(`/tools`)
|
||||
## 8. 工具页(`/tools`)
|
||||
|
||||
- **联网搜索**:配置 Tavily API Key,支持手动测试搜索;对话中的「联网搜索」开关依赖该配置。
|
||||
- **技能(Skill)**:
|
||||
@@ -116,14 +163,14 @@
|
||||
|
||||
---
|
||||
|
||||
## 7. 服务管理页(`/server`)
|
||||
## 9. 服务管理页(`/server`)
|
||||
|
||||
- OpenAI 兼容的本地 API 服务:`/v1/models`、`/v1/chat/completions`(SSE 流式)、`/v1/embeddings`。
|
||||
- 可设置端口与 API Key,仅本机监听;可启动/停止并查看状态。
|
||||
|
||||
---
|
||||
|
||||
## 8. 设置页(`/settings`)
|
||||
## 10. 设置页(`/settings`)
|
||||
|
||||
- **引擎与路径**:模型目录、llama-server 路径、模型下载源(hf-mirror / huggingface.co / modelscope.cn)、默认后端(auto/cpu/cuda/vulkan)、上传大小上限。
|
||||
- **对话**:
|
||||
@@ -137,12 +184,14 @@
|
||||
|
||||
---
|
||||
|
||||
## 9. 改动记录
|
||||
## 11. 改动记录
|
||||
|
||||
> 按时间倒序追加;每次改动功能都要在此登记。
|
||||
|
||||
### 2026-08-16
|
||||
|
||||
- 新增「工作流」选项卡:画布式节点编辑器(开始/大模型/文本/输出,节点连线传参、拖动布局),内置 4 个预制工作流(翻译助手、内容总结、两步润色、写作助手)并支持自定义与恢复;新增 `workflows` 表与 `run_workflow` 命令,后端 `apps/desktop/src/workflow.rs` 执行引擎支持拓扑排序、模板变量(`{{input}}`/`{{节点id}}`)、循环检测,LLM 节点支持本地/在线大模型(节点 → 工作流 → 运行参数 → 自动回退);`workflow://node-status` 事件实时推送节点状态;5 个引擎单元测试 + 1 个真实模型端到端测试全部跑通。
|
||||
- 新增「智能体」选项卡:内置 6 个预制智能体 + 支持自定义智能体(名称/图标/描述/系统提示词/默认模型/启用开关);每个智能体拥有独立会话区(`conversations.agent_id` 隔离),新建会话自动继承智能体系统提示词与默认模型;系统提示词统一注入 `chat_send` / `regenerate_message` / `edit_message` 链路;删除智能体时级联删除其会话;支持「恢复预制智能体」。
|
||||
- 工具页新增「技能(Skill)」与「MCP 服务」管理;对话工具协议上线:模型用 `[[skill:…]]` / `[[mcp:…]]` 标记调用技能与 MCP 工具,系统执行后回填结果(最多 3 轮)。新增本地 MCP 测试服务器 `scripts/test_mcp_server.py` 与 3 个示例技能。
|
||||
- 会话列表「更多操作」菜单:鼠标移出按钮/菜单所在区域时自动关闭,避免遮挡其他对话标题的查看与操作。
|
||||
- 新建对话时复用已有空会话(无消息的会话),避免堆积多个空的「新会话」。
|
||||
|
||||
Reference in New Issue
Block a user