# 互动组件配置JSON生成器 — 产品需求文档

## v1 基础版（已完成）

### 目标
从飞书wiki剧本文档出发，经过sheet数据解析、组件类型匹配、LLM驱动的jsonData生成，
最终输出组件配置JSON并持久化到本地SQLite数据库。

### 已实现能力
- 27种中互动组件类型的中英对照注册表
- 飞书wiki文档+内嵌sheet读取（feishu_client.py）
- 组件行识别与教研配置提取（parse_script.py）
- 通用LLM生成（few-shot参考样例驱动）
- 规则化kpInfo生成
- 端到端pipeline + SQLite持久化

---

## v2 精确Prompt优化（已完成 2026-04-28）

> 来源: /root/.openclaw/prd/xiaoyan_comp_json_skill_v2.md

### 核心需求

1. **每种组件类型使用独立的精确Prompt模板**，包含完整的字段定义、抽取规则、输出格式和样例，
   方便排查问题。输出规则设置应尽量全部保留，最终达成与原有流程一样的输出效果。

2. **角色物品配置（resourceMapping）通过 section 对应关系解析**：
   - 读取文档markdown中 "角色-section对应" 表格，获取每个section的角色id对应关系
   - 组件配置行的"配置信息"列标记了所属section（如 "S1主线"）
   - 根据section找到对应的角色id，写入最终JSON的 resourceMapping 字段

3. **教研配置文本拆解为结构化字段**，作为prompt的输入变量：
   - 标题、情境引入、互动内容、后置对话、角色配置、资源配置、互动反馈、互动描述、学习意义构建、语音识别热词

### 覆盖组件类型（16种已提供精确prompt）

#### 对话类（6种）
| 中文名 | cType | 特殊字段 |
|--------|-------|----------|
| 对话朗读 | mid_dialog_repeat | question(去掉"朗读"), imgShowTimingList, audioFile/itemName |
| 对话表达 | mid_dialog_express | asrPrompt(热词), tip, corFeedback/errFeedback, question.desc, example |
| 对话选择 | mid_dialog_choose | optionList+needAudio, answer, corFeedback/errFeedback |
| 对话选读 | mid_dialog_select | optionList+needAudio+feedback(per-option) |
| 对话挖空 | mid_dialog_fillin | question(desc+content), optionGroupList, corFeedback/errFeedback |
| 对话组句 | mid_dialog_sentence | question(desc+content), optionList, answer(索引), tip, corFeedback/errFeedback |

#### 信息类（6种）
| 中文名 | cType | 特殊字段 |
|--------|-------|----------|
| 信息描写 | mid_message_trace | cDesc, trace, img, inputSet=[] |
| 信息拼词 | mid_message_spell | cDesc, inputConfig(stem+value), stemList, tip |
| 信息组句 | mid_message_combine | cDesc, optionList, answer(索引), tip |
| 信息补词 | mid_message_fillin | cDesc, inputConfig(stem+value), tip |
| 信息填词 | mid_message_word | cDesc, answer(数组), tip |
| 信息填句 | mid_message_sentence | cDesc, answerHint, tip |

#### 图片类（4种）
| 中文名 | cType | 特殊字段 |
|--------|-------|----------|
| 图片单选 | mid_image_choose | meaning, imageInfo(questionImg+answerImg), optionList({ID}_option_XX.png), answer, cDesc |
| 图片多选 | mid_image_multiple | 同上，answer为多个索引 |
| 图片有序 | mid_image_sequence | 同上，answer为排序索引 |
| 图片拖拽 | mid_image_drag | 同上，question可含content(音频) |

### 通用输出规则（所有类型）
- 输出必须在一行内完成，不要换行
- 不要使用markdown代码块包裹
- 输出内容必须是合法JSON，可直接用于 JSON.parse
- resourceMapping中id必须为int类型
- "无"的字段使用空数组[]或空对象{}
- imgShowTimingList对应关系：preDialog:情境引入、content:互动内容、feedback:互动反馈、postDialog:后置对话
- img字段值为"{ID}.png"（仅资源配置中存在图片时机时）
- audioFile字段值为"{ID}.mp3"（仅资源配置中存在音频载体时）
- "（音频）"标记 → needAudio:true
- "（正确）"标记 → answer索引，抽取时不包含标记本身

