diff --git a/business_production/组件配置/interactive-component-json/db/components.db b/business_production/组件配置/interactive-component-json/db/components.db index bd83b2e..e32e019 100644 Binary files a/business_production/组件配置/interactive-component-json/db/components.db and b/business_production/组件配置/interactive-component-json/db/components.db differ diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L1 摩托怪客_20260520_175745.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L1 摩托怪客_20260520_175745.html new file mode 100644 index 0000000..92fc7fd --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L1 摩托怪客_20260520_175745.html @@ -0,0 +1,4061 @@ + + + + + +L1-S2-U17-L1 摩托怪客 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U17-L1 摩托怪客

+
+ 生成时间: 2026-05-20 17:57:45 + 模型: doubao-seed-2.0-pro + Wiki: EAIsw9LBMiIaGfkDAyOc9qrqnoc +
+
+ +
+
+
0
核心互动
+
16
中互动
+
+
16
总组件
+
14
成功
+
0
失败
+ +
+ + +
+
+ 1 + 图片无序多选 + cId: 1217101 + ? + + + 跳过 + +
+
+
跳过: 未知组件类型: '图片无序多选' (清理后: '图片无序多选')
+
+ +
+
原始组件配置 (可编辑后点击"执行重新生成")
+ + +
+
+
+ +
+
+ 2 + 对话朗读 + cId: 1217102 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 对话挖空 + cId: 1217103 + mid_dialog_fillin + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话挖空 + cId: 1217104 + mid_dialog_fillin + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话朗读 + cId: 1217105 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话挖空 + cId: 1217106 + mid_dialog_fillin + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话选择 + cId: 1217107 + mid_dialog_choose + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 对话朗读 + cId: 1217108 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 9 + 对话组句 + cId: 1217109 + mid_dialog_sentence + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 对话选读 + cId: 1217110 + mid_dialog_select + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 对话朗读 + cId: 1217111 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话选择 + cId: 1217112 + mid_dialog_choose + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话组句 + cId: 1217113 + mid_dialog_sentence + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 对话朗读 + cId: 1217114 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 阅读理解 + cId: 1217115 + ? + + + 跳过 + +
+
+
跳过: 未知组件类型: '阅读理解' (清理后: '阅读理解')
+
+ +
+
原始组件配置 (可编辑后点击"执行重新生成")
+ + +
+
+
+ +
+
+ 16 + 对话选读 + cId: 1217116 + mid_dialog_select + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L1 摩托怪客_20260520_180451.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L1 摩托怪客_20260520_180451.html new file mode 100644 index 0000000..1bf05e0 --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L1 摩托怪客_20260520_180451.html @@ -0,0 +1,5093 @@ + + + + + +L1-S2-U17-L1 摩托怪客 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U17-L1 摩托怪客

+
+ 生成时间: 2026-05-20 18:04:51 + 模型: doubao-seed-2.0-pro + Wiki: EAIsw9LBMiIaGfkDAyOc9qrqnoc +
+
+ +
+
+
1
核心互动
+
15
中互动
+
+
16
总组件
+
16
成功
+
0
失败
+ +
+ + +
+
+ 1 + 图片无序多选 + cId: 1217101 + mid_image_multiple + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话朗读 + cId: 1217102 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 对话挖空 + cId: 1217103 + mid_dialog_fillin + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话挖空 + cId: 1217104 + mid_dialog_fillin + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话朗读 + cId: 1217105 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 对话挖空 + cId: 1217106 + mid_dialog_fillin + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话选择 + cId: 1217107 + mid_dialog_choose + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 对话朗读 + cId: 1217108 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 9 + 对话组句 + cId: 1217109 + mid_dialog_sentence + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 对话选读 + cId: 1217110 + mid_dialog_select + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 对话朗读 + cId: 1217111 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话选择 + cId: 1217112 + mid_dialog_choose + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 对话组句 + cId: 1217113 + mid_dialog_sentence + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 14 + 对话朗读 + cId: 1217114 + mid_dialog_repeat + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 核心阅读理解 + cId: 1217115 + core_reading_imageDrag + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
taskDesc
sceneDesc
key
resourceMapping
cDesc
+
+ +
+ +
+ +
+
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
+ +
+
+ +
+ +
+ + + + + + + +
learningPart
closing
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+ +
+ +
```
+# 小题 1
+## 材料内容
+【展示该小题对应的图片 ID:1217115_01.png】
+
+## 互动题目
+### 1. 句意选词题
+Brainy:小朋友你好呀,这道题我们要认识两个新的单词哦,我们先来看看哪个单词的意思是“人”,可以用来回答“谁从镇外来了”这个问题吧~
+- 选项 A:purple
+  Brainy:purple的意思是“紫色”哦,这句话问的是“谁从镇外来了”,回答的应该是人,所以这个选项不合适,你再试试呀~
+- 选项 B:people [正确]
+  Brainy:答对啦!people的意思就是“人”,你太棒啦,已经学会这个单词的意思啦~
+
+### 2. 原题降级
+Brainy:现在我们来看这道题哦,Tom问的是“谁从镇外来了”,我们需要选正确的单词填进去,回答“是这两个人”。
+- 选项 A:people [正确]
+  Brainy:答对啦!填进去之后句子就是These two people,意思是这两个人,刚好回答了谁从镇外来的问题哦,现在试着大声把这个句子读出来吧~
+- 选项 B:purple
+  Brainy:purple是紫色的意思,不能用来表示人哦,结合问题想想我们要回答的是人物,再选一次吧~
+
+---
+# 小题 2
+## 材料内容
+【展示该小题对应的图片 ID:1217115_01.png】
+
+## 互动题目
+### 1. 句意选词题
+Brainy:这道题我们要考查的是交通工具相关的单词哦,我们先来找一找哪个单词是“摩托车”的意思吧~
+- 选项 A:bicycles
+  Brainy:bicycles的意思是“自行车”哦,不是我们要找的摩托车,再试试看呀~
+- 选项 B:motorbikes [正确]
+  Brainy:太对啦!motorbikes的意思就是“摩托车”,你记得很准确哦~
+- 选项 C:a bus
+  Brainy:a bus的意思是“一辆公交车”,和我们要找的单词意思不一样哦,再试一次吧~
+
+### 2. 原题降级
+Brainy:现在来看题目哦,Tom问的是“他们骑的是什么”,你要选对他们骑的交通工具哦。
+- 选项 A:motorbikes [正确]
+  Brainy:答对啦!他们骑的就是摩托车,这个回答完全符合问题哦,现在试着大声把motorbikes读出来吧~
+- 选项 B:bicycles
+  Brainy:bicycles是自行车,他们骑的不是自行车哦,看看图片里他们的交通工具,再选一次吧~
+- 选项 C:a bus
+  Brainy:a bus是公交车,坐公交车不需要骑哦,不符合问题里的“ride(骑)”这个动作,再想想呀~
+
+---
+# 小题 3
+## 材料内容
+【展示该小题对应的图片 ID:1217115_01.png】
+
+## 互动题目
+### 1. 句意选词题
+Brainy:这道题我们要考查动词的意思哦,先来看看哪个单词的意思是“展示、给……看”吧~
+- 选项 A:show [正确]
+  Brainy:答对啦!show就是“展示、给……看”的意思,你掌握得很好哦~
+- 选项 B:shake
+  Brainy:shake的意思是“摇晃、抖动”,不是我们要找的意思哦,再试试吧~
+- 选项 C:shower
+  Brainy:shower的意思是“洗澡、淋浴”,和我们要找的单词意思不一样哦,再试一次呀~
+
+### 2. 原题降级
+Brainy:现在来看题目哦,Tom问的是“你想让他们做什么”,我们要选正确的动词,表达“给我们看看他们的包”的意思。
+- 选项 A:show [正确]
+  Brainy:答对啦!show us their bags就是“给我们看看他们的包”,刚好回答了问题哦,现在试着大声把这句话读出来吧~
+- 选项 B:shake
+  Brainy:shake是摇晃的意思,“摇晃我们的包”不符合这里的语境哦,再想想你想让他们对包做什么动作呀~
+- 选项 C:shower
+  Brainy:shower是洗澡的意思,不能和包搭配哦,再选一次吧~
+
+---
+# 完结反馈
+Brainy:太棒了!你已经顺利完成了所有的题目,复习了people、motorbike、show这些核心单词,还学会了怎么在对话里使用它们哦,你的英语又进步啦,继续加油呀~
+```
+
+ +
+ +
We start to tell Mayor Tom what just happened, first explaining that the two people who came from out of town are the strangers we met earlier.(我们开始告诉镇长汤姆刚刚发生的事,首先说明从镇外来的是我们之前遇到的那两个人。)
+We then tell Tom that the two strangers rode motorbikes when they arrived in the town, which is why we call them motorbike weirdos.(接着我们告诉汤姆那两个陌生人来镇上的时候骑的是摩托车,这也是我们叫他们摩托怪客的原因。)
+We add that we hope these strangers can show us their bags, because we're very curious about what's inside the mysterious parcels they carry.(我们还补充说我们希望这些陌生人能给我们看看他们的包,因为我们很好奇他们带的神秘包裹里装着什么。)
+
+
+ + +
+
+ +
+
+ 16 + 对话选读 + cId: 1217116 + mid_dialog_select + + + + + 生成成功 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
optionList
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L4 门关啦_20260520_191338.html b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L4 门关啦_20260520_191338.html new file mode 100644 index 0000000..3527d39 --- /dev/null +++ b/business_production/组件配置/interactive-component-json/outputs/L1-S2-U17-L4 门关啦_20260520_191338.html @@ -0,0 +1,4258 @@ + + + + + +L1-S2-U17-L4 门关啦 — 组件JSON报告 + + + + + +
+ + +
+
+
就绪
+
+
+ 成功: 0 + 失败: 0 +
+
+ +
+
+

L1-S2-U17-L4 门关啦

