# 专家模式默认提示词自动填充功能 - 实施说明

## 概述

为所有专家模式添加**选择后自动填充默认提示词**功能,提升用户体验,快速引导用户使用专家功能。

## 功能说明

当用户在主输入框中输入触发词(如"SOP转工作流"),系统检测到多个匹配的专家并弹出选择卡片时:

1. 用户点击某个专家子技能的"使用"按钮
2. 系统激活该专家
3. **自动在主输入框中填充该专家的默认提示词**
4. 用户可以编辑提示词后发送

---

## 实施步骤

### 步骤1: 在avatar.json中添加defaultPrompt字段

为每个子技能添加`defaultPrompt`字段,定义选择该专家后自动填充的默认提示词。

#### 示例: OP工作流专家

```json
{
  "subSkills": [
    {
      "skillName": "SOP转BPMN工作流生成指令",
      "triggerWords": ["SOP转工作流", "生成BPMN", "工作流配置"],
      "description": "智能解析SOP文档,自动生成符合云平台导入标准的BPMN 2.0工作流MD文档。",
      "defaultPrompt": "SOP转工作流\n\n请帮我将以下SOP文档转换为BPMN 2.0工作流配置:\n\n【SOP编号】HY-G-LTC-SOP-001\n【SOP名称】线索管理SOP(V5.1)\n【步骤总览】\n步骤1: 接收AI评估已分级线索 (执行者: AR-01, 输出: 线索接收记录.md)\n步骤2: 线索信息核验与验收 (执行者: AR-01, 入参: AI评估报告.md, 输出: 线索验收记录.md, 下一节点: 步骤3(通过)/退回MM(驳回))\n...\n\n请生成:\n1. 完整的BPMN 2.0 XML配置(节点ID使用流程标识前缀ltc_)\n2. 节点唯一性验证报告\n3. 流程导入说明文档\n\n【要求】\n- 节点ID必须使用流程标识前缀(如ltc_step1_receive),彻底规避跨流程冲突\n- 角色分配(flowable:candidateGroups)必须匹配SOP中的执行者\n- 扩展属性(__inputAttachments/__outputAttachments)必须包含所有入参/出参MD文档\n- 分支逻辑(ExclusiveGateway)必须与SOP中的下一节点分支匹配",
      "workflowMode": "complex",
      "outputPathTemplate": "{workspace}/doc/{sop-id}-工作流配置.md",
      "systemPrompt": "..."
    }
  ]
}
```

#### defaultPrompt编写规范

1. **首行**: 触发词(如`SOP转工作流`)
2. **空行**: 分隔触发词和正文
3. **正文**: 结构化的任务描述
   - 使用【】标记关键信息
   - 使用列表格式清晰展示要求
   - 包含示例数据(如SOP编号、步骤总览)
4. **长度**: 建议200-500字,既要完整又要简洁

---

### 步骤2: 修改AvatarChoiceCard组件(已完成✅)

**文件**: `apps/electron/src/renderer/src/components/chat/AvatarChoiceCard.tsx`

**修改内容**:

```typescript
const handleChoose = useCallback(
  async (c: Candidate) => {
    // ... 原有激活逻辑 ...
    
    // ✅ 新增: 选择专家后,自动填充默认提示词到主输入框
    if (c.description) {
      const defaultPrompt = `${c.triggerWord || c.skillName}\n\n${c.description}`
      
      setTimeout(() => {
        window.dispatchEvent(new CustomEvent('twork-fill-prompt', {
          detail: {
            prompt: defaultPrompt,
            source: 'avatar-choice',
            avatarId: c.avatarId,
            subSkillId: c.subSkillId,
          }
        }))
        console.log('[AvatarChoiceCard] 已触发twork-fill-prompt事件, 填充默认提示词')
      }, 300)
    }
    
    // ... 后续逻辑 ...
  },
  [conversationId],
)
```

