docs: 工作台设计稿收入 docs 体系,routes.go 更名 ai_routes.go
7 份散落在 frontend/src/views/workbench/ 的设计稿按现有编号体系收入 docs/, 源码目录现在只剩 12 个 .vue 页面: PlatformArchitectureRethink -> docs/01_System_Overall/SY24 WorkbenchArchitectureContract -> docs/02_Architecture/AR05 SkillPackagingSpecification -> docs/02_Architecture/AR06 ArchitectureAlignmentAudit -> docs/02_Architecture/AR07 RoleInteractionDesign -> docs/02_Architecture/AR08 YunQuParityRoadmap_OfficePlatform -> docs/06_Product_Lines/PL04 WorkBuddySkillRpaLearning -> docs/09_Research/RS01 14 处交叉引用同步更新(含 SY20/SY21 里指向旧源码路径的两处);三份 README 索引 补齐 SY20-SY24 与 AR05-AR08、PL04;README 顶部「本目录全是历史快照」的说法改精确 (AR05-AR08、PL04 不属于 V1.1 / V1 快照)。 AR08 文首补注「采纳与废弃」,避免它被当成现行设计照做: - 已采纳:对象不跳页 / 不做独立工具页 / + 菜单挂载 / 切换对象=更新任务上下文 - 已废弃:「数字技术员」第三类对象(SY21 §2.2 已废除 tool 命名)、 「通用助手 = 默认专员」、§14「与本稿冲突以本稿为准」的自我授权 backend-go: internal/api/routes.go -> ai_routes.go。该文件管的是 AI 模型路由 (LLM provider 列表),与 router.go 的 URL 路由注册同包同名易混,加文件头注释钉死。 验证:go build ./... 通过;go vet ./internal/api/ 无告警;npm run build 通过。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,9 @@
|
||||
|
||||
> **命名规则:** `SY{NN}_{描述}.md`
|
||||
> **用途:** 系统概述、架构愿景、设计原则
|
||||
>
|
||||
> **当前统一口径:** 术语与一级导航请以 `SY21`、`SY22` 为准。
|
||||
> 当前产品一级导航目标态为:`新建任务 / 项目 / 专员·技能·APP·连接器 / 长程APP / 知识库 / 后台管理 / 我的`
|
||||
|
||||
## 文件清单
|
||||
|
||||
@@ -24,9 +27,14 @@
|
||||
| `SY14_Industry_Derived_Connector_And_Application_Requirement_Matrix.md` | 从六个行业反推连接器与应用方向矩阵 |
|
||||
| `SY15_Terminology_Benchmark_Ontology_Semantic_Layer_Object_Layer.md` | 本体层 / 语义层 / 对象层命名基准研究(含星邺汇捷 / Palantir / Microsoft / Salesforce 对照) |
|
||||
| `SY16_Ontology_Generalizes_Data_Actions_And_Workflows.md` | 本体如何让数据、动作、工作流一般化 |
|
||||
| `SY17_Workbench_UI_Wireframes.md` | 数字员工平台 UI 线框图(知识库固定 + 专员动态生长) |
|
||||
| `SY17_Workbench_UI_Wireframes.md` | 数字员工平台 UI 线框图(早期线框推演,当前命名与导航以 SY22 为准) |
|
||||
| `SY18_DWP_DW_ADW_Formal_Design_Contract.md` | DWP / DW / ADW 正式设计合同(供人和 AI 共用的对象基准) |
|
||||
| `SY19_Universal_Digital_Worker_Product_Planning.md` | 通用数字员工平台 V1.0 产品规划(先通用、后定制的产品打法收口) |
|
||||
| `SY20_Role_Card_And_Lightweight_Ontology_Architecture.md` | 角色卡与轻量本体对象架构(专家对象交互属性的历史收敛稿) |
|
||||
| `SY21_Unified_Role_Skill_Action_Architecture.md` | 统一 Expert / Skill / Action 总架构确认稿(六层架构与命名收口) |
|
||||
| `SY22_Role_Skill_App_Unified_Task_Architecture.md` | Expert / Skill / App 统一任务架构(把 App 升级为一级对象、补齐完整一级导航、并将知识库确认为默认内建 App,产品名收口为“长程APP”) |
|
||||
| `SY23_Specialist_Rule_File_And_Skill_Binding_Plan.md` | 专员「岗位说明书 + 技能绑定」改造方案(诊断运行时同质化根因 + 三步打通链路 + AionUi 规则文件改写清单) |
|
||||
| `SY24_Platform_Architecture_Rethink.md` | 数字员工平台整体架构重思考(Workbench 收敛与对象化迁移**历史稿**,其结论已并入 SY21 / SY22) |
|
||||
|
||||
## 当前主线关系
|
||||
|
||||
@@ -44,3 +52,8 @@
|
||||
12. `SY17`:把六层架构落成数字员工平台工作台线框,明确平台不再是单一导航后台
|
||||
13. `SY18`:正式定义 DWP / DW / ADW 的结构合同、字段规范和 AI 生成规则
|
||||
14. `SY19`:把当前阶段产品路线正式收口为「先通用数字员工、后行业包与企业定制」
|
||||
15. `SY20`:把角色卡从 UI 文案提升为角色对象内建属性,并确认轻量本体的落地边界
|
||||
16. `SY21`:正式收口六层架构与 `expert / skill / action / connector / policy` 总命名
|
||||
17. `SY22`:在 `SY21` 基础上补齐第三类一级对象 `app`,补全完整一级导航视图,并将知识库确认为默认内建 App,把平台升级为 Expert / Skill / App 三对象统一任务系统,产品名收口为“长程APP”
|
||||
18. `SY23`:定位到「专员与技能之间缺绑定边、专员说明未进 prompt」是专员的运行时空洞根因,给出三步打通方案与 AionUi 规则文件改写清单
|
||||
19. `SY24`:Workbench 收敛与对象化迁移的历史重思考稿,结论已并入 `SY21` / `SY22`;本文只作背景追溯,命名一律以 `SY21` 为准
|
||||
|
||||
@@ -0,0 +1,484 @@
|
||||
# SY20 — 角色卡与轻量本体对象架构
|
||||
|
||||
> 状态:架构建议稿
|
||||
> 日期:2026-09-16
|
||||
> 关联文档:
|
||||
> - `SY03_Knowledge_Centric_Agent_Platform_Strategy.md`
|
||||
> - `docs/01_System_Overall/SY24_Platform_Architecture_Rethink.md`
|
||||
|
||||
> 2026-09-16 术语同步:
|
||||
> 本文档继续成立,但请以 `SY21_Unified_Role_Skill_Action_Architecture.md`、`SY22_Role_Skill_App_Unified_Task_Architecture.md` 为总架构收口版本。
|
||||
> 其中最关键的口径更新是:
|
||||
> - 角色卡属于专家对象属性,不再单列为独立架构层
|
||||
> - 对外当前统一采用 `专家 / 技能 / 长程APP / 知识库`
|
||||
> - 对内正式收敛为 `expert / skill / app / action / connector / policy`
|
||||
> - 当前一级导航目标态为 `新建任务 / 项目 / 专员·技能·APP·连接器 / 长程APP / 知识库 / 后台管理 / 我的`
|
||||
> - 本文中原先出现的“角色 / Role / 工具”概念,应理解为历史过渡词,未来命名统一转向 `专家 / 技能 / action`
|
||||
|
||||
---
|
||||
|
||||
## 1. 这份文档要回答什么
|
||||
|
||||
在当前工作台架构下,我们已经确认:
|
||||
|
||||
- 专员和技能都不应该再是独立页面
|
||||
- 它们都应该作为可挂载对象进入 `/home`
|
||||
- 当前最大问题已经不是“怎么跳转”,而是“对象本身怎么定义”
|
||||
|
||||
这份文档要回答 3 个关键问题:
|
||||
|
||||
1. 专员和技能型角色是否应该统一为同一种对象
|
||||
2. 是否应该引入类似 character.ai 的“角色卡”
|
||||
3. 是否应该在当前阶段引入“本体 / ontology”
|
||||
|
||||
---
|
||||
|
||||
## 2. 核心结论
|
||||
|
||||
### 2.1 专员和工具应统一为同一种对象
|
||||
|
||||
建议统一收敛为:
|
||||
|
||||
**角色对象(Role Object)**
|
||||
|
||||
两者底层结构基本一致,差异只在能力边界:
|
||||
|
||||
- 工具:单能力、单任务域、通常不再继续调用别的工具
|
||||
- 专员:多步骤、可编排、允许调用工具完成子任务
|
||||
|
||||
也就是说:
|
||||
|
||||
**工具不是“低一层的页面”,而是“能力范围更窄的角色”。**
|
||||
|
||||
### 2.2 应该加入角色卡,而且要作为对象内建属性
|
||||
|
||||
建议明确加入:
|
||||
|
||||
**Role Card = 角色对象的可定义交互外壳**
|
||||
|
||||
它不只是欢迎语,而是对象如何被用户感知、如何开场、如何引导用户进入任务的第一层契约。
|
||||
|
||||
欢迎语应从硬编码 UI 文案,升级为:
|
||||
|
||||
**对象属性驱动的开场定义**
|
||||
|
||||
### 2.3 应该加入本体,但当前只做轻量本体
|
||||
|
||||
建议加入:
|
||||
|
||||
**轻量运营本体(Lightweight Operational Ontology)**
|
||||
|
||||
但不建议现在就上完整 RDF / OWL / SHACL 那套重语义工程。
|
||||
|
||||
当前阶段更合适的是:
|
||||
|
||||
- 先定义平台自己的对象类型、动作类型、产物类型、关系类型
|
||||
- 先服务工作台挂载、执行链、权限、结果展示
|
||||
- 先把“平台语义层”立起来
|
||||
|
||||
而不是一开始就追求语义网级别的正式本体工程。
|
||||
|
||||
---
|
||||
|
||||
## 3. 为什么要引入角色卡
|
||||
|
||||
### 3.1 当前问题
|
||||
|
||||
现在工作台的问题不是“没有欢迎语”这么简单,而是:
|
||||
|
||||
- 选了专员后,页面不知道该如何以这个对象的身份开场
|
||||
- 选了工具后,只是多了一个 chip,但没有人格化 / 职责化表达
|
||||
- 当前欢迎态仍然是“通用助手门厅”,不是“当前对象门厅”
|
||||
|
||||
这说明我们缺的不是一句文案,而是:
|
||||
|
||||
**对象自我介绍能力**
|
||||
|
||||
### 3.2 角色卡的价值
|
||||
|
||||
角色卡负责定义:
|
||||
|
||||
1. 这个对象是谁
|
||||
2. 它擅长什么
|
||||
3. 它怎么和用户说话
|
||||
4. 它建议用户怎么开始
|
||||
5. 它不做什么
|
||||
|
||||
所以角色卡不是装饰,而是对象定义的一部分。
|
||||
|
||||
### 3.3 角色卡应该覆盖的内容
|
||||
|
||||
建议 `role_card` 最少包含:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "合同审查专员",
|
||||
"tagline": "把合同风险、红线和交付意见整理清楚",
|
||||
"greeting": "我是合同审查专员,已经准备好帮你定位条款风险、整理红线建议,并输出可交付的审查结果。",
|
||||
"relationship_to_user": "你的法务协作搭档",
|
||||
"tone": "专业、直接、可追溯",
|
||||
"opening_prompt": "把合同发给我,或者直接告诉我这次要重点盯哪些条款。",
|
||||
"starter_prompts": [
|
||||
"审查这份采购合同的风险点",
|
||||
"帮我整理一版 redline 建议",
|
||||
"重点看赔偿责任和终止条款"
|
||||
],
|
||||
"boundaries": [
|
||||
"我会指出风险,但不替代人工法律意见",
|
||||
"高风险条款会明确标出待人工确认"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 为什么要引入轻量本体
|
||||
|
||||
### 4.1 我们真正需要的不是“知识图谱名词”,而是平台统一语义
|
||||
|
||||
如果没有本体层,平台会继续出现这些问题:
|
||||
|
||||
- 专员和工具只是 UI 名字,没有统一语义身份
|
||||
- 任务挂的是 `specialist_key`,但系统不知道对象之间是什么关系
|
||||
- 工作流、产物、动作、知识对象各自分散,难以统一编排
|
||||
- 后面做多对象协作时,平台不知道谁能调用谁、产出什么、依赖什么
|
||||
|
||||
### 4.2 当前阶段不适合直接上重本体
|
||||
|
||||
完整本体工程的问题不在“对不对”,而在“此刻成本太高”:
|
||||
|
||||
- 建模成本高
|
||||
- 治理成本高
|
||||
- 版本演进成本高
|
||||
- 需要更成熟的数据治理和知识工程流程
|
||||
|
||||
对我们当前阶段来说,最重要的是先统一平台对象语义,而不是先做语义网工程。
|
||||
|
||||
### 4.3 当前阶段建议的本体范围
|
||||
|
||||
建议只定义 5 类核心语义:
|
||||
|
||||
1. **角色类型**
|
||||
- specialist
|
||||
- tool
|
||||
|
||||
2. **对象类型**
|
||||
- contract
|
||||
- customer
|
||||
- report
|
||||
- resume
|
||||
- knowledge_item
|
||||
|
||||
3. **动作类型**
|
||||
- analyze
|
||||
- extract
|
||||
- review
|
||||
- draft
|
||||
- translate
|
||||
- escalate
|
||||
|
||||
4. **产物类型**
|
||||
- summary
|
||||
- report
|
||||
- redline
|
||||
- checklist
|
||||
- spreadsheet
|
||||
|
||||
5. **关系类型**
|
||||
- can_use_tool
|
||||
- produces_artifact
|
||||
- acts_on_object
|
||||
- depends_on
|
||||
- cites_knowledge
|
||||
|
||||
这就足以支撑我们当前的工作台对象化。
|
||||
|
||||
---
|
||||
|
||||
## 5. 建议采用的统一对象架构
|
||||
|
||||
### 5.1 根对象:`object_definition`
|
||||
|
||||
不建议再把“专员定义”和“工具定义”拆成两套根结构。
|
||||
|
||||
建议统一使用已有方向里的:
|
||||
|
||||
**`object_definition`**
|
||||
|
||||
然后在里面用 `role_kind` 区分:
|
||||
|
||||
- `specialist`
|
||||
- `tool`
|
||||
|
||||
### 5.2 建议结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "obj.contract-review",
|
||||
"code": "EAI-R-001",
|
||||
"key": "contract-review",
|
||||
"label": "合同审查专员",
|
||||
"object_class": "role",
|
||||
"role_kind": "specialist",
|
||||
"source": "eai",
|
||||
"status": "active",
|
||||
"role_card": {
|
||||
"tagline": "把合同风险、红线和交付意见整理清楚",
|
||||
"greeting": "我是合同审查专员,已经准备好帮你定位条款风险并输出审查建议。",
|
||||
"relationship_to_user": "你的法务协作搭档",
|
||||
"tone": "专业、直接、可追溯",
|
||||
"opening_prompt": "把合同发给我,或者告诉我这次重点审哪些条款。",
|
||||
"starter_prompts": [
|
||||
"审查这份采购合同的风险点",
|
||||
"帮我整理一版 redline 建议"
|
||||
],
|
||||
"boundaries": [
|
||||
"我会标出高风险项",
|
||||
"最终法律意见仍需人工确认"
|
||||
]
|
||||
},
|
||||
"capability_profile": {
|
||||
"summary": "条款识别、风险分析、红线建议、交付摘要",
|
||||
"input_types": ["document", "text"],
|
||||
"artifact_types": ["summary", "redline", "checklist"],
|
||||
"can_chat": true,
|
||||
"can_execute": true
|
||||
},
|
||||
"collaboration_profile": {
|
||||
"callable_tool_keys": ["document-translate", "batch-extract"],
|
||||
"can_be_called_by": [],
|
||||
"orchestration_mode": "supervisor"
|
||||
},
|
||||
"ontology_binding": {
|
||||
"acts_on_object_types": ["contract"],
|
||||
"action_types": ["review", "analyze", "draft"],
|
||||
"produces_artifact_types": ["summary", "redline", "checklist"],
|
||||
"knowledge_domains": ["legal", "compliance"]
|
||||
},
|
||||
"execution_profile": {
|
||||
"settings_schema": [],
|
||||
"executor_key": "contract-review",
|
||||
"result_card_key": "contract-review"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 工具对象也用同一结构
|
||||
|
||||
工具只是把 `role_kind` 改为 `tool`:
|
||||
|
||||
```json
|
||||
{
|
||||
"key": "document-translate",
|
||||
"label": "文档翻译",
|
||||
"object_class": "role",
|
||||
"role_kind": "tool",
|
||||
"role_card": {
|
||||
"tagline": "把内容准确翻译成目标语言并输出指定格式",
|
||||
"greeting": "我是文档翻译工具,可以把文本、文档整理成目标语言输出。",
|
||||
"relationship_to_user": "你的翻译执行角色"
|
||||
},
|
||||
"collaboration_profile": {
|
||||
"callable_tool_keys": [],
|
||||
"orchestration_mode": "none"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
也就是说:
|
||||
|
||||
**工具和专员不是两套模型,而是一套模型上的两个角色种类。**
|
||||
|
||||
---
|
||||
|
||||
## 6. 专员与工具的真正差异
|
||||
|
||||
建议只保留这一个核心差异:
|
||||
|
||||
### 6.1 工具
|
||||
|
||||
- 聚焦单能力
|
||||
- 输入输出边界更明确
|
||||
- 通常不再调别的工具
|
||||
- 更像“执行角色”
|
||||
|
||||
### 6.2 专员
|
||||
|
||||
- 聚焦任务闭环
|
||||
- 可以调用多个工具
|
||||
- 会管理步骤、产物、待确认点
|
||||
- 更像“编排角色”
|
||||
|
||||
所以:
|
||||
|
||||
**专员 = 能调用工具的角色对象**
|
||||
|
||||
而不是:
|
||||
|
||||
**专员 = 页面,工具 = 页面里的功能按钮**
|
||||
|
||||
---
|
||||
|
||||
## 7. 对工作台交互的直接影响
|
||||
|
||||
### 7.1 欢迎态改成对象驱动
|
||||
|
||||
当前 `/home` 的欢迎态不应再写死成通用助手。
|
||||
|
||||
应该改为:
|
||||
|
||||
1. 如果当前挂的是对象,就优先显示该对象的 `role_card.greeting`
|
||||
2. `starter_prompts` 作为欢迎态快捷入口
|
||||
3. `tagline / opening_prompt / boundaries` 作为辅助说明
|
||||
4. 如果没有挂对象,再退回通用助手默认欢迎态
|
||||
|
||||
### 7.2 输入框左侧对象 chip 不再只是标签
|
||||
|
||||
它应表达:
|
||||
|
||||
- 当前对象是谁
|
||||
- 当前对象属于 `specialist` 还是 `tool`
|
||||
- 当前对象的 `tagline`
|
||||
|
||||
### 7.3 右栏不应再叫“专员面板”
|
||||
|
||||
因为工具也是角色对象。
|
||||
|
||||
建议后续改成更中性的:
|
||||
|
||||
- `ObjectPanel`
|
||||
- `RolePanel`
|
||||
|
||||
只是当对象是 `specialist` 时,展示更完整的工作流与产物;
|
||||
当对象是 `tool` 时,展示它的输入边界、执行结果、相关产物。
|
||||
|
||||
---
|
||||
|
||||
## 8. 对数据层的建议
|
||||
|
||||
### 8.1 先别引入新根对象名,先复用 `object_definition`
|
||||
|
||||
当前项目已经在往:
|
||||
|
||||
- `object_definition`
|
||||
- `task_object_instance`
|
||||
- `object_run`
|
||||
- `task_message`
|
||||
|
||||
这条路上走。
|
||||
|
||||
因此不建议再新起一套:
|
||||
|
||||
- `specialist_definition`
|
||||
- `tool_definition`
|
||||
- `role_definition`
|
||||
|
||||
而是:
|
||||
|
||||
**在 `object_definition` 里加角色属性分组。**
|
||||
|
||||
### 8.2 建议新增的对象属性分组
|
||||
|
||||
建议统一加这几组:
|
||||
|
||||
- `role_kind`
|
||||
- `role_card_json`
|
||||
- `capability_profile_json`
|
||||
- `collaboration_profile_json`
|
||||
- `ontology_binding_json`
|
||||
|
||||
### 8.3 后端可以分阶段兼容
|
||||
|
||||
第一阶段不必立刻改完后端表。
|
||||
|
||||
可以先在前端 registry 和 specialist adapter 里形成统一结构:
|
||||
|
||||
- 内置工具走前端静态定义
|
||||
- 专员走后端字段 + 前端适配
|
||||
- 统一映射成 `object_definition` 视图模型
|
||||
|
||||
等结构稳定后,再把后端持久化模型补齐。
|
||||
|
||||
---
|
||||
|
||||
## 9. 当前阶段的实施建议
|
||||
|
||||
### Phase 1:先把角色卡引入前端对象视图层
|
||||
|
||||
先做:
|
||||
|
||||
- `role_card` 统一适配层
|
||||
- `/home` 欢迎态改为对象驱动
|
||||
- 专员 / 工具都能显示自己的 greeting 与 starter prompts
|
||||
|
||||
这一步不要求后端表结构大改。
|
||||
|
||||
### Phase 2:把 Studio / Market 的专员编辑升级为对象编辑
|
||||
|
||||
新增:
|
||||
|
||||
- 欢迎语
|
||||
- tagline
|
||||
- opening prompt
|
||||
- starter prompts
|
||||
- boundaries
|
||||
|
||||
让专员卡真正可定义。
|
||||
|
||||
工具也开始逐步以同样结构注册。
|
||||
|
||||
### Phase 3:补轻量本体层
|
||||
|
||||
建立平台统一字典:
|
||||
|
||||
- object types
|
||||
- action types
|
||||
- artifact types
|
||||
- relation types
|
||||
|
||||
先服务工作台、运行链和知识引用,不追求重语义工程。
|
||||
|
||||
---
|
||||
|
||||
## 10. 最终建议
|
||||
|
||||
这次不建议二选一,而是建议同时引入两层:
|
||||
|
||||
### 必须现在就做
|
||||
|
||||
1. **角色卡**
|
||||
- 必须加
|
||||
- 而且要作为对象属性
|
||||
- 欢迎语、引导语、starter prompts 都应从这里来
|
||||
|
||||
2. **统一对象模型**
|
||||
- 专员和工具统一为 `object_definition`
|
||||
- 用 `role_kind` 区分
|
||||
- 专员只是“可调用工具的角色”
|
||||
|
||||
### 应该现在开始,但先做轻量版
|
||||
|
||||
3. **轻量本体**
|
||||
- 必须做
|
||||
- 但只做平台运营本体
|
||||
- 不要一开始就上重 RDF / OWL 工程
|
||||
|
||||
### 暂时不要做的事
|
||||
|
||||
4. 不要再继续把“欢迎语”写成页面模板文案
|
||||
5. 不要再继续把“工具”当页面,而不是角色
|
||||
6. 不要现在就把本体做成知识工程大项目
|
||||
|
||||
---
|
||||
|
||||
## 11. 一句话收口
|
||||
|
||||
建议把平台对象统一定义为:
|
||||
|
||||
**“带角色卡的角色对象”**
|
||||
|
||||
其中:
|
||||
|
||||
- 工具 = 单能力角色
|
||||
- 专员 = 可调用工具的编排角色
|
||||
- 本体 = 这些角色、动作、对象、产物之间的轻量语义骨架
|
||||
@@ -0,0 +1,691 @@
|
||||
# SY21 — 统一 Expert / Skill / Action 总架构确认稿
|
||||
|
||||
> 状态:总架构确认稿
|
||||
> 日期:2026-09-16
|
||||
> 关联文档:
|
||||
> - `SY03_Knowledge_Centric_Agent_Platform_Strategy.md`
|
||||
> - `SY15_Terminology_Benchmark_Ontology_Semantic_Layer_Object_Layer.md`
|
||||
> - `SY20_Role_Card_And_Lightweight_Ontology_Architecture.md`
|
||||
> - `docs/01_System_Overall/SY24_Platform_Architecture_Rethink.md`
|
||||
|
||||
> 2026-09-16 术语同步:
|
||||
> 本文原先使用 `Role / role / role_card` 作为主术语。
|
||||
> 现已确认 `Role` 不再作为推荐命名,统一改口为:
|
||||
> - 对外:`专家(Expert) / 技能 / 连接器`
|
||||
> - 对内:`expert / skill / action / connector / policy`
|
||||
> 文中尚未完全迁移的 `role`、`role_card`、`角色对象层`,后续均应分别理解为 `expert`、`expert_card`、`专家对象层`。
|
||||
|
||||
---
|
||||
|
||||
## 1. 这份文档要确认什么
|
||||
|
||||
在前面几轮讨论后,当前项目已经不再缺“局部页面方案”,真正缺的是一份统一总架构结论,用来回答以下问题:
|
||||
|
||||
1. 平台到底按几层架构来收敛
|
||||
2. 本体、角色卡、对象、技能、Action、连接器分别处于什么位置
|
||||
3. 对外到底暴露什么,对内到底运行什么
|
||||
4. 是否还要继续使用 `tool` 这个词
|
||||
5. 当前代码和文档后续应该往哪个方向迁移
|
||||
|
||||
这份文档的目标不是给出某个局部功能设计,而是把平台的总语言、总结构、总对象模型先定下来。
|
||||
|
||||
---
|
||||
|
||||
## 2. 最终结论
|
||||
|
||||
## 2.1 平台采用六层总架构
|
||||
|
||||
建议正式统一为六层:
|
||||
|
||||
1. 外部连接层
|
||||
2. 本体与语义上下文层
|
||||
3. 总线与编排层
|
||||
4. 能力层
|
||||
5. 专家对象层
|
||||
6. 工作台与运行治理层
|
||||
|
||||
这六层已经足以覆盖:
|
||||
|
||||
- 通用数字员工
|
||||
- 文档类、知识类、分析类能力
|
||||
- 工业设备监测、安防、巡检、告警、工单等强外部接口场景
|
||||
|
||||
## 2.2 不再把 `tool` 作为正式命名
|
||||
|
||||
命名上正式收敛为:
|
||||
|
||||
- 对外:`专家 / 技能 / 连接器`
|
||||
- 对内:`expert / skill / action / connector / policy`
|
||||
|
||||
结论:
|
||||
|
||||
**以后不再新增正式架构概念 `tool`。**
|
||||
|
||||
`tool` 只作为历史迁移词存在,用于兼容旧文档、旧字段、旧目录,不再作为未来架构的主词。
|
||||
|
||||
## 2.3 对外默认暴露 `专家 + 技能`
|
||||
|
||||
外部用户看到的应该是:
|
||||
|
||||
- 专家
|
||||
- 技能
|
||||
- 欢迎语
|
||||
- starter prompts
|
||||
- 可完成的任务
|
||||
|
||||
而不是:
|
||||
|
||||
- tool 列表
|
||||
- 底层调用动作
|
||||
- 技术执行接口
|
||||
|
||||
所以:
|
||||
|
||||
**用户入口层默认暴露 skill,不暴露 action。**
|
||||
|
||||
## 2.4 对内统一使用 `action`
|
||||
|
||||
内部最小执行单元统一叫:
|
||||
|
||||
**Action**
|
||||
|
||||
它用于承接:
|
||||
|
||||
- 一次原子能力执行
|
||||
- 一次外部系统调用
|
||||
- 一次标准化输入输出动作
|
||||
- 一次可授权、可审计、可编排的执行操作
|
||||
|
||||
也就是说:
|
||||
|
||||
- `skill` 是任务化能力包
|
||||
- `action` 是原子执行单元
|
||||
|
||||
## 2.5 要引入本体层,而且是必需的
|
||||
|
||||
如果平台后续要扩展到:
|
||||
|
||||
- 工业设备运行监测员
|
||||
- 安防管理员
|
||||
- 巡检专员
|
||||
- 告警分析专员
|
||||
- 工单协调专员
|
||||
|
||||
那么本体层不是可选项,而是必要项。
|
||||
|
||||
原因很简单:
|
||||
|
||||
没有本体层,上层对象和工作台体验很快就会被行业对象、事件、状态、规则的差异撕裂。
|
||||
|
||||
## 2.6 专家卡不是独立层,而是专家对象属性
|
||||
|
||||
角色卡仍然要保留,但它不是一层单独架构层。
|
||||
|
||||
更准确的定义是:
|
||||
|
||||
**专家卡 = 专家对象的交互属性集**
|
||||
|
||||
它负责:
|
||||
|
||||
- 角色是谁
|
||||
- 角色如何开场
|
||||
- 角色如何和用户说话
|
||||
- 角色建议用户如何开始
|
||||
- 角色承诺做什么、不做什么
|
||||
|
||||
---
|
||||
|
||||
## 3. 六层总架构定义
|
||||
|
||||
## 3.1 第一层:外部连接层
|
||||
|
||||
这一层负责连接真实世界和外部系统。
|
||||
|
||||
包括:
|
||||
|
||||
- PLC
|
||||
- SCADA
|
||||
- MES
|
||||
- ERP
|
||||
- CRM
|
||||
- CMMS / 工单系统
|
||||
- IoT 平台
|
||||
- 视频平台
|
||||
- 文档系统
|
||||
- 数据库
|
||||
- API / Webhook / MQ
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**数据从哪里来,动作往哪里去。**
|
||||
|
||||
在本项目里,这一层的标准对象是:
|
||||
|
||||
- `connector_definition`
|
||||
- `connector_binding`
|
||||
|
||||
## 3.2 第二层:本体与语义上下文层
|
||||
|
||||
这一层负责定义平台语义。
|
||||
|
||||
它不是简单的表结构,而是平台统一语义底座。
|
||||
|
||||
当前阶段建议采用轻量本体,先定义:
|
||||
|
||||
1. 对象类型
|
||||
- device
|
||||
- alarm
|
||||
- work_order
|
||||
- report
|
||||
- contract
|
||||
- knowledge_item
|
||||
- person
|
||||
- site
|
||||
|
||||
2. 动作类型
|
||||
- monitor
|
||||
- inspect
|
||||
- diagnose
|
||||
- review
|
||||
- extract
|
||||
- translate
|
||||
- escalate
|
||||
- dispatch
|
||||
|
||||
3. 状态类型
|
||||
- running
|
||||
- warning
|
||||
- critical
|
||||
- pending
|
||||
- approved
|
||||
- closed
|
||||
|
||||
4. 关系类型
|
||||
- belongs_to
|
||||
- depends_on
|
||||
- triggers
|
||||
- resolves
|
||||
- cites
|
||||
- produces
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**系统里到底有什么对象,它们如何关联,允许哪些动作。**
|
||||
|
||||
## 3.3 第三层:总线与编排层
|
||||
|
||||
这一层负责流转,不负责人格,不负责 UI。
|
||||
|
||||
它至少应包含三类总线:
|
||||
|
||||
1. 上下文总线
|
||||
2. 事件总线
|
||||
3. 能力编排总线
|
||||
|
||||
职责包括:
|
||||
|
||||
- 角色之间的协作
|
||||
- skill 对 action 的编排
|
||||
- action 对 connector 的调用
|
||||
- 事件进入任务上下文
|
||||
- 审批和安全边界控制
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**对象怎么流动,能力怎么协作,任务怎么推进。**
|
||||
|
||||
## 3.4 第四层:能力层
|
||||
|
||||
这一层正式拆成三类对象:
|
||||
|
||||
1. `skill`
|
||||
2. `action`
|
||||
3. `policy`
|
||||
|
||||
### 3.4.1 skill
|
||||
|
||||
`skill` 是面向任务的能力包。
|
||||
|
||||
它通常由以下部分组成:
|
||||
|
||||
- intent
|
||||
- prompt template
|
||||
- action chain
|
||||
- input schema
|
||||
- output schema
|
||||
- artifact schema
|
||||
- guardrails
|
||||
|
||||
可以理解为:
|
||||
|
||||
**skill = 用户任务入口 + 规则 + 执行编排模板**
|
||||
|
||||
### 3.4.2 action
|
||||
|
||||
`action` 是内部原子执行单元。
|
||||
|
||||
例如:
|
||||
|
||||
- `read_device_status`
|
||||
- `query_alarm_history`
|
||||
- `create_work_order`
|
||||
- `extract_contract_terms`
|
||||
- `translate_document`
|
||||
- `generate_shift_report`
|
||||
|
||||
它必须具备:
|
||||
|
||||
- 标准输入
|
||||
- 标准输出
|
||||
- 权限边界
|
||||
- 风险级别
|
||||
- 审计记录
|
||||
|
||||
### 3.4.3 policy
|
||||
|
||||
`policy` 负责定义约束和治理条件,例如:
|
||||
|
||||
- 某 action 是否允许自动执行
|
||||
- 是否需要人工确认
|
||||
- 哪些角色可以调用哪些 skill
|
||||
- 哪些 connector 只能读不能写
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**系统能做哪些事,这些事如何以任务化和原子化两种粒度存在。**
|
||||
|
||||
## 3.5 第五层:专家对象层
|
||||
|
||||
这是用户真正感知到的执行主体层。
|
||||
|
||||
专家对象统一采用一个根模型,例如:
|
||||
|
||||
- `object_definition`
|
||||
|
||||
专家对象不再分裂成多套根结构。
|
||||
|
||||
建议至少包含两类专家:
|
||||
|
||||
1. `assistant`
|
||||
2. `specialist`
|
||||
|
||||
如果后续需要更强的“执行人格化对象”,可补充:
|
||||
|
||||
3. `executor`
|
||||
|
||||
其中:
|
||||
|
||||
- `assistant`:默认兜底编排专家
|
||||
- `specialist`:面向领域任务的主专家
|
||||
- `executor`:必要时暴露给用户的窄能力执行专家
|
||||
|
||||
这里最关键的变化是:
|
||||
|
||||
**专家对象不直接等于 action。**
|
||||
|
||||
专家对象负责承接用户、暴露 skill、组织交互体验;
|
||||
真正执行时,仍然落到 `skill -> action -> connector`。
|
||||
|
||||
### 3.5.1 专家卡属于这一层
|
||||
|
||||
`expert_card` 是专家对象属性,不再单列成架构层。
|
||||
|
||||
建议最少包含:
|
||||
|
||||
- name
|
||||
- tagline
|
||||
- greeting
|
||||
- tone
|
||||
- opening_prompt
|
||||
- starter_prompts
|
||||
- boundaries
|
||||
- relationship_to_user
|
||||
|
||||
### 3.5.2 专家对象与能力层的关系
|
||||
|
||||
专家对象不直接暴露所有 action。
|
||||
|
||||
更合适的关系是:
|
||||
|
||||
- 专家对象暴露 `skill`
|
||||
- `skill` 编排多个 `action`
|
||||
- `action` 调用 `connector`
|
||||
|
||||
所以:
|
||||
|
||||
**专家承接用户,skill 组织任务,action 执行动作。**
|
||||
|
||||
## 3.6 第六层:工作台与运行治理层
|
||||
|
||||
这一层是最终运行现场。
|
||||
|
||||
包括:
|
||||
|
||||
- `/home` Workbench
|
||||
- task
|
||||
- task_message
|
||||
- task_object_instance
|
||||
- object_run
|
||||
- artifact
|
||||
- workflow panel
|
||||
- audit / observe / approval
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**一条具体任务如何挂载角色、发送消息、运行 skill、触发 action、沉淀产物。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 最终对象关系
|
||||
|
||||
建议以后统一采用下面这条主链路:
|
||||
|
||||
`user -> expert -> skill -> action -> connector`
|
||||
|
||||
再叠加本体层:
|
||||
|
||||
`ontology -> expert / skill / action / connector`
|
||||
|
||||
也就是说:
|
||||
|
||||
1. 用户不是直接找 action
|
||||
2. 用户是进入某个专家
|
||||
3. 专家向用户暴露 skill
|
||||
4. skill 编排 action
|
||||
5. action 调用 connector
|
||||
6. 全程受 ontology 和 policy 约束
|
||||
|
||||
---
|
||||
|
||||
## 5. 对外暴露模型
|
||||
|
||||
## 5.1 对终端用户
|
||||
|
||||
默认暴露:
|
||||
|
||||
- 专员
|
||||
- 技能
|
||||
- 欢迎语
|
||||
- 任务入口
|
||||
- 产物结果
|
||||
|
||||
默认不暴露:
|
||||
|
||||
- action
|
||||
- connector 技术细节
|
||||
- 编排细节
|
||||
- 底层风险策略
|
||||
|
||||
## 5.2 对管理员 / 搭建者
|
||||
|
||||
可以暴露:
|
||||
|
||||
- skill 绑定了哪些 action
|
||||
- action 绑定了哪些 connector
|
||||
- 权限和审批条件
|
||||
- 输出 schema
|
||||
- 审计与日志
|
||||
|
||||
## 5.3 对运行时
|
||||
|
||||
直接处理:
|
||||
|
||||
- action call
|
||||
- connector call
|
||||
- context binding
|
||||
- event routing
|
||||
- approval gate
|
||||
- audit log
|
||||
|
||||
---
|
||||
|
||||
## 6. 为什么不再使用 `tool`
|
||||
|
||||
## 6.1 对外不合适
|
||||
|
||||
`tool` 太像功能按钮集合,不像任务语言,也不像角色语言。
|
||||
|
||||
尤其在数字员工和工业智能体场景里,它会把产品体验拉回“工具页”心智。
|
||||
|
||||
## 6.2 对内也不够精确
|
||||
|
||||
内部真正需要区分的是:
|
||||
|
||||
- 任务级能力包:`skill`
|
||||
- 原子执行动作:`action`
|
||||
- 外部系统入口:`connector`
|
||||
|
||||
`tool` 夹在中间,语义反而模糊。
|
||||
|
||||
## 6.3 正式命名替换
|
||||
|
||||
后续正式命名建议统一为:
|
||||
|
||||
- 用户可见的 `tool` -> `skill`
|
||||
- 内部原子执行的 `tool` -> `action`
|
||||
- `chatTools` -> `availableSkills`
|
||||
- `currentToolKey` -> `currentSkillKey`
|
||||
- `tool_keys` -> `skill_keys`
|
||||
- 顶部设置条组件 -> `SkillStrip` 或 `ActionStrip`
|
||||
- 前端技能定义目录 -> `src/skills/*`
|
||||
- 后端原子动作定义 -> `action_definition / action_refs / action_records`
|
||||
|
||||
说明:
|
||||
|
||||
当前仓库已有大量 `tool` 历史字段,不建议在总架构确认稿阶段立刻全量重命名;
|
||||
但从现在开始,**不再新增新的正式 `tool` 命名。**
|
||||
|
||||
---
|
||||
|
||||
## 7. 角色、技能、Action 的清晰边界
|
||||
|
||||
## 7.1 角色
|
||||
|
||||
回答的是:
|
||||
|
||||
**谁来承接这次任务。**
|
||||
|
||||
角色包含:
|
||||
|
||||
- 身份
|
||||
- 角色卡
|
||||
- 协作边界
|
||||
- 可暴露 skills
|
||||
- 权限范围
|
||||
|
||||
## 7.2 技能
|
||||
|
||||
回答的是:
|
||||
|
||||
**用户想完成什么任务。**
|
||||
|
||||
技能包含:
|
||||
|
||||
- 任务意图
|
||||
- 开始条件
|
||||
- 输入输出约束
|
||||
- 产物定义
|
||||
- 对 action 的编排模板
|
||||
|
||||
## 7.3 Action
|
||||
|
||||
回答的是:
|
||||
|
||||
**系统这一步到底执行了什么动作。**
|
||||
|
||||
Action 包含:
|
||||
|
||||
- 原子能力定义
|
||||
- 风险级别
|
||||
- 调用协议
|
||||
- connector 绑定
|
||||
- 审计信息
|
||||
|
||||
---
|
||||
|
||||
## 8. 角色卡和本体是否重叠
|
||||
|
||||
不重叠。
|
||||
|
||||
它们都可能写到“能力”相关内容,但目标完全不同。
|
||||
|
||||
## 8.1 本体
|
||||
|
||||
服务机器一致性,定义:
|
||||
|
||||
- 对象
|
||||
- 动作
|
||||
- 状态
|
||||
- 关系
|
||||
- 规则
|
||||
|
||||
## 8.2 角色卡
|
||||
|
||||
服务人机交互一致性,定义:
|
||||
|
||||
- 开场方式
|
||||
- 角色语气
|
||||
- 任务入口提示
|
||||
- 用户对该角色的体验预期
|
||||
|
||||
一句话:
|
||||
|
||||
**本体定义世界,角色卡定义人格。**
|
||||
|
||||
---
|
||||
|
||||
## 9. 对当前 Workbench 的直接要求
|
||||
|
||||
## 9.1 欢迎语必须对象属性驱动
|
||||
|
||||
当用户挂载某个角色后,Workbench 不应继续显示通用助手欢迎语。
|
||||
|
||||
应改为:
|
||||
|
||||
1. 优先显示当前专家的 `expert_card.greeting`
|
||||
2. 下方展示 `starter_prompts`
|
||||
3. 辅助展示 `tagline / opening_prompt / boundaries`
|
||||
4. 无挂载角色时,再退回默认助手欢迎态
|
||||
|
||||
## 9.2 输入区顶部应体现当前对象
|
||||
|
||||
输入区顶部不应只显示一个孤立 chip。
|
||||
|
||||
应明确表达:
|
||||
|
||||
- 当前对象是谁
|
||||
- 当前这次输入会触发什么任务语义
|
||||
- 当前对象是否存在可调设置
|
||||
|
||||
并冻结以下交互规则:
|
||||
|
||||
1. `+` 右边一次只显示一个当前对象
|
||||
2. 当前对象要么是专员,要么是技能,要么是默认助手
|
||||
3. 专员内部调用技能时,下游技能只进入执行链与右侧面板,不在输入区显性双挂
|
||||
|
||||
## 9.3 右侧面板应是对象面板,不再是旧“工具面板”
|
||||
|
||||
建议中性命名:
|
||||
|
||||
- `ObjectPanel`
|
||||
- `ExpertPanel`
|
||||
|
||||
其内容由当前角色和当前运行态决定,而不是由旧页面类型决定。
|
||||
|
||||
---
|
||||
|
||||
## 10. 目标数据结构建议
|
||||
|
||||
## 10.1 角色定义 `object_definition`
|
||||
|
||||
建议继续作为统一根对象,至少补充:
|
||||
|
||||
- `object_kind`
|
||||
- `expert_card_json`
|
||||
- `capability_profile_json`
|
||||
- `collaboration_profile_json`
|
||||
- `ontology_binding_json`
|
||||
|
||||
## 10.2 技能定义 `skill_definition`
|
||||
|
||||
建议新增独立定义层,至少包含:
|
||||
|
||||
- `id`
|
||||
- `key`
|
||||
- `label`
|
||||
- `description`
|
||||
- `exposed_to_user`
|
||||
- `input_schema`
|
||||
- `output_schema`
|
||||
- `artifact_schema`
|
||||
- `action_refs`
|
||||
- `policy_refs`
|
||||
- `ontology_binding`
|
||||
|
||||
## 10.3 Action 定义 `action_definition`
|
||||
|
||||
建议新增,至少包含:
|
||||
|
||||
- `id`
|
||||
- `key`
|
||||
- `label`
|
||||
- `action_type`
|
||||
- `connector_ref`
|
||||
- `input_schema`
|
||||
- `output_schema`
|
||||
- `risk_level`
|
||||
- `approval_mode`
|
||||
- `audit_level`
|
||||
|
||||
## 10.4 运行态
|
||||
|
||||
建议继续沿用并收敛为:
|
||||
|
||||
- `task`
|
||||
- `task_object_instance`
|
||||
- `task_message`
|
||||
- `object_run`
|
||||
- `artifact`
|
||||
|
||||
其中:
|
||||
|
||||
- `task_object_instance` 负责挂载当前角色
|
||||
- `task_message` 负责持久化会话
|
||||
- `object_run` 负责记录 skill 和 action 的执行链
|
||||
|
||||
---
|
||||
|
||||
## 11. 对当前项目的迁移原则
|
||||
|
||||
## 11.1 总原则
|
||||
|
||||
先定语言,再改代码。
|
||||
|
||||
当前阶段最重要的是把架构口径统一为:
|
||||
|
||||
- 六层总架构
|
||||
- 对外 `角色 + 技能`
|
||||
- 对内 `skill + action + connector`
|
||||
- `tool` 正式退出未来命名
|
||||
|
||||
## 11.2 当前阶段不要做的事
|
||||
|
||||
1. 不要继续新增 `tool` 概念
|
||||
2. 不要再把 action 做成独立页面
|
||||
3. 不要再让路由承担能力身份
|
||||
4. 不要让欢迎语继续写死在页面里
|
||||
|
||||
## 11.3 下一阶段最值得做的事
|
||||
|
||||
1. 先把当前架构文档同步到这一套口径
|
||||
2. 再把前端欢迎态改为 `expert_card.greeting` 驱动
|
||||
3. 再把 `tool` 相关变量和目录逐步迁移到 `skill / action`
|
||||
4. 后续再进入数据库与运行时的对象化升级
|
||||
|
||||
---
|
||||
|
||||
## 12. 一句话总收口
|
||||
|
||||
平台以后应统一理解为:
|
||||
|
||||
**一个以本体为语义底座、以角色为用户承接体、以技能为任务入口、以 Action 为原子执行单元、以 Workbench 为统一运行现场的数字员工与工业智能体平台。**
|
||||
@@ -0,0 +1,755 @@
|
||||
# SY22 — Expert / Skill / App 统一任务架构
|
||||
|
||||
> 状态:总架构扩展确认稿
|
||||
> 日期:2026-09-16
|
||||
> 关联文档:
|
||||
> - `SY17_Workbench_UI_Wireframes.md`
|
||||
> - `SY20_Role_Card_And_Lightweight_Ontology_Architecture.md`
|
||||
> - `SY21_Unified_Role_Skill_Action_Architecture.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 这份文档要解决什么问题
|
||||
|
||||
在 `SY21` 中,平台已经正式收敛为六层架构,并明确了:
|
||||
|
||||
- 对外暴露 `专家 / 技能 / 连接器`
|
||||
- 对内运行 `expert / skill / action / connector / policy`
|
||||
- 不再继续扩张 `tool` 概念
|
||||
|
||||
但随着工作台进一步向 WorkBuddy 类产品演进,出现了一个新问题:
|
||||
|
||||
**系统里需要一种既不是专家、也不是技能的新一级对象。**
|
||||
|
||||
它具备以下特征:
|
||||
|
||||
- 不是以对话为主交互
|
||||
- 有自己长期存在的主界面
|
||||
- 有结构化状态、表单、题卡、看板、画布等交互
|
||||
- 启动后应成为一个长程任务实例
|
||||
- 可挂载右栏 AI、可调用技能、可沉淀业务产物
|
||||
|
||||
这类对象不适合继续塞进 `expert`,也不适合伪装成“大 skill”。
|
||||
|
||||
因此,这份文档正式确认:
|
||||
|
||||
> **平台需要第三类一级对象:App。**
|
||||
|
||||
---
|
||||
|
||||
## 2. 最终结论
|
||||
|
||||
## 2.1 六层总架构继续成立,但第五层升级
|
||||
|
||||
`SY21` 的六层架构继续有效:
|
||||
|
||||
1. 外部连接层
|
||||
2. 本体与语义上下文层
|
||||
3. 总线与编排层
|
||||
4. 能力层
|
||||
5. 对象层
|
||||
6. 工作台与运行治理层
|
||||
|
||||
本次变化不是推翻六层,而是把第五层从偏“专家对象层”正式升级为:
|
||||
|
||||
> **对象层(Expert / Skill / App)**
|
||||
|
||||
## 2.2 App 是一级对象,不是页面,也不是大技能
|
||||
|
||||
App 的准确定义是:
|
||||
|
||||
> **面向某类长程任务的状态化运行壳。**
|
||||
|
||||
它与 Skill 的区别在于:
|
||||
|
||||
- `skill` 解决“做什么”
|
||||
- `app` 解决“这类工作如何持续运行、展示、交互、留痕”
|
||||
|
||||
它与 Expert 的区别在于:
|
||||
|
||||
- `expert` 解决“谁在与你协作”
|
||||
- `app` 解决“这项工作在什么界面和状态机里被推进”
|
||||
|
||||
## 2.3 任务不再等于对话
|
||||
|
||||
平台后续的统一定义应为:
|
||||
|
||||
> **任务 = 一个工作实例容器**
|
||||
|
||||
这个容器里可以挂载:
|
||||
|
||||
- 一个主 `app`
|
||||
- 一个右栏 `expert`
|
||||
- 多个后台 `skill`
|
||||
- 若干 `connector`
|
||||
|
||||
因此:
|
||||
|
||||
- 对话是任务中的一种交互轨迹
|
||||
- 不是所有任务都必须以消息流作为主界面
|
||||
|
||||
## 2.4 长程APP是一级导航,但一级导航必须完整描述
|
||||
|
||||
`app` 升格后,不能只补一句“新增长程APP”,否则会把整个一级导航重新说乱。
|
||||
|
||||
一级导航不再是同质栏目,而应明确分成四类:
|
||||
|
||||
1. 工作入口
|
||||
2. 对象目录
|
||||
3. 组织知识入口
|
||||
4. 治理与个人入口
|
||||
|
||||
推荐的一级导航全景应为:
|
||||
|
||||
1. `新建任务`
|
||||
- 对话驱动任务的默认入口
|
||||
- 负责创建以 `expert` 为主对象的任务
|
||||
2. `项目`
|
||||
- 任务容器与聚合视图
|
||||
- 用于组织多个长程任务与对话任务
|
||||
3. `专家 · 技能 · 连接器`
|
||||
- 对象目录与配置浏览入口
|
||||
- 这里看的是定义,不是运行时
|
||||
4. `长程APP`
|
||||
- `app` 定义卡片入口
|
||||
- 这里展示的是可启动的长程 App,不是历史任务
|
||||
5. `知识库`
|
||||
- 组织级默认内建 App 的直达入口
|
||||
- 承载组织专有知识、素材、题库、结果记录等核心资产
|
||||
- 是 Expert 与 App 共同消费的知识底座
|
||||
6. `后台管理`
|
||||
- 工坊、系统配置、对象治理、权限治理
|
||||
- 是平台治理入口,不是业务运行入口
|
||||
7. `我的`
|
||||
- 个人总览、我的资料、个人偏好与个人工作视角
|
||||
|
||||
这里最重要的边界是:
|
||||
|
||||
- `专家 · 技能 · 连接器` 看的是对象定义与配置
|
||||
- `长程APP` 看的是可运行的 `app`
|
||||
- `项目` 看的是任务集合
|
||||
- `知识库` 看的是组织级知识底座与其内建 App 运行面
|
||||
|
||||
这里需要明确一个特例:
|
||||
|
||||
> **知识库本身也是 `app`,但它不是普通可选 App,而是组织级默认必须存在的内建 App。**
|
||||
|
||||
原因是:
|
||||
|
||||
- 平台服务的是单一组织而不是开放公域
|
||||
- 没有组织专有知识,很多 Expert 与 App 无法稳定运行
|
||||
- 知识库不仅提供资料查看,还承担沉淀、审批、引用、题库与知识资产治理
|
||||
|
||||
因此在产品层,知识库同时具有两种身份:
|
||||
|
||||
1. 在对象模型里,它属于 `app.knowledge_hub`
|
||||
2. 在一级导航里,它拥有保留的直达入口,不必埋进“长程APP”卡片列表
|
||||
|
||||
点击 `长程APP` 里的卡片后,标准动作应为:
|
||||
|
||||
1. 创建任务实例
|
||||
2. 挂载主 `app`
|
||||
3. 进入该 `app` 的运行界面
|
||||
4. 同时进入统一任务列表
|
||||
|
||||
当前像 `AI考试` 这种已经长出独立业务界面的主导航,在架构上应理解为**过渡态专题入口**。
|
||||
后续应逐步收敛为:
|
||||
|
||||
- `长程APP -> app.training_exam`
|
||||
|
||||
而不是继续长期作为与 `专家 / 技能 / 项目 / 知识库` 并列的专题型一级主栏目。
|
||||
|
||||
---
|
||||
|
||||
## 3. 三类一级对象的边界
|
||||
|
||||
## 3.1 Expert
|
||||
|
||||
`expert` 是面向用户协作的交互外壳。
|
||||
|
||||
核心职责:
|
||||
|
||||
- 理解意图
|
||||
- 引导开场
|
||||
- 陪伴推进
|
||||
- 解释状态
|
||||
- 调度技能
|
||||
|
||||
典型交互:
|
||||
|
||||
- 对话主导
|
||||
- 欢迎语
|
||||
- starter prompts
|
||||
- 右栏 AI 助手
|
||||
|
||||
## 3.2 Skill
|
||||
|
||||
`skill` 是面向任务复用的能力包。
|
||||
|
||||
核心职责:
|
||||
|
||||
- 封装某类能力
|
||||
- 编排 `action`
|
||||
- 规范输入输出
|
||||
- 生成产物
|
||||
|
||||
典型交互:
|
||||
|
||||
- 被角色调用
|
||||
- 被 App 调用
|
||||
- 被工作流调用
|
||||
|
||||
## 3.3 App
|
||||
|
||||
`app` 是面向场景化长程任务或组织级运行面的运行壳。
|
||||
|
||||
核心职责:
|
||||
|
||||
- 承载主界面
|
||||
- 驱动状态机
|
||||
- 管理结构化数据
|
||||
- 组织多步骤交互
|
||||
- 沉淀长程产物
|
||||
|
||||
典型交互:
|
||||
|
||||
- 菜单
|
||||
- 表单
|
||||
- 按钮
|
||||
- 题卡
|
||||
- 看板
|
||||
- 画布
|
||||
|
||||
其中应区分两类 App:
|
||||
|
||||
1. **任务型 App**
|
||||
- 进入后通常创建 `app_task`
|
||||
- 例如培训考试、审批、数据分析、流程编排
|
||||
2. **底座型 App**
|
||||
- 组织级长期存在,默认安装
|
||||
- 例如知识库
|
||||
- 它既提供独立运行面,也为其他任务提供知识支撑
|
||||
|
||||
AI 在 App 中通常位于:
|
||||
|
||||
- 右栏副驾驶位
|
||||
- 辅助填表
|
||||
- 规则解释
|
||||
- 状态总结
|
||||
- 自然语言触发复杂动作
|
||||
|
||||
---
|
||||
|
||||
## 4. 六层架构回溯后的新定义
|
||||
|
||||
## 4.1 第一层:外部连接层
|
||||
|
||||
这一层继续负责连接真实世界与外部系统。
|
||||
|
||||
包括:
|
||||
|
||||
- 本地文件系统
|
||||
- 企业业务系统
|
||||
- 工业系统
|
||||
- 培训 / 考试 / OA / ERP / MES / CRM / LMS
|
||||
- 模型服务
|
||||
- API / Webhook / MQ
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**数据从哪里来,动作往哪里去。**
|
||||
|
||||
## 4.2 第二层:本体与语义上下文层
|
||||
|
||||
这一层需要从行业对象语义继续扩展到工作对象语义。
|
||||
|
||||
除了原有:
|
||||
|
||||
- device
|
||||
- alarm
|
||||
- work_order
|
||||
- report
|
||||
|
||||
还应补充:
|
||||
|
||||
- task
|
||||
- stage
|
||||
- expert
|
||||
- skill
|
||||
- app
|
||||
- artifact
|
||||
- form
|
||||
- workflow
|
||||
- record
|
||||
|
||||
对于 `app`,这一层必须支持:
|
||||
|
||||
- App 处理的业务对象类型
|
||||
- App 允许的阶段类型
|
||||
- App 产物类型
|
||||
- App 与 Expert / Skill 的可挂载关系
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**平台到底在处理哪些业务对象、工作对象和它们之间的关系。**
|
||||
|
||||
## 4.3 第三层:总线与编排层
|
||||
|
||||
这一层继续承担流转职责,但要正式接纳 `app` 作为任务主对象。
|
||||
|
||||
至少应包含:
|
||||
|
||||
1. 任务总线
|
||||
2. 事件总线
|
||||
3. 对象挂载总线
|
||||
4. 能力编排总线
|
||||
|
||||
新职责包括:
|
||||
|
||||
- 任务创建后挂载主 `app`
|
||||
- 根据 `app` 状态切换工作台界面
|
||||
- 允许右栏 `expert` 感知当前 `app` 上下文
|
||||
- 允许 `app` 调度 `skill`
|
||||
- 允许人工接管与审批节点插入
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**任务如何创建,对象如何挂载,状态如何推进,能力如何协作。**
|
||||
|
||||
## 4.4 第四层:能力层
|
||||
|
||||
这一层继续保持:
|
||||
|
||||
- `skill`
|
||||
- `action`
|
||||
- `policy`
|
||||
|
||||
但要明确一个边界:
|
||||
|
||||
> **App 不进入能力层。**
|
||||
|
||||
原因是:
|
||||
|
||||
- `skill` 是能力包
|
||||
- `action` 是原子动作
|
||||
- `app` 是运行壳
|
||||
|
||||
App 可以调用 Skill,但不替代 Skill。
|
||||
|
||||
## 4.5 第五层:对象层
|
||||
|
||||
这一层正式收敛为:
|
||||
|
||||
- `expert`
|
||||
- `skill`
|
||||
- `app`
|
||||
|
||||
并且三者都应该具备:
|
||||
|
||||
- 对象定义
|
||||
- 版本信息
|
||||
- 生命周期状态
|
||||
- 权限边界
|
||||
- 可挂载关系
|
||||
|
||||
这一层回答的是:
|
||||
|
||||
**平台有哪些可被用户使用、可被任务挂载、可被版本化治理的一等对象。**
|
||||
|
||||
## 4.6 第六层:工作台与运行治理层
|
||||
|
||||
这一层不再只有单一对话工作台,而应明确分成两类运行现场:
|
||||
|
||||
### A. 对话工作台
|
||||
|
||||
- 以专家为主
|
||||
- 适合模糊任务、探索任务、咨询任务
|
||||
- 中央区域以消息流为主
|
||||
|
||||
### B. 长程APP
|
||||
|
||||
- 以 App 为主
|
||||
- 适合强状态、强结构、长周期任务
|
||||
- 中央区域以业务界面为主
|
||||
- AI 位于右栏
|
||||
|
||||
两者统一纳入:
|
||||
|
||||
- 同一任务列表
|
||||
- 同一运行治理体系
|
||||
- 同一审计和产物体系
|
||||
|
||||
---
|
||||
|
||||
## 5. 统一任务模型
|
||||
|
||||
## 5.1 任务是工作实例容器
|
||||
|
||||
新的任务定义应为:
|
||||
|
||||
> **task = 一次完整工作实例**
|
||||
|
||||
它负责统一承载:
|
||||
|
||||
- 当前主对象
|
||||
- 当前阶段
|
||||
- 当前参与对象
|
||||
- 当前运行状态
|
||||
- 当前产物集合
|
||||
|
||||
## 5.2 一个任务可挂多个对象实例
|
||||
|
||||
建议使用如下运行模型:
|
||||
|
||||
- 主挂载:`app` 或 `expert`
|
||||
- 右栏挂载:`expert`
|
||||
- 后台挂载:`skill`
|
||||
|
||||
例如一个培训考试任务可以是:
|
||||
|
||||
- 主对象:`app.training_exam`
|
||||
- 右栏对象:`expert.learning_coach`
|
||||
- 后台能力:`skill.auto_grading`
|
||||
- 后台能力:`skill.study_plan_generation`
|
||||
|
||||
## 5.3 会话只是任务的一部分
|
||||
|
||||
以后应避免继续把任务状态写死在消息流里。
|
||||
|
||||
更准确的关系是:
|
||||
|
||||
- `task`:工作容器
|
||||
- `task_message`:对话轨迹
|
||||
- `app_state`:App 主状态
|
||||
- `artifact`:产物
|
||||
- `event`:运行轨迹
|
||||
|
||||
---
|
||||
|
||||
## 6. 存储架构建议
|
||||
|
||||
## 6.1 对象定义层
|
||||
|
||||
建议继续使用统一根定义:
|
||||
|
||||
- `object_definition`
|
||||
- `object_version`
|
||||
|
||||
关键字段建议:
|
||||
|
||||
- `object_id`
|
||||
- `object_type`:`expert | skill | app`
|
||||
- `code`
|
||||
- `key`
|
||||
- `label`
|
||||
- `status`
|
||||
- `manifest`
|
||||
- `schema_version`
|
||||
|
||||
其中 `app.manifest` 至少应包含:
|
||||
|
||||
- `object_entry_route`
|
||||
- `layout_type`
|
||||
- `supported_views`
|
||||
- `default_sidebar_expert`
|
||||
- `allowed_skills`
|
||||
- `state_schema`
|
||||
- `artifact_schema`
|
||||
- `permission_model`
|
||||
|
||||
为避免与 AI 路由和普通页面导航混同,当前项目统一采用三类命名:
|
||||
|
||||
- `ai_route_*`:AI 模型路由
|
||||
- `object_entry_route`:专家 / 技能 / APP 这类业务对象的进入入口
|
||||
- `page_route`:普通页面导航路径
|
||||
|
||||
## 6.2 任务与挂载层
|
||||
|
||||
建议新增或统一为:
|
||||
|
||||
- `task`
|
||||
- `task_object_instance`
|
||||
|
||||
`task` 核心字段建议:
|
||||
|
||||
- `task_id`
|
||||
- `task_type`:`conversation_task | app_task`
|
||||
- `title`
|
||||
- `status`
|
||||
- `source_object_type`
|
||||
- `source_object_id`
|
||||
- `current_stage`
|
||||
- `started_at`
|
||||
- `completed_at`
|
||||
|
||||
`task_object_instance` 核心字段建议:
|
||||
|
||||
- `task_object_instance_id`
|
||||
- `task_id`
|
||||
- `object_id`
|
||||
- `object_version_id`
|
||||
- `object_type`
|
||||
- `mount_slot`:`main | right_sidebar | background`
|
||||
- `instance_role`:`primary | assistant | worker`
|
||||
|
||||
## 6.3 运行轨迹层
|
||||
|
||||
建议使用:
|
||||
|
||||
- `object_run`
|
||||
- `task_message`
|
||||
|
||||
其中:
|
||||
|
||||
- `object_run` 记录对象执行、阶段推进、技能调用、人工确认
|
||||
- `task_message` 仅记录对话内容和消息元数据
|
||||
|
||||
需要明确:
|
||||
|
||||
> **`task_message` 不再承担 App 主状态存储责任。**
|
||||
|
||||
## 6.4 App 状态层
|
||||
|
||||
建议为 `app` 单独引入运行时状态存储:
|
||||
|
||||
- `app_instance_state`
|
||||
- `app_event`
|
||||
- `app_artifact`
|
||||
|
||||
`app_instance_state` 建议存:
|
||||
|
||||
- `task_id`
|
||||
- `task_object_instance_id`
|
||||
- `workflow_state`
|
||||
- `ui_state`
|
||||
- `form_state`
|
||||
- `selected_record_id`
|
||||
- `snapshot_version`
|
||||
|
||||
`app_event` 建议存:
|
||||
|
||||
- `event_type`
|
||||
- `payload`
|
||||
- `operator`
|
||||
- `created_at`
|
||||
|
||||
`app_artifact` 建议存:
|
||||
|
||||
- `artifact_type`
|
||||
- `artifact_uri`
|
||||
- `artifact_meta`
|
||||
- `produced_by`
|
||||
- `created_at`
|
||||
|
||||
## 6.5 领域数据层
|
||||
|
||||
对于复杂 App,不应把所有业务数据都塞进 `app_instance_state.payload_json`。
|
||||
|
||||
必须允许按领域建模。
|
||||
|
||||
例如培训考试 App 可拥有独立领域表:
|
||||
|
||||
- `training_plan`
|
||||
- `course_module`
|
||||
- `exam_paper`
|
||||
- `exam_question`
|
||||
- `exam_attempt`
|
||||
- `exam_answer`
|
||||
- `exam_score`
|
||||
|
||||
因此存储应分为:
|
||||
|
||||
- 通用运行表:承载平台运行
|
||||
- 领域业务表:承载业务事实
|
||||
|
||||
---
|
||||
|
||||
## 7. 前端与交互层含义
|
||||
|
||||
## 7.1 一级导航升级
|
||||
|
||||
前端一级导航不能只补“长程APP”这一项,而应整体升级为完整的信息架构。
|
||||
|
||||
建议目标态如下:
|
||||
|
||||
1. `新建任务`
|
||||
- 默认进入对话工作台
|
||||
- 主对象通常为 `expert`
|
||||
2. `项目`
|
||||
- 承载项目列表与项目详情
|
||||
- 用于聚合任务、产物与阶段
|
||||
3. `专家 · 技能 · 连接器`
|
||||
- 展示 `expert / skill / connector` 的定义目录
|
||||
- 负责浏览、筛选、配置、安装态查看
|
||||
4. `长程APP`
|
||||
- 展示 `app` 定义卡片
|
||||
- 负责启动 `app_task`
|
||||
5. `知识库`
|
||||
- 作为默认必须存在的内建 App 直接出现在一级导航
|
||||
- 承载组织知识、素材、题库、记录与知识治理
|
||||
- 是任务运行的公共知识面
|
||||
6. `后台管理`
|
||||
- 承载工坊、系统配置、组织与治理能力
|
||||
7. `我的`
|
||||
- 承载个人总览、个人资料与个人入口
|
||||
|
||||
因此,一级导航里实际并存四种不同语义:
|
||||
|
||||
- 工作启动入口:`新建任务`
|
||||
- 工作组织入口:`项目`
|
||||
- 对象目录入口:`专家 · 技能 · 连接器`、`长程APP`
|
||||
- 组织知识与治理入口:`知识库`、`后台管理`、`我的`
|
||||
|
||||
### 7.1.1 为什么必须这样写全
|
||||
|
||||
如果只写:
|
||||
|
||||
- 专家
|
||||
- 技能
|
||||
- 长程APP
|
||||
|
||||
会遗漏三件事:
|
||||
|
||||
1. `项目` 其实是统一任务系统的重要容器,不是普通页面
|
||||
2. `知识库` 是组织级默认内建 App,也是 Expert 和 App 的共用知识底座,不是边角内容
|
||||
3. `后台管理 / 我的` 分别承担治理与个人视角,不应被误解为附属页
|
||||
|
||||
### 7.1.2 当前专题主导航的收敛原则
|
||||
|
||||
凡是已经长成“非对话式、强结构、强状态”的专题栏目,例如:
|
||||
|
||||
- 培训考试
|
||||
- 审批中心
|
||||
- 数据分析台
|
||||
- 流程编排台
|
||||
|
||||
在目标架构中都应优先判断为 `app`,最终收敛进:
|
||||
|
||||
- `长程APP`
|
||||
|
||||
而不是继续无限增长新的专题型一级导航。
|
||||
|
||||
唯一应保留一级直达入口的 App,是像 `知识库` 这种**组织级默认必装底座 App**。
|
||||
|
||||
## 7.2 进入 App 的动作不是“打开页面”,而是“创建任务”
|
||||
|
||||
点击 App 卡片后的标准动作应为:
|
||||
|
||||
1. 创建 `task`
|
||||
2. 创建主 `task_object_instance(app)`
|
||||
3. 自动挂载右栏 `expert`
|
||||
4. 进入 `app runtime`
|
||||
|
||||
## 7.3 App 运行界面不再强制对话居中
|
||||
|
||||
App 主界面应由业务形态决定,例如:
|
||||
|
||||
- 培训考试:课程目录、题卡、成绩面板
|
||||
- 审批:表单、节点、操作栏
|
||||
- 数据分析:图表、筛选器、表格
|
||||
- 流程编排:画布、节点、日志
|
||||
|
||||
AI 对话框在 App 中退居右栏能力区。
|
||||
|
||||
---
|
||||
|
||||
## 8. 样板场景:培训考试 App
|
||||
|
||||
## 8.1 对象组合
|
||||
|
||||
- 主对象:`app.training_exam`
|
||||
- 右栏对象:`expert.learning_coach`
|
||||
- 调用技能:`skill.generate_study_plan`
|
||||
- 调用技能:`skill.auto_grade_exam`
|
||||
|
||||
## 8.2 任务阶段
|
||||
|
||||
建议阶段至少包括:
|
||||
|
||||
1. 待建档
|
||||
2. 培训中
|
||||
3. 练习中
|
||||
4. 待模拟考
|
||||
5. 模拟考完成
|
||||
6. 待正式考试
|
||||
7. 正式考试中
|
||||
8. 待复盘
|
||||
9. 待补训
|
||||
10. 已结业
|
||||
|
||||
## 8.3 交互形态
|
||||
|
||||
- 培训中:课程目录 + 内容区 + 右栏 AI 教练
|
||||
- 练习中:题目区 + 即时讲解
|
||||
- 正式考试中:题卡 + 倒计时 + 受控作答区
|
||||
- 复盘中:错题分析 + 补训计划 + 证书面板
|
||||
|
||||
这个样板说明:
|
||||
|
||||
> **同一个任务实例中,对话、结构化界面、技能执行、产物沉淀可以长期共存。**
|
||||
|
||||
---
|
||||
|
||||
## 9. 迁移指导
|
||||
|
||||
## 9.1 术语迁移
|
||||
|
||||
对外:
|
||||
|
||||
- 专家
|
||||
- 技能
|
||||
- 长程APP
|
||||
|
||||
一级导航目标态:
|
||||
|
||||
- 新建任务
|
||||
- 项目
|
||||
- 专家 · 技能 · 连接器
|
||||
- 长程APP
|
||||
- 知识库
|
||||
- 后台管理
|
||||
- 我的
|
||||
|
||||
对内:
|
||||
|
||||
- `expert`
|
||||
- `skill`
|
||||
- `app`
|
||||
- `action`
|
||||
- `connector`
|
||||
- `policy`
|
||||
|
||||
## 9.2 后端迁移重点
|
||||
|
||||
1. 从“任务 = 对话”迁移到“任务 = 工作实例”
|
||||
2. 新增 `app` 对象定义与版本机制
|
||||
3. 新增 `task_object_instance`
|
||||
4. 新增 `app_state / app_event / app_artifact`
|
||||
5. 把消息表从主状态中心降级为对话轨迹层
|
||||
|
||||
## 9.3 前端迁移重点
|
||||
|
||||
1. 把一级导航整理为“新建任务 / 项目 / 专家 · 技能 · 连接器 / 长程APP / 知识库 / 后台管理 / 我的”
|
||||
2. 新增“长程APP”并以对象定义驱动 App 卡片列表与详情页
|
||||
3. 将现有专题型一级导航逐步收敛为 `app`,避免继续平铺新的业务主栏目;`知识库` 作为默认必装底座 App 保留一级直达入口
|
||||
4. 统一任务列表兼容 `conversation_task` 和 `app_task`
|
||||
5. App Runtime 布局支持“主业务区 + 右栏 AI”
|
||||
|
||||
---
|
||||
|
||||
## 10. 最终定义
|
||||
|
||||
这次架构升级后的平台可以正式定义为:
|
||||
|
||||
> **一个以统一任务系统为核心、同时承载 Expert / Skill / App 三类一级对象的工业智能体操作平台。**
|
||||
|
||||
其中:
|
||||
|
||||
- `Expert` 负责协作
|
||||
- `Skill` 负责能力
|
||||
- `App` 负责长程任务运行壳
|
||||
- `Task` 负责统一承载工作实例
|
||||
|
||||
这意味着平台已经不再是单一对话驱动系统,而是:
|
||||
|
||||
> **对话工作台与长程APP并存,但统一运行、统一治理、统一沉淀。**
|
||||
@@ -0,0 +1,381 @@
|
||||
# SY23 — 专员「岗位说明书 + 技能绑定」改造方案
|
||||
|
||||
> 状态:实施建议稿
|
||||
> 日期:2026-09-17
|
||||
> 关联文档:`SY18_Specialist_Minimal_Definition_Model.md`、`SY20_Role_Card_And_Lightweight_Ontology_Architecture.md`、`SY21_Unified_Role_Skill_Action_Architecture.md`、`SY22_Role_Skill_App_Unified_Task_Architecture.md`
|
||||
> 外部参照:AionUi / AionCore 内置助手与技能(已下载至 `codebase/AionCore-assets/`)
|
||||
|
||||
---
|
||||
|
||||
## 0. 一句话诊断
|
||||
|
||||
**我们现在的 10 个专员,在运行时是同一个助手换了 10 个名字。**
|
||||
|
||||
工作台主对话走 `POST /api/assistant/chat`(前端 `api/assistant.js` → `chatWithAssistant`),而这个接口:
|
||||
|
||||
| 环节 | 现状 | 位置 |
|
||||
|------|------|------|
|
||||
| 前端发送的字段 | 只有 `message` / `mode` / `ai_route_id` | `views/workbench/SmartAssistantPage.vue:471` |
|
||||
| 后端请求体 | **已有** `task_id` / `context` 字段,但前端一个都没发 | `internal/api/smart_assistant.go:17-25` |
|
||||
| 后端 System Prompt | **两条写死的字符串**,与专员无关 | `internal/api/smart_assistant.go:136-140` |
|
||||
| 后端是否查过 specialist 表 | **从未** | `callAssistantAI` 全文 26 行 |
|
||||
| 「专家模式」任务拆解 | **三条写死的假步骤**(准备/执行/完成阶段) | `internal/api/smart_assistant.go:161-174` |
|
||||
| 知识检索 | 这条链路完全不检索知识库 | 对比 `worker_task.go:707` |
|
||||
|
||||
也就是说:**不管用户选了「合同审查专员」还是「物流履约专员」,后端收到的请求完全一样,产出的 System Prompt 完全一样。** 专员是在前端画出来的差异,不是后端跑出来的差异。
|
||||
|
||||
这与 SY21 §3.5.2 已经拍板的关系式直接冲突:
|
||||
|
||||
> 专家承接用户,skill 组织任务,action 执行动作。
|
||||
|
||||
我们目前**只做了「专家承接用户」(前端 UI),缺了「专家暴露 skill」和「skill 编排 action」两条边**。
|
||||
|
||||
---
|
||||
|
||||
## 1. AionUi 做对了什么(三件事)
|
||||
|
||||
AionCore 的 `builtin-assistants/assistants.json` 里,每个助手就三个关键字段:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "word-creator",
|
||||
"rule_file": "word-creator.{locale}.md",
|
||||
"enabled_skills": ["officecli-docx"]
|
||||
}
|
||||
```
|
||||
|
||||
拆开看:
|
||||
|
||||
**① 每个助手有一份「岗位说明书」(rule file)**
|
||||
- 就是这个助手的 System Prompt 主体,会话创建时注入
|
||||
- 简体中文版共 21 份,长度分布很说明问题:
|
||||
- 办公类 9 份在 **433–650 字**(如 `word-creator.zh-CN.md` 517 字)
|
||||
- 编排类 9 份在 **2470–9007 字**(如 `cowork.zh-CN.md` 6705 字)
|
||||
- **短的那批不是偷懒,是分工**:它们把「怎么做」全部委托给技能,说明书本身只负责「我是谁 / 什么时候说什么 / 什么时候用哪个技能」
|
||||
|
||||
`word-creator.zh-CN.md` 全文的结构(517 字):
|
||||
|
||||
```markdown
|
||||
# Word 文档助手
|
||||
你是 **Word Creator** —— 一个专门使用 officecli 创建、编辑和分析专业 Word 文档的 AI 助手。
|
||||
## 当用户打招呼或询问你能做什么时
|
||||
简短介绍自己:[一段自我介绍的原文]
|
||||
然后等待用户请求。
|
||||
## 当用户想要创建或编辑文档时
|
||||
严格按照 `officecli-docx` 技能执行。……不要偏离或简化技能中的指令。
|
||||
在开始工作前,主动提醒用户一次:[一段提醒原文]
|
||||
在生成完成后,明确告诉用户:[一段收尾原文]
|
||||
```
|
||||
|
||||
**② 每个助手声明它能用哪些技能(`enabled_skills`)**
|
||||
- 技能以目录形式链接进工作区,底层 CLI 通过 `native_skills_dirs` 发现
|
||||
- 21 个助手里 13 个只绑 1 个技能,`cowork` 绑 5 个,`game-3d` / `ui-ux-pro-max` / `planning-with-files` / `human-3-coach` 绑 0 个
|
||||
- **绑 0 个技能但有 4000+ 字说明书的,恰恰是最像「专员」的那几个**(纯靠说明书驱动行为,不靠工具)
|
||||
|
||||
**③ 说明书负责「调度」,技能负责「执行」**
|
||||
- 长说明书(`cowork` 6705 字)的核心内容就是「什么场景下按哪个技能走」——这正是 SY20 说的「专员 = 可调用工具的角色」
|
||||
- `cowork` 是 21 个助手里唯一的多技能编排样板,**也是我们最该先抄的一份**
|
||||
|
||||
### 结论
|
||||
|
||||
SY18 + SY20 + AionUi 三边指向同一件缺失的事:
|
||||
|
||||
```
|
||||
SY18 说:专员有「动作」 ─┐
|
||||
SY20 说:专员 = 可调用工具的角色 ─┼─→ 专员和技能之间没有绑定边
|
||||
SY21 说:专家对象暴露 skill ─┤ 专员没有一份进 prompt 的说明书
|
||||
AionUi 说:rule_file + enabled_skills ─┘
|
||||
```
|
||||
|
||||
**我们已经有的(没用的)**:`specialist.role_card_json` 字段建了、值也写了,但从未进过任何 prompt。
|
||||
**我们缺的**:不是字段,是**把字段送进 prompt 的那条线**,和**专员↔技能的绑定边**。
|
||||
|
||||
---
|
||||
|
||||
## 2. 改造方案
|
||||
|
||||
三步,从「运行时能看出差异」倒推,不铺新架构。
|
||||
|
||||
### 步骤 1:给专员两样东西(数据层,改动最小)
|
||||
|
||||
在 `internal/model/specialist.go` 加两个字段:
|
||||
|
||||
```go
|
||||
// RuleFileMarkdown 岗位说明书正文(Markdown 全文)。
|
||||
// 会话创建时注入 System Prompt,决定这个专员怎么说话、怎么推进、什么时候调用哪个技能。
|
||||
RuleFileMarkdown string `gorm:"type:text" json:"rule_file_markdown"`
|
||||
|
||||
// AllowedSkills 绑定技能 key 列表,JSON 数组,顺序即优先级(首个为主技能)。
|
||||
// 元素取值对齐前端 availableSkills[].key,见 §2.4 校验清单。
|
||||
AllowedSkills string `gorm:"type:text" json:"allowed_skills"`
|
||||
```
|
||||
|
||||
**为什么是两个字段而不是两张表**
|
||||
|
||||
| 选择 | 理由 |
|
||||
|------|------|
|
||||
| 说明书用单字段 | AionUi 也是「一个助手一份 rule file」,不引入版本表 |
|
||||
| 技能绑定用 JSON 数组 | SY22 §6.1 已把 `allowed_skills` 定为对象 `manifest` 的字段。现在用同名字段落地,**将来迁到 `object_definition` 时只是把列搬进 manifest,没有语义返工** |
|
||||
| 不新建 `specialist_skill` 表 | 10 个专员 × 3–5 个技能 ≈ 40 行。表能提供的索引和 FK,在这里都不成立——15 个前端技能在后端根本没有行,FK 建不起来。数组顺序天然表达优先级,无需 `sort_order` 列 |
|
||||
|
||||
> 升级路径(不在本轮):若将来技能绑定要挂**属性**(按技能配参数默认值、按技能配权限档位),再拆成关联表;那时 `allowed_skills` 里的元素从字符串升级为对象,字段名不变。
|
||||
|
||||
**迁移**:GORM `AutoMigrate` 会自动 `ADD COLUMN`,**不需要**手写迁移函数。
|
||||
(`internal/store/db.go:83` 的 `migrateObjectEntryRouteColumns` 是为 `DROP COLUMN` 写的——SQLite 的 AutoMigrate 删不掉列,加列不在此列。)
|
||||
|
||||
**播种**:在 `internal/store/seed.go` 的 `seedSpecialists()` 之后加 `seedSpecialistRules()`,遵守现有「存在则只补空字段」约定——**说明书非空就不覆盖**,保护人工编辑。
|
||||
|
||||
### 步骤 2:让对话带上专员(打通链路)
|
||||
|
||||
这是**当前最大的断点**,也是投入产出比最高的一处。改动共 4 个文件、约 30 行。
|
||||
|
||||
**前端(3 处)**
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `frontend/src/api/assistant.js` | `chatWithAssistant(data)` 已透传整个 data,无需改 |
|
||||
| `frontend/src/store/workerRuntime.js` | 已有 `currentSpecialistKey` computed(185-192 行),直接用 |
|
||||
| `frontend/src/views/workbench/SmartAssistantPage.vue:471` | 请求体补上 `task_id` 与 `specialist_key` |
|
||||
|
||||
```js
|
||||
const res = await chatWithAssistant({
|
||||
message: text,
|
||||
mode: mode.value,
|
||||
ai_route_id: selectedAiChatRouteId.value,
|
||||
task_id: currentTaskId.value || 0,
|
||||
specialist_key: workerRuntime.currentSpecialistKey || '',
|
||||
})
|
||||
```
|
||||
|
||||
> 两个都发是刻意的:**有任务时以 `task_id` 为准**(服务端从 `worker_task.specialist_key` 反查,不信任客户端);**任务尚未创建时**(刚进 `/home` 还没发第一句话)前端手上只有 `pendingSpecialistKey`,此时用 `specialist_key` 兜底。
|
||||
|
||||
**后端(1 处)**
|
||||
|
||||
`internal/api/smart_assistant.go` 的 `callAssistantAI` 增加专员解析:
|
||||
|
||||
```go
|
||||
// 解析当前专员:优先按 task_id 反查(服务端权威),其次用请求里的 specialist_key
|
||||
func resolveSpecialist(userID uint, req SmartAssistantRequest) *model.Specialist {
|
||||
if req.TaskID > 0 {
|
||||
var task model.WorkerTask
|
||||
if err := store.DB.Where("id = ? AND user_id = ?", req.TaskID, userID).
|
||||
First(&task).Error; err == nil && task.SpecialistKey != "" {
|
||||
var s model.Specialist
|
||||
if err := store.DB.Where("key = ?", task.SpecialistKey).First(&s).Error; err == nil {
|
||||
return &s
|
||||
}
|
||||
}
|
||||
}
|
||||
if req.SpecialistKey != "" {
|
||||
var s model.Specialist
|
||||
if err := store.DB.Where("key = ?", req.SpecialistKey).First(&s).Error; err == nil {
|
||||
return &s
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
```
|
||||
|
||||
> 现成的反查先例:`internal/api/worker_task.go:364` 就是同一套 `store.DB.Where("key = ?", task.SpecialistKey).First(&specialist)`。
|
||||
|
||||
`SmartAssistantRequest` 需补一个字段(`TaskID` 已存在,只差 `SpecialistKey`):
|
||||
|
||||
```go
|
||||
SpecialistKey string `json:"specialist_key"`
|
||||
```
|
||||
|
||||
### 步骤 3:让说明书进 prompt(注入)
|
||||
|
||||
改造 `callAssistantAI` 的 System Prompt 拼装,从「二选一写死」变成「通用底座 + 专员说明书」:
|
||||
|
||||
```go
|
||||
func buildAssistantSystemPrompt(userID uint, req SmartAssistantRequest, enableThinking bool) string {
|
||||
base := "你是一位专业的AI通用助手,回答简洁直接,不展开思考过程,快速响应用户问题。"
|
||||
if enableThinking {
|
||||
base = "你是一位专家级AI数字员工,使用 thinking 模式。……"
|
||||
}
|
||||
|
||||
s := resolveSpecialist(userID, req)
|
||||
if s == nil {
|
||||
return base // 未挂专员 → 通用助手兜底,行为与今天一致
|
||||
}
|
||||
|
||||
var b strings.Builder
|
||||
b.WriteString(base)
|
||||
b.WriteString("\n\n【当前专员】")
|
||||
b.WriteString(s.Label)
|
||||
|
||||
if skills := parseAllowedSkills(s.AllowedSkills); len(skills) > 0 {
|
||||
b.WriteString("\n【可用技能】")
|
||||
b.WriteString(strings.Join(skills, "、"))
|
||||
}
|
||||
|
||||
// 说明书是主体,放最后,避免被前面的短句稀释
|
||||
if strings.TrimSpace(s.RuleFileMarkdown) != "" {
|
||||
b.WriteString("\n\n")
|
||||
b.WriteString(s.RuleFileMarkdown)
|
||||
}
|
||||
return b.String()
|
||||
}
|
||||
```
|
||||
|
||||
**同时接上第二条链路**:`internal/api/worker_task.go:708` 已经在拼 System Prompt 且**手上就有 specialist 对象**,把说明书一起拼进去即可——这条链路是免费的,因为它本来就认识专员。
|
||||
|
||||
```go
|
||||
systemPrompt := buildSystemPrompt(contextJSON, knowledge) +
|
||||
specialistPromptSection(specialist) + // ← 新增
|
||||
"\n\n当前任务:" + buildWorkerAITaskPrompt(task, specialist, req)
|
||||
```
|
||||
|
||||
> `specialistPromptSection(s)` 抽成一个共用小函数,`smart_assistant.go` 和 `worker_task.go` 都调它,避免两处 prompt 拼法各写一遍。
|
||||
|
||||
### §2.4 技能 key 校验清单
|
||||
|
||||
绑定的是裸字符串,所以需要一个校验来源。**新增单个 Go 常量文件**即可(22 条,从 `frontend/src/config/workbench.js` 的 `availableSkills` 一次性抄出):
|
||||
|
||||
```go
|
||||
// internal/model/skill_keys.go
|
||||
// 前端 availableSkills 的 key 全集。绑定校验以此为准。
|
||||
// 注意:这里只列 key,不含技能实现——技能实现仍在前端。
|
||||
var ValidSkillKeys = map[string]bool{
|
||||
"smart-assistant": true, "document-translate": true, "copy-proofreading": true,
|
||||
"audio-transcribe": true, "batch-extract": true, "contract-review": true,
|
||||
"report-generation": true, "ppt-generation": true, "mind-map": true,
|
||||
"longform-writing": true, "text-toolkit": true, "ocr-understanding": true,
|
||||
"meeting-minutes": true, "project-planning": true, "email-drafting": true,
|
||||
"table-cleanup": true, "proposal-summary": true, "progress-report": true,
|
||||
"contract-brief": true, "interview-summary": true, "policy-rewrite": true,
|
||||
"survey-summary": true,
|
||||
}
|
||||
```
|
||||
|
||||
写入时校验,非法 key 直接 400 —— 这样至少在录入侧挡住拼写错误。
|
||||
|
||||
> **命名冲突提醒**:`contract-review` 和 `report-generation` **既是专员 key 又是技能 key**。
|
||||
> 这是对的、也是刻意的(合同审查专员绑定合同审查技能),但读日志和调代码时极易混淆。建议**日志与报错文案一律写成 `专员:contract-review` / `技能:contract-review`** 带类型前缀。
|
||||
|
||||
---
|
||||
|
||||
## 3. 21 份规则文件,先改写哪几份
|
||||
|
||||
全部 21 份已下载在 `codebase/AionCore-assets/crates/aionui-app/assets/builtin-assistants/rules/`。
|
||||
|
||||
### 第一梯队:直接改写就能用(建议本轮做)
|
||||
|
||||
| # | AionUi 来源 | 字数 | 对应我们的专员 | 为什么先做 |
|
||||
|---|-------------|------|----------------|------------|
|
||||
| 1 | `cowork` + 5 技能 | 6705 | `general-assistant`、`process-coordination` | **21 份里唯一的多技能编排样板**。它的说明书通篇在写「什么场景按哪个技能走」——这正是 SY20「专员 = 可调用工具的角色」要的东西。我们的「通用助手 / 流程协调」现在完全是空壳 |
|
||||
| 2 | `word-creator` + `officecli-docx` | 517 | `report-generation`、`solution-proposal` | 说明书只有 517 字,是**最简模板**,改造成本最低;`officecli-docx` 是文档产出的通用底座,一份技能喂两个专员 |
|
||||
| 3 | `morph-ppt` + `officecli-pptx` | 554 | `training-delivery` | 培训交付要出课件,morph-ppt 专做「文档转 PPT」,另有 3D 变体。我们「培训交付」目前零后端实现,接上就是真能力 |
|
||||
|
||||
### 第二梯队:要改业务语义(本轮之后)
|
||||
|
||||
| # | AionUi 来源 | 字数 | 对应我们的专员 | 改造要点 |
|
||||
|---|-------------|------|----------------|----------|
|
||||
| 4 | `social-job-publisher` | 2470 | `hr-email-sorter`、`resume-processor` | 招聘发布场景接近,但从「发帖到社媒」改成「读邮箱 → 写简历表」,需按 SY18 的信源/结果模型重写 |
|
||||
| 5 | `planning-with-files` | 5500 | `process-coordination` | 纯说明书(绑 0 技能),讲「用文件做长期规划」,接近流程协调 |
|
||||
| 6 | `beautiful-mermaid` | 433 | `report-generation` | 图表产出,可作报告生成的第二个技能 |
|
||||
| 7 | `excel-creator` + `officecli-xlsx` | 562 | `report-generation` | 表格产出 |
|
||||
| 8 | `dashboard-creator`、`financial-model-creator`、`pitch-deck-creator`、`academic-paper` | 567–614 | `solution-proposal` | 方案建议的几种形态,按客户行业挑 |
|
||||
|
||||
### 不要碰
|
||||
|
||||
| 来源 | 原因 |
|
||||
|------|------|
|
||||
| **`builtin-skills/pdf/`** | **© 2025 Anthropic, PBC,附加条款明文禁止创建衍生作品、禁止在服务外保留副本、禁止再分发。必须删除,不得移植进产品。** |
|
||||
| `openclaw-setup`、`aionui-assistant`、`aionui-*` 技能 | AionUi 自身的安装运维助手,与业务无关 |
|
||||
| `moltbook` | 面向其自有平台的发布助手 |
|
||||
| `game-3d`、`story-roleplay`、`human-3-coach`、`ui-ux-pro-max` | 游戏 / 角色扮演 / 个人成长 / 设计工具,与企业办公无关 |
|
||||
| `weixin-file-send` | 是「把文件发到微信」的客户端脚本,依赖其本地 Electron 环境,不可移植(公众号专员要的是发文,不是发文件) |
|
||||
|
||||
### 前置依赖:OfficeCLI 未下载
|
||||
|
||||
7 个 `officecli-*` 技能全部依赖 **OfficeCLI**(AionUi 用它免装 Office 操作 docx/xlsx/pptx)。**我们目前没有这份资产**,第一梯队第 2、3 项开工前必须先搞定它,否则说明书改完也没东西可调。
|
||||
|
||||
---
|
||||
|
||||
## 4. 前端要动的地方(最小集)
|
||||
|
||||
**前提原则(沿用已拍板方向):专员是任务的字段,不是页面。** 本方案不新增任何专员页面。
|
||||
|
||||
### 必改
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `views/workbench/SmartAssistantPage.vue:471` | 请求体补 `task_id` / `specialist_key`(步骤 2) |
|
||||
| `views/workbench/CapabilityCatalogDetailPage.vue:257` | 专员详情页 `extraSections: []` 是空的,**正好是挂「绑定技能」「岗位说明书」两个 section 的位置**(技能详情页 160-183 行有现成写法可抄) |
|
||||
| `store/workerRuntime.js:425-441` | `attachSpecialistToCurrentTask` 目前**强制**把技能清成 `DEFAULT_SKILL_KEY`(438 行)。这正是「选了专员反而更空」的根因——应改为写入该专员的**主技能**(`allowed_skills[0]`) |
|
||||
|
||||
### 建议改
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `views/workbench/StudioPage.vue:1505-1545`、`MarketPage.vue:660-740` | 管理员/市场的专员表单,是录入说明书与绑定技能的两个编辑入口(`api/specialist.go` 与表单 payload 需同步透传新字段) |
|
||||
| `components/chat/SpecialistChip.vue:41-54` | 胶囊提示补「已绑定 N 个技能」 |
|
||||
| `views/workbench/CapabilityCatalogPage.vue:385-404` | 专员卡片增加技能徽章 |
|
||||
|
||||
### 明确不改
|
||||
|
||||
- `config/workbench.js` 的 `availableSkills`(22 条)—— 技能仍归前端,本方案不把技能搬到后端
|
||||
- `config/skillSettings.js` 的既有 7 条技能定义
|
||||
- `skills/registry/*` 技能实现本体
|
||||
|
||||
> **双份真相问题记录在案**:前端 22 个技能 vs 后端 `skill_definition` 7 行,今天无同步机制。本方案用 §2.4 的 `ValidSkillKeys` 常量做**单向校验**兜底,不解决同步问题。彻底解决要等 SY22 的 `object_definition` 落地,**不在本轮**。
|
||||
|
||||
---
|
||||
|
||||
## 5. 顺带发现的线上缺陷(独立于本方案,建议立即修)
|
||||
|
||||
`internal/api/batch_extract.go:62` 与 `internal/api/contract_review.go:359` 调用:
|
||||
|
||||
```go
|
||||
ai.GenerateWithFallback(nil, messages)
|
||||
```
|
||||
|
||||
而 `internal/ai/llm.go:302` 的实现第一行就是:
|
||||
|
||||
```go
|
||||
fallbacks, err := config.GetFallbackRoutes(primary.RouteID) // primary == nil → 空指针
|
||||
```
|
||||
|
||||
**验证结论**:
|
||||
- `internal/api/router.go:146` / `:152` 确认两条路由都是活路径(`POST /api/contract/review`、`POST /api/batch/extract`,均挂 `middleware.Auth`)
|
||||
- `cmd/server/main.go:47` 用的是 `gin.Default()`,自带 Recovery —— 所以表现为 **HTTP 500**,不会打挂进程,但**这两个功能 100% 不可用**
|
||||
- 前端 `api/contract.js:3`、`api/batch.js:3` 确实在调这两个接口
|
||||
|
||||
**修复**:两处改为传入真实路由(`config.GetRoute(...)`,可参照 `smart_assistant.go:146`),或在 `GenerateWithFallback` 入口对 `primary == nil` 显式返回错误而非 panic。**建议两者都做**——前者修功能,后者防复发。
|
||||
|
||||
---
|
||||
|
||||
## 6. 不建议现在做的事
|
||||
|
||||
| 事项 | 原因 |
|
||||
|------|------|
|
||||
| 迁到统一的 `object_definition` 根表 | SY22 §6.1 是终态,但当前前端专员/技能展示**大量读本地硬编码**(`businessApps` 10 个、`availableSkills` 22 个)。先迁表等于先付迁移成本、后拿收益。本方案的字段命名已与 SY22 对齐,将来搬迁无返工 |
|
||||
| 把 22 个前端技能搬到后端 | 无运行时收益,且会立刻暴露「技能没有真实实现」的更大缺口 |
|
||||
| 给专员做独立页面 | 违背已拍板方向(专员是任务的字段)。AionUi 同样把助手配置放在设置里,不放主界面 |
|
||||
| 移植 `builtin-skills/pdf/` | 许可证禁止(见 §3) |
|
||||
| 补 `specialist_skill` 关联表 | 见 §2 步骤 1 的取舍说明 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 工作量与推进顺序
|
||||
|
||||
| 阶段 | 内容 | 估时 |
|
||||
|------|------|------|
|
||||
| **P0** | 修 §5 的空指针缺陷 | 0.5 天 |
|
||||
| **P1** | 步骤 1 数据层(2 字段 + 播种 + `ValidSkillKeys` 校验) | 0.5 天 |
|
||||
| **P2** | 步骤 2 打通链路(前端 2 处 + 后端 `resolveSpecialist`) | 0.5 天 |
|
||||
| **P3** | 步骤 3 注入 prompt(`buildAssistantSystemPrompt` + `worker_task.go:708` 同步) | 0.5 天 |
|
||||
| **P4** | 前端最小集(详情页两个 section + `attachSpecialistToCurrentTask` 改主技能) | 1 天 |
|
||||
| **P5** | 第一梯队 3 份说明书改写(需先拿到 OfficeCLI) | 每份 0.5–1 天 |
|
||||
|
||||
**P1–P3 合计约 1.5 天,做完即可看到「同一个助手在不同专员下说话方式不同」**——这是整个方案能否立住的最小验证点。**建议 P1–P3 做完先停下来验证一次,再决定要不要投 P5。**
|
||||
|
||||
### 验收标准(沿用 SY18 §8)
|
||||
|
||||
> 如果一个专员无法用三行(信源 / 动作 / 结果)说清、且权限说不出「能读什么 / 能写什么 / 谁能用」,说明设计过重了。
|
||||
|
||||
再加一条本方案的:
|
||||
|
||||
> **选中两个不同的专员、问同一句话,后端发出的 System Prompt 必须不同。** 只要这一条不成立,专员就还只是装饰。
|
||||
@@ -0,0 +1,941 @@
|
||||
# 数字员工平台整体架构重思考
|
||||
|
||||
> 落盘日期:2026-09-16
|
||||
> 状态:架构重思考稿,作为后续产品与数据结构重构的总纲
|
||||
> 关联文档:
|
||||
> - `../02_Architecture/AR05_Workbench_Architecture_Contract.md`
|
||||
> - `../02_Architecture/AR06_Skill_Packaging_Specification.md`
|
||||
> - `../02_Architecture/AR08_Role_Interaction_Design.md`
|
||||
|
||||
> 2026-09-16 架构同步说明:
|
||||
> 本文档保留 Workbench 收敛和对象化迁移结论,但总命名以
|
||||
> `docs/01_System_Overall/SY21_Unified_Role_Skill_Action_Architecture.md` 为准。
|
||||
> 当前统一口径为:
|
||||
> - 对外:`角色 / 技能 / 连接器`
|
||||
> - 对内:`role / skill / action / connector / policy`
|
||||
> - `tool` 在本稿中主要代表历史命名和过渡字段,不再作为未来正式概念
|
||||
> - 欢迎语、starter prompts、对象开场方式,应由角色对象属性驱动,而不是页面硬编码
|
||||
|
||||
---
|
||||
|
||||
## 1. 最终判断
|
||||
|
||||
现在这个系统最核心的问题,不是页面太多,也不是导航太乱,而是:
|
||||
|
||||
**产品架构、前端架构、后端数据结构三层没有使用同一个对象模型。**
|
||||
|
||||
当前系统里同时混着以下几种模型:
|
||||
|
||||
1. `任务挂专员`
|
||||
2. `工具等于页面`
|
||||
3. `项目保存一组 skill_keys / specialist_keys`
|
||||
4. `运行记录只知道 specialist_key,不知道真正执行的是谁`
|
||||
|
||||
这四套模型不能长期并存。
|
||||
|
||||
所以新的总架构必须统一成一句话:
|
||||
|
||||
`一个 Workbench + 一个任务会话 + 多个可挂载对象 + 一条可追踪执行链`
|
||||
|
||||
---
|
||||
|
||||
## 2. 产品架构重定义
|
||||
|
||||
平台以后不是“很多能力页面”,而是一个真正的数字员工平台,分成两大面:
|
||||
|
||||
### 2.1 执行面
|
||||
|
||||
执行面只保留一个:
|
||||
|
||||
- `Workbench`
|
||||
|
||||
它承载:
|
||||
|
||||
- 当前任务
|
||||
- 当前对象
|
||||
- 消息流
|
||||
- 工作流
|
||||
- 产物
|
||||
- 附件
|
||||
- 启动对象 / 切换对象 / 关闭对象
|
||||
|
||||
### 2.2 管理面
|
||||
|
||||
管理面负责:
|
||||
|
||||
- 目录浏览
|
||||
- 配置
|
||||
- 安装
|
||||
- 权限
|
||||
- 连接器
|
||||
- 运营
|
||||
- 观测
|
||||
|
||||
它不承担任务执行。
|
||||
|
||||
一句话:
|
||||
|
||||
- `Workbench` 负责使用
|
||||
- `Catalog / Studio / Console` 负责管理
|
||||
|
||||
---
|
||||
|
||||
## 3. 统一对象模型
|
||||
|
||||
未来系统里所有“可被用户启动、配置、关闭、调用”的东西,都统一叫:
|
||||
|
||||
`对象`
|
||||
|
||||
对象分三类:
|
||||
|
||||
### 3.1 默认助手
|
||||
|
||||
定义:
|
||||
|
||||
- 默认兜底对象
|
||||
- 没选专员、没选技术员时的默认入口
|
||||
|
||||
本质:
|
||||
|
||||
- 一种特殊的编排对象
|
||||
|
||||
### 3.2 数字专员
|
||||
|
||||
定义:
|
||||
|
||||
- 负责任务拆解、编排、协调、汇总的对象
|
||||
|
||||
本质:
|
||||
|
||||
- 编排型对象
|
||||
|
||||
### 3.3 数字技术员
|
||||
|
||||
定义:
|
||||
|
||||
- 负责某一个能力动作的对象
|
||||
|
||||
本质:
|
||||
|
||||
- 执行型对象
|
||||
|
||||
### 3.4 关键结论
|
||||
|
||||
工具不再是页面,也不再是一个特殊技术概念。
|
||||
|
||||
工具只是:
|
||||
|
||||
`数字技术员的产品展示名称`
|
||||
|
||||
所以未来建模必须统一为:
|
||||
|
||||
- 对象定义
|
||||
- 对象安装
|
||||
- 对象实例
|
||||
- 对象运行
|
||||
|
||||
而不是:
|
||||
|
||||
- 专员一套表
|
||||
- 工具一套路由
|
||||
- 页面里再塞一套局部状态
|
||||
|
||||
---
|
||||
|
||||
## 4. 新的领域分层
|
||||
|
||||
系统应该拆成 4 层:
|
||||
|
||||
### 4.1 定义层
|
||||
|
||||
定义“这个对象是谁”。
|
||||
|
||||
例如:
|
||||
|
||||
- 文档翻译技术员
|
||||
- 合同审查专员
|
||||
- 通用助手
|
||||
|
||||
这一层存:
|
||||
|
||||
- 身份
|
||||
- 来源
|
||||
- 版本
|
||||
- 设置 schema
|
||||
- 能力 schema
|
||||
- 展示配置
|
||||
|
||||
### 4.2 安装层
|
||||
|
||||
定义“这个对象在当前租户 / 工作区里是否可用”。
|
||||
|
||||
这一层存:
|
||||
|
||||
- 是否启用
|
||||
- 是否安装
|
||||
- 版本锁定
|
||||
- 权限范围
|
||||
- 默认配置
|
||||
|
||||
### 4.3 实例层
|
||||
|
||||
定义“这条任务当前挂了谁”。
|
||||
|
||||
这一层存:
|
||||
|
||||
- 当前任务里挂载了哪些对象
|
||||
- 当前焦点是谁
|
||||
- 各对象的本次任务配置快照
|
||||
- 对象是否打开 / 关闭
|
||||
|
||||
### 4.4 运行层
|
||||
|
||||
定义“这次实际跑了什么”。
|
||||
|
||||
这一层存:
|
||||
|
||||
- 消息
|
||||
- 调用链
|
||||
- 步骤
|
||||
- 产物
|
||||
- 日志
|
||||
- 状态变化
|
||||
|
||||
---
|
||||
|
||||
## 5. 最重要的结构纠偏
|
||||
|
||||
### 5.1 Task 不能只挂一个 specialist_key
|
||||
|
||||
当前 `worker_task` 的核心绑定是:
|
||||
|
||||
- `specialist_key`
|
||||
|
||||
这不够。
|
||||
|
||||
因为未来一条任务里可能同时存在:
|
||||
|
||||
- 一个主专员
|
||||
- 多个技术员
|
||||
- 动态切换的当前焦点对象
|
||||
|
||||
但对用户可见的输入区交互,必须坚持一条规则:
|
||||
|
||||
- `+` 右边一次只显示一个当前对象
|
||||
- 当前对象要么是专员,要么是技能,要么是默认助手
|
||||
- 专员内部调用技能,只进入执行链和右侧面板,不在输入区显性双挂
|
||||
|
||||
所以真正的任务结构不应是:
|
||||
|
||||
`task -> specialist_key`
|
||||
|
||||
而应是:
|
||||
|
||||
`task -> mounted objects`
|
||||
|
||||
### 5.2 Run 不能只知道 specialist_key
|
||||
|
||||
当前 `worker_run` 也只知道:
|
||||
|
||||
- `specialist_key`
|
||||
- `action_key`
|
||||
|
||||
这会导致系统分不清:
|
||||
|
||||
- 是哪个对象发起的
|
||||
- 是哪个对象实际执行的
|
||||
- 是专员步骤,还是技术员步骤
|
||||
- 是人工确认,还是自动调用
|
||||
|
||||
所以运行记录必须升级为:
|
||||
|
||||
- 谁发起
|
||||
- 谁执行
|
||||
- 父子运行关系
|
||||
- 对应对象实例
|
||||
|
||||
### 5.3 Project 不能只存 skill_keys 与 object_entry_route 语义
|
||||
|
||||
当前项目里保存:
|
||||
|
||||
- `specialist_keys`
|
||||
- `skill_keys`
|
||||
- `connector_keys`
|
||||
|
||||
方向是对的,但语义还不够硬。
|
||||
|
||||
以后项目应该保存的是:
|
||||
|
||||
- 默认对象绑定
|
||||
- 默认配置快照
|
||||
- 默认连接器绑定
|
||||
- 默认知识域
|
||||
|
||||
而不是仅仅一串“key 列表”。
|
||||
|
||||
### 5.4 消息必须成为一等数据
|
||||
|
||||
当前系统最大缺口之一,是消息没有成为正式持久化对象。
|
||||
|
||||
没有消息层,Workbench 永远只是半成品,因为:
|
||||
|
||||
- 任务无法真正恢复
|
||||
- 对象切换没有上下文历史
|
||||
- 运行记录无法和用户意图精确对齐
|
||||
- 后续审计、回放、总结都不完整
|
||||
|
||||
所以必须新增:
|
||||
|
||||
- `task_message`
|
||||
|
||||
---
|
||||
|
||||
## 6. 推荐的核心数据结构
|
||||
|
||||
以下是建议采用的目标数据模型。
|
||||
|
||||
## 6.1 对象定义表 `object_definition`
|
||||
|
||||
作用:
|
||||
|
||||
- 统一描述默认助手 / 专员 / 技术员
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type ObjectDefinition = {
|
||||
id: string
|
||||
code: string
|
||||
source: 'eai' | 'custom'
|
||||
kind: 'assistant' | 'specialist' | 'tool'
|
||||
key: string
|
||||
label: string
|
||||
description: string
|
||||
version: string
|
||||
state: 'active' | 'inactive'
|
||||
icon: string
|
||||
color: string
|
||||
capabilitySchema: object
|
||||
settingsSchema: object[]
|
||||
workflowSchema: object[]
|
||||
artifactSchema: object[]
|
||||
uiSchema: object
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. `specialist` 和 `tool` 都是对象定义,不再属于两套异构模型
|
||||
2. EAI 与 custom 由 `source` 区分
|
||||
3. 旧的 `specialist` 表最终应演进成这一层
|
||||
|
||||
## 6.2 对象安装表 `object_installation`
|
||||
|
||||
作用:
|
||||
|
||||
- 记录某个对象在某个租户 / 工作区 / 组织里是否可用
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type ObjectInstallation = {
|
||||
id: string
|
||||
objectDefinitionId: string
|
||||
tenantId: string
|
||||
workspaceId: string
|
||||
state: 'installed' | 'disabled' | 'trial'
|
||||
pinned: boolean
|
||||
permissionScope: object
|
||||
connectorBindings: object[]
|
||||
knowledgeBindings: object[]
|
||||
defaultSettings: object
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 这层解决“平台有,但当前租户能不能用”
|
||||
2. 这层负责安装态,而不是任务态
|
||||
|
||||
## 6.3 项目表 `project`
|
||||
|
||||
作用:
|
||||
|
||||
- 作为任务的长期上下文容器
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type Project = {
|
||||
id: string
|
||||
code: string
|
||||
name: string
|
||||
ownerId: string
|
||||
instruction: string
|
||||
templateKey: string
|
||||
defaultObjectBindings: object[]
|
||||
defaultConnectorBindings: object[]
|
||||
defaultKnowledgeBindings: object[]
|
||||
state: 'active' | 'archived'
|
||||
pinned: boolean
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 项目不是对象目录
|
||||
2. 项目是任务上下文模板
|
||||
3. 项目里应该保存默认挂载关系,而不是只保存裸 key 列表
|
||||
|
||||
## 6.4 任务会话表 `task_session`
|
||||
|
||||
作用:
|
||||
|
||||
- 表示用户正在处理的一条真实任务
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type TaskSession = {
|
||||
id: string
|
||||
title: string
|
||||
summary: string
|
||||
ownerId: string
|
||||
projectId?: string
|
||||
state: 'draft' | 'running' | 'waiting' | 'done' | 'archived'
|
||||
priority: 'P1' | 'P2' | 'P3'
|
||||
currentObjectInstanceId?: string
|
||||
defaultSpecialistInstanceId?: string
|
||||
latestRunId?: string
|
||||
latestArtifactId?: string
|
||||
pinned: boolean
|
||||
dueAt?: string
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 任务只记录“当前主会话”
|
||||
2. 任务不直接存 `tool object_entry_route`
|
||||
3. 任务不直接把工具建模成页面
|
||||
|
||||
## 6.5 任务挂载对象表 `task_object_instance`
|
||||
|
||||
作用:
|
||||
|
||||
- 这是整个系统最关键的新表
|
||||
- 记录某条任务当前挂载了哪些对象
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type TaskObjectInstance = {
|
||||
id: string
|
||||
taskId: string
|
||||
objectDefinitionId: string
|
||||
objectKind: 'assistant' | 'specialist' | 'skill'
|
||||
role: 'default' | 'primary' | 'secondary'
|
||||
state: 'mounted' | 'focused' | 'closed'
|
||||
settingsSnapshot: object
|
||||
source: 'manual' | 'auto'
|
||||
mountedAt: string
|
||||
closedAt?: string
|
||||
updatedAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 当前专员、当前技能都应该从这里来
|
||||
2. `currentSkillKey` 只是这张表的前端运行态字段
|
||||
3. 关闭对象时,不是跳页面,而是把实例 state 改成 `closed`
|
||||
|
||||
## 6.6 消息表 `task_message`
|
||||
|
||||
作用:
|
||||
|
||||
- 持久化消息流
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type TaskMessage = {
|
||||
id: string
|
||||
taskId: string
|
||||
objectInstanceId?: string
|
||||
role: 'user' | 'assistant' | 'system'
|
||||
messageType: 'text' | 'tool_call' | 'status' | 'summary'
|
||||
contentText: string
|
||||
contentJSON?: object
|
||||
replyToMessageId?: string
|
||||
createdAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 每条消息可以挂到某个对象实例上
|
||||
2. 这样才能知道“这句话是对谁说的”
|
||||
3. 回放、总结、继续追问都依赖这层
|
||||
|
||||
## 6.7 执行表 `object_run`
|
||||
|
||||
作用:
|
||||
|
||||
- 记录对象实际执行的过程
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type ObjectRun = {
|
||||
id: string
|
||||
taskId: string
|
||||
objectInstanceId: string
|
||||
initiatedByRunId?: string
|
||||
initiatedByObjectInstanceId?: string
|
||||
parentRunId?: string
|
||||
runType: 'chat' | 'workflow' | 'skill' | 'approval'
|
||||
actionKey: string
|
||||
actionTitle: string
|
||||
state: 'queued' | 'running' | 'waiting' | 'done' | 'failed' | 'cancelled'
|
||||
inputJSON: object
|
||||
outputJSON?: object
|
||||
logsJSON?: object[]
|
||||
startedAt?: string
|
||||
finishedAt?: string
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 必须显式有 `running / waiting / failed`
|
||||
2. 当前 `worker_run.status` 默认 `done` 的模型是不够的
|
||||
3. `parentRunId` 解决专员调用技术员的问题
|
||||
|
||||
## 6.8 产物表 `artifact`
|
||||
|
||||
作用:
|
||||
|
||||
- 统一管理任务产出
|
||||
|
||||
建议字段:
|
||||
|
||||
```ts
|
||||
type Artifact = {
|
||||
id: string
|
||||
taskId: string
|
||||
objectInstanceId?: string
|
||||
createdByRunId?: string
|
||||
artifactType: string
|
||||
title: string
|
||||
state: 'draft' | 'review' | 'approved' | 'published'
|
||||
contentText?: string
|
||||
contentJSON?: object
|
||||
sourceRefsJSON?: object[]
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 产物不属于页面
|
||||
2. 产物属于任务和执行链
|
||||
3. 右栏展示只是视图,不是数据来源
|
||||
|
||||
---
|
||||
|
||||
## 7. 前端运行时结构重定义
|
||||
|
||||
前端 store 应该从“按页面凑状态”改成“按任务会话管理状态”。
|
||||
|
||||
推荐结构:
|
||||
|
||||
```ts
|
||||
type WorkbenchRuntime = {
|
||||
activeTaskId: string
|
||||
draftSelection: {
|
||||
specialistKey?: string
|
||||
toolKey?: string
|
||||
mode?: string
|
||||
}
|
||||
tasksById: Record<string, TaskSession>
|
||||
mountedObjectsByTaskId: Record<string, TaskObjectInstance[]>
|
||||
messagesByTaskId: Record<string, TaskMessage[]>
|
||||
runsByTaskId: Record<string, ObjectRun[]>
|
||||
artifactsByTaskId: Record<string, Artifact[]>
|
||||
focusedObjectInstanceIdByTaskId: Record<string, string>
|
||||
panelStateByTaskId: Record<string, { activeTab: 'workflow' | 'artifacts' }>
|
||||
}
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. 当前对象应该由 `focusedObjectInstanceId` 决定
|
||||
2. `currentSkillKey` 和 `currentSpecialistKey` 最终都只是计算值
|
||||
3. 页面不应该自己猜当前对象是谁
|
||||
|
||||
---
|
||||
|
||||
## 8. 前端目录结构重定义
|
||||
|
||||
建议未来前端结构分成 5 块:
|
||||
|
||||
```text
|
||||
src/
|
||||
workbench/
|
||||
pages/
|
||||
components/
|
||||
stores/
|
||||
runtime/
|
||||
tools/
|
||||
eai/
|
||||
custom/
|
||||
registry/
|
||||
shared/
|
||||
specialists/
|
||||
eai/
|
||||
custom/
|
||||
registry/
|
||||
shared/
|
||||
connectors/
|
||||
catalog/
|
||||
```
|
||||
|
||||
关键说明:
|
||||
|
||||
1. `workbench/` 只承载执行工作面
|
||||
2. `tools/` 只放技术员定义与局部组件
|
||||
3. `specialists/` 只放专员定义与局部组件
|
||||
4. 不再允许 `views/tools/*.vue` 承担执行职责
|
||||
|
||||
---
|
||||
|
||||
## 9. 路由模型重定义
|
||||
|
||||
未来路由应该只分三类:
|
||||
|
||||
### 9.1 执行路由
|
||||
|
||||
- `/home`
|
||||
|
||||
### 9.2 目录路由
|
||||
|
||||
- `/catalog/specialists`
|
||||
- `/catalog/skills`
|
||||
- `/catalog/connectors`
|
||||
|
||||
### 9.3 配置 / 管理路由
|
||||
|
||||
- `/studio`
|
||||
- `/console`
|
||||
- `/projects`
|
||||
|
||||
强结论:
|
||||
|
||||
- `apps/*` 退出执行入口
|
||||
- `tools/*` 退出执行入口
|
||||
|
||||
---
|
||||
|
||||
## 10. 对当前表结构的明确评价
|
||||
|
||||
### 10.1 当前 `specialist` 表
|
||||
|
||||
优点:
|
||||
|
||||
- 已经积累了足够多的对象定义字段
|
||||
|
||||
问题:
|
||||
|
||||
- 同时承载了目录字段、展示字段、流程字段、配置字段
|
||||
- 仍然以“专员”命名,无法统一承载默认助手和技术员
|
||||
|
||||
判断:
|
||||
|
||||
- 可以作为 `object_definition` 的迁移来源
|
||||
- 不建议长期继续维持原表语义
|
||||
|
||||
### 10.2 当前 `worker_task` 表
|
||||
|
||||
优点:
|
||||
|
||||
- 已经有任务的基础壳
|
||||
|
||||
问题:
|
||||
|
||||
- 核心绑定仍然是 `specialist_key`
|
||||
- 还没有对象实例层
|
||||
- 还没有消息层
|
||||
|
||||
判断:
|
||||
|
||||
- 适合作为 `task_session` 的迁移来源
|
||||
- 不适合作为最终任务模型
|
||||
|
||||
### 10.3 当前 `worker_run` 表
|
||||
|
||||
优点:
|
||||
|
||||
- 已经有动作记录
|
||||
|
||||
问题:
|
||||
|
||||
- 缺少对象实例 id
|
||||
- 缺少父子调用链
|
||||
- 缺少真实运行状态
|
||||
|
||||
判断:
|
||||
|
||||
- 适合作为 `object_run` 的迁移来源
|
||||
- 必须升级
|
||||
|
||||
### 10.4 当前 `worker_artifact` 表
|
||||
|
||||
优点:
|
||||
|
||||
- 基本方向正确
|
||||
|
||||
问题:
|
||||
|
||||
- 仍然绑定 `specialist_key`
|
||||
- 没有明确对象实例来源
|
||||
|
||||
判断:
|
||||
|
||||
- 可以直接演进成新 `artifact` 模型
|
||||
|
||||
---
|
||||
|
||||
## 11. 最关键的产品决策
|
||||
|
||||
下面这些必须作为平台级决策固定下来:
|
||||
|
||||
### 11.1 任务中心化
|
||||
|
||||
所有运行时行为都围绕任务展开。
|
||||
|
||||
### 11.2 对象实例化
|
||||
|
||||
对象不是页面,不是 tab,不是配置项。
|
||||
|
||||
对象在任务里必须有实例。
|
||||
|
||||
### 11.3 消息持久化
|
||||
|
||||
没有消息层,就没有真正的 Workbench。
|
||||
|
||||
### 11.4 运行链可追踪
|
||||
|
||||
专员调技术员,必须可追踪为父子执行链。
|
||||
|
||||
### 11.5 管理与使用分离
|
||||
|
||||
Catalog / Studio / Console 不参与执行面。
|
||||
|
||||
---
|
||||
|
||||
## 12. 推荐迁移顺序
|
||||
|
||||
### Phase 1:冻结对象模型
|
||||
|
||||
确定:
|
||||
|
||||
- assistant / specialist / tool 三类对象
|
||||
- source / code / key / label 规范
|
||||
|
||||
### Phase 2:补对象实例层
|
||||
|
||||
新增:
|
||||
|
||||
- `task_object_instance`
|
||||
|
||||
前端先用 runtime 影子模型兼容。
|
||||
|
||||
### Phase 3:补消息层
|
||||
|
||||
新增:
|
||||
|
||||
- `task_message`
|
||||
|
||||
让任务真正可恢复。
|
||||
|
||||
### Phase 4:升级运行链
|
||||
|
||||
把 `worker_run` 升级为带父子关系的 `object_run`。
|
||||
|
||||
### Phase 5:收口前端执行页
|
||||
|
||||
删除:
|
||||
|
||||
- `apps/*` 执行页
|
||||
- `tools/*` 执行页
|
||||
|
||||
### Phase 6:收口定义层
|
||||
|
||||
把:
|
||||
|
||||
- `specialist`
|
||||
- `tool config`
|
||||
|
||||
逐步统一到对象定义体系。
|
||||
|
||||
---
|
||||
|
||||
## 13. WorkBuddy 实测确认点
|
||||
|
||||
本轮已实际登录并查看 WorkBuddy,以下观察可以作为架构校准依据。
|
||||
|
||||
### 13.1 单一执行工作面成立
|
||||
|
||||
登录后默认进入的是单一工作台,而不是“先选一个工具页再开始工作”。
|
||||
|
||||
可见特征:
|
||||
|
||||
- 左侧是一级工作区标签
|
||||
- 中间是统一输入工作面
|
||||
- 右侧是固定侧栏
|
||||
|
||||
这说明:
|
||||
|
||||
- 我们保留唯一 Workbench 的方向是对的
|
||||
|
||||
### 13.2 `项目` 是独立管理面,不是执行页
|
||||
|
||||
WorkBuddy 的 `项目` 入口跳到单独的项目列表与模板空间。
|
||||
|
||||
这个页面的职责是:
|
||||
|
||||
- 项目管理
|
||||
- 项目模板
|
||||
- 多人协同入口
|
||||
|
||||
而不是聊天执行。
|
||||
|
||||
这说明:
|
||||
|
||||
- 我们把 `项目` 归入管理面是对的
|
||||
- 项目不是对象目录,也不是工具页
|
||||
|
||||
### 13.3 `专家·技能·连接器` 是统一目录中心
|
||||
|
||||
WorkBuddy 中这一组入口是统一的目录中心,内部再切:
|
||||
|
||||
- 专家
|
||||
- 技能
|
||||
- 连接器
|
||||
|
||||
它的形态明显是:
|
||||
|
||||
- 搜索
|
||||
- 分类
|
||||
- 推荐
|
||||
- 安装 / 连接
|
||||
|
||||
而不是执行工作面。
|
||||
|
||||
这说明:
|
||||
|
||||
- 我们把 `Catalog` 与 `Workbench` 分开是对的
|
||||
- `专员·工具·连接器` 不应该承担直接执行语义
|
||||
|
||||
### 13.4 具体技能点击后是详情 / 安装,不是进入另一套聊天页
|
||||
|
||||
在 `技能` 列表中点击某个具体技能后,出现的是技能详情与安装动作,而不是跳进单独的技能聊天页面。
|
||||
|
||||
这说明:
|
||||
|
||||
- “一个工具一个执行页”的老结构方向不对
|
||||
- 工具更接近“目录项 + 详情 + 安装 + 后续被调用”
|
||||
|
||||
### 13.5 右侧面板是壳层能力,不是某个页面私有能力
|
||||
|
||||
无论在新建任务、项目、技能、连接器等区域,右侧面板结构都持续存在。
|
||||
|
||||
即使内容为空,壳也还在。
|
||||
|
||||
这说明:
|
||||
|
||||
- 右栏应该属于 shell / workbench 壳层
|
||||
- 不应该每个工具页自己维护一份右栏
|
||||
|
||||
### 13.6 WorkBuddy 仍然保留了较强的“市场 / 目录 / 工作台”边界
|
||||
|
||||
它不是把所有东西都糊成一个平面,而是:
|
||||
|
||||
- 工作台负责执行
|
||||
- 项目负责协同容器
|
||||
- 专家 / 技能 / 连接器负责目录与安装
|
||||
|
||||
这和我们当前重构方向高度一致。
|
||||
|
||||
### 13.7 对我们的直接启发
|
||||
|
||||
WorkBuddy 实测后,可以进一步确认以下决策不需要再摇摆:
|
||||
|
||||
1. 保留唯一执行工作面
|
||||
2. `项目` 作为管理 / 协同面保留
|
||||
3. `专家·技能·连接器` 作为目录中心保留
|
||||
4. 工具不再做独立执行页
|
||||
5. 右栏属于壳层,而不是页面层
|
||||
|
||||
### 13.8 我们不需要照搬的地方
|
||||
|
||||
WorkBuddy 当前实现里,仍然保留了较强的目录跳转结构。
|
||||
|
||||
我们项目和它的差异是:
|
||||
|
||||
- 我们更强调“任务上下文中的对象挂载”
|
||||
- 我们更强调“启动、配置、关闭对象”
|
||||
- 我们希望对象实例层更加明确
|
||||
|
||||
所以我们不需要简单复刻它的页面结构,而应该吸收它已经验证过的边界:
|
||||
|
||||
- 工作台是工作台
|
||||
- 目录是目录
|
||||
- 安装是安装
|
||||
- 执行不是目录页行为
|
||||
|
||||
---
|
||||
|
||||
## 14. 关于 WorkBuddy 与本项目的关系
|
||||
|
||||
基于当前仓库、既有合同以及本轮 WorkBuddy 实测,已经可以确认:
|
||||
|
||||
- 第一性原理判断没有走偏
|
||||
- WorkBuddy 更适合用来校准边界,而不是替代建模
|
||||
|
||||
也就是说:
|
||||
|
||||
- 我们参考 WorkBuddy
|
||||
- 但我们的最终模型应该比它更明确地引入“对象实例层”
|
||||
|
||||
---
|
||||
|
||||
## 15. 最终一句话
|
||||
|
||||
这个平台最终不应该再被理解为:
|
||||
|
||||
`专员页 + 工具页 + 若干配置页`
|
||||
|
||||
而应该被理解为:
|
||||
|
||||
`一个数字员工工作台 + 一套对象目录 + 一层对象实例模型 + 一条执行与产物链`
|
||||
|
||||
如果后续任何实现仍然要求用户去理解:
|
||||
|
||||
- 我现在在哪个工具页
|
||||
- 我是不是切到了另一个专员页
|
||||
- 这个页面和那条任务是什么关系
|
||||
|
||||
那就说明架构还没有真正完成重构。
|
||||
Reference in New Issue
Block a user