### 实现方案
- `prompts/prompt_registry.py` — 16种组件的prompt模板 + 结构化字段解析 + prompt构建
- `parse_script.py` 增强 — extract_section_character_map() + resolve_resource_mapping() + config_info列
- `generate_json.py` 重写 — 优先使用per-type prompt模板，无模板时回退到few-shot
- `pipeline.py` 更新 — 传递section_char_map到generate_component

### 参考文档
- 输入: https://makee-interactive.feishu.cn/wiki/Z3ydwGJnti4zaDkLXLNcGk3enod

---

## v3 resourceMapping补全 + LLM升级（已完成 2026-04-28）

> 来源: /root/.openclaw/prd/xiaoyan_comp_json/v3.md

### 核心需求

1. **resourceMapping字段补全**：所有互动类型都有resourceMapping字段，此前6种信息类（mid_message_*）
   的prompt模板中遗漏了该字段。已为全部6种信息类模板补充resourceMapping字段定义和角色配置输入。

2. **section-character映射验证**：确认每个组件的config_info（如"S1主线"）正确关联到角色ID：
   - S1-S14 → Eva:663, Peter:653, Vicky:658
   - S15-S16 → Eva:738, Peter:739
   - 实现：parse_script.py中extract_section_character_map()解析markdown表格，
     resolve_resource_mapping()根据config_info列的section编号查找对应角色ID

3. **LLM模型切换到doubao-seed-2.0-pro**：
   - 端点：ep-m-20260301164317-vmmj4
   - 关闭thinking模式（payload中设置 `thinking: {type: "disabled"}`）
   - 性能提升：单组件生成从~17s降至~4s

### 变更文件
- `prompts/prompt_registry.py` — 6种mid_message_*模板补充resourceMapping + INPUT_FIELDS补充角色配置
- `scripts/llm_client.py` — 新增doubao-seed-2.0-pro模型注册，设为默认，disable_thinking支持

---

## v3.1 语音识别热词自动生成（已完成 2026-04-28）

### 核心需求
对涉及语音识别的互动组件，基于教研配置上下文自动生成热词（asrPrompt）：
- **表达类**（mid_dialog_express）：LLM根据情境引入、互动内容、后置对话自动生成高频/难识别词汇，逗号连接
- **朗读类**：返回"无"

### 实现
- `scripts/generate_json.py` — 新增 `generate_asr_hotwords()` 函数 + `ASR_TYPES` 集合
- 在 `_generate_with_template()` 中，对 ASR_TYPES 类型在构建prompt前自动生成热词并注入 parsed_fields

---

## v4 核心互动组件支持（已完成 2026-04-28）

> 来源: /root/.openclaw/prd/xiaoyan_comp_json/v4.md

### 数据来源说明
**数据来源不变** — 仍然是剧本文档表格的"组件配置"列。多维表格（bitable）是旧的数据流程，
我们基于剧本文档进行自动化生产是新流程，目标是替换多维表格流程。

### 飞书多维表格读取经验（参考用）
已有能力通过 `feishu_client.py` 读取多维表格数据，可用于参考理解数据结构：
```python
from feishu_client import list_bitable_tables, read_bitable_records

# 列出表
tables = list_bitable_tables('H6DJweNkpigCbak2Y5LcTZ8Vnfb')
# 读取记录
records = read_bitable_records('H6DJweNkpigCbak2Y5LcTZ8Vnfb', 'tblAsmsV19vUnFb8', page_size=5)
# 每条记录: {"record_id": str, "fields": dict}
```

### 一. 合作阅读（core_reading_order）