**工作原理**:
1. 用户点击"使用"按钮
2. 调用`sessionChoose`激活专家
3. 激活成功后,延迟300ms触发`twork-fill-prompt`事件
4. `ChatInputArea`组件监听到事件后,自动填充提示词到主输入框

---

### 步骤3: 为所有专家添加defaultPrompt

需要为以下所有专家的子技能添加`defaultPrompt`字段:

#### 3.1 SOP审核专家(sop-auditor)

```json
{
  "skillName": "SOP文档审核指令",
  "triggerWords": ["SOP审核", "审核SOP", "文档审核"],
  "defaultPrompt": "SOP审核\n\n请帮我审核以下SOP文档:\n\n【SOP编号】HY-G-LTC-SOP-001\n【SOP名称】线索管理SOP(V5.1)\n\n【审核要求】\n1. 检查步骤总览完整性\n2. 验证角色职责定义\n3. 确认入参出参文档清单\n4. 审查分支逻辑合理性\n5. 输出审核报告和改进建议",
  // ...
}
```

#### 3.2 开发工程师(dev-engineer)

```json
{
  "skillName": "代码生成指令",
  "triggerWords": ["生成代码", "代码实现", "编写代码"],
  "defaultPrompt": "生成代码\n\n请帮我实现以下功能:\n\n【功能描述】[请描述需要实现的功能]\n【技术栈】React + TypeScript + Ant Design\n【要求】\n1. 使用函数式组件和Hooks\n2. 类型安全,定义完整的TypeScript接口\n3. 响应式设计,适配不同屏幕尺寸\n4. 添加必要的错误处理和加载状态\n5. 包含注释和文档",
  // ...
}
```

#### 3.3 产品经理(pm-core)

```json
{
  "skillName": "PRD撰写指令",
  "triggerWords": ["写PRD", "产品需求文档", "需求分析"],
  "defaultPrompt": "写PRD\n\n请帮我撰写以下功能的产品需求文档:\n\n【功能名称】[功能名称]\n【目标用户】[目标用户群体]\n【核心场景】[用户核心使用场景]\n\n【PRD结构】\n1. 产品概述\n2. 目标用户与场景\n3. 功能需求清单\n4. 用户故事(User Story)\n5. 交互流程\n6. 数据模型\n7. 验收标准\n8. 风险与依赖",
  // ...
}
```

#### 3.4 数据分析师(data-analyst)

```json
{
  "skillName": "数据分析指令",
  "triggerWords": ["数据分析", "生成报表", "数据可视化"],
  "defaultPrompt": "数据分析\n\n请帮我分析以下数据:\n\n【数据源】[数据来源或文件路径]\n【分析目标】[需要回答的业务问题]\n\n【分析要求】\n1. 数据清洗与预处理\n2. 探索性数据分析(EDA)\n3. 关键指标计算\n4. 可视化图表生成\n5. 业务洞察与建议\n6. 输出分析报告",
  // ...
}
```

---

## 技术架构

### 事件流

```
用户选择专家
  ↓
AvatarChoiceCard.handleChoose()
  ↓
sessionChoose() 激活专家
  ↓
setTimeout(300ms)
  ↓
window.dispatchEvent('twork-fill-prompt')
  ↓
ChatInputArea 监听到事件
  ↓
setInputValue(prompt) 填充提示词
  ↓
失焦 → 更新 → 同步DOM → 聚焦
  ↓
message.success('已填充预设提示词,请编辑后发送')
```

### 关键组件

| 组件 | 职责 | 文件路径 |
|-----|------|---------|
| AvatarChoiceCard | 专家选择卡片,触发fill-prompt事件 | `apps/electron/src/renderer/src/components/chat/AvatarChoiceCard.tsx` |
| ChatInputArea | 主输入框,监听fill-prompt事件 | `apps/electron/src/renderer/src/components/chat/ChatInputArea.tsx` |
| avatar.json | 专家配置,包含defaultPrompt | `apps/electron/resources/digital-avatars/{expert}/avatar.json` |