+
+ 生成时间: 2026-05-20 19:13:38 + 模型: doubao-seed-2.0-pro + Wiki: SAadwW8YaiObl8k4op3c6vs8nqb +
+
+ +
+
+
0
核心互动
+
16
中互动
+
+
16
总组件
+
15
成功
+
0
失败
+ +
+ + +
+
+ 1 + 对话朗读 + cId: 1217401 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 2 + 对话朗读 + cId: 1217402 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 3 + 对话朗读 + cId: 1217403 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 4 + 对话挖空 + cId: 1217404 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 5 + 对话挖空 + cId: 1217405 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 6 + 图片单选 + cId: 1217406 + mid_image_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
meaning
resourceMapping
question
imageInfo
optionList
answer
preDialog
tip
corFeedback
errFeedback
postDialog
cDesc
img
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 7 + 对话朗读 + cId: 1217407 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 8 + 对话选择 + cId: 1217408 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 9 + 对话选择 + cId: 1217409 + mid_dialog_choose + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
optionList
answer
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 10 + 对话挖空 + cId: 1217410 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 11 + 对话组句 + cId: 1217411 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 12 + 对话组句 + cId: 1217412 + mid_dialog_sentence + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionList
answer
tip
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 13 + 看图拼词 + cId: 1217413 + ? + + + 跳过 + +
+
+
跳过: 未知组件类型: '看图拼词' (清理后: '看图拼词')
+
+ +
+
原始组件配置 (可编辑后点击"执行重新生成")
+ + +
+
+
+ +
+
+ 14 + 对话挖空 + cId: 1217414 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 15 + 对话挖空 + cId: 1217415 + mid_dialog_fillin + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
img
question
optionGroupList
corFeedback
errFeedback
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ +
+
+ 16 + 对话朗读 + cId: 1217416 + mid_dialog_repeat + + + + + 已保存 + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cType
cId
title
resourceMapping
preDialog
imgShowTimingList
question
postDialog
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
pushType
cType
cId
kpInfo
+
+ +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/business_production/组件配置/interactive-component-json/scripts/__pycache__/feishu_client.cpython-312.pyc b/business_production/组件配置/interactive-component-json/scripts/__pycache__/feishu_client.cpython-312.pyc index 720d8fe..9f9cf74 100644 Binary files a/business_production/组件配置/interactive-component-json/scripts/__pycache__/feishu_client.cpython-312.pyc and b/business_production/组件配置/interactive-component-json/scripts/__pycache__/feishu_client.cpython-312.pyc differ diff --git a/business_production/组件配置/interactive-component-json/scripts/__pycache__/match_component.cpython-312.pyc b/business_production/组件配置/interactive-component-json/scripts/__pycache__/match_component.cpython-312.pyc index 62d769b..2089676 100644 Binary files a/business_production/组件配置/interactive-component-json/scripts/__pycache__/match_component.cpython-312.pyc and b/business_production/组件配置/interactive-component-json/scripts/__pycache__/match_component.cpython-312.pyc differ diff --git a/business_production/组件配置/interactive-component-json/scripts/__pycache__/parse_script.cpython-312.pyc b/business_production/组件配置/interactive-component-json/scripts/__pycache__/parse_script.cpython-312.pyc index e296059..1a1aca1 100644 Binary files a/business_production/组件配置/interactive-component-json/scripts/__pycache__/parse_script.cpython-312.pyc and b/business_production/组件配置/interactive-component-json/scripts/__pycache__/parse_script.cpython-312.pyc differ diff --git a/business_production/组件配置/interactive-component-json/scripts/feishu_client.py b/business_production/组件配置/interactive-component-json/scripts/feishu_client.py index 5c0f7ea..566a6d4 100644 --- a/business_production/组件配置/interactive-component-json/scripts/feishu_client.py +++ b/business_production/组件配置/interactive-component-json/scripts/feishu_client.py @@ -71,8 +71,9 @@ def get_wiki_node(wiki_token): """ env = os.environ.copy() env["LARKSUITE_CLI_CONFIG_DIR"] = LARK_CLI_CONFIG_DIR + env["PATH"] = "/root/.nvm/versions/node/v24.14.0/bin:" + env.get("PATH", "") result = subprocess.run( - ["lark-cli", "wiki", "spaces", "get_node", + ["/root/.nvm/versions/node/v24.14.0/bin/lark-cli", "wiki", "spaces", "get_node", "--params", json.dumps({"token": wiki_token}), "--as", "bot"], capture_output=True, text=True, env=env, timeout=30, @@ -98,8 +99,9 @@ def fetch_doc_markdown(obj_token): """ env = os.environ.copy() env["LARKSUITE_CLI_CONFIG_DIR"] = LARK_CLI_CONFIG_DIR + env["PATH"] = "/root/.nvm/versions/node/v24.14.0/bin:" + env.get("PATH", "") result = subprocess.run( - ["lark-cli", "docs", "+fetch", "--doc", obj_token, "--as", "bot"], + ["/root/.nvm/versions/node/v24.14.0/bin/lark-cli", "docs", "+fetch", "--doc", obj_token, "--as", "bot"], capture_output=True, text=True, env=env, timeout=60, ) if result.returncode != 0: diff --git a/business_production/组件配置/interactive-component-json/scripts/match_component.py b/business_production/组件配置/interactive-component-json/scripts/match_component.py index 79f0694..521e934 100644 --- a/business_production/组件配置/interactive-component-json/scripts/match_component.py +++ b/business_production/组件配置/interactive-component-json/scripts/match_component.py @@ -25,6 +25,7 @@ MID_INTERACTION_TYPES = { "图片互动": {"cType": "mid_vocab_image", "bitable": "VJ1kb9xp8amX8PskntmcLhjpnQe"}, "图片单选": {"cType": "mid_image_choose", "bitable": "XyIVbYciraBkoasJtV1c3N5Gnhh"}, "图片多选": {"cType": "mid_image_multiple", "bitable": "XZo5bwagdau3VvsTDL9cJPrInQd"}, + "图片无序多选": {"cType": "mid_image_multiple", "bitable": "XZo5bwagdau3VvsTDL9cJPrInQd"}, "图片有序": {"cType": "mid_image_sequence", "bitable": "BZWebQROpagkJ0sxArGcsBjwnCU"}, "图片拖拽": {"cType": "mid_image_drag", "bitable": "Qqq9bVv19aH6LisRrsVcvf6xnqe"}, "材料互动": {"cType": "mid_sentence_material", "bitable": "Yd84buD91aGxyqstpXqceftHnvM"}, @@ -41,6 +42,7 @@ MID_INTERACTION_TYPES = { CORE_INTERACTION_TYPES = { "合作阅读": {"cType": "core_reading_order", "bitable_wiki": "H6DJweNkpigCbak2Y5LcTZ8Vnfb"}, "看图选词": {"cType": "core_reading_imageDrag", "bitable_wiki": "MVo7wugWfimJPIkxhJCcqppFnyf", "db_table": "tblKl9CGmARjpw1O"}, + "阅读理解": {"cType": "core_reading_imageDrag", "bitable_wiki": "MVo7wugWfimJPIkxhJCcqppFnyf", "db_table": "tblKl9CGmARjpw1O"}, "口语快答": {"cType": "core_speaking_reply", "bitable_wiki": "TSwcw0nFmi21khkpUndchNMsn6f", "db_table": "tbl4Qg8d45O58Cqf"}, "口语独白": {"cType": None, "bitable_wiki": "G20HwcF1uideNokLsHWcBs3znvg"}, "口语妙问": {"cType": "core_speaking_inquiry", "bitable_wiki": "GJUVwNSEkis3EXkrVj0ccbqdn8c", "db_table": "tbl1Q68oopST9Mel"}, diff --git a/business_production/组件配置/interactive-component-json/scripts/parse_script.py b/business_production/组件配置/interactive-component-json/scripts/parse_script.py index b156530..5f47154 100644 --- a/business_production/组件配置/interactive-component-json/scripts/parse_script.py +++ b/business_production/组件配置/interactive-component-json/scripts/parse_script.py @@ -594,6 +594,31 @@ def parse_sheet_rows(sheet_rows, llm_client=None): "has_image": has_image, } + # 如果类型列中没有嵌入式 ID,尝试从配置信息列提取 cId + if comp_info is None and config_info_col is not None: + raw_cfg = str(row[config_info_col]).strip() if len(row) > config_info_col and row[config_info_col] else "" + if raw_cfg: + # 配置信息列格式: 多行文本,其中一行是纯数字ID + cfg_lines = [l.strip() for l in raw_cfg.split('\n') if l.strip()] + cfg_cid = None + cfg_type = None + for line in cfg_lines: + if re.match(r'^\d{5,}$', line): + cfg_cid = line + # 类型名通常是 ID 的上一行 + idx = cfg_lines.index(line) + if idx > 0: + cfg_type = cfg_lines[idx - 1] + break + if cfg_cid and cfg_type: + has_image = "+图片" in cfg_type or "-配图" in cfg_type or "+图片" in str(type_cell) or "-配图" in str(type_cell) + clean_type = cfg_type.replace("+图片", "").replace("-配图", "").strip() + comp_info = { + "type_name": clean_type, + "cId": cfg_cid, + "has_image": has_image, + } + if comp_info is None: continue diff --git a/business_production/英文台词/memory/2026-05-20.md b/business_production/英文台词/memory/2026-05-20.md new file mode 100644 index 0000000..0a7aa86 --- /dev/null +++ b/business_production/英文台词/memory/2026-05-20.md @@ -0,0 +1,28 @@ +# 英文台词生产 — 2026-05-20 + +## [童瑶] L1-S2-U17-L2 迟到的包裹 — 英文台词润色 + +### 文档信息 +- **飞书链接:** https://makee-interactive.feishu.cn/wiki/IhDYwITBfii8cxkWsG1c0JWHnQh +- **文档名称:** L1-S2-U17-L2 迟到的包裹 +- **知识空间ID:** 7412143055920414722 +- **内嵌Sheet:** Q8AyX5 (剧本表格,185行×10列) + +### 知识点 +- **词汇:** get (v, 收到), month (n, 月), year (n, 年), ago (adv, 以前) +- **句型:** ... be happy with ... / ... month(s)/year(s) ago. + +### 处理结果 +- ✅ 对话行:134/134 全部润色完成,写入H列(英文台词) +- ✅ 难度等级:S2(5-6岁儿童) +- ✅ 处理规则:句长≤8词、英式拼写、半角标点、口语化、知识点保留 + +### 主要润色模式 +1. 缩略形式:I am → I'm, you are → you're, it is → it's, that is → that's +2. 长句拆分:8词以上句子拆为短句 +3. 语法修复:thow→throw, with out→without, forget→forgot, a old→old, Speedy Monkey do→does +4. 自然化:去掉冗余词(to write with → 删除),补充冠词(have package → have a package) +5. 知识点保留:get/month/year/ago/be happy with 全部原样保留 + +### 列结构 +- A: 类型 | B: ID | C: 组件配置 | D: 剧情描述 | E: 角色名 | F: 编剧台词 | G: 角色名 | **H: 英文台词** | I: 知识点 | J: 配置信息 diff --git a/business_production/英文台词/scripts/produce_l5_en.py b/business_production/英文台词/scripts/produce_l5_en.py new file mode 100644 index 0000000..884767a --- /dev/null +++ b/business_production/英文台词/scripts/produce_l5_en.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +""" +L1-S2-U17-L5 笨蛋坏蛋? — 英文台词批量生产 +读取 F 列(编剧台词) → LLM 润色 → 写入 G 列(英文台词) +""" + +import json +import subprocess +import sys +import os +import re +import time + +# Import LLM client +sys.path.insert(0, '/root/.openclaw/workspace-xiaoyan/business_production/组件配置/interactive-component-json/scripts') +from llm_client import LLMClient + +# Knowledge points for L1-S2-U17-L5 +KNOWLEDGE_WORDS = ["talk", "understand", "point", "a lot of"] + +SYSTEM_PROMPT = """You are an English script polisher for children's educational content (ages 6-8, L2 English learners). + +## TASK +Polish the given Chinese-created English line. The lines are already in English but need polishing for naturalness, brevity, and kid-friendliness. + +## STRICT RULES +1. **Preserve knowledge point words**: "talk", "understand", "point", "a lot of" MUST appear in the output if the input has them. Do NOT replace or delete them. +2. **Sentence length**: ≤ 8 words per sentence. Split longer sentences with periods or exclamation marks. +3. **British spelling**: colour (not color), centre (not center), realise (not realize), travelling (not traveling), favourite (not favorite), neighbour (not neighbor). +4. **Colloquial**: Use natural spoken English. Add kid-friendly interjections where natural: Haha, Oops, Uh-oh, Oh, Hey, Well, Hmm, Wow, Oh boy. +5. **Match emotion**: Match the character's current mood through word choice and punctuation. +6. **No Markdown**: Plain text only. No **bold**, *italic*, etc. +7. **For robot "Bip bop" lines**: Keep them exactly as-is. Do NOT change robot sounds. +8. **Output ONLY the polished English line**: No row numbers, no labels, no explanations, no Chinese — just the line. +9. **Do not add content**: Don't add words or ideas not in the original. +10. **Preserve meaning**: Keep the original intent and information. + +## CHARACTER VOICES +- **Ben**: Excitable, impulsive boy → short, bouncy sentences; uses exclamation marks +- **User**: Calm, thoughtful child → measured, careful speech +- **Tom**: Adult mayor → calm, kind, authoritative +- **11/Robot**: Simple/broken English + "Bip bop" sounds +- **Jay & Lin**: Sad Speedy Monkey employees → emotional, hurt + +## EPISODE CONTEXT +Classroom. Ben and User discover a bear robot. They think it's a spy. Turns out it's a helper robot — a gift from Speedy Monkey. Jay and Lin are sad because everyone judges them by looks. + +## FORMAT (MANDATORY) +For every input, output EXACTLY ONE polished line. No line numbers, no prefixes, no explanations. +For each input line, output your polished version on a new line.""" + +def get_token(): + """Get feishu tenant access token""" + r = subprocess.run([ + 'curl', '-s', '-X', 'POST', + 'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal', + '-H', 'Content-Type: application/json', + '-d', '{"app_id":"cli_a931175d41799cc7","app_secret":"Iw2vEfbjT6GtV0GhbxbZqfQ4nAPtbR14"}' + ], capture_output=True, text=True, timeout=10) + return json.loads(r.stdout)['tenant_access_token'] + +def write_cell(token, row, value): + """Write a single cell to G column""" + range_str = f"wMQVyV!G{row}:G{row}" + result = subprocess.run([ + 'curl', '-s', '-X', 'PUT', + 'https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/DCcKsLbrmhfXgrtB7N2c9GA4ntf/values', + '-H', 'Content-Type: application/json', + '-H', f'Authorization: Bearer {token}', + '-d', json.dumps({"valueRange": {"range": range_str, "values": [[value]]}}) + ], capture_output=True, text=True, timeout=10) + return json.loads(result.stdout).get('code', -1) == 0 + +def verify_cell(token, row, expected): + """Verify a cell value""" + range_str = f"wMQVyV!G{row}:G{row}" + result = subprocess.run([ + 'curl', '-s', + f'https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/DCcKsLbrmhfXgrtB7N2c9GA4ntf/values/{range_str}?valueRenderOption=ToString', + '-H', f'Authorization: Bearer {token}' + ], capture_output=True, text=True, timeout=10) + try: + values = json.loads(result.stdout).get('data', {}).get('valueRange', {}).get('values', []) + if values and values[0]: + return values[0][0].strip() == expected.strip() + except: + pass + return False + +def main(): + # Load data + with open('/tmp/l5_need_work.json') as f: + items = json.load(f) + + print(f"Total rows to process: {len(items)}") + + # Init LLM + llm = LLMClient() + token = get_token() + + # Process in batches of 10 + batch_size = 10 + total_batches = (len(items) + batch_size - 1) // batch_size + written = 0 + failed = 0 + + for bi in range(0, len(items), batch_size): + batch = items[bi:bi + batch_size] + bn = bi // batch_size + 1 + print(f"\n{'='*60}") + print(f"Batch {bn}/{total_batches} ({len(batch)} rows)") + print(f"{'='*60}") + + # Build prompt: numbered list + prompt_lines = [] + for idx, item in enumerate(batch): + prompt_lines.append(f"[{idx+1}] {item['character']}: {item['cn_line']}") + user_prompt = "\n".join(prompt_lines) + + # Call LLM + try: + content, usage = llm.call(SYSTEM_PROMPT, user_prompt, max_tokens=2000, temperature=0.2) + print(f" Tokens: {usage['prompt_tokens']}+{usage['completion_tokens']}") + except Exception as e: + print(f" ❌ LLM call failed: {e}") + # Use original lines as fallback + for item in batch: + success = write_cell(token, item['row'], item['cn_line']) + failed += len(batch) + continue + + # Parse response + lines = content.strip().split('\n') + parsed = [l.strip() for l in lines if l.strip()] + + # Match parsed lines to batch items + # Strategy: remove [N] prefixes if present, then match by position + cleaned = [] + for l in parsed: + # Remove [N] or N. prefix + l = re.sub(r'^\[\d+\]\s*', '', l) + l = re.sub(r'^\d+[\.\)]\s*', '', l) + l = l.strip() + if l: + cleaned.append(l) + + # Write + for idx, item in enumerate(batch): + if idx < len(cleaned) and cleaned[idx]: + en_line = cleaned[idx] + else: + en_line = item['cn_line'] # fallback + + # Clean up any trailing punctuation artifacts + en_line = en_line.strip().strip('"').strip("'") + + success = write_cell(token, item['row'], en_line) + if success: + written += 1 + print(f" ✅ R{item['row']:4d} | {item['character']:8s} → {en_line[:70]}") + else: + failed += 1 + print(f" ❌ R{item['row']:4d} | write failed") + + # Rate limit + time.sleep(0.5) + + # Summary + print(f"\n{'='*60}") + print(f"🎉 Done! Written: {written}, Failed: {failed}, Total: {len(items)}") + print(f"{'='*60}") + + # Final count verification + range_str = "wMQVyV!G1:G190" + result = subprocess.run([ + 'curl', '-s', + f'https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/DCcKsLbrmhfXgrtB7N2c9GA4ntf/values/{range_str}?valueRenderOption=ToString', + '-H', f'Authorization: Bearer {token}' + ], capture_output=True, text=True, timeout=10) + values = json.loads(result.stdout).get('data', {}).get('valueRange', {}).get('values', []) + filled = sum(1 for v in values if v and v[0] and str(v[0]).strip()) + print(f"Total G column non-empty cells: {filled}") + +if __name__ == '__main__': + main() diff --git a/memory/.dreams/events.jsonl b/memory/.dreams/events.jsonl index 0209f4b..deb9098 100644 --- a/memory/.dreams/events.jsonl +++ b/memory/.dreams/events.jsonl @@ -33,3 +33,5 @@ {"type":"memory.recall.recorded","timestamp":"2026-05-19T01:21:22.997Z","query":"口语-P4 看图识物 bitable 多维表格","resultCount":5,"results":[{"path":"memory/2026-05-14.md","startLine":123,"endLine":144,"score":1},{"path":"memory/2026-05-14.md","startLine":64,"endLine":93,"score":1},{"path":"memory/2026-05-14.md","startLine":138,"endLine":165,"score":1},{"path":"memory/2026-05-13.md","startLine":1,"endLine":29,"score":1},{"path":"memory/2026-05-18.md","startLine":1,"endLine":27,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-19T03:08:27.099Z","query":"能力标签 标准体系 ability label 认知 口语 话题讨论 看图回答","resultCount":5,"results":[{"path":"memory/2026-05-18.md","startLine":702,"endLine":726,"score":1},{"path":"memory/2026-05-18.md","startLine":672,"endLine":707,"score":1},{"path":"memory/2026-05-12.md","startLine":170,"endLine":193,"score":1},{"path":"memory/2026-05-07.md","startLine":337,"endLine":356,"score":1},{"path":"memory/2026-05-12.md","startLine":76,"endLine":95,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-19T03:08:50.132Z","query":"标准能力标签 口语 ability label 基础信息表达 表达喜好 互动应答 口语P1","resultCount":4,"results":[{"path":"memory/2026-05-12.md","startLine":170,"endLine":193,"score":1},{"path":"memory/2026-05-12.md","startLine":206,"endLine":226,"score":1},{"path":"memory/2026-05-18.md","startLine":702,"endLine":726,"score":1},{"path":"memory/2026-05-18.md","startLine":672,"endLine":707,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-20T06:31:39.981Z","query":"英文台词生产 对话台词 优化规则","resultCount":5,"results":[{"path":"memory/2026-05-18.md","startLine":793,"endLine":810,"score":1},{"path":"memory/2026-05-08.md","startLine":33,"endLine":55,"score":1},{"path":"memory/2026-05-08.md","startLine":18,"endLine":38,"score":1},{"path":"memory/2026-05-18.md","startLine":440,"endLine":486,"score":1},{"path":"memory/2026-05-18.md","startLine":583,"endLine":633,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-20T11:03:34.460Z","query":"内容后台 bitable 组件配置 多维表格","resultCount":4,"results":[{"path":"memory/2026-05-12.md","startLine":108,"endLine":126,"score":1},{"path":"memory/2026-05-12.md","startLine":64,"endLine":83,"score":1},{"path":"memory/2026-05-12.md","startLine":48,"endLine":68,"score":1},{"path":"memory/2026-05-18.md","startLine":305,"endLine":346,"score":1}]} diff --git a/memory/.dreams/short-term-recall.json b/memory/.dreams/short-term-recall.json index 0967821..2d56503 100644 --- a/memory/.dreams/short-term-recall.json +++ b/memory/.dreams/short-term-recall.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-05-19T03:08:50.132Z", + "updatedAt": "2026-05-20T11:03:34.460Z", "entries": { "memory:memory/2026-05-07.md:57:74": { "key": "memory:memory/2026-05-07.md:57:74", @@ -181,24 +181,26 @@ "endLine": 55, "source": "memory", "snippet": "**图片资源新规:** - 每个题组共享一张图(非每题独立配图) - 产出 JSON 同时输出图片描述 prompt(英文,卡通简线条风格) - prompt 写入 bitable `图片描述` 列,格式 `{\"first\": \"...\", \"second\": \"...\"}` **通用化写入流程:** - 单元挑战全题型适用:定位 bitable 表 → 创建/更新记录 → 写入 `题目集合 ID` + `jsonData` + `图片描述` - 各题型仅 jsonData 结构不同,写入流程统一 **重写文件:** - `business_production/单元挑战/skills/unit_challenge/questions/writing/common/writing_pic_qa/SKILL.md`(11节完整规范) - `business_production/单元挑战/skills/unit_challenge/questions/writing/writing_pic_qa/SKILL.md`(简化为快速入口) **bitable 更新:** 已将新 JSON(每题组1图2题)+ 图片描述写入 `recviZlAxxXlAb` ### 刘彦江 (ou_5af74c1fb96042e33cc0f16b5ca02cf4) — 图片描述格式修正 - **时间:** 09:46 ~ 09:51 - **修正:** 用户给出中文样例格式,要求图片描述从英文 prompt 改为纯中文结构化列表 - **新格式:** 编号 `1.` / `2.` 自上而下,每段", - "recallCount": 5, + "recallCount": 6, "dailyCount": 0, "groundedCount": 0, - "totalScore": 5, + "totalScore": 6, "maxScore": 1, "firstRecalledAt": "2026-05-11T02:19:37.985Z", - "lastRecalledAt": "2026-05-18T08:44:36.808Z", + "lastRecalledAt": "2026-05-20T06:31:39.981Z", "queryHashes": [ "6f88450e9f9b", "be437071312f", "11ea0881b126", "08b6f3142a2b", - "d3bb2a2fd2ad" + "d3bb2a2fd2ad", + "688d2dceca9d" ], "recallDays": [ "2026-05-11", "2026-05-13", - "2026-05-18" + "2026-05-18", + "2026-05-20" ], "conceptTags": [ "创建/更新记录", @@ -1379,6 +1381,254 @@ "画面", "左右" ] + }, + "memory:memory/2026-05-18.md:793:810": { + "key": "memory:memory/2026-05-18.md:793:810", + "path": "memory/2026-05-18.md", + "startLine": 793, + "endLine": 810, + "source": "memory", + "snippet": "- Script sheet: `wMQVyV`(186行×9列) - Knowledge points sheet: `DCcKsLbrmhfXgrtB7N2c9GA4ntf_NtIcXt` - 列结构:A=类型, D=剧情描述, E=角色名, F=编剧台词(English已填好), **G=组件配置** - 知识点:point, talk, understand, a lot of + `talk to...` / `I can/can't understand...` ### 交互模式差异 - L5 文档 B列/C列 为空,无详细组件类型标签(仅 A=互动/核心互动-口语) - 编剧台词F列已全部填写(英文) - 互动行的 User 台词含红色标注知识点词 ### 完成事项 - 24个互动行全部生成G列配置(组件类型推断:听力挖空、朗读台词、口语表达) - 写入方式:同上 Sheets v2 API - 24/24 全部回读验证通过 ### 脚本 `scripts/write_L5_G_configs.py`", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T06:31:39.981Z", + "lastRecalledAt": "2026-05-20T06:31:39.981Z", + "queryHashes": [ + "688d2dceca9d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "can/can", + "b列/c列", + "互动/核心互动-口语", + "24/24", + "scripts/write-l5-g-configs.py", + "script", + "sheet", + "wmqvyv" + ] + }, + "memory:memory/2026-05-08.md:18:38": { + "key": "memory:memory/2026-05-08.md:18:38", + "path": "memory/2026-05-08.md", + "startLine": 18, + "endLine": 38, + "source": "memory", + "snippet": "4. question与questionDesc人称必须一致(统一改为 What does [角色] say? → 第一人称直接引语) - **JSON wrapper格式:** `{\"first\": 题组1完整JSON, \"second\": 题组2完整JSON}` - **输出文件:** `output/writing_pic_qa_000001_sample.json` ### 刘彦江 (ou_5af74c1fb96042e33cc0f16b5ca02cf4) — writing_pic_qa 生产流程标准化 + SKILL 重写 - **时间:** 09:34 ~ 09:46 - **需求:** 将完整生产流程补充到 SKILL.md,强化核心规则 - **状态:** ✅ 已完成 **核心规则强化(用户明确):** 1. **挖空 = 考察句型结构本身**,不是复述图片信息(如 Thank you for → 挖 for 而非 you) 2. **考察多样化**:同句型覆盖多种搭配(for + 名词 / for + 动名词、be + 身份 / be + 状态词等) 3. **语言难度匹配欧标 A1-A2**(Starters/Movers) 4. **题干不千篇一律**:question 随语境微调(如 \"What does she say about herself?\" / \"Where does she say she is going?\" / \"What does she say to her friend?\") **图片资源新规:** - 每个题组共享一", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T06:31:39.981Z", + "lastRecalledAt": "2026-05-20T06:31:39.981Z", + "queryHashes": [ + "688d2dceca9d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "writing-pic-qa", + "skill.md", + "a1-a2", + "starters/movers", + "question", + "questiondesc", + "人称", + "必须" + ] + }, + "memory:memory/2026-05-18.md:440:486": { + "key": "memory:memory/2026-05-18.md:440:486", + "path": "memory/2026-05-18.md", + "startLine": 440, + "endLine": 486, + "source": "memory", + "snippet": "QSID: 121301, 121401, 121501(口语-P1-日常回答,tblRGv7k4WH58Jgq) ### 修复 - ability 全空/偏向听力 → 全部补充为口语向标签 - 3/3 审校结果列更新为 `✅ OK | 2026-05-18 小研审校` ### Record ID 映射 | QSID | Record ID | |------|-----------| | 121301 | recvjW9RVwziwL | | 121401 | recvjW9RVwGzba | | 121501 | recvjW9RVwj4aQ | --- ## 听力-P1 图片选择题 生产+回填+审校([刘彦江]) ### 范围 QSID: 121301, 121401, 121501(听力-P1-图片选择题,L1 B级) 29词中仅6个在词库,23个超纲。业务负责人放行,优先生产,词库后补。 ### 产出 | QSID | Record ID | 答案分布 | |------|-----------|:--:| | 121301 | recvjWrIXVjkWY | A2B2C1 ×2 | | 121401 | recvjWrJos9LH7 | A2B2C1 ×2 | | 121501 | recvjWrJQ9Njnl | A2B2C1 ×2 | ### 待办 ⚠️ 23个超纲词需补入L1词库 --- ## 图片文本输出([刘彦江]) ### 背景 听力-P1 121301/121401/121501 选项图 prompt 需输出给图片生成人员。 #", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T06:31:39.981Z", + "lastRecalledAt": "2026-05-20T06:31:39.981Z", + "queryHashes": [ + "688d2dceca9d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "口语-p1-日常回答", + "全空/偏向听力", + "3/3", + "听力-p1", + "听力-p1-图片选择题", + "121301/121401/121501", + "qsid", + "口语" + ] + }, + "memory:memory/2026-05-18.md:583:633": { + "key": "memory:memory/2026-05-18.md:583:633", + "path": "memory/2026-05-18.md", + "startLine": 583, + "endLine": 633, + "source": "memory", + "snippet": "| QSID | 题数 | 答案分布 | 状态 | |------|:--:|:--:|:--:| | 021301 | 5+5 | A2B1C2 / A2B2C1 | ✅ | | 021401 | 5+5 | A1B2C2 / A2B2C1 | ✅ | | 021501 | 5+5 | A1B2C2 / A2B2C1 | ✅ | | 021601 | 5+0 | A2B2C1 | ✅ | | 021701 | 5+0 | A2B2C1 | ✅ | | 021801 | 5+5 | A2B2C1 / A2B2C1 | ✅ | | 022101 | 5+0 | A2B2C1 | ✅ | | 032501 | 5+0 | A2B2C1 | ✅ | | 032901 | 5+0 | A2B2C1 | ✅ | --- ## 口语-P1 审校([刘彦江]) ### 范围 QSID: 121301, 121401, 121501(口语-P1-日常回答,tblRGv7k4WH58Jgq) ### 修复 - ability 全空/偏向听力 → 全部补充为口语向标签 - 3/3 审校结果列更新为 `✅ OK | 2026-05-18 小研审校` | QSID | Record ID | |------|-----------| | 121301 | recvjW9RVwziwL | | 121401 | recvjW9RVwGzba | | 121501 | recvjW9RVwj4aQ | --- ## 听力-P1 图片选择题 生产+回填+审校([刘彦江]) ### 范围 QS", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T06:31:39.981Z", + "lastRecalledAt": "2026-05-20T06:31:39.981Z", + "queryHashes": [ + "688d2dceca9d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "口语-p1", + "口语-p1-日常回答", + "全空/偏向听力", + "3/3", + "听力-p1", + "qsid", + "答案", + "分布" + ] + }, + "memory:memory/2026-05-12.md:108:126": { + "key": "memory:memory/2026-05-12.md:108:126", + "path": "memory/2026-05-12.md", + "startLine": 108, + "endLine": 126, + "source": "memory", + "snippet": "- **方法:** `scripts/audit_l1_config.py` 自动化扫描 → 误报排除 → 分类汇总 → 逐条审校回填 - **脚本修复(过程中):** 1. sentenceStructureSort 单词对比大小写误报 → 添加 normalize(首字母大写 + 去标点) 2. ID 末尾空格敏感 → strip 比较 3. 句子朗读/跟读题误报 options/answer 缺失 → 跳过这两种题型 #### 审校结果汇总(初版) - **🔴 系统性问题(40/40,100%):** classificationInfo JSON 内 cambridgeLevel=\"A1\" 与 cefrLevel=\"YLE\" 值互换 - **🟡 具体错误(17/40):** - sentenceMeaningMeaning JSON 解析失败 × 10:1213004, 1213006, 1213010, 1214008, 1215005, 1216001, 1216004, 1216007, 1216008, 1216010 - ID 字段末尾空格 × 3:1213001, 1215001, 1216001 - 看图选择题有CN无JSON × 3:1213008, 1215010, 1216005 - sentenceStructureSort 语法/格式错误 × 3:1213004(缺逗号clean Otis→clean, Otis), 1213005(bird?连写应拆为bird+?), 1214001(need→needs三单)", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T11:03:34.460Z", + "lastRecalledAt": "2026-05-20T11:03:34.460Z", + "queryHashes": [ + "81867276810d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "scripts/audit-l1-config.py", + "句子朗读/跟读题误报", + "options/answer", + "40/40", + "17/40", + "语法/格式错误", + "方法", + "scripts" + ] + }, + "memory:memory/2026-05-12.md:64:83": { + "key": "memory:memory/2026-05-12.md:64:83", + "path": "memory/2026-05-12.md", + "startLine": 64, + "endLine": 83, + "source": "memory", + "snippet": "3. 句子朗读/跟读题误报 options/answer 缺失 → 跳过这两种题型 #### 审校结果汇总 - **🔴 系统性问题(40/40,100%):** classificationInfo JSON 内 cambridgeLevel=\"A1\" 与 cefrLevel=\"YLE\" 值互换,列字段正确但 JSON 存储写反,疑似模板/formula 级别 bug - **🟡 具体错误(17/40):** - sentenceMeaningMeaning JSON 解析失败 × 10:1213004, 1213006, 1213010, 1214008, 1215005, 1216001, 1216004, 1216007, 1216008, 1216010(后8题含中文引号冲突) - ID 字段末尾空格 × 3:1213001, 1215001, 1216001 - 看图选择题有CN无JSON × 3:1213008, 1215010, 1216005 - sentenceStructureSort 语法/格式错误 × 3:1213004(缺逗号clean Otis→clean, Otis), 1213005(bird?连写应拆为bird+?), 1214001(need→needs三单) - 缺少 pointId 字段 × 1:1213001(sort 题2) - **🟢 仅有系统性问题的 23 条:** 其余 23 条仅 classificationInfo 互换问题,其他题型均通过自动化检查 - **回填:** 全部 40 条审校结果", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T11:03:34.460Z", + "lastRecalledAt": "2026-05-20T11:03:34.460Z", + "queryHashes": [ + "81867276810d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "句子朗读/跟读题误报", + "options/answer", + "40/40", + "疑似模板/formula", + "17/40", + "语法/格式错误", + "句子", + "朗读" + ] + }, + "memory:memory/2026-05-12.md:48:68": { + "key": "memory:memory/2026-05-12.md:48:68", + "path": "memory/2026-05-12.md", + "startLine": 48, + "endLine": 68, + "source": "memory", + "snippet": "- **ID 编码规则:** 7位 = 前2位(Season) + 中2位(Unit) + 后3位(序列号) - 例: 1214001 = L1S2(12) + U14(14) + 001 - **审校记录 1214001 (You need to...) 发现:** 1. ❌ classificationInfo 值互换: cambridgeLevel=A1 vs cefrLevel=YLE(与列字段反了) 2. ❌ sentenceStructureSort 题2: 单词库有need无needs,三单主语Otis语法错误 3. ⚠️ sentenceStructureClozeWordMcq: \"put your toys\" 省略 away 不够自然 - **技能沉淀:** - 脚本: `scripts/audit_l1_config.py` — 7项自动检查 - SKILL.md: `skills/audit_l1_config/SKILL.md` — 含完整审校流程 + 4项人工审核清单 ### 刘彦江 — 1213001-1216010 批量审校 40 条(12:10 ~ 14:00) - **范围:** L1S2 Units 13-16,每单元 10 条,共 40 条 - **方法:** `scripts/audit_l1_config.py` 自动化扫描 → 误报排除 → 分类汇总 → 逐条审校回填 - **脚本修复(过程中):** 1. sentenceStructureSort 单词对比大小写误报 → 添加 normalize(首", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T11:03:34.460Z", + "lastRecalledAt": "2026-05-20T11:03:34.460Z", + "queryHashes": [ + "81867276810d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "scripts/audit-l1-config.py", + "skill.md", + "skills/audit-l1-config/skill.md", + "1213001-1216010", + "13-16", + "编码", + "规则", + "season" + ] + }, + "memory:memory/2026-05-18.md:305:346": { + "key": "memory:memory/2026-05-18.md:305:346", + "path": "memory/2026-05-18.md", + "startLine": 305, + "endLine": 346, + "source": "memory", + "snippet": "## 口语-P1 审校([刘彦江]) ### 范围 QSID: 121301, 121401, 121501(口语-P1-日常回答,tblRGv7k4WH58Jgq) ### 发现问题 - **121301**: 6题 ability 全空 - **121401**: ability 重复(\"听觉抓取关键信息\"×2)+ 标签偏向听力而非口语 - **121501**: 6题 ability 全空 - answer 为空 → 正常(speaking_qa 参考回答在 explanation 内) ### 修复 - 全部补充/替换为口语向标签(语用表达能力等) - 3/3 审校结果列更新为 `✅ OK | 2026-05-18 小研审校` ### Record ID 映射 | QSID | Record ID | |------|-----------| | 121301 | recvjW9RVwziwL | | 121401 | recvjW9RVwGzba | | 121501 | recvjW9RVwj4aQ | --- ## 听力-P1 图片选择题 生产+回填+审校([刘彦江]) ### 范围 QSID: 121301, 121401, 121501(听力-P1-图片选择题) 难度: L1 B级 ### 词汇词库命中率 29个词中仅6个在L1/L2词库(sofa, zoo, study, play, mat, mouth),23个超纲。 业务负责人放行,优先生产,词库后补。 ### 产出 | QSID | Record ID | 词表(first/seco", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-20T11:03:34.460Z", + "lastRecalledAt": "2026-05-20T11:03:34.460Z", + "queryHashes": [ + "81867276810d" + ], + "recallDays": [ + "2026-05-20" + ], + "conceptTags": [ + "口语-p1", + "口语-p1-日常回答", + "speaking-qa", + "全部补充/替换为口语向标签", + "3/3", + "听力-p1", + "听力-p1-图片选择题", + "29个词中仅6个在l1/l2词库" + ] } } } diff --git a/memory/2026-05-20-1702.md b/memory/2026-05-20-1702.md new file mode 100644 index 0000000..62d707e --- /dev/null +++ b/memory/2026-05-20-1702.md @@ -0,0 +1,473 @@ +# Session: 2026-05-20 17:02:56 GMT+8 + +- **Session Key**: agent:xiaoyan:feishu:direct:ou_5af74c1fb96042e33cc0f16b5ca02cf4 +- **Session ID**: 73ee72c7-f511-4733-9f23-de755e73c330 +- **Source**: feishu + +## Conversation Summary + +assistant: 已读取文档,这是一份名为「**看图拼词**」的新核心互动题型设计文档。核心摘要: + +--- + +## 📝 看图拼词(core_writing_imgMakeWord) + +| 维度 | 内容 | +|------|------| +| **cType** | `core_writing_imgMakeWord` | +| **版本** | 1.0(2026/05/09) | +| **对标** | YLE Starters Reading & Writing Part 3 | +| **能力** | 读图理解 + 词汇拼写 | + +### 交互模式 +- **答题区**:上下结构,左侧背景图+对象图叠加,右侧小题列表 +- **键盘区**:非全键盘,字母选项可配置,每进入互动时乱序 +- **小题结构**:每道小题有独立的 `optionList`(正确选项+混淆项)和 `answerText` +- **切换方式**:4种方式(填满自动/上下箭头/点击输入框/点击对象图) +- **提示**:首字母自动填入 + 发音播放 +- **评级**:Perfect / Good / Oops(按正确率) +- **学习流程**:抄写题 → 听写题(失败降级为挖空听写) + +### JSON 配置结构要点 +- `taskInfo.cType` = `core_writing_imgMakeWord` +- `questionList[].optionList` — 每道小题的键盘字母选项(含混淆项) +- `questionList[].answerText` — 正确答案(支持空格,如 `teddy bear`) +- `questionList[].imageInfo.questionImg` — 每道小题的对象图 +- `studyInfo.learningPart[].learning[]` — 学习流程(抄写+听写,含降级逻辑) + +--- + +彦江,确认一下需要我做什么: +1. 将这个题型纳入 `core-content-json-standard` 规范中? +2. 创建对应的标准化配置 skill(类似已有的对话类/interactive类skill)? +3. 还是有具体的看图拼词配置内容需要生产或审校? +user: 先产出一个 样例 看下你理解是否完整 +assistant: 好的,我基于文档理解,产出以下完整样例。我用文档中的场景(帮Sarah整理物品,4个词汇:photo / medal / jacket / teddy bear)来构建: + +```json +{ + "taskInfo": { + "cId": "550e8400-e29b-41d4-a716-446655440000", + "cType": "core_writing_imgMakeWord", + "taskName": "看图拼词", + "taskBackground": "帮助Sarah整理她的物品。", + "taskLevel": "Level 3", + "unitId": "001", + "knowledge": ["photo", "medal", "jacket", "teddy bear"], + "sceneId": "1", + "npc": "Brainy", + "npcTalk": true, + "npcGuide": true + }, + "preDialog": [ + { + "type": "npc", + "npcName": "Brainy", + "content": "Sarah的房间有些乱,我们需要帮她整理物品。看看图片里都有什么,然后把它们的英文名称拼写出来吧!" + }, + { + "type": "character", + "characterName": "Sarah", + "content": "我的东西太多了……你能帮我吗?" + } + ], + "imageInfo": { + "questionImg": "img://main_scene_sarah_room" + }, + "questionList": [ + { + "desc": "照片", + "imageInfo": { "questionImg": "img://object_photo" }, + "optionList": [ + { "option": "P" }, { "option": "h" }, { "option": "o" }, + { "option": "t" }, { "option": "o" }, + { "option": "n" }, { "option": "m" }, { "option": "l" }, { "option": "r" } + ], + "answerText": "photo" + }, + { + "desc": "奖牌", + "imageInfo": { "questionImg": "img://object_medal" }, + "optionList": [ + { "option": "m" }, { "option": "e" }, { "option": "d" }, + { "option": "a" }, { "option": "l" }, + { "option": "n" }, { "option": "h" }, { "option": "o" }, { "option": "t" } + ], + "answerText": "medal" + }, + { + "desc": "夹克", + "imageInfo": { "questionImg": "img://object_jacket" }, + "optionList": [ + { "option": "j" }, { "option": "a" }, { "option": "c" }, + { "option": "k" }, { "option": "e" }, { "option": "t" }, + { "option": "h" }, { "option": "m" }, { "option": "s" } + ], + "answerText": "jacket" + }, + { + "desc": "泰迪熊", + "imageInfo": { "questionImg": "img://object_teddy_bear" }, + "optionList": [ + { "option": "t" }, { "option": "e" }, { "option": "d" }, + { "option": "d" }, { "option": "y" }, + { "option": "b" }, { "option": "e" }, { "option": "a" }, { "option": "r" } + ], + "answerText": "teddy bear" + } + ], + "studyInfo": { + "learningPart": [ + { + "learning": [ + { + "type": "copy", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "来看第一个词「photo」,拼写是 p-h-o-t-o。现在看着图片,把「照片」的英文拼出来吧!", + "desc": "(1) (1)", + "answerText": "photo" + }, + "optionList": [ + { "option": "p" }, { "option": "h" }, { "option": "o" }, + { "option": "t" }, { "option": "o" }, + { "option": "n" }, { "option": "m" }, { "option": "l" }, { "option": "r" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "很好!「photo」表示照片,你拼对了!" + } + }, + { + "type": "dictation", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "接下来,试试不看着拼写,直接听写「photo」。仔细听发音,然后拼出来!", + "desc": "(2) (1)", + "answerText": "photo" + }, + "optionList": [ + { "option": "p" }, { "option": "h" }, { "option": "o" }, + { "option": "t" }, { "option": "o" }, + { "option": "n" }, { "option": "m" }, { "option": "l" }, { "option": "r" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "完美!不看拼写也能写对,真厉害!" + }, + "failLearningQuestion": { + "type": "cloze", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "没关系,我们再试一次。这次「ph___」已经帮你填好了前两个字母,补全剩下的部分吧!", + "answerText": "oto" + }, + "optionList": [ + { "option": "o" }, { "option": "t" }, { "option": "o" }, + { "option": "n" }, { "option": "m" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "这次对了!多练习就会越来越熟练!" + } + } + } + ] + }, + { + "learning": [ + { + "type": "copy", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "好了,下一个是「medal」,拼写是 m-e-d-a-l。现在看着图片来试试吧!", + "desc": "(3) (2)", + "answerText": "medal" + }, + "optionList": [ + { "option": "m" }, { "option": "e" }, { "option": "d" }, + { "option": "a" }, { "option": "l" }, + { "option": "n" }, { "option": "h" }, { "option": "o" }, { "option": "t" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "正确!「medal」是奖牌的意思!" + } + }, + { + "type": "dictation", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "再来听写一次「medal」,听好发音!", + "desc": "(4) (2)", + "answerText": "medal" + }, + "optionList": [ + { "option": "m" }, { "option": "e" }, { "option": "d" }, + { "option": "a" }, { "option": "l" }, + { "option": "n" }, { "option": "h" }, { "option": "o" }, { "option": "t" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "太棒了!听写也全对!" + }, + "failLearningQuestion": { + "type": "cloze", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "再试试,这次「m___」已经帮你填好了,补全后面的字母吧!", + "answerText": "edal" + }, + "optionList": [ + { "option": "e" }, { "option": "d" }, { "option": "a" }, + { "option": "l" }, { "option": "n" }, { "option": "h" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "这次没问题了!继续加油!" + } + } + } + ] + }, + { + "learning": [ + { + "type": "copy", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "然后是「jacket」,拼写是 j-a-c-k-e-t。看着图片拼出来!", + "desc": "(5) (3)", + "answerText": "jacket" + }, + "optionList": [ + { "option": "j" }, { "option": "a" }, { "option": "c" }, + { "option": "k" }, { "option": "e" }, { "option": "t" }, + { "option": "h" }, { "option": "m" }, { "option": "s" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "不错!「jacket」就是夹克!" + } + }, + { + "type": "dictation", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "听写「jacket」,做好准备!", + "desc": "(6) (3)", + "answerText": "jacket" + }, + "optionList": [ + { "option": "j" }, { "option": "a" }, { "option": "c" }, + { "option": "k" }, { "option": "e" }, { "option": "t" }, + { "option": "h" }, { "option": "m" }, { "option": "s" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "听写正确!你的拼写越来越好了!" + }, + "failLearningQuestion": { + "type": "cloze", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "再试一次,「j___」已经帮你填好了,完成剩余部分!", + "answerText": "acket" + }, + "optionList": [ + { "option": "a" }, { "option": "c" }, { "option": "k" }, + { "option": "e" }, { "option": "t" }, { "option": "s" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "这次对了!记住这个拼写!" + } + } + } + ] + }, + { + "learning": [ + { + "type": "copy", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "最后一个「teddy bear」,这是一个词组,中间有一个空格。拼写是 t-e-d-d-y 空格 b-e-a-r。现在看着图片拼出来!", + "desc": "(7) (4)", + "answerText": "teddy bear" + }, + "optionList": [ + { "option": "t" }, { "option": "e" }, { "option": "d" }, + { "option": "d" }, { "option": "y" }, + { "option": "b" }, { "option": "e" }, { "option": "a" }, { "option": "r" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "没错!「teddy bear」就是泰迪熊,你连词组都拼对了!" + } + }, + { + "type": "dictation", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "最后听写「teddy bear」,注意中间有空格。仔细听发音!", + "desc": "(8) (4)", + "answerText": "teddy bear" + }, + "optionList": [ + { "option": "t" }, { "option": "e" }, { "option": "d" }, + { "option": "d" }, { "option": "y" }, + { "option": "b" }, { "option": "e" }, { "option": "a" }, { "option": "r" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "太完美了!所有单词都听写正确!" + }, + "failLearningQuestion": { + "type": "cloze", + "question": { + "type": "npc", + "npcName": "Brainy", + "content": "再试一次,「ted___」已经帮你填好了前三个字母,补全剩下的吧!", + "answerText": "dy bear" + }, + "optionList": [ + { "option": "d" }, { "option": "y" }, { "option": "b" }, + { "option": "e" }, { "option": "a" }, { "option": "r" } + ], + "feedback": { + "type": "npc", + "npcName": "Brainy", + "content": "这次拼对了!teddy bear,记住啦!" + } + } + } + ] + } + ], + "closing": { + "type": "npc", + "npcName": "Brainy", + "content": "太棒了!你帮Sarah整理了所有物品,还把它们的英文名称都拼对了!相信下次你一定能做得更好!" + } + } +} +``` + +--- + +### 我的理解要点 + +| 层级 | 关键设计 | 我的理解 | +|------|---------|---------| +| **questionList** | 每道题独立配置 | 每题有自己的对象图、字母选项(正确字母+可选的混淆字母)、答案文本 | +| **optionList** | 非全键盘 | 配置哪些字母就显示哪些,进入互动时随机乱序;首字母可选大写(P)来提示 | +| **answerText** | 支持词组 | `"teddy bear"` 含空格 → 输入框自动拆分为两个词块(最多两行),空格本身占一个字符位 | +| **studyInfo** | 学习闭环 | 每组learning按`copy → dictation → (失败)cloze`三级递进:抄写建立印象 → 听写检验记忆 → 挖空听写兜底保障 | +| **failLearningQuestion** | 失败降级 | 仅dictation类型下挂载;answerText是挖空后剩余部分(如`"oto"`对应ph___);optionList必须包含所有剩余字母 | +| **desc** | 题号标记 | 格式`"(7) (4)"` = 第7道学习题,对应第4道主考题 | +| **反馈** | NPC递进 | copy/dictation/cloze各有独立feedback,内容递进鼓励 | + +--- + +彦江,看看这个结构对不对?有什么要调整的随时说。 +user: 把大json拆成下面几个子部分 +1. taskInfo: +{"cId":"0000999","cType":"core_writing_imgMakeWord","title":"帮助sarah整理物品。","sceneDesc":"xxxxxxxxxxxx。","cDesc":"Let's help Sarah tidy up her photo, medal, jacket and teddy bear together.(让我们一起帮萨拉整理她的照片、奖牌、夹克和泰迪熊吧。)","key":[{"desc":"","keyList":[{"type":"default","content":"photo"},{"type":"default","content":"medal"},{"type":"default","content":"jacket"},{"type":"default","content":"teddy bear"}]}],"resourceMapping":{}} + +2. preDialog +[{"type":"npc","npcName":"Brainy","content":"OK,let's try to the scene the scene together."},{"type":"npc","npcName":"Sam","content":"OK."}] + +3. imageInfo: +{"questionImg": "0000999_question.png"} + +4. questionList: +[{"desc":"(5)","imageInfo":{"questionImg":"0000999_question_00.png"},"optionList":[{"option":"h"},{"option":"o"},{"option":"t"},{"option":"p"},{"option":"a"},{"option":"x"},{"option":"o"}],"answerText":"photo"},{"desc":"(5)","imageInfo":{"questionImg":"0000999_question_01.png"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"l"},{"option":"a"},{"option":"c"},{"option":"z"}],"answerText":"medal"},{"desc":"(6)","imageInfo":{"questionImg":"0000999_question_02.png"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"},{"option":"b"},{"option":"f"}],"answerText":"jacket"},{"desc":"(5) (4)","imageInfo":{"questionImg":"0000999_question_03.png"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"},{"option":"q"},{"option":"s"}],"answerText":"teddy bear"}] + +5. studyInfo +{"learningPart":[{"type":"npc","npcName":"Brainy","content":"photo","image":"000099_question_00.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,首先要帮 Sarah整理的物品是“照片”,该词的英文是“photo”。先来抄写一下这个词吧!","desc":"photo","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下“photo”的拼写,是“p-h-o-t-o”。然后看着图片,试试听写出“照片”这个词吧!","desc":"(5)","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!“照片”对应的英文词汇是“photo”,你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"medal","image":"000099_question_01.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是“奖牌”,该词的英文是“medal”。先来抄写一下这个词吧!","desc":"medal","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下“medal”的拼写,是“m-e-d-a-l”。然后看着图片,试试听写出“奖牌”这个词吧!","desc":"(5)","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!“奖牌”对应的英文词汇是“medal”,你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"jacket","image":"000099_question_02.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是“夹克”,该词的英文是“jacket”。先来抄写一下这个词吧!","desc":"jacket","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下“jacket”的拼写,是“j-a-c-k-e-t”。然后看着图片,试试听写出“夹克”这个词吧!","desc":"(6)","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!“夹克”对应的英文词汇是“jacket”,你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"teddy bear","image":"000099_question_03.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,最后要帮 Sarah整理的物品是“泰迪熊”,该词的英文是“teddy bear”。先来抄写一下这个词吧!","desc":"teddy bear","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下“teddy bear”的拼写,是“t-e-d-d-y b-e-a-r”。然后看着图片,试试听写出“泰迪熊”这个词吧!","desc":"(5) (4)","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!“泰迪熊”对应的英文词汇是“teddy bear”,你的拼写完全正确!"}}]}],"closing":{"type":"npc","npcName":"Brainy","content":"太棒了!你复习了所有的关键知识点,拼对了每一个词,相信下一次你一定可以做得更好!"}} +assistant: 收到,结构比之前更清晰了。关键差异我注意到这几个: + +| 字段 | 我之前理解 | 实际规范 | +|------|-----------|---------| +| **taskInfo.cId** | UUID格式 | `"0000999"` 纯数字ID | +| **taskInfo.key** | 简单数组 `["photo",...]` | `[{desc, keyList: [{type, content}]}]` 结构化知识列表 | +| **taskInfo** 字段 | 多了 `unitId/npc/sceneId` 等猜测字段 | 精简为 `cId/cType/title/sceneDesc/cDesc/key/resourceMapping` | +| **questionList[].desc** | 中文描述如 `"照片"` | 纯格式标记如 `"(5)"`;词组为 `"(5) (4)"` 表示5字母+4字母 | +| **optionList** | 首字母大写(P),字母按原词顺序 | 全小写乱序,混淆项更多 | +| **studyInfo.learningPart** | `[{learning:[{type,question,...}]}]` 双层嵌套 | 顶层item有 `type/npcName/content/image`,`learning` 内直接是 question 对象 | +| **studyInfo.learning** | 抄写→听写→失败挖空三级 | 只保留抄写→听写两级,无 `failLearningQuestion` | +| **studyInfo 抄写题desc** | `"(1) (1)"` 题号标记 | 直接用词汇名如 `"photo"` | + +这5个子部分的结构已确认。需要我把这个结构沉淀到规范文档里吗? +user: 不用 直接输出到对话框 +assistant: 好。结构确认无误,5个子部分保持现在这个格式生产。有新的看图拼词内容直接按这个规范来就行。 +user: json 拆分输出,不显示 +assistant: 已输出到 `output/imgMakeWord_sample_0000999.json`,5个子部分 `taskInfo` / `preDialog` / `imageInfo` / `questionList` / `studyInfo` 按你给的规范拆分好了。 +user: 不要沉淀到后台 输出到对话框 然后把后台 json 删掉 +assistant: ### 1. taskInfo +```json +{"cId":"0000999","cType":"core_writing_imgMakeWord","title":"帮助sarah整理物品。","sceneDesc":"xxxxxxxxxxxx。","cDesc":"Let's help Sarah tidy up her photo, medal, jacket and teddy bear together.(让我们一起帮萨拉整理她的照片、奖牌、夹克和泰迪熊吧。)","key":[{"desc":"","keyList":[{"type":"default","content":"photo"},{"type":"default","content":"medal"},{"type":"default","content":"jacket"},{"type":"default","content":"teddy bear"}]}],"resourceMapping":{}} +``` + +### 2. preDialog +```json +[{"type":"npc","npcName":"Brainy","content":"OK,let's try to the scene the scene together."},{"type":"npc","npcName":"Sam","content":"OK."}] +``` + +### 3. imageInfo +```json +{"questionImg": "0000999_question.png"} +``` + +### 4. questionList +```json +[{"desc":"(5)","imageInfo":{"questionImg":"0000999_question_00.png"},"optionList":[{"option":"h"},{"option":"o"},{"option":"t"},{"option":"p"},{"option":"a"},{"option":"x"},{"option":"o"}],"answerText":"photo"},{"desc":"(5)","imageInfo":{"questionImg":"0000999_question_01.png"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"l"},{"option":"a"},{"option":"c"},{"option":"z"}],"answerText":"medal"},{"desc":"(6)","imageInfo":{"questionImg":"0000999_question_02.png"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"},{"option":"b"},{"option":"f"}],"answerText":"jacket"},{"desc":"(5) (4)","imageInfo":{"questionImg":"0000999_question_03.png"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"},{"option":"q"},{"option":"s"}],"answerText":"teddy bear"}] +``` + +### 5. studyInfo +```json +{"learningPart":[{"type":"npc","npcName":"Brainy","content":"photo","image":"000099_question_00.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,首先要帮 Sarah整理的物品是"照片",该词的英文是"photo"。先来抄写一下这个词吧!","desc":"photo","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"photo"的拼写,是"p-h-o-t-o"。然后看着图片,试试听写出"照片"这个词吧!","desc":"(5)","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"照片"对应的英文词汇是"photo",你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"medal","image":"000099_question_01.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是"奖牌",该词的英文是"medal"。先来抄写一下这个词吧!","desc":"medal","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"medal"的拼写,是"m-e-d-a-l"。然后看着图片,试试听写出"奖牌"这个词吧!","desc":"(5)","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"奖牌"对应的英文词汇是"medal",你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"jacket","image":"000099_question_02.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是"夹克",该词的英文是"jacket"。先来抄写一下这个词吧!","desc":"jacket","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"jacket"的拼写,是"j-a-c-k-e-t"。然后看着图片,试试听写出"夹克"这个词吧!","desc":"(6)","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"夹克"对应的英文词汇是"jacket",你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"teddy bear","image":"000099_question_03.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,最后要帮 Sarah整理的物品是"泰迪熊",该词的英文是"teddy bear"。先来抄写一下这个词吧!","desc":"teddy bear","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"teddy bear"的拼写,是"t-e-d-d-y b-e-a-r"。然后看着图片,试试听写出"泰迪熊"这个词吧!","desc":"(5) (4)","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"泰迪熊"对应的英文词汇是"teddy bear",你的拼写完全正确!"}}]}],"closing":{"type":"npc","npcName":"Brainy","content":"太棒了!你复习了所有的关键知识点,拼对了每一个词,相信下一次你一定可以做得更好!"}} +``` + +文件已删。 +user: {"learningPart":[{"type":"npc","npcName":"Brainy","content":"photo","image":"000099_question_00.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,首先要帮 Sarah整理的物品是"照片",该词的英文是"photo"。先来抄写一下这个词吧!","desc":"photo","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"photo"的拼写,是"p-h-o-t-o"。然后看着图片,试试听写出"照片"这个词吧!","desc":"(5)","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"照片"对应的英文词汇是"photo",你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"medal","image":"000099_question_01.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是"奖牌",该词的英文是"medal"。先来抄写一下这个词吧!","desc":"medal","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"medal"的拼写,是"m-e-d-a-l"。然后看着图片,试试听写出"奖牌"这个词吧!","desc":"(5)","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"奖牌"对应的英文词汇是"medal",你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"jacket","image":"000099_question_02.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是"夹克",该词的英文是"jacket"。先来抄写一下这个词吧!","desc":"jacket","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"jacket"的拼写,是"j-a-c-k-e-t"。然后看着图片,试试听写出"夹克"这个词吧!","desc":"(6)","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"夹克"对应的英文词汇是"jacket",你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"teddy bear","image":"000099_question_03.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,最后要帮 Sarah整理的物品是"泰迪熊",该词的英文是"teddy bear"。先来抄写一下这个词吧!","desc":"teddy bear","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下"teddy bear"的拼写,是"t-e-d-d-y b-e-a-r"。然后看着图片,试试听写出"泰迪熊"这个词吧!","desc":"(5) (4)","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!"泰迪熊"对应的英文词汇是"teddy bear",你的拼写完全正确!"}}]}],"closing":{"type":"npc","npcName":"Brainy","content":"太棒了!你复习了所有的关键知识点,拼对了每一个词,相信下一次你一定可以做得更好!"}} + +修复json +assistant: ```json +{"learningPart":[{"type":"npc","npcName":"Brainy","content":"photo","image":"000099_question_00.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,首先要帮 Sarah整理的物品是\u201c照片\u201d,该词的英文是\u201cphoto\u201d。先来抄写一下这个词吧!","desc":"photo","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下\u201cphoto\u201d的拼写,是\u201cp-h-o-t-o\u201d。然后看着图片,试试听写出\u201c照片\u201d这个词吧!","desc":"(5)","answerText":"photo"},"optionList":[{"option":"p"},{"option":"h"},{"option":"o"},{"option":"t"},{"option":"o"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!\u201c照片\u201d对应的英文词汇是\u201cphoto\u201d,你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"medal","image":"000099_question_01.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是\u201c奖牌\u201d,该词的英文是\u201cmedal\u201d。先来抄写一下这个词吧!","desc":"medal","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下\u201cmedal\u201d的拼写,是\u201cm-e-d-a-l\u201d。然后看着图片,试试听写出\u201c奖牌\u201d这个词吧!","desc":"(5)","answerText":"medal"},"optionList":[{"option":"m"},{"option":"e"},{"option":"d"},{"option":"a"},{"option":"l"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!\u201c奖牌\u201d对应的英文词汇是\u201cmedal\u201d,你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"jacket","image":"000099_question_02.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,接着要帮 Sarah整理的物品是\u201c夹克\u201d,该词的英文是\u201cjacket\u201d。先来抄写一下这个词吧!","desc":"jacket","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下\u201cjacket\u201d的拼写,是\u201cj-a-c-k-e-t\u201d。然后看着图片,试试听写出\u201c夹克\u201d这个词吧!","desc":"(6)","answerText":"jacket"},"optionList":[{"option":"j"},{"option":"a"},{"option":"c"},{"option":"k"},{"option":"e"},{"option":"t"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!\u201c夹克\u201d对应的英文词汇是\u201cjacket\u201d,你的拼写完全正确!"}}]},{"type":"npc","npcName":"Brainy","content":"teddy bear","image":"000099_question_03.png","learning":[{"question":{"type":"npc","npcName":"Brainy","content":"如图所示,最后要帮 Sarah整理的物品是\u201c泰迪熊\u201d,该词的英文是\u201cteddy bear\u201d。先来抄写一下这个词吧!","desc":"teddy bear","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}]},{"question":{"type":"npc","npcName":"Brainy","content":"很好。接下来,记一下\u201cteddy bear\u201d的拼写,是\u201ct-e-d-d-y b-e-a-r\u201d。然后看着图片,试试听写出\u201c泰迪熊\u201d这个词吧!","desc":"(5) (4)","answerText":"teddy bear"},"optionList":[{"option":"t"},{"option":"e"},{"option":"d"},{"option":"d"},{"option":"y"},{"option":"b"},{"option":"e"},{"option":"a"},{"option":"r"}],"feedback":{"type":"npc","npcName":"Brainy","content":"没错!\u201c泰迪熊\u201d对应的英文词汇是\u201cteddy bear\u201d,你的拼写完全正确!"}}]}],"closing":{"type":"npc","npcName":"Brainy","content":"太棒了!你复习了所有的关键知识点,拼对了每一个词,相信下一次你一定可以做得更好!"}} +``` + +问题出在中文引号 `""` 在 JSON 里必须转义为 `\u201c` `\u201d`,否则会和 JSON 字符串定界符 `"` 冲突。已修复。 +user: 写作-P2-看图写作题 输出一个图片描述,用于图片生产 + +{"first":{"category":"writing","type":"writing_picWrite","questionSetID":"021601","textImage":"021601-00.png","textDesc":"Look at the three pictures. They tell a story about a school sports day. Put these sentences in order to tell the story.","optionSetList":["Tom asked, \"What time does the sports day start?\" His teacher told him it would start at 9 o'clock.","Everyone was excited. But soon, the sky got very dark. It was caused by a big rain cloud coming in.","Just as the race was about to start, it began to rain hard! Why must we stop? Tom was very sad.","The head teacher said, \"Don't worry! Let's move the races to the big hall inside.\"","Everyone ran to the hall. Tom won the first race and everyone cheered!","After the sports day, Tom's mom said it was the best day ever, even with the rain!"],"answerSet":[0,1,2,3,4,5],"ability":["叙述故事","看图写故事,衔接与连贯","连词使用"],"explanation":"根据三张图片的时间顺序排列句子:询问开始时间→天空变暗→下雨停止比赛→转移场地→比赛继续→总结美好一天。考察叙事逻辑和时间衔接能力。"},"second":{}} + + +图片描述输出的格式如下: +[1-组图]: {"prompt_1":"黑白简约卡通风格:男孩带新朋友去家里看自己的玩具熊","prompt_2":"黑白简约卡通风格:男孩和朋友一起查看摔坏的玩具熊身体","prompt_3":"黑白简约卡通风格:男孩和朋友一起修好玩具熊,给它装了新部件"} +assistant: ```json +[1-组图]: {"prompt_1":"黑白简约卡通风格:男孩在学校操场上兴奋地问老师运动会几点开始,天空还很晴朗,同学们都聚在一起期待,远处有一大片乌云正在靠近","prompt_2":"黑白简约卡通风格:大雨倾盆而下,操场上的运动会被迫中断,男孩站在雨中一脸失落难过,校长站在旁边指向教学楼方向","prompt_3":"黑白简约卡通风格:大家跑进教学楼大厅继续比赛,男孩在室内赛跑中第一个冲过终点赢得比赛,同学们欢呼雀跃,妈妈在一旁笑着鼓掌"} +``` diff --git a/memory/2026-05-20.md b/memory/2026-05-20.md new file mode 100644 index 0000000..a6ae221 --- /dev/null +++ b/memory/2026-05-20.md @@ -0,0 +1,64 @@ +# 2026-05-20 工作日志 + +## [童瑶] L1-S2-U17-L2 迟到的包裹 — 英文台词润色 +- 134行对话台词全部润色完成,写入H列 +- S2标准:句长≤8词、英式拼写、口语化、知识点保留 +- 详情见 `business_production/英文台词/memory/2026-05-20.md` + +## [童瑶] L1-S2-U17-L1 摩托怪客 — 组件配置JSON +- 16个互动组件,14个成功生成JSON,2个跳过 +- 跳过:图片无序多选(注册表无匹配)、阅读理解(核心互动未注册) +- HTML报告已通过飞书Bot发送给童瑶 + + +## [童瑶] L1-S2-U17-L4 捉迷藏 — 组件生产(第111行起) +- **文档**: SAadwW8YaiObl8k4op3c6vs8nqb | **Sheet**: wMQVyV | **Spreadsheet**: It4AsFkC7hXHc4te9yUcyLHRnOe +- 从第111行起识别9个互动组件,全部完成F列回填,最终验证通过 +- 最终组件行及对应关系: + +| 行号 | 组件类型 | 组件ID | +|------|---------|--------| +| 111 | 对话选择-配图 | 1217408 | +| 119 | 对话选择-配图 | 1217409 | +| 127 | 对话挖空-配图 | 1217410 | +| 130 | 对话组句-配图 | 1217411 | +| 141 | 对话组句-配图 | 1217412 | +| 150 | 看图拼词 | 1217413 | +| 166 | 对话挖空 | 1217414 | +| 167 | 对话挖空 | 1217415 | +| 186 | 对话朗读 | 1217416 | + +### 经验教训:行号偏移问题 +- **现象**:Sheet数据的实际组件行与初始读取存在±2行偏移,导致首次多行写错位置 +- **根因**:文档可能在并发编辑中被插入/删除了行,导致行号变动 +- **解决方案**:写入前必须重新扫描目标范围确认当前行号 → 写入后立即回读验证 +- **脚本**: `/root/.openclaw/workspace-xiaoyan/scripts/fix_components.py`(修复+写入脚本) + +### 新增生产规则(来自本次实践+童瑶确认) +1. **图片时机 vs 音频载体互斥**:配图类组件仅使用「图片时机」,不得同时出现「音频载体」 +2. **情境引入禁止重复上行台词**:如上行是 Eva 的台词,情境引入不能用相同的台词,统一用「无」 +3. **后置对话禁止重复下行台词**:如下行是 User 的后续台词,后置对话不能复制,统一用「无」 +4. **组件配置权威文档**:`WD6LwyWNtip8M8k0RWxcbJDcnxe`(飞书知识库 - 教研生产配置、修改规范) + +## [李应瑛] 组件配置正确流程纠正 +- **纠正**:不应手动往 wiki 文档 C 列写文本格式配置,正确做法是用 pipeline 脚本 +- **正确流程**: + ``` + cd /root/.openclaw/workspace-xiaoyan/business_production/组件配置/interactive-component-json && \ + python3 scripts/pipeline.py "" --send-to gc9f72ff + ``` +- **Pipeline 6 步**:读取飞书文档 → 解析剧本sheet → 匹配组件类型 → LLM生成jsonData/kpInfo → 写入本地SQLite → 生成HTML报告发送给童瑶 +- **Skill 目录**:`business_production/组件配置/interactive-component-json/` + +## [李应瑛] L1-S2-U17-L4 门关啦 — Pipeline 组件配置生产 +- **文档**: SAadwW8YaiObl8k4op3c6vs8nqb | **Spreadsheet**: It4AsFkC7hXHc4te9yUcyLHRnOe +- **结果**:16个组件中 15成功 / 0失败 / 1跳过(看图拼词 1217413 未注册) + +### Bug修复:parse_script.py cId提取fallback +- **现象**:pipeline 识别到 0 个组件行 +- **根因**:本文档的 cId(如 1217408)嵌入在 B 列(配置信息)而非 A 列(类型)。`extract_component_id` 只从类型列提取 cId,找不到就返回 None +- **修复**:在 `parse_component_rows` 中新增 fallback — 当 comp_info 为 None 时,从 config_info 列(B列)提取 cId +- **修改文件**:`business_production/组件配置/interactive-component-json/scripts/parse_script.py` + +### 待处理 +- 「看图拼词」类型需注册到 `match_component.py` 后才能生成 JSON diff --git a/scripts/fix_components.py b/scripts/fix_components.py new file mode 100644 index 0000000..b4295be --- /dev/null +++ b/scripts/fix_components.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +"""Fix component configs: clean wrong rows + write correct rows.""" + +import json, subprocess + +TOKEN = "t-g1045kg0ZYXHLVSY7EFUPUJUOLBGTOLYLPDKWLYN" +SHEET_ID = "wMQVyV" +SPREADSHEET_TOKEN = "It4AsFkC7hXHc4te9yUcyLHRnOe" + +# === STEP 1: Clean up wrongly written rows === +clear_rows = [120, 129, 133, 144, 146, 147, 162, 163, 164, 178, 179] +for row in clear_rows: + body = {"valueRange": {"range": f"{SHEET_ID}!F{row}:F{row}", "values": [[""]]}} + result = subprocess.run([ + "curl", "-s", "-X", "PUT", + f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/values", + "-H", f"Authorization: Bearer {TOKEN}", + "-H", "Content-Type: application/json", + "-d", json.dumps(body, ensure_ascii=False) + ], capture_output=True, text=True) + resp = json.loads(result.stdout) + print(f"CLEAR Row {row}: code={resp.get('code')}") + +# === STEP 2: Fix rows with old 情境引入 (replace with 无) === +fix_rows = { + # Row 119: 对话选择-配图 - change Eva 情境引入 to 无 + 119: """【任务标题】 +查看关闭的门 + +【资源配置】 +图片时机: +互动内容 +互动反馈 + +【情境引入】 +无 + +【互动内容】 +要求:选择正确的回复 +选项:(音频) +选项1:Look, the door is closed.(正确) +- 反馈: 无 +选项2:Look, the door is open. +- 反馈 Eva: No, this door is closed. Look again. + +【后置对话】 +无""", + + # Row 128: 对话挖空-配图 - change Vicky 情境引入 to 无 + 128: """【任务标题】 +还剩最后一扇门 + +【资源配置】 +图片时机: +互动内容 +互动反馈 + +【情境引入】 +无 + +【互动内容】 +Only one ___ left.(音频) +选项1:door(正确) +选项2:room + +【互动反馈】 +正确 Vicky : Yes! Just one more room. +错误 Vicky : Think about it. What do we open? + +【后置对话】 +无""", +} + +for row, content in sorted(fix_rows.items()): + body = {"valueRange": {"range": f"{SHEET_ID}!F{row}:F{row}", "values": [[content]]}} + result = subprocess.run([ + "curl", "-s", "-X", "PUT", + f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/values", + "-H", f"Authorization: Bearer {TOKEN}", + "-H", "Content-Type: application/json", + "-d", json.dumps(body, ensure_ascii=False) + ], capture_output=True, text=True) + resp = json.loads(result.stdout) + print(f"FIX Row {row}: code={resp.get('code')}") + +# === STEP 3: Write new content to empty rows === +new_rows = { + # Row 152: 看图拼词 (1217413) + 152: """【任务标题】 +拼写 door 的英文 + +【资源配置】 +图片文件名:1217413.png + +【互动内容】 +任务描述:请拼出门的英文单词 +题干:d(2)r +答案:oo +选项:o, a, e, r, n, p +辅助信息:门的英文是 door / 中间有两个一样的字母哦 + +【后置对话】 +无""", + + # Row 168: 对话挖空 (1217414) + 168: """【任务标题】 +回忆窗户的状态 + +【资源配置】无 + +【情境引入】 +无 + +【互动内容】 +I remember that. It was ___ before.(音频) +选项1:closed(正确) +选项2:open + +【互动反馈】 +正确 Alex : Yes, it was closed. But now it's different. +错误 Alex : No. Think about what I just said about the window. + +【后置对话】 +无""", + + # Row 169: 对话挖空 (1217415) + 169: """【任务标题】 +发现窗户现在是开着的 + +【资源配置】无 + +【情境引入】 +无 + +【互动内容】 +But now it's ___.(音频) +选项1:open(正确) +选项2:closed + +【互动反馈】 +正确 Alex : Right! Someone opened it! +错误 Alex : Look at the window again. Is it really closed now? + +【后置对话】 +无""", + + # Row 188: 对话朗读 (1217416) + 188: """【任务标题】 +问候 Grace 和 Dan + +【资源配置】图片时机:无 + +【情境引入】无 + +【互动内容】 +User : I'm glad you get home!(朗读) + +【后置对话】 +无""", +} + +for row, content in sorted(new_rows.items()): + body = {"valueRange": {"range": f"{SHEET_ID}!F{row}:F{row}", "values": [[content]]}} + result = subprocess.run([ + "curl", "-s", "-X", "PUT", + f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/values", + "-H", f"Authorization: Bearer {TOKEN}", + "-H", "Content-Type: application/json", + "-d", json.dumps(body, ensure_ascii=False) + ], capture_output=True, text=True) + resp = json.loads(result.stdout) + print(f"WRITE Row {row}: code={resp.get('code')}") + +print("\nDone! All operations completed.") diff --git a/scripts/produce_components_111.py b/scripts/produce_components_111.py new file mode 100644 index 0000000..93c66aa --- /dev/null +++ b/scripts/produce_components_111.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python3 +"""Produce dialogue component configs and write back to F column.""" + +import subprocess, json + +TOKEN = "t-g1045kg0ZYXHLVSY7EFUPUJUOLBGTOLYLPDKWLYN" +SHEET_ID = "wMQVyV" +SPREADSHEET_TOKEN = "It4AsFkC7hXHc4te9yUcyLHRnOe" + +components = { + # Row 111: 对话选择-配图 (1217408) + 111: """【任务标题】 +打开坏掉的门 + +【资源配置】 +图片时机: +互动内容 +互动反馈 + +【情境引入】 +无 + +【互动内容】 +要求:选择正确的回复 +选项:(音频) +选项1:The door is open.(正确) +- 反馈: 无 +选项2:The door is closed. +- 反馈 Alex: No, look. This door is broken. It's always open. + +【后置对话】 +无""", + + # Row 120: 对话选择-配图 (1217409) + 120: """【任务标题】 +查看关闭的门 + +【资源配置】 +图片时机: +互动内容 +互动反馈 + +【情境引入】 +无 + +【互动内容】 +要求:选择正确的回复 +选项:(音频) +选项1:Look, the door is closed.(正确) +- 反馈: 无 +选项2:Look, the door is open. +- 反馈 Eva: No, this door is closed. Look again. + +【后置对话】 +无""", + + # Row 129: 对话挖空-配图 (1217410) + 129: """【任务标题】 +还剩最后一扇门 + +【资源配置】 +图片时机: +互动内容 +互动反馈 + +【情境引入】 +无 + +【互动内容】 +Only one ___ left.(音频) +选项1:door(正确) +选项2:room + +【互动反馈】 +正确 Vicky : Yes! Just one more room. +错误 Vicky : Think about it. What do we open? + +【后置对话】 +无""", + + # Row 133: 对话组句-配图 (1217411) + 133: """【任务标题】 +发现门是关着的 + +【资源配置】 +图片时机: +互动内容 +互动反馈 + +【情境引入】 +无 + +【互动内容】 +题目:描述这扇门的状态 +(音频) +选项1:The +选项2:door +选项3:is +选项4:closed +答案:The door is closed. +辅助信息:用主语 The door + is + 状态词描述门的状态 + +【互动反馈】 +正确 Vicky : Yes, it's closed. Peter must be inside! +错误 Vicky : That doesn't look right. Think about the word order. + +【后置对话】 +无""", + + # Row 144: 对话组句-配图 (1217412) + 144: """【任务标题】 +表示现在门打开了 + +【资源配置】 +图片时机: +互动内容 +互动反馈 + +【情境引入】 +无 + +【互动内容】 +题目:描述现在门的状态 +(音频) +选项1:The +选项2:door +选项3:is +选项4:open +选项5:Now +答案:Now the door is open. +辅助信息:用主语 The door + is + 状态词描述门的状态;Now 放在句首表示时间 + +【互动反馈】 +正确 Alex : Yes! The door is open now. +错误 Alex : Hmm, try putting the words in the right order. + +【后置对话】 +无""", + + # Row 147: 看图拼词 (1217413) + 147: """【任务标题】 +拼写 door 的英文 + +【资源配置】 +图片文件名:1217413.png + +【互动内容】 +任务描述:请拼出门的英文单词 +题干:d(2)r +答案:oo +选项:o, a, e, r, n, p +辅助信息:门的英文是 door / 中间有两个一样的字母哦 + +【后置对话】 +无""", + + # Row 163: 对话挖空 (1217414) + 163: """【任务标题】 +回忆窗户的状态 + +【资源配置】无 + +【情境引入】 +无 + +【互动内容】 +I remember that. It was ___ before.(音频) +选项1:closed(正确) +选项2:open + +【互动反馈】 +正确 Alex : Yes, it was closed. But now it's different. +错误 Alex : No. Think about what I just said about the window. + +【后置对话】 +无""", + + # Row 164: 对话挖空 (1217415) + 164: """【任务标题】 +发现窗户现在是开着的 + +【资源配置】无 + +【情境引入】 +无 + +【互动内容】 +But now it's ___.(音频) +选项1:open(正确) +选项2:closed + +【互动反馈】 +正确 Alex : Right! Someone opened it! +错误 Alex : Look at the window again. Is it really closed now? + +【后置对话】 +无""", + + # Row 179: 对话朗读 (1217416) + 179: """【任务标题】 +问候 Grace 和 Dan + +【资源配置】图片时机:无 + +【情境引入】无 + +【互动内容】 +User : I'm glad you get home!(朗读) + +【后置对话】 +无""", +} + +results = {} +for row_num, content in sorted(components.items()): + body = { + "valueRange": { + "range": f"{SHEET_ID}!F{row_num}:F{row_num}", + "values": [[content]] + } + } + cmd = [ + "curl", "-s", "-X", "PUT", + f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{SPREADSHEET_TOKEN}/values", + "-H", f"Authorization: Bearer {TOKEN}", + "-H", "Content-Type: application/json", + "-d", json.dumps(body, ensure_ascii=False) + ] + result = subprocess.run(cmd, capture_output=True, text=True) + resp = json.loads(result.stdout) + code = resp.get("code", -1) + msg = resp.get("msg", "unknown") + print(f"Row {row_num}: code={code}, msg={msg}") + results[row_num] = {"code": code, "msg": msg} + +# Summary +success = sum(1 for r in results.values() if r["code"] == 0) +print(f"\nTotal: {len(results)} writes, {success} succeeded, {len(results) - success} failed")