#### 输入
剧本"组件配置"列 = "教研配置-任务" + "教研配置-材料" 拼接，包含以下【】section：
- 【任务标题】、【任务背景】、【通关知识】（来自教研配置-任务）
- 【阅读材料】（来自教研配置-材料）
- 【流程编排】、【角色配置】、【专有词汇】、【学习材料】等

#### 多维表格参考（合作阅读 bitable）
- wiki: H6DJweNkpigCbak2Y5LcTZ8Vnfb
- S3表: tblAsmsV19vUnFb8
- 字段列表: ID, 教研配置-任务, 教研配置-材料, 角色配置, 通关知识, 流程编排, 专有名词,
  阅读材料, 学习材料, 互动题目, 阅读材料格式化, 学习材料格式化, 学习过程配置,
  taskData, textData, sequenceData, learningData, kpInfo

#### 生成流水线（7步LLM调用）
```
教研配置-材料 ──┬──→ [Step 1] 阅读材料格式化 ──→ 材料正文
               └──→ [Step 2] 学习材料格式化 ──→ 学习内容(段落)
                                                    ↓
              [Step 3] 学习过程配置 ←── 文章材料(S1) + 学习内容(S2) + 专有词汇
                  │
    ┌─────────────┼─────────────┬─────────────┐
    ↓             ↓             ↓             ↓
[Step 4]      [Step 5]      [Step 6]      [Step 7]
taskData      textData    sequenceData  learningData
```

#### 4个最终JSON输出
- **taskData**: cType, cId, title, sceneDesc, img, key(通关知识), resourceMapping
- **textData**: text(材料正文), question(互动题目)
- **sequenceData**: sequence(流程编排→材料/对话/题目序列)
- **learningData**: closing, learningPart(段落+题目+反馈)

### 实现
- `scripts/match_component.py` — 注册 `core_reading_order` cType
- `prompts/core_reading_prompts.py` — 7步prompt模板 + `build_step_prompt()` + `CORE_READING_STEPS` 注册表
- `scripts/generate_json.py` — 新增:
  - `CORE_TYPES` 集合
  - `parse_core_reading_fields()` 从【】section提取各字段
  - `generate_core_reading_order()` 7步LLM调用编排器
  - `generate_component()` 增加核心互动分流逻辑，返回 taskData/textData/sequenceData/learningData
- `scripts/pipeline.py` — 核心互动结果写入多JSON字段，HTML报告传递 category
- `scripts/db_manager.py` — 新增5列: task_data_json, text_data_json, sequence_data_json, learning_data_json, intermediate_json + 自动迁移
- `scripts/html_report.py` — 核心互动卡片展示多JSON section + 中间结果 + 核心互动badge

### 验证
使用 bitable 样例数据 (ID=0325001) 端到端通过7步生成，所有JSON结构正确。

---

## v5 看图选词 + 口语快答 核心互动支持（已完成 2026-04-28）

> 来源: prd/v5.md

### 二. 看图选词（core_reading_imageDrag）

#### 输入
剧本"组件配置"列 = "教研-导览配置" + "教研-互动配置" 拼接，包含以下【】section：
- 【任务标题】、【任务背景】、【任务描述】、【通关知识】（来自教研-导览配置）
- 【阅读材料】、【互动问题】（来自教研-互动配置）

#### 多维表格参考
- wiki: MVo7wugWfimJPIkxhJCcqppFnyf
- 表: tblKl9CGmARjpw1O
- 字段: ID, 教研-导览配置, 教研-互动配置, 用户任务描述, 用户任务知识, 角色配置, 专有名词,
  学习流程配置, 互动描述, taskInfo, questionGroup, studyInfo, kpInfo

#### 生成流水线（5步LLM调用）
```
教研配置 ──┬──→ [Step 1] 学习流程配置 ──→ 中间文本
           └──→ [Step 2] 互动描述      ──→ 中间文本
                                              ↓
               [Step 3] taskInfo  ←── 用户任务描述 + 用户任务知识 + 角色配置 + 互动描述
               [Step 4] questionGroup ←── 互动配置(材料+问题)
               [Step 5] studyInfo     ←── 学习流程配置(S1)
```

