@rookiestar/eng-lang-tutor 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @rookiestar/eng-lang-tutor might be problematic. Click here for more details.

Files changed (37) hide show
  1. package/CLAUDE.md +5 -4
  2. package/README.md +16 -1
  3. package/README_EN.md +16 -1
  4. package/SKILL.md +113 -92
  5. package/docs/OPENCLAW_DEPLOYMENT.md +7 -4
  6. package/package.json +1 -1
  7. package/requirements.txt +2 -0
  8. package/scripts/__pycache__/audio_composer.cpython-313.pyc +0 -0
  9. package/scripts/__pycache__/audio_converter.cpython-313.pyc +0 -0
  10. package/scripts/__pycache__/audio_enhancer.cpython-313.pyc +0 -0
  11. package/scripts/__pycache__/state_manager.cpython-313.pyc +0 -0
  12. package/scripts/__pycache__/utils.cpython-313.pyc +0 -0
  13. package/scripts/audio_composer.py +389 -0
  14. package/scripts/audio_converter.py +245 -0
  15. package/scripts/cli.py +223 -0
  16. package/scripts/constants.py +56 -0
  17. package/scripts/feishu_voice.py +421 -0
  18. package/scripts/gamification.py +48 -34
  19. package/scripts/scorer.py +14 -32
  20. package/scripts/state_manager.py +131 -207
  21. package/scripts/tts/__pycache__/__init__.cpython-313.pyc +0 -0
  22. package/scripts/tts/__pycache__/base.cpython-313.pyc +0 -0
  23. package/scripts/tts/__pycache__/manager.cpython-313.pyc +0 -0
  24. package/scripts/tts/manager.py +14 -4
  25. package/scripts/tts/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  26. package/scripts/tts/providers/__pycache__/xunfei.cpython-313.pyc +0 -0
  27. package/scripts/tts/providers/xunfei.py +10 -1
  28. package/scripts/utils.py +78 -0
  29. package/templates/prompt_templates.md +47 -1235
  30. package/templates/prompts/display_guide.md +106 -0
  31. package/templates/prompts/initialization.md +213 -0
  32. package/templates/prompts/keypoint_generation.md +268 -0
  33. package/templates/prompts/output_rules.md +106 -0
  34. package/templates/prompts/quiz_generation.md +187 -0
  35. package/templates/prompts/responses.md +291 -0
  36. package/templates/prompts/shared_enums.md +97 -0
  37. package/templates/state_schema.json +1 -6
