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` | 预制工作流是否已写入(内部标记,避免覆盖用户删除) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user