auto backup: 2026-05-21 08:10:02

This commit is contained in:
ai_member_only 2026-05-21 08:10:02 +08:00
parent 473c3a9cff
commit f645ae96ee
18 changed files with 14863 additions and 8 deletions

File diff suppressed because one or more lines are too long

View File

@ -71,8 +71,9 @@ def get_wiki_node(wiki_token):
""" """
env = os.environ.copy() env = os.environ.copy()
env["LARKSUITE_CLI_CONFIG_DIR"] = LARK_CLI_CONFIG_DIR 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( 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}), "--params", json.dumps({"token": wiki_token}),
"--as", "bot"], "--as", "bot"],
capture_output=True, text=True, env=env, timeout=30, capture_output=True, text=True, env=env, timeout=30,
@ -98,8 +99,9 @@ def fetch_doc_markdown(obj_token):
""" """
env = os.environ.copy() env = os.environ.copy()
env["LARKSUITE_CLI_CONFIG_DIR"] = LARK_CLI_CONFIG_DIR 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( 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, capture_output=True, text=True, env=env, timeout=60,
) )
if result.returncode != 0: if result.returncode != 0:

View File

@ -25,6 +25,7 @@ MID_INTERACTION_TYPES = {
"图片互动": {"cType": "mid_vocab_image", "bitable": "VJ1kb9xp8amX8PskntmcLhjpnQe"}, "图片互动": {"cType": "mid_vocab_image", "bitable": "VJ1kb9xp8amX8PskntmcLhjpnQe"},
"图片单选": {"cType": "mid_image_choose", "bitable": "XyIVbYciraBkoasJtV1c3N5Gnhh"}, "图片单选": {"cType": "mid_image_choose", "bitable": "XyIVbYciraBkoasJtV1c3N5Gnhh"},
"图片多选": {"cType": "mid_image_multiple", "bitable": "XZo5bwagdau3VvsTDL9cJPrInQd"}, "图片多选": {"cType": "mid_image_multiple", "bitable": "XZo5bwagdau3VvsTDL9cJPrInQd"},
"图片无序多选": {"cType": "mid_image_multiple", "bitable": "XZo5bwagdau3VvsTDL9cJPrInQd"},
"图片有序": {"cType": "mid_image_sequence", "bitable": "BZWebQROpagkJ0sxArGcsBjwnCU"}, "图片有序": {"cType": "mid_image_sequence", "bitable": "BZWebQROpagkJ0sxArGcsBjwnCU"},
"图片拖拽": {"cType": "mid_image_drag", "bitable": "Qqq9bVv19aH6LisRrsVcvf6xnqe"}, "图片拖拽": {"cType": "mid_image_drag", "bitable": "Qqq9bVv19aH6LisRrsVcvf6xnqe"},
"材料互动": {"cType": "mid_sentence_material", "bitable": "Yd84buD91aGxyqstpXqceftHnvM"}, "材料互动": {"cType": "mid_sentence_material", "bitable": "Yd84buD91aGxyqstpXqceftHnvM"},
@ -41,6 +42,7 @@ MID_INTERACTION_TYPES = {
CORE_INTERACTION_TYPES = { CORE_INTERACTION_TYPES = {
"合作阅读": {"cType": "core_reading_order", "bitable_wiki": "H6DJweNkpigCbak2Y5LcTZ8Vnfb"}, "合作阅读": {"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_reading_imageDrag", "bitable_wiki": "MVo7wugWfimJPIkxhJCcqppFnyf", "db_table": "tblKl9CGmARjpw1O"},
"口语快答": {"cType": "core_speaking_reply", "bitable_wiki": "TSwcw0nFmi21khkpUndchNMsn6f", "db_table": "tbl4Qg8d45O58Cqf"}, "口语快答": {"cType": "core_speaking_reply", "bitable_wiki": "TSwcw0nFmi21khkpUndchNMsn6f", "db_table": "tbl4Qg8d45O58Cqf"},
"口语独白": {"cType": None, "bitable_wiki": "G20HwcF1uideNokLsHWcBs3znvg"}, "口语独白": {"cType": None, "bitable_wiki": "G20HwcF1uideNokLsHWcBs3znvg"},
"口语妙问": {"cType": "core_speaking_inquiry", "bitable_wiki": "GJUVwNSEkis3EXkrVj0ccbqdn8c", "db_table": "tbl1Q68oopST9Mel"}, "口语妙问": {"cType": "core_speaking_inquiry", "bitable_wiki": "GJUVwNSEkis3EXkrVj0ccbqdn8c", "db_table": "tbl1Q68oopST9Mel"},

View File

@ -594,6 +594,31 @@ def parse_sheet_rows(sheet_rows, llm_client=None):
"has_image": has_image, "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: if comp_info is None:
continue continue

View File

@ -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列英文台词
- ✅ 难度等级S25-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: 配置信息

View File

@ -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()

View File

@ -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-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: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-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}]}

View File

@ -1,6 +1,6 @@
{ {
"version": 1, "version": 1,
"updatedAt": "2026-05-19T03:08:50.132Z", "updatedAt": "2026-05-20T11:03:34.460Z",
"entries": { "entries": {
"memory:memory/2026-05-07.md:57:74": { "memory:memory/2026-05-07.md:57:74": {
"key": "memory:memory/2026-05-07.md:57:74", "key": "memory:memory/2026-05-07.md:57:74",
@ -181,24 +181,26 @@
"endLine": 55, "endLine": 55,
"source": "memory", "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.` 自上而下,每段", "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, "dailyCount": 0,
"groundedCount": 0, "groundedCount": 0,
"totalScore": 5, "totalScore": 6,
"maxScore": 1, "maxScore": 1,
"firstRecalledAt": "2026-05-11T02:19:37.985Z", "firstRecalledAt": "2026-05-11T02:19:37.985Z",
"lastRecalledAt": "2026-05-18T08:44:36.808Z", "lastRecalledAt": "2026-05-20T06:31:39.981Z",
"queryHashes": [ "queryHashes": [
"6f88450e9f9b", "6f88450e9f9b",
"be437071312f", "be437071312f",
"11ea0881b126", "11ea0881b126",
"08b6f3142a2b", "08b6f3142a2b",
"d3bb2a2fd2ad" "d3bb2a2fd2ad",
"688d2dceca9d"
], ],
"recallDays": [ "recallDays": [
"2026-05-11", "2026-05-11",
"2026-05-13", "2026-05-13",
"2026-05-18" "2026-05-18",
"2026-05-20"
], ],
"conceptTags": [ "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/40100%** classificationInfo JSON 内 cambridgeLevel=\"A1\" 与 cefrLevel=\"YLE\" 值互换 - **🟡 具体错误17/40** - sentenceMeaningMeaning JSON 解析失败 × 101213004, 1213006, 1213010, 1214008, 1215005, 1216001, 1216004, 1216007, 1216008, 1216010 - ID 字段末尾空格 × 31213001, 1215001, 1216001 - 看图选择题有CN无JSON × 31213008, 1215010, 1216005 - sentenceStructureSort 语法/格式错误 × 31213004(缺逗号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/40100%** classificationInfo JSON 内 cambridgeLevel=\"A1\" 与 cefrLevel=\"YLE\" 值互换,列字段正确但 JSON 存储写反,疑似模板/formula 级别 bug - **🟡 具体错误17/40** - sentenceMeaningMeaning JSON 解析失败 × 101213004, 1213006, 1213010, 1214008, 1215005, 1216001, 1216004, 1216007, 1216008, 1216010后8题含中文引号冲突 - ID 字段末尾空格 × 31213001, 1215001, 1216001 - 看图选择题有CN无JSON × 31213008, 1215010, 1216005 - sentenceStructureSort 语法/格式错误 × 31213004(缺逗号clean Otis→clean, Otis), 1213005(bird?连写应拆为bird+?), 1214001(need→needs三单) - 缺少 pointId 字段 × 11213001(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, mouth23个超纲。 业务负责人放行,优先生产,词库后补。 ### 产出 | 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词库"
]
} }
} }
} }

473
memory/2026-05-20-1702.md Normal file
View File

@ -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.02026/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":"黑白简约卡通风格:大家跑进教学楼大厅继续比赛,男孩在室内赛跑中第一个冲过终点赢得比赛,同学们欢呼雀跃,妈妈在一旁笑着鼓掌"}
```

64
memory/2026-05-20.md Normal file
View File

@ -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个成功生成JSON2个跳过
- 跳过:图片无序多选(注册表无匹配)、阅读理解(核心互动未注册)
- 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 "<wiki_url>" --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

174
scripts/fix_components.py Normal file
View File

@ -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: """【任务标题】
查看关闭的门
资源配置
图片时机
互动内容
互动反馈
情境引入
互动内容
要求选择正确的回复
选项音频
选项1Look, the door is closed.正确
- 反馈:
选项2Look, the door is open.
- 反馈 Eva: No, this door is closed. Look again.
后置对话
""",
# Row 128: 对话挖空-配图 - change Vicky 情境引入 to 无
128: """【任务标题】
还剩最后一扇门
资源配置
图片时机
互动内容
互动反馈
情境引入
互动内容
Only one ___ left.音频
选项1door正确
选项2room
互动反馈
正确 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.音频
选项1closed正确
选项2open
互动反馈
正确 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 ___.(音频)
选项1open正确
选项2closed
互动反馈
正确 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.")

View File

@ -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: """【任务标题】
打开坏掉的门
资源配置
图片时机
互动内容
互动反馈
情境引入
互动内容
要求选择正确的回复
选项音频
选项1The door is open.正确
- 反馈:
选项2The door is closed.
- 反馈 Alex: No, look. This door is broken. It's always open.
后置对话
""",
# Row 120: 对话选择-配图 (1217409)
120: """【任务标题】
查看关闭的门
资源配置
图片时机
互动内容
互动反馈
情境引入
互动内容
要求选择正确的回复
选项音频
选项1Look, the door is closed.正确
- 反馈:
选项2Look, the door is open.
- 反馈 Eva: No, this door is closed. Look again.
后置对话
""",
# Row 129: 对话挖空-配图 (1217410)
129: """【任务标题】
还剩最后一扇门
资源配置
图片时机
互动内容
互动反馈
情境引入
互动内容
Only one ___ left.音频
选项1door正确
选项2room
互动反馈
正确 Vicky : Yes! Just one more room.
错误 Vicky : Think about it. What do we open?
后置对话
""",
# Row 133: 对话组句-配图 (1217411)
133: """【任务标题】
发现门是关着的
资源配置
图片时机
互动内容
互动反馈
情境引入
互动内容
题目描述这扇门的状态
音频
选项1The
选项2door
选项3is
选项4closed
答案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: """【任务标题】
表示现在门打开了
资源配置
图片时机
互动内容
互动反馈
情境引入
互动内容
题目描述现在门的状态
音频
选项1The
选项2door
选项3is
选项4open
选项5Now
答案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.音频
选项1closed正确
选项2open
互动反馈
正确 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 ___.(音频)
选项1open正确
选项2closed
互动反馈
正确 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")