@@ -0,0 +1,187 @@
1
+ # Quiz Generation Template
2
+
3
+ > Template for generating daily quizzes based on knowledge points.
4
+
5
+ **Related Files:**
6
+ - [shared_enums.md](shared_enums.md) - Quiz types, XP values, CEFR levels
7
+ - [output_rules.md](output_rules.md) - JSON output rules, markdown formatting
8
+
9
+ ---
10
+
11
+ ## Quiz Generation Prompt
12
+
13
+ ```markdown
14
+ Based on today's knowledge point, generate a 3-question quiz calibrated to user's CEFR level.
15
+
16
+ ## USER CONTEXT
17
+ - CEFR Level: {cefr_level} (A1=Beginner to C2=Proficient)
18
+
19
+ ## KNOWLEDGE POINT
20
+ {keypoint_json}
21
+
22
+ ## CEFR DIFFICULTY CALIBRATION
23
+
24
+ | Level | Question Characteristics |
25
+ |-------|-------------------------|
26
+ | A1-A2 | Simple recognition, obvious distractors, direct context matching |
27
+ | B1-B2 | Nuanced usage, subtle distractors, requires understanding context |
28
+ | C1-C2 | Complex scenarios, idiomatic variations, cultural nuance testing |
29
+
30
+ **For B1-B2 (most users):**
31
+ - Multiple choice: Distractors should be grammatically correct but contextually wrong
32
+ - Chinglish fix: Use subtle errors (preposition, article, word choice) not obvious mistakes
33
+ - Create NEW scenarios that differ from the keypoint examples
34
+
35
+ ## QUESTION TYPE REQUIREMENTS (3 questions total)
36
+ 1. **multiple_choice** (required): Test expression recognition - 10 XP
37
+ 2. **chinglish_fix** (required): Identify and correct Chinglish - 15 XP
38
+ 3. **fill_blank OR dialogue_completion** (random): Pick one randomly - 12 XP
39
+
40
+ ## QUESTION GUIDELINES
41
+
42
+ ### Multiple Choice (10 XP)
43
+ - 4 options (A, B, C, D)
44
+ - Only 1 correct answer
45
+ - **Distractors MUST be plausible** - grammatically correct but semantically wrong
46
+ - Test understanding of meaning or usage in a NEW context (not copied from keypoint)
47
+ - For B2+: Include one distractor that's "almost correct" to test nuance
48
+
49
+ ### Chinglish Fix (15 XP)
50
+ - Show a sentence with Chinglish expressions
51
+ - **Create a NEW sentence** - NOT the example from the keypoint
52
+ - For B2+: Use subtle errors (wrong preposition, article misuse, slight word order)
53
+ - Include explanation in the answer
54
+
55
+ ### Fill in the Blank (12 XP)
56
+ - Use "___" for the blank
57
+ - Provide word bank with 3 options
58
+ - **Create a NEW context/sentence** - NOT copied from keypoint
59
+ - Test the expression in a different situation
60
+
61
+ ### Dialogue Completion (12 XP)
62
+ - Show partial dialogue with NEW context
63
+ - Ask what should come next
64
+ - Test natural conversation flow
65
+
66
+ ## ⛔ CRITICAL PROHIBITIONS ⛔
67
+
68
+ 1. **NEVER copy questions directly from keypoint content**
69
+ - Create NEW scenarios and contexts
70
+ - Change the situation while testing the same expression
71
+
72
+ 2. **NEVER reveal the answer in hints or question text**
73
+ - Hint format: "💡 Think about what Americans say in this situation"
74
+ - FORBIDDEN: "💡 The answer is 'touch base'" or showing the phrase directly
75
+
76
+ 3. **NEVER make distractors obviously wrong**
77
+ - All 4 options should sound plausible
78
+ - For B2+: At least one distractor should be a common learner error
79
+
80
+ ## STRICT RULES
81
+ 1. Output ONLY valid JSON - no markdown, no extra text
82
+ 2. All questions must relate to today's knowledge point
83
+ 3. **Difficulty MUST match CEFR level** - harder for B2+ users
84
+ 4. Include encouraging feedback in display fields
85
+ 5. Total XP should be around 35-40
86
+ 6. **End sentences with proper punctuation** - periods for statements, question marks for questions
87
+ 7. **Use NEW contexts** - never copy-paste from keypoint examples
88
+ ```
89
+
90
+ ---
91
+
92
+ ## Output Schema
93
+
94
+ > **CRITICAL:** Display fields must NOT reveal answers before user responds.
95
+
96
+ ```json
97
+ {
98
+ "quiz_date": "{today_date}",
99
+ "keypoint_fingerprint": "{fingerprint}",
100
+ "cefr_level": "{cefr_level}",
101
+ "questions": [
102
+ {
103
+ "id": 1,
104
+ "type": "multiple_choice",
105
+ "question": "The question text - MUST be a NEW context, not copied from keypoint",
106
+ "context": "NEW scenario description",
107
+ "options": ["A. ...", "B. ...", "C. ...", "D. ..."],
108
+ "correct_answer": "B",
109
+ "explanation": "Why this is correct...",
110
+ "xp_value": 10,
111
+ "display": {
112
+ "type_emoji": "🔤",
113
+ "type_name": "选择题 | Multiple Choice",
114
+ "question_formatted": "💬 {question}",
115
+ "context_formatted": "📱 {context}",
116
+ "options_formatted": ["⬜ A. ...", "⬜ B. ...", "⬜ C. ...", "⬜ D. ..."],
117
+ "hint": "💡 Think about the context - which fits naturally?",
118
+ "correct_feedback": "✅ Correct! **{key_phrase}** = {meaning}",
119
+ "wrong_feedback": "❌ Not quite. The answer was **{correct_answer}**. {explanation}",
120
+ "xp_display": "💎 +10 XP"
121
+ }
122
+ },
123
+ {
124
+ "id": 2,
125
+ "type": "chinglish_fix",
126
+ "question": "Fix this sentence - MUST be NEW sentence, not from keypoint",
127
+ "chinglish_sentence": "A NEW sentence with Chinglish error...",
128
+ "correct_answer": "The corrected version...",
129
+ "explanation": "Why the original was wrong...",
130
+ "xp_value": 15,
131
+ "display": {
132
+ "type_emoji": "🔧",
133
+ "type_name": "Chinglish 修正 | Fix the Chinglish",
134
+ "question_formatted": "🔧 What's wrong with this sentence?",
135
+ "sentence_formatted": "📝 \"{chinglish_sentence}\"",
136
+ "hint": "💡 How would an American say this naturally?",
137
+ "correct_feedback": "✅ Fixed! **{correct_phrase}** sounds much more natural!",
138
+ "wrong_feedback": "❌ Better: **{correct_sentence}**\n💡 {explanation}",
139
+ "xp_display": "💎 +15 XP"
140
+ }
141
+ },
142
+ {
143
+ "id": 3,
144
+ "type": "fill_blank",
145
+ "question": "Complete the sentence - MUST be NEW context",
146
+ "context": "NEW dialogue or situation with ___ blank",
147
+ "word_bank": ["phrase1", "phrase2", "phrase3"],
148
+ "correct_answer": "phrase1",
149
+ "explanation": "...",
150
+ "xp_value": 12,
151
+ "display": {
152
+ "type_emoji": "✏️",
153
+ "type_name": "填空题 | Fill in the Blank",
154
+ "question_formatted": "✏️ Fill in the blank:",
155
+ "context_formatted": "💬 {context_with_blank}",
156
+ "word_bank_formatted": "📦 Options: [ {opt1} | {opt2} | {opt3} ]",
157
+ "hint": "💡 Consider the formality and context.",
158
+ "correct_feedback": "✅ Perfect! **{answer}** fits perfectly here!",
159
+ "wrong_feedback": "❌ The answer was **{correct_answer}**. {explanation}",
160
+ "xp_display": "💎 +12 XP"
161
+ }
162
+ }
163
+ ],
164
+ "total_xp": 37,
165
+ "passing_score": 70,
166
+ "display": {
167
+ "header": "📝 今日测验 | Daily Quiz",
168
+ "date": "📅 {quiz_date}",
169
+ "difficulty": "📊 Level: **{cefr_level}**",
170
+ "topic": "🏷️ Topic: **{topic_name}**",
171
+ "instructions": "🎯 3道小题,答对2道就过关!3 questions, get 2 right to pass!",
172
+ "progress_bar": "⬜⬜⬜ 0/3 questions",
173
+ "xp_summary": "💎 Total XP: {total_xp} | 🏆 Pass: 2/3 correct",
174
+ "footer": "───────────────────\n💪 Good luck! 加油! 🚀"
175
+ }
176
+ }
177
+ ```
178
+
179
+ **Note:** Removed `key_phrase_summary` from display - it reveals the answer before quiz starts!
180
+
181
+ ---
182
+
183
+ ## XP Values Summary
184
+
185
+ > See [shared_enums.md](shared_enums.md#quiz-question-types-题型) for full quiz type definitions.
186
+
187
+ **Daily Quiz:** 3 questions, ~37 XP, pass with 2/3 correct
@@ -0,0 +1,291 @@
1
+ # Response Templates
2
+
3
+ > Templates for various response scenarios in the eng-lang-tutor skill.
4
+
5
+ **Related Files:**
6
+ - [shared_enums.md](shared_enums.md) - Level names, badges, quiz types
7
+ - [output_rules.md](output_rules.md) - JSON output rules, markdown formatting
8
+ - [display_guide.md](display_guide.md) - Emoji and formatting guidelines
9
+
10
+ ---
11
+
12
+ ## 1. Already Completed Responses
13
+
14
+ ```json
15
+ {
16
+ "quiz_already_done": {
17
+ "display": {
18
+ "title": "✅ Already Completed!",
19
+ "message": "You've already finished today's quiz. Great job! 🎉",
20
+ "stats": "Your score: {score}/{total} | XP earned: {xp}",
21
+ "next_quiz": "Come back tomorrow at 10:45 PM for a new quiz!",
22
+ "alternative": "💡 Want to review? Say **errors** to see your wrong answers."
23
+ }
24
+ }
25
+ }
26
+ ```
27
+
28
+ ---
29
+
30
+ ## 2. Not Available Responses
31
+
32
+ ```json
33
+ {
34
+ "keypoint_not_found": {
35
+ "display": {
36
+ "title": "📅 No Keypoint Found",
37
+ "message": "No knowledge point exists for {date}.",
38
+ "hint": "Try **keypoint today** for today's content.",
39
+ "history": "Or say **keypoint history** to see recent keypoints."
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ ---
46
+
47
+ ## 2.5. Quiz Request Flow (CRITICAL)
48
+
49
+ > **NEVER tell user "will generate later" - ALWAYS generate immediately when user requests quiz.**
50
+
51
+ ```
52
+ When user requests quiz:
53
+ 1. Check if quiz already completed today (completion_status.quiz_completed_date == today)
54
+ → YES: Show "Already completed" message
55
+ → NO: Continue to step 2
56
+
57
+ 2. Check if keypoint.json exists for today
58
+ → NO: IMMEDIATELY generate keypoint via LLM (do NOT say "will notify later")
59
+ Save keypoint with generated=true
60
+ → YES: Continue to step 3
61
+
62
+ 3. Check if quiz.json exists and quiz.generated == true
63
+ → NO: IMMEDIATELY generate quiz via LLM based on keypoint
64
+ Save quiz with generated=true
65
+ → YES: Load existing quiz
66
+
67
+ 4. Present quiz questions to user in ONE response
68
+ ```
69
+
70
+ **FORBIDDEN responses:**
71
+ - ❌ "今天还没有生成知识点,稍后会为您生成并通知您"
72
+ - ❌ "Quiz will be available later"
73
+ - ❌ "Please wait for the scheduled push"
74
+
75
+ **REQUIRED behavior:**
76
+ - ✅ Generate keypoint immediately via LLM if missing
77
+ - ✅ Generate quiz immediately via LLM
78
+ - ✅ Present quiz in the same response
79
+
80
+ ---
81
+
82
+ ## 3. Keypoint History Response
83
+
84
+ **When user says:** `keypoint history`, `知识点 历史`, `昨天`, `yesterday`
85
+
86
+ **Logic:**
87
+ 1. Scan `~/.openclaw/state/eng-lang-tutor/daily/` directory for all `YYYY-MM-DD/keypoint.json` files
88
+ 2. Sort by date descending (most recent first)
89
+ 3. Extract `display.title` or `topic` from each keypoint
90
+
91
+ **Empty History Response:**
92
+ ```markdown
93
+ 📚 **知识点历史记录**
94
+
95
+ 暂无历史记录。从今天开始学习吧!
96
+
97
+ 💡 输入 **keypoint** 或 **知识点** 获取今日内容
98
+ ```
99
+
100
+ **With History Response:**
101
+ ```markdown
102
+ 📚 **知识点历史记录**
103
+
104
+ | 日期 | 主题 |
105
+ |------|------|
106
+ | 2026-02-21 | 🏢 Touch Base - 工作沟通 |
107
+ | 2026-02-20 | 🎮 GG - 游戏用语 |
108
+ | 2026-02-19 | 🗣️ Gonna/Wanna - 口语缩写 |
109
+
110
+ 💡 输入 **keypoint 日期** 查看详情,如 `keypoint 2026-02-20`
111
+ ```
112
+
113
+ ---
114
+
115
+ ## 4. Keypoint Display Template
116
+
117
+ > IMPORTANT: Use `**text**` for bold. Never use `~~strikethrough~~`. Output Markdown text directly, NOT JSON.
118
+
119
+ **Assembly Flow:**
120
+
121
+ ```markdown
122
+ {title}
123
+
124
+ | 主题 | **{topic_name}** |
125
+ |------|------------------|
126
+ | 正式度 | **{formality}** |
127
+
128
+ ───────────────────
129
+ {scene_intro}
130
+
131
+ {scene_text}
132
+
133
+ ───────────────────
134
+ {expressions_title}
135
+
136
+ {for each item in expressions_formatted:
137
+ {emoji} {phrase}
138
+ {pronunciation}
139
+ {usage}
140
+ }
141
+
142
+ ───────────────────
143
+ {alternatives_title}
144
+
145
+ {alternatives_formatted}
146
+
147
+ ───────────────────
148
+ {chinglish_title}
149
+
150
+ {chinglish_formatted}
151
+
152
+ ───────────────────
153
+ {examples_title}
154
+
155
+ {for each item in examples_formatted:
156
+ {situation_emoji} {situation}
157
+ {dialogue}
158
+ }
159
+
160
+ ───────────────────
161
+ {extended_title}
162
+
163
+ {extended_formatted}
164
+
165
+ ───────────────────
166
+ {references_title}
167
+
168
+ {references_formatted}
169
+
170
+ ───────────────────
171
+ {footer}
172
+ ```
173
+
174
+ ---
175
+
176
+ ## 5. Stats Display Template
177
+
178
+ ```markdown
179
+ 📊 **Your Learning Progress**
180
+
181
+ • 等级: **{level}** ({level_name})
182
+ • XP: **{current_xp}** / {next_level_xp} (**{progress}%**)
183
+ • 连胜: **{streak}** 天 (倍数: **{multiplier}x**)
184
+ • 正确率: **{correct_rate}%**
185
+ • 徽章: **{badges_count}**/6
186
+ • 宝石: **{gems}**
187
+
188
+ ───────────────────
189
+ Keep it up! 💪
190
+ ```
191
+
192
+ > See [shared_enums.md](shared_enums.md#activity-levels-活跃等级) for level names.
193
+
194
+ **Multiplier Calculation:** `1.0 + (streak * 0.05)`, max 2.0x
195
+
196
+ ---
197
+
198
+ ## 6. Config Display Template
199
+
200
+ ```markdown
201
+ ⚙️ **Your Settings**
202
+
203
+ • CEFR 等级: **{cefr_level}**
204
+ • 主题偏好: **{topics_list}**
205
+ • 导师风格: **{tutor_style}**
206
+ • 口语占比: **{oral_ratio}%**
207
+ • 知识点推送: **{keypoint_time}**
208
+ • Quiz 推送: **{quiz_time}**
209
+
210
+ ───────────────────
211
+ 💡 Say **set level B2** to change your level
212
+ ```
213
+
214
+ ---
215
+
216
+ ## 7. Errors Display Template (Paginated)
217
+
218
+ ```markdown
219
+ 📓 **Error Notebook**
220
+
221
+ 📊 统计: **{total}** 条错题 (未复习: **{unreviewed}**)
222
+
223
+ ❌ 最近 **5** 条:
224
+
225
+ **{date_1}**
226
+ Q: {question_1}
227
+ Your answer: {user_answer_1}
228
+ ✅ Correct: **{correct_answer_1}**
229
+
230
+ **{date_2}**
231
+ Q: {question_2}
232
+ Your answer: {user_answer_2}
233
+ ✅ Correct: **{correct_answer_2}**
234
+
235
+ [显示 5 条,第 1/{total_pages} 页]
236
+
237
+ ───────────────────
238
+ 📄 输入 **"错题本 更多"** 查看下5条
239
+ 📄 输入 **"错题本 2026-02"** 查看特定月份
240
+ 📄 输入 **"错题本 随机5"** 随机复习5条
241
+ 📄 输入 **"错题本 统计"** 查看完整统计
242
+ 📄 输入 **"错题本 复习"** 开始错题复习
243
+ ```
244
+
245
+ **Pagination Commands:**
246
+ - `errors` / `错题本` → Show recent 5 errors
247
+ - `errors more` / `错题本 更多` → Next 5 errors
248
+ - `errors page N` → Go to page N
249
+ - `errors 2026-02` → Filter by month
250
+ - `errors random 5` → Random 5 for review
251
+ - `errors stats` → Show statistics only
252
+ - `errors review` → Start interactive review
253
+
254
+ ---
255
+
256
+ ## 8. Quiz Result Display Template
257
+
258
+ ```markdown
259
+ 📊 **Quiz Results**
260
+
261
+ • 分数: **{correct}/{total}** (**{accuracy}%**)
262
+ • 状态: {status_emoji} {status_text}
263
+ • XP 获得: **+{total_xp} XP**
264
+ • 连胜: **{old_streak}** → **{new_streak}** 天
265
+ • 总 XP: **{total_xp_earned}**
266
+
267
+ 💎 XP 明细:
268
+ • Base: **{base_xp} XP**
269
+ • Streak Bonus: **{multiplier}x** ({streak} day streak)
270
+ {perfect_bonus}
271
+
272
+ ───────────────────
273
+ 📝 Come back tomorrow for a new quiz!
274
+ ```
275
+
276
+ **Variables:**
277
+ - `{status_emoji}`: ✅ for passed, ❌ for failed
278
+ - `{status_text}`: "Passed! Great job! 🎉" or "Keep trying! 💪"
279
+ - `{perfect_bonus}`: "• Perfect Bonus: **+20 XP**" (only if 100% correct)
280
+
281
+ ---
282
+
283
+ ## 9. Output Format Rules
284
+
285
+ > See [output_rules.md](output_rules.md) for complete formatting rules.
286
+
287
+ **Quick Reference:**
288
+ - **Bold syntax**: Use `**text**` for bold
289
+ - **Never use** `~~strikethrough~~` - use ❌ emoji instead
290
+ - **Emojis**: Include at the start of each section
291
+ - **Punctuation**: End sentences properly (`.` or `?` or `!`)
@@ -0,0 +1,97 @@
1
+ # 共享枚举定义
2
+
3
+ > 本文件定义所有 prompt 模板共用的枚举值。其他模板应引用此文件而非重复定义。
4
+
5
+ ---
6
+
7
+ ## Topics 主题
8
+
9
+ | ID | 中文名 | Emoji | 描述 |
10
+ |----|--------|-------|------|
11
+ | movies | 电影 | 🎬 | 电影、美剧相关表达 |
12
+ | news | 新闻 | 📰 | 新闻报道、时事评论 |
13
+ | gaming | 游戏 | 🎮 | 电子游戏、在线游戏 |
14
+ | sports | 体育 | ⚽ | 体育运动、比赛 |
15
+ | workplace | 职场 | 💼 | 工作、商务、职业 |
16
+ | social | 社交 | 🍻 | 朋友聚会、社交活动 |
17
+ | daily_life | 生活 | 🏠 | 日常生活、购物、出行 |
18
+
19
+ ---
20
+
21
+ ## CEFR Levels 能力等级
22
+
23
+ | Level | 中文名 | 描述 | Quiz 特点 |
24
+ |-------|--------|------|-----------|
25
+ | A1 | 入门 | 基础词汇和简单句 | 简单识别,明显干扰项 |
26
+ | A2 | 初级 | 日常表达和基础对话 | 直接上下文匹配 |
27
+ | B1 | 中级 | 熟悉话题的连贯表达 | 细微用法区别 |
28
+ | B2 | 中高级 | 复杂话题的深入讨论 | 隐含干扰项,需理解上下文 |
29
+ | C1 | 高级 | 流利自然的表达 | 复杂场景,习语变体 |
30
+ | C2 | 精通 | 接近母语水平 | 文化细微差别测试 |
31
+
32
+ ---
33
+
34
+ ## Tutor Styles 导师风格
35
+
36
+ | Style | 中文名 | 语气特点 | 示例 |
37
+ |-------|--------|----------|------|
38
+ | humorous | 幽默 | 轻松愉快,带梗和调侃 | "这个表达老外听了会笑死" |
39
+ | rigorous | 严谨 | 专业分析,深入讲解 | "从语法角度分析..." |
40
+ | casual | 随意 | 自然口语,朋友间聊天 | "平时老美就这么说" |
41
+ | professional | 专业 | 正式商务,职场场景 | "在商务邮件中建议使用..." |
42
+
43
+ ---
44
+
45
+ ## Quiz Question Types 题型
46
+
47
+ | Type | 中文名 | XP | 描述 | 每日数量 |
48
+ |------|--------|-----|------|----------|
49
+ | multiple_choice | 选择题 | 10 | 四选一,测试表达识别 | 1 (必选) |
50
+ | chinglish_fix | Chinglish修正 | 15 | 识别并修正中式英语 | 1 (必选) |
51
+ | fill_blank | 填空题 | 12 | 完成对话中的空白 | 0-1 (随机) |
52
+ | dialogue_completion | 对话补全 | 15 | 选择合适的对话回应 | 0-1 (随机) |
53
+
54
+ **每日 Quiz 结构:** 3 题,约 37 XP,答对 2 题即过关
55
+
56
+ ---
57
+
58
+ ## Category Types 类别
59
+
60
+ | Category | 中文名 | 描述 |
61
+ |----------|--------|------|
62
+ | oral | 口语 | 日常口语表达,非正式场合 |
63
+ | written | 书面 | 正式书面表达,商务邮件、报告 |
64
+
65
+ ---
66
+
67
+ ## Formality Levels 正式程度
68
+
69
+ | Level | 中文名 | Emoji | 场景示例 |
70
+ |-------|--------|-------|----------|
71
+ | casual | 随意 | 👕 | 朋友聊天、社交媒体 |
72
+ | neutral | 中性 | 👔 | 同事交流、日常沟通 |
73
+ | formal | 正式 | 🤵 | 商务会议、正式邮件 |
74
+
75
+ ---
76
+
77
+ ## Badge Types 徽章
78
+
79
+ | Badge ID | 中文名 | 触发条件 | 宝石奖励 |
80
+ |----------|--------|----------|----------|
81
+ | first_steps | 初次尝试 | 完成首次 Quiz | 10 |
82
+ | week_warrior | 周末战士 | 7天连胜 | 25 |
83
+ | month_master | 月度大师 | 30天连胜 | 100 |
84
+ | perfect_10 | 完美十连 | 10次满分 Quiz | 50 |
85
+ | vocab_hunter | 词汇猎人 | 学习100个表达 | 75 |
86
+ | error_slayer | 错题克星 | 清除30个错题 | 30 |
87
+
88
+ ---
89
+
90
+ ## Activity Levels 活跃等级
91
+
92
+ | Stage | 中文名 | Level | XP 范围 |
93
+ |-------|--------|-------|---------|
94
+ | Starter | 启程者 | 1-5 | 0-350 |
95
+ | Traveler | 行路人 | 6-10 | 550-2000 |
96
+ | Explorer | 探索者 | 11-15 | 2600-6000 |
97
+ | Pioneer | 开拓者 | 16-20 | 7200-15000 |
@@ -155,13 +155,8 @@
155
155
  },
156
156
  "progress": {
157
157
  "type": "object",
158
- "required": ["total_points", "total_quizzes", "correct_rate", "last_study_date"],
158
+ "required": ["total_quizzes", "correct_rate", "last_study_date"],
159
159
  "properties": {
160
- "total_points": {
161
- "type": "integer",
162
- "minimum": 0,
163
- "description": "Total points earned"
164
- },
165
160
  "total_quizzes": {
166
161
  "type": "integer",
167
162
  "minimum": 0,