### 事件格式

```typescript
window.dispatchEvent(new CustomEvent('twork-fill-prompt', {
  detail: {
    prompt: string,           // 默认提示词内容
    source: 'avatar-choice',  // 事件来源
    avatarId: string,         // 专家ID
    subSkillId: string,       // 子技能ID
  }
}))
```

---

## 测试验证

### 测试用例

#### 用例1: OP工作流专家选择

1. 在主输入框输入: `SOP转工作流`
2. 系统弹出专家选择卡片
3. 点击"使用"按钮选择"SOP转BPMN工作流生成指令"
4. **预期结果**: 主输入框自动填充默认提示词,包含:
   - 触发词: `SOP转工作流`
   - SOP编号: `HY-G-LTC-SOP-001`
   - SOP名称: `线索管理SOP(V5.1)`
   - 步骤总览示例
   - 生成要求清单

#### 用例2: 用户编辑提示词

1. 完成用例1后,主输入框已填充默认提示词
2. 用户修改SOP编号和步骤总览
3. 点击发送按钮
4. **预期结果**: 专家根据用户修改后的提示词执行任务

#### 用例3: 多个专家子技能

1. 在主输入框输入: `验证节点唯一性`
2. 系统弹出专家选择卡片(如果有多个匹配)
3. 点击"使用"按钮选择"BPMN节点唯一性验证指令"
4. **预期结果**: 主输入框自动填充验证指令的默认提示词

---

## 注意事项

### 1. defaultPrompt长度控制

- **建议**: 200-500字
- **原因**: 过长会影响用户体验,过短会导致信息不足
- **技巧**: 使用示例数据和结构化格式,提升信息密度

### 2. 触发词一致性

- defaultPrompt的首行必须与triggerWords中的某个触发词一致
- **示例**: 
  ```json
  "triggerWords": ["SOP转工作流", "生成BPMN"],
  "defaultPrompt": "SOP转工作流\n\n..."
  ```

### 3. 延迟时间

- 当前使用300ms延迟触发fill-prompt事件
- **原因**: 确保专家激活完成后再填充提示词
- **调整**: 如需调整,修改`setTimeout(..., 300)`中的延迟时间

### 4. 主进程支持(可选优化)

当前实现使用`c.description`作为默认提示词,未来可以优化为:

1. 主进程在返回candidates时附带`defaultPrompt`字段
2. AvatarChoiceCard直接使用`c.defaultPrompt`
3. 避免从description中解析

**优化后的Candidate接口**:

```typescript
interface Candidate {
  avatarId: string
  avatarName: string
  subSkillId: string
  skillName: string
  triggerWord: string
  description?: string
  defaultPrompt?: string  // ✅ 新增字段
}
```

---

## 完成清单

- [x] 修改AvatarChoiceCard组件,添加自动填充逻辑
- [x] 为OP工作流专家添加defaultPrompt字段
- [ ] 为SOP审核专家添加defaultPrompt字段
- [ ] 为开发工程师添加defaultPrompt字段
- [ ] 为产品经理添加defaultPrompt字段
- [ ] 为数据分析师添加defaultPrompt字段
- [ ] 为所有其他专家添加defaultPrompt字段
- [ ] 测试验证所有专家的自动填充功能
- [ ] (可选)优化主进程,返回candidates时附带defaultPrompt字段

---

## 已完成的专家配置

| 专家 | 子技能 | defaultPrompt | 状态 |
|-----|--------|---------------|------|
| OP工作流专家 | SOP转BPMN工作流生成指令 | ✅ 已添加 | ✅ 完成 |
| OP工作流专家 | BPMN节点唯一性验证指令 | ✅ 已添加 | ✅ 完成 |

---

**实施日期**: 2026-06-28  
**实施人员**: AI Assistant  
**状态**: 部分完成(OP工作流专家已完成,其他专家待添加)