#### 3个最终JSON输出
- **taskData**: cType, cId, title, taskDesc, sceneDesc, key(通关知识), resourceMapping, cDesc
- **questionGroupData**: [{ image, questionList: [{ type, npcName, content/title, desc, optionList, answer }] }]
- **studyData**: { learningPart: [{ image, learning: [{ question, optionList(+feedback), answer }] }], closing }

### 三. 口语快答（core_speaking_reply）

#### 输入
剧本"组件配置"列 = "教研-用户视角任务信息" + "教研-任务规则与NPC设定" 拼接，包含以下【】section：
- 【任务标题】、【任务背景】、【任务描述】、【通关知识】（用户视角任务信息）
- 【对话角色】、【回合设定】、【任务设定】、【示例对话】、【通过规则】（任务规则与NPC设定）

#### 多维表格参考
- wiki: TSwcw0nFmi21khkpUndchNMsn6f
- 表: tbl4Qg8d45O58Cqf
- 字段: ID, 教研-用户视角任务信息, 教研-任务规则与NPC设定, 用户任务描述, 用户任务知识,
  示例对话, 角色配置, 对话角色及回合设定, 通过规则, 任务设定, 任务背景,
  学习流程配置, promptInfo配置, 语音识别热词, taskData, settingData, configData, learningData, kpInfo

#### 生成流水线（7步LLM调用）
```
教研配置 ──┬──→ [Step 1] 学习流程配置   ──→ 中间文本
           ├──→ [Step 2] promptInfo配置  ──→ 中间文本
           └──→ [Step 3] 语音识别热词    ──→ 中间文本
                                               ↓
               [Step 4] taskData     ←── 用户任务描述 + 用户任务知识 + 角色配置
               [Step 5] settingData  ←── 对话配置(角色+回合)
               [Step 6] configData   ←── 热词(S3) + 背景 + promptInfo(S2) + 示例对话 + 通过规则
               [Step 7] learningData ←── 学习流程配置(S1)
```

#### 4个最终JSON输出
- **taskData**: cType, cId, title, taskDesc, sceneDesc, img, key(通关知识), resourceMapping
- **settingData**: { setting: { npcName, round, checkRound } }
- **configData**: { config: { asrPrompt, promptInfo: { default, scene, in_progress_goal, final_goal, reference_dialog, user_task, user_scene, user_knowledge } } }
- **learningData**: { learningPart: { opening, wrongReadLeadIn, learning: [{ question, optionList(+feedback), answer, read, feedback }], closing } }

### 实现
- `scripts/match_component.py` — 注册 `core_reading_imageDrag` + `core_speaking_reply` cType 及 db_table
- `prompts/core_imagedrag_prompts.py` — 5步prompt模板 (2中间+3最终JSON)
- `prompts/core_speaking_prompts.py` — 7步prompt模板 (3中间+4最终JSON)
- `scripts/generate_json.py` — 新增:
  - `parse_core_imagedrag_fields()` / `parse_core_speaking_fields()` 字段解析器
  - `generate_core_reading_imagedrag()` 5步LLM编排器
  - `generate_core_speaking_reply()` 7步LLM编排器
  - `generate_component()` 增加两种新核心类型分流
  - `CORE_TYPES` 集合新增两种类型
- `scripts/pipeline.py` — 核心互动结果写入多JSON字段 (questionGroupData/studyData/settingData/configData)
- `scripts/html_report.py` — 核心互动卡片展示全部JSON section
- `scripts/db_manager.py` — 新增4列: question_group_json, study_data_json, setting_data_json, config_data_json + 自动迁移 + allowed_fields

### 验证
- 看图选词 (ID=1201001): 5步生成全部通过，taskData/questionGroupData/studyData 结构正确，耗时~47s
- 口语快答 (ID=0325001): 7步生成全部通过，taskData/settingData/configData/learningData 结构正确，耗时~90s
- HTML验证报告: `outputs/V5核心互动验证 - imageDrag + speaking`
