@sokeai/cli 1.0.65 → 1.0.67
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.
- package/README.md +35 -0
- package/package.json +1 -1
- package/scripts/build-binaries.sh +10 -1
- package/skills/README.md +2 -0
- package/skills/SKILL.md +33 -1
- package/skills/ai-coach-director/.learnings/LEARNINGS.md +71 -0
- package/skills/ai-coach-director/SKILL.md +1229 -0
- package/skills/ai-coach-director/assets/ERRORS-TEMPLATE.md +5 -0
- package/skills/ai-coach-director/assets/FEATURE_REQUESTS-TEMPLATE.md +5 -0
- package/skills/ai-coach-director/assets/LEARNINGS-TEMPLATE.md +45 -0
- package/skills/ai-coach-director/assets/SKILL-TEMPLATE.md +177 -0
- package/skills/ai-coach-director/coaching/prompt-engineer/parts/part1-basic.md +59 -0
- package/skills/ai-coach-director/coaching/prompt-engineer/parts/part2-roles.md +317 -0
- package/skills/ai-coach-director/coaching/prompt-engineer/parts/part3-flow.md +72 -0
- package/skills/ai-coach-director/coaching/prompt-engineer/parts/part4-scoring.md +87 -0
- package/skills/ai-coach-director/coaching/prompt-engineer/parts/part5-constraints.md +48 -0
- package/skills/ai-coach-director/coaching/prompt-engineer/prompt-engineer.md +217 -0
- package/skills/ai-coach-director/coaching/prompt-optimizer/prompt-optimizer.md +362 -0
- package/skills/ai-coach-director/coaching/role-profiler/role-profiler.md +87 -0
- package/skills/ai-coach-director/platform/interaction.md +312 -0
- package/skills/ai-coach-director/platform/soke-ai-training/soke-ai-training.md +93 -0
- package/skills/ai-coach-director/platform/sync-engine.md +974 -0
- package/skills/ai-coach-director/references/cases/AI/345/256/242/346/210/267/350/247/222/350/211/262/346/250/241/346/235/277/345/272/223.md +265 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203Bad Case/346/240/267/346/234/254/345/272/223.md" +206 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/345/210/233/345/273/272/351/227/256/351/242/230/345/272/223.md +666 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/345/234/272/346/231/257/345/210/206/347/261/273/345/272/223.md +213 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/345/256/242/346/210/267/346/235/220/346/226/231/346/270/205/345/215/225/344/270/216/350/256/277/350/260/210/351/242/230/345/272/223.md +229 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/345/276/256/350/260/203/351/227/256/351/242/230/345/272/223.md +833 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/346/212/200/346/234/257/350/276/271/347/225/214/344/270/216/346/216/222/351/232/234/345/272/223.md +239 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215/346/250/241/345/235/227/345/272/223.md +249 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/346/225/260/346/215/256/346/214/207/346/240/207/344/270/216/347/234/213/346/235/277/345/217/243/345/276/204/345/272/223.md +282 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/346/265/213/350/257/225/347/224/250/344/276/213/345/272/223.md +254 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/350/257/204/345/210/206/346/240/207/345/207/206/347/273/204/344/273/266/345/272/223.md +264 -0
- package/skills/ai-coach-director/references/cases/AI/351/231/252/347/273/203/351/241/271/347/233/256/346/241/210/344/276/213/345/244/215/347/233/230/345/272/223.md +223 -0
- package/skills/ai-coach-director/references/cases/AI/351/241/276/345/256/242/350/247/222/350/211/262/346/250/241/346/213/237_GoodCase_BadCase_20260701.md +304 -0
- package/skills/ai-coach-director/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/345/256/242/346/210/267/346/235/220/346/226/231/346/261/207/346/200/273_2026-05-19_1341.md +42 -0
- package/skills/ai-coach-director/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277_/346/240/207/345/207/206/347/237/245/350/257/206/345/272/223.md +199 -0
- package/skills/ai-coach-director/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277/347/237/245/350/257/206/345/272/223.md +388 -0
- package/skills/ai-coach-director/references/cases/create//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267/347/237/245/350/257/206/345/272/223/347/224/237/346/210/220_20260615.md +23 -0
- package/skills/ai-coach-director/references/cases/create//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215/347/224/237/346/210/220_20260615.md +34 -0
- package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/tuv-knowledge-base.md +125 -0
- package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/tuv-p03-first-call-scenario-prompt.md +428 -0
- package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204P03/351/231/252/347/273/203/346/211/247/350/241/214/346/226/271/346/241/210_20260610.md +225 -0
- package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/351/231/252/347/273/203/346/211/247/350/241/214/346/226/271/346/241/210/344/272/244/344/273/230/350/256/260/345/275/225_20260610.md +26 -0
- package/skills/ai-coach-director/references/cases/create//346/237/220/345/234/260/346/226/271/351/223/266/350/241/214//346/237/220/345/234/260/346/226/271/351/223/266/350/241/214/345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277AI/351/231/252/347/273/203/346/265/213/350/257/225/347/224/250/344/276/213/345/220/210/351/233/206.md +525 -0
- package/skills/ai-coach-director/references/cases/create//347/211/251/346/265/201/350/241/214/344/270/232//347/211/251/346/265/201/350/241/214/344/270/232-/345/210/235/346/254/241/346/213/234/350/256/277/351/246/231/347/262/276/351/246/231/346/226/231/345/256/242/346/210/267.md +146 -0
- package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2061_/346/226/260/345/223/201/346/216/250/351/224/200_20260701.md +230 -0
- package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2062_/345/202/254/350/217/234/345/256/211/346/212/232_20260701.md +257 -0
- package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2063_/345/267/256/350/257/204/345/233/236/350/256/277_20260701.md +259 -0
- package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203/345/234/272/346/231/257/346/226/271/346/241/210_20260701.md +452 -0
- package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/345/256/242/346/210/267/347/241/256/350/256/244/345/217/215/351/246/210/350/241/250.md +133 -0
- package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/346/217/220/347/244/272/350/257/215/346/220/255/345/273/272_20260622.md +30 -0
- package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215_v1.md +333 -0
- package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215_v2_Part1-Part5.md +649 -0
- package/skills/ai-coach-director/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_V1.1_20260616.md +262 -0
- package/skills/ai-coach-director/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_V1.2_20260616.md +254 -0
- package/skills/ai-coach-director/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/345/216/213/347/274/251/347/211/210_V2.0_20260616.md +96 -0
- package/skills/ai-coach-director/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215/344/274/230/345/214/226_20260616.md +20 -0
- package/skills/ai-coach-director/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277AI/351/231/252/347/273/203/347/263/273/347/273/237_/346/265/213/350/257/225/345/217/215/351/246/210/346/261/207/346/200/273_2026-06-01.md +434 -0
- package/skills/ai-coach-director/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277KYC/344/277/241/344/273/273/345/200/274/347/246/201/344/273/244_2026-06-09_0932.md +22 -0
- package/skills/ai-coach-director/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277KYC/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v2_20260608.md +261 -0
- package/skills/ai-coach-director/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v1.1.md +277 -0
- package/skills/ai-coach-director/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v1.2.md +354 -0
- package/skills/ai-coach-director/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215/344/274/230/345/214/226_V2_/350/257/212/346/226/255/344/272/244/344/273/230_20260609.md +26 -0
- package/skills/ai-coach-director/references/cases//345/233/233/345/244/247/345/234/272/346/231/257_GoodCase_BadCase_20260701.md +194 -0
- package/skills/ai-coach-director/references/cases//346/241/210/344/276/213/345/272/223/350/241/245/345/205/205_2026-06-24.md +41 -0
- package/skills/ai-coach-director/references/change-log-partwise-refactor.md +74 -0
- package/skills/ai-coach-director/references/env-check.md +132 -0
- package/skills/ai-coach-director/references/platform-api-pitfalls.md +218 -0
- package/skills/ai-coach-director/references/role-resource-matching.md +312 -0
- package/skills/ai-coach-director/references/self-improvement-examples.md +374 -0
- package/skills/ai-coach-director/references/verified-cli-cheatsheet.md +189 -0
- package/skills/ai-coach-director/scripts/activator.sh +4 -0
- package/skills/ai-coach-director/scripts/error-detector.sh +4 -0
- package/skills/ai-coach-director/scripts/extract-skill.sh +7 -0
- package/skills/soke-ai-training/SKILL.md +22 -1
- package/skills/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +3 -3
- package/skills/soke-course/SKILL.md +1 -1
- package/skills/soke-course/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +3 -3
- package/skills/soke-exam/SKILL.md +1 -1
- package/skills/soke-examPool/SKILL.md +124 -0
- package/skills/soke-learning-map/SKILL.md +1 -1
- package/skills/soke-learning-map/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +3 -3
- package/skills/soke-learning-profile/SKILL.md +1 -1
- package/skills/soke-photo-gallery/SKILL.md +1 -1
- package/skills/soke-shared/SKILL.md +1 -0
- package/skills/soke-training-demand/SKILL.md +112 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Partwise 重构变更摘要
|
|
2
|
+
|
|
3
|
+
> 记录 `ai-coach-director` 从旧三步大包流程迁移到 Part1-Part5 逐段编排流程的关键变化,供后续维护、交接和回归检查使用。
|
|
4
|
+
|
|
5
|
+
## 1. 架构层重构
|
|
6
|
+
|
|
7
|
+
- 新增 `coaching/prompt-engineer/parts/part1-basic.md`
|
|
8
|
+
- `prompt-engineer.md` 从 Step1/Step2/Step3 大包改为 Part1 → Part2 → Part3 → Part4 → Part5 串行生成、确认、同步
|
|
9
|
+
- `interaction.md` 改为 5 个 Part 弹窗 + 1 个微调诊断弹窗
|
|
10
|
+
- `sync-engine.md` 改为 Step1 create + Part2/Part3/Part4/Part5 operations 的 Partwise 同步引擎
|
|
11
|
+
- 状态快照统一改为 `mode: "partwise"`,使用 `current_part`、`confirmed_data.part1~part5`、`applied.part1~part5`
|
|
12
|
+
|
|
13
|
+
## 2. 真实 API 差异修正
|
|
14
|
+
|
|
15
|
+
### Part3 对话流程
|
|
16
|
+
- 历史旧写法:`replace_conversation_steps`
|
|
17
|
+
- 实证结论:平台不接受整包替换
|
|
18
|
+
- 当前规范:使用 `add_conversation_step` / `patch_conversation_step` / `remove_conversation_step` / `reorder_conversation_steps`
|
|
19
|
+
|
|
20
|
+
### Part4 评分配置
|
|
21
|
+
- 历史旧写法:`criteria_data` / `one_vote_veto` 直接平铺在 `data`
|
|
22
|
+
- 实证结论:真实请求必须包在 `data.config`
|
|
23
|
+
- 当前规范:使用 `data.config.criteria_data` 与 `data.config.one_vote_veto`
|
|
24
|
+
|
|
25
|
+
### Step1 创建
|
|
26
|
+
- 历史误区:只传基础字段即可创建
|
|
27
|
+
- 实证结论:缺少 `scenario_cover` 会直接失败
|
|
28
|
+
- 当前规范:先上传封面,再写入 `step1-create.json`
|
|
29
|
+
|
|
30
|
+
## 3. Part2 角色结构升级
|
|
31
|
+
|
|
32
|
+
### 已验证的稳定规则
|
|
33
|
+
- `replace_ai_roles` 可用,但不能只传裸 `role_data`
|
|
34
|
+
- 必须使用完整 custom role 外壳
|
|
35
|
+
- `avatar` 输入必须是头像资源 URL(来自 `+list-role-avatars` 的 `url` 字段),不是资源 ID
|
|
36
|
+
- `voice_id` 输入必须是声音资源 ID(来自 `+list-role-voices` 的 `id` 字段)
|
|
37
|
+
- `knowledge_level` 必须是数组,不是字符串
|
|
38
|
+
- `replace_ai_roles` 的数据键是 `data.roles`(非 `data.ai_roles`)
|
|
39
|
+
- 必须提供 `scenario_role_id`(如 `role_kong_dajie`)
|
|
40
|
+
- 建议同时写入 `tags`、`source_type`、`customized_fields`、`created_at`、`updated_at`
|
|
41
|
+
|
|
42
|
+
### 上游约束同步
|
|
43
|
+
- `prompt-engineer.md` Step2 已明确头像/语音留空待 Part2 apply 后自动匹配回填(见 `role-resource-matching.md`),不再在内容阶段手写资源 ID
|
|
44
|
+
- `part2-roles.md` 已新增平台落地硬规则、资源字段和生成后自检清单
|
|
45
|
+
- `sync-engine.md` 已加入 Part2 成功结构与错误排查规则
|
|
46
|
+
|
|
47
|
+
## 4. 经验沉淀
|
|
48
|
+
|
|
49
|
+
- 新增 `references/platform-api-pitfalls.md`
|
|
50
|
+
- 当历史文档、示例和真实 CLI 返回冲突时,以踩坑清单 + 最新实证为准
|
|
51
|
+
- `SKILL.md`、`prompt-engineer.md`、`sync-engine.md` 已显式引用该清单
|
|
52
|
+
|
|
53
|
+
## 5. 审查结果
|
|
54
|
+
|
|
55
|
+
本轮重构后,创建链路主文档已基本统一到 Partwise 口径:
|
|
56
|
+
|
|
57
|
+
- `SKILL.md`:总控入口与平台同步主口径已切换
|
|
58
|
+
- `prompt-engineer.md`:生成流程与 Part2 上游约束已切换
|
|
59
|
+
- `interaction.md`:弹窗模板与回退链路已对齐
|
|
60
|
+
- `sync-engine.md`:字段映射、CLI 模板、错误表已切换
|
|
61
|
+
|
|
62
|
+
### 本轮补修的文案问题
|
|
63
|
+
- 修复 `interaction.md` 中“取消回退链路”与实际按钮不一致的问题
|
|
64
|
+
- 旧文案原先把模板 2-6 都写成“取消”,但实际按钮分别是“重设角色设定 / 重设对话流程 / 重设评分标准 / 重设练习设置和知识库 / 保持原样”
|
|
65
|
+
- 现已改为与真实按钮一致的“回退链路”描述
|
|
66
|
+
|
|
67
|
+
## 6. 建议的回归检查顺序
|
|
68
|
+
|
|
69
|
+
1. 创建型流程:Part1 → Part5 各模板是否与按钮文案一致
|
|
70
|
+
2. 同步层:各 Part 的 JSON 文件名、CLI 参数、错误处理表是否一致
|
|
71
|
+
3. Part2:角色卡资源字段、数组字段、custom role 外壳是否完整
|
|
72
|
+
4. Part3:流程操作是否仍误用整包替换
|
|
73
|
+
5. Part4:评分配置是否仍遗漏 `data.config`
|
|
74
|
+
6. apply 后是否强制执行一次 `+get-scenario --raw` 验收
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# soke-cli 环境检测
|
|
2
|
+
|
|
3
|
+
独立于页面/创作管线,仅在需要调用平台接口时执行。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
> ⚠️ **沙箱绕过(全局规则)**:soke-cli 是 Go 编译的二进制文件,在 WorkBuddy Bash 工具沙箱中执行会受限(表现为 `permission denied`、`operation not permitted`、静默无输出)。**以下所有命令在调用 Bash 工具时必须设置 `dangerouslyDisableSandbox: true`**,包括 `which soke-cli`、`soke-cli --version`、`soke-cli config show`、`soke-cli auth login` 及后续全部 `soke-cli ai-training +...` 命令。若 soke-cli 命令在沙箱中执行失败并返回权限错误,这是预期行为——切换为 `dangerouslyDisableSandbox: true` 重试即可。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 检测流程
|
|
12
|
+
|
|
13
|
+
按顺序执行,任一步不通过则停止并引导修复。
|
|
14
|
+
|
|
15
|
+
### 1. Node.js 版本
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
node --version
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- ✅ >= 14.0.0 → 通过
|
|
22
|
+
- ❌ 未安装或版本过低 → 提示:`需要 Node.js >= 14.0.0,请先安装或升级`
|
|
23
|
+
- ❌ `command not found` → 提示安装 Node.js
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
### 2. soke-cli 安装
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
which soke-cli && soke-cli --version
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- ✅ 输出版本号 → 通过
|
|
34
|
+
- ❌ `command not found` → 执行安装:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
mkdir -p ~/.npm-global
|
|
38
|
+
npm config set prefix ~/.npm-global
|
|
39
|
+
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.zshrc
|
|
40
|
+
source ~/.zshrc
|
|
41
|
+
npm install -g @sokeai/cli@latest
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
安装后重新执行 `which soke-cli && soke-cli --version` 验证。
|
|
45
|
+
|
|
46
|
+
> Windows:将 `~/.zshrc` 替换为 PowerShell profile 路径,PATH 追加方式不同(见安装指南 Q2)。
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### 3. 登录状态
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
soke-cli config show
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- ✅ 输出含 `user_token` → 通过,进入下一步企业绑定检查
|
|
57
|
+
- ❌ 无 `user_token` → 执行登录:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
soke-cli auth login
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
自动打开浏览器完成 OAuth 授权。如果浏览器未自动打开,复制终端显示的链接手动打开。
|
|
64
|
+
|
|
65
|
+
登录完成后重新执行 `soke-cli config show`,确认 `user_token` 已存在。
|
|
66
|
+
|
|
67
|
+
- ❌ 返回 `401 Unauthorized` → Token 过期,重新登录:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
soke-cli auth logout
|
|
71
|
+
soke-cli auth login
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
登录成功后重新执行 `soke-cli config show`,确认 `user_token` 已恢复。
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### 4. 企业绑定(corp binding)
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
soke-cli config show
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
依次检查以下字段是否存在且非空:
|
|
85
|
+
- `implementation_corp_id`
|
|
86
|
+
- `corpid`
|
|
87
|
+
|
|
88
|
+
判定规则:
|
|
89
|
+
- ✅ `implementation_corp_id` 非空 → 通过,后续优先使用该字段
|
|
90
|
+
- ✅ `implementation_corp_id` 为空,但 `corpid` 非空 → 通过,后续可使用 `corpid`
|
|
91
|
+
- ❌ 两者都为空 → 提示用户:
|
|
92
|
+
> 已登录,但当前账号未绑定企业。请先在授客AI平台完成企业绑定,再重新执行 `soke-cli auth login --force`
|
|
93
|
+
|
|
94
|
+
如需强制刷新企业绑定信息,执行:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
soke-cli auth login --force
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
完成后重新执行 `soke-cli config show`,确认 `implementation_corp_id` 或 `corpid` 至少一个非空。
|
|
101
|
+
|
|
102
|
+
如果仍为空,说明当前账号未加入任何企业,需联系管理员添加。
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 常见故障速查
|
|
107
|
+
|
|
108
|
+
| 现象 | 原因 | 修复 |
|
|
109
|
+
|------|------|------|
|
|
110
|
+
| `which soke-cli` 无输出但已安装 | PATH 未生效 | `source ~/.zshrc` 或新开终端 |
|
|
111
|
+
| `401 Unauthorized` | Token 过期 | `soke-cli auth logout && soke-cli auth login` |
|
|
112
|
+
| 登录时浏览器未打开 | 系统无默认浏览器 | 手动复制终端链接到浏览器 |
|
|
113
|
+
| `npm: command not found` | Node.js 未安装 | 安装 Node.js >= 14 |
|
|
114
|
+
| `EACCES` 权限错误 | npm 全局安装需要 sudo | 使用 `~/.npm-global` 方案(见步骤2) |
|
|
115
|
+
| `implementation_corp_id` / `corpid` 为空 | 未绑定企业 | `soke-cli auth login --force` 重新授权,或联系管理员 |
|
|
116
|
+
| `permission denied` / 静默无输出 | soke-cli 在沙箱中受限(Go 二进制) | Bash 工具设置 `dangerouslyDisableSandbox: true` 重试 |
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 使用方式
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
# 在 ai-coach-director 中
|
|
124
|
+
read references/env-check.md
|
|
125
|
+
按顺序执行 4 步检测:
|
|
126
|
+
1. node --version
|
|
127
|
+
2. which soke-cli && soke-cli --version
|
|
128
|
+
3. soke-cli config show → 确认 user_token
|
|
129
|
+
4. soke-cli config show → 确认 implementation_corp_id / corpid 至少一个非空
|
|
130
|
+
全部通过 → 记录企业 ID,继续调度
|
|
131
|
+
任一步失败 → 按修复流程引导用户,不进入内容生成/同步
|
|
132
|
+
```
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# 平台 API 踩坑清单
|
|
2
|
+
|
|
3
|
+
> 记录 AI 陪练场景在真实 MentorAI 平台同步过程中的已验证差异。优先级高于历史示例;当文档、经验和平台返回冲突时,以本文件 + 最新 CLI 实证为准。
|
|
4
|
+
|
|
5
|
+
> 需要复制标准命令时,统一参考 `verified-cli-cheatsheet.md`,避免误写成顶层 `soke-cli +...`。
|
|
6
|
+
|
|
7
|
+
## 1. Step2 / Part3 对话流程不能整包替换
|
|
8
|
+
|
|
9
|
+
- 历史误区:使用 `replace_conversation_steps`
|
|
10
|
+
- 真实结果:422 校验失败
|
|
11
|
+
- 已验证做法:改用 `add_conversation_step` / `patch_conversation_step` / `remove_conversation_step` / `reorder_conversation_steps`
|
|
12
|
+
- 备注:字段名必须是 `step_name`,不是 `name`
|
|
13
|
+
|
|
14
|
+
## 2. Step3 / Part4 评分配置必须包在 `data.config`
|
|
15
|
+
|
|
16
|
+
- 历史误区:把 `criteria_data` 直接平铺在 `data` 下,或在 `config` 与 `criteria_data` 之间缺失层级
|
|
17
|
+
- 真实结果:`replace_scoring_criteria_config 必须提供 config` 或平台 UI 不显示评分配置
|
|
18
|
+
- 已验证做法:使用 `data.config.criteria_data`(完整的三层嵌套),不可省略 `config` 或 `criteria_data` 任一层级
|
|
19
|
+
|
|
20
|
+
## 2.1 Part4 `replace_scoring_criteria_config` 缺少外壳字段导致 UI 不渲染
|
|
21
|
+
|
|
22
|
+
- 历史误区:`data.config` 下只传了 `criteria_data`,缺少外壳字段
|
|
23
|
+
- 真实结果:API apply 成功,但平台 UI 不显示评分配置
|
|
24
|
+
- 已验证做法:`data.config` 必须同时包含:
|
|
25
|
+
- `scenario_criteria_id`:场景内评分标准唯一标识(格式 `criteria_{场景短码}`)
|
|
26
|
+
- `customization_level`:固定 `"full"`
|
|
27
|
+
- `is_custom_criteria`:固定 `true`
|
|
28
|
+
- `customized_fields`:固定 `["criteria_data"]`
|
|
29
|
+
- `criteria_data`:评分标准正文(直接在 config 下,完整三层嵌套:`data.config.criteria_data`)
|
|
30
|
+
- 备注:缺少任一外壳字段或层级缺失,平台 UI 无法识别和渲染评分配置模块
|
|
31
|
+
|
|
32
|
+
## 2.2 Part4 `criteria_data` 和维度缺少内部元数据字段
|
|
33
|
+
|
|
34
|
+
- 历史误区:`criteria_data` 只传了 `name`、`description`、`dimensions`,缺少内部元数据;维度缺少 `id` 和 `sort_order`
|
|
35
|
+
- 真实结果:数据存储但 UI 展示不完整或维度顺序不可控
|
|
36
|
+
- 已验证做法:
|
|
37
|
+
- `criteria_data` 必须包含:`source_type`(固定 `"enterprise"`)、`total_weight`(固定 `100`)、`tags`(取 Part1 标签前 4 个)
|
|
38
|
+
- 每个维度必须包含:`id`(格式 `dim_{code}`)、`sort_order`(从 1 递增)
|
|
39
|
+
- 参考:`比得_AI陪练CLI创建与更新场景使用指南.md` 第 6.4 节
|
|
40
|
+
|
|
41
|
+
> 生成 `part4-operations.json` 后,preview 前**必须逐项核对** `platform/sync-engine.md` 中的「Part4 replace_scoring_criteria_config 自查清单」(13 项),任一项不通过禁止 preview。
|
|
42
|
+
|
|
43
|
+
## 3. Step1 创建场景必须先准备封面
|
|
44
|
+
|
|
45
|
+
- 历史误区:只传 name / description / tags 就能建场景
|
|
46
|
+
- 真实结果:`soke-cli ai-training +create-scenario` 报缺少 `scenario_cover`
|
|
47
|
+
- 已验证做法:先上传封面,再把 `scenario_cover` URL 写入 `step1-create.json`
|
|
48
|
+
|
|
49
|
+
## 3.1 Step1 创建场景必须传 `key_points` 和 `scene_lang`
|
|
50
|
+
|
|
51
|
+
- 历史误区:`step1-create.json` 只写 name / description / tags,没写 key_points / scene_lang
|
|
52
|
+
- 真实结果:创建成功但场景不完整,或者平台校验报缺少必填字段
|
|
53
|
+
- 已验证做法:`step1-create.json` 必须包含六个字段:`name`, `description`, `tags`(数组), `key_points`(字符串,不能用数组), `scene_lang`(固定 `简体中文`), `scenario_cover`
|
|
54
|
+
- `key_points` 来源:将 Part1 的考核关键点拼接为单个字符串(分号或编号分隔),不能直接传数组
|
|
55
|
+
|
|
56
|
+
## 3.5 opening_dialogue_type 是整数,不是字符串
|
|
57
|
+
|
|
58
|
+
- 历史误区:传入 `"opening_dialogue_type": "2"` 或 `"opening_dialogue_type": "customer_first"`
|
|
59
|
+
- 真实结果:`VALIDATION_ERROR: opening_dialogue_type 必须是 1 或 2`
|
|
60
|
+
- 已验证做法:`"opening_dialogue_type": 1`(AI 先开口)或 `"opening_dialogue_type": 2`(学员/客户先开口),传数字不传字符串
|
|
61
|
+
- 影响文件:`sync-engine.md` Part2 字段映射表、`step2-operations.json` 示例
|
|
62
|
+
|
|
63
|
+
## 3.6 --operations-file 直接放数组,不要 {"operations": [...]} 包装
|
|
64
|
+
|
|
65
|
+
- 历史误区:operations JSON 套一层 `{"operations": [...], "step_name": "..."}`
|
|
66
|
+
- 真实结果:`解析 JSON 失败 .../operations.json: json: cannot unmarshal object into Go value of type []interface {}`
|
|
67
|
+
- 已验证做法:文件内容为裸数组 `[{type: "...", data: {...}}, ...]`,不套外层对象
|
|
68
|
+
- 影响:所有 `part2/3/4/5-operations.json` 的生成逻辑
|
|
69
|
+
|
|
70
|
+
## 3.7 apply 必须传 --idempotency-key,preview 不需要
|
|
71
|
+
|
|
72
|
+
- 历史误区:preview 和 apply 参数完全对称
|
|
73
|
+
- 真实结果:apply 缺少 `--idempotency-key` 时报 `apply 需要 idempotency_key`
|
|
74
|
+
- 已验证做法:
|
|
75
|
+
- `preview`:不传 `--idempotency-key`
|
|
76
|
+
- `apply`:传 `--idempotency-key "nature-part2-apply-1752395205"`(建议格式 `{场景短码}-{part}-apply-{timestamp}`)
|
|
77
|
+
|
|
78
|
+
## 3.8 reason 是 preview 和 apply 的必填参数
|
|
79
|
+
|
|
80
|
+
- 历史误区:`--reason` 是可选参数,只在多人协作时有用
|
|
81
|
+
- 真实结果:不传 `--reason` 时直接报 `reason 不能为空`
|
|
82
|
+
- 已验证做法:preview 和 apply 都传 `--reason "PartX: 描述"`,如 `--reason "Part2: AI角色设定同步"`
|
|
83
|
+
- 备注:reason 字符串会出现在快照列表中,建议含 Part 编号便于追踪
|
|
84
|
+
|
|
85
|
+
## 3.9 含中文引号的 JSON 必须通过 Python json.dump 写入,禁止 heredoc / echo
|
|
86
|
+
|
|
87
|
+
- 历史误区:用 shell heredoc 或 `echo` 生成含中文标点(如 `""` 中文双引号)的 JSON
|
|
88
|
+
- 真实结果:`invalid character '0' after object key:value pair` —— shell 会将中文引号误解析为语法结构
|
|
89
|
+
- 已验证做法:一律用 `python3 -c "import json; json.dump(data, f, ensure_ascii=False, indent=2)"` 写入 JSON 文件
|
|
90
|
+
- 备注:`「」`(直角引号)不触发此问题,只有 `""`(全角双引号,Unicode U+201C/U+201D)会
|
|
91
|
+
|
|
92
|
+
## 3.2 场景命令必须走 `ai-training` 子命令
|
|
93
|
+
|
|
94
|
+
- 历史误区:把命令写成 `soke-cli +create-scenario`、`soke-cli +get-scenario` 这类顶层调用
|
|
95
|
+
- 真实结果:命令入口错误,无法稳定复现平台行为,也容易把排查方向带偏
|
|
96
|
+
- 已验证做法:统一使用 `soke-cli ai-training +create-scenario`、`soke-cli ai-training +get-scenario`、`soke-cli ai-training +preview-scenario-update`、`soke-cli ai-training +apply-scenario-update`
|
|
97
|
+
- 备注:场景创建、读取、预览、应用、封面上传等 MentorAI 场景能力,均按 `soke-cli ai-training +...` 口径执行,不要省略 `ai-training`
|
|
98
|
+
|
|
99
|
+
## 3.3 soke-cli 在 WorkBuddy 沙箱中受限
|
|
100
|
+
|
|
101
|
+
- 历史误区:直接在 Bash 工具中执行 soke-cli 命令(默认沙箱模式)
|
|
102
|
+
- 真实结果:`permission denied`、`operation not permitted`、或静默无输出,命令未实际执行
|
|
103
|
+
- 根因:soke-cli 是 Go 编译的二进制文件,沙箱限制了其所需的系统调用
|
|
104
|
+
- 已验证做法:调用 Bash 工具执行任何 soke-cli 命令时,**必须设置 `dangerouslyDisableSandbox: true`**
|
|
105
|
+
- 备注:此规则适用于全部 soke-cli 子命令(`config show`、`auth login`、`ai-training +...` 等),不限于创建型流程。若 soke-cli 命令返回权限错误,第一反应应检查是否遗漏了 `dangerouslyDisableSandbox: true`
|
|
106
|
+
|
|
107
|
+
## 4. Part2 角色写入的真实最小稳定结构
|
|
108
|
+
|
|
109
|
+
### 关键结论
|
|
110
|
+
|
|
111
|
+
- `replace_ai_roles` 可用,数据键为 `data.roles`(非 `data.ai_roles`),不能只传裸 `role_data`
|
|
112
|
+
- 必须使用完整 custom role 外壳,且提供稳定的 `scenario_role_id`
|
|
113
|
+
- `avatar` 输入必须是头像资源 URL(来自 `+list-role-avatars` 的 `url` 字段),**严禁**使用资源 `id`
|
|
114
|
+
- `voice_id` 输入必须是声音资源 ID(来自 `+list-role-voices` 的 `id` 字段)
|
|
115
|
+
- `knowledge_level` 必须是数组,不是字符串
|
|
116
|
+
- 建议同时携带 `tags`、`source_type`、`customized_fields`、`created_at`、`updated_at`
|
|
117
|
+
|
|
118
|
+
> 生成 `part2-operations.json` 后,preview 前**必须逐项核对** `platform/sync-engine.md` 中的「Part2 replace_ai_roles 自查清单」(14 项),任一项不通过禁止 preview。
|
|
119
|
+
|
|
120
|
+
### 已验证可回读的角色结构特征
|
|
121
|
+
|
|
122
|
+
- `customization_level = "full"`
|
|
123
|
+
- `is_custom_role = true`
|
|
124
|
+
- `template_id / template_name / template_version = null`
|
|
125
|
+
- `source_type = "custom"`
|
|
126
|
+
- `customized_fields` 与 `role_data` 实际写入字段逐项对应
|
|
127
|
+
|
|
128
|
+
## 4.1 Part2 外壳字段层级放错 → "角色数据异常"
|
|
129
|
+
|
|
130
|
+
- 历史误区:把 `customization_level`、`is_custom_role`、`customized_fields`、`source_type`、`created_at`、`updated_at` 塞进 `role_data` 内部
|
|
131
|
+
- 真实结果:角色回读显示 `name: "角色数据异常"`,所有字段 null
|
|
132
|
+
- 已验证做法:这些 **平台外壳字段** 必须放在与 `role_data`、`scenario_role_id` 同级的**外层**,不可写入 `role_data` 内部。平台回读后可稳定解析的角色结构:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
// ✅ 正确 —— 外壳字段在外层
|
|
136
|
+
{
|
|
137
|
+
"scenario_role_id": "role_chen",
|
|
138
|
+
"customization_level": "full", // ← 外层
|
|
139
|
+
"is_custom_role": true, // ← 外层
|
|
140
|
+
"role_data": {
|
|
141
|
+
"name": "陈检查员",
|
|
142
|
+
"avatar": "<头像URL>",
|
|
143
|
+
"voice_id": "<语音ID>",
|
|
144
|
+
"description": "...",
|
|
145
|
+
"communication_style": "...",
|
|
146
|
+
"personality_type": "ISTJ",
|
|
147
|
+
"personality": "..."
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
// ❌ 错误 —— 外壳字段在 role_data 内
|
|
154
|
+
{
|
|
155
|
+
"scenario_role_id": "role_chen",
|
|
156
|
+
"role_data": {
|
|
157
|
+
"name": "陈检查员",
|
|
158
|
+
"customization_level": "full", // ← 错,触发"角色数据异常"
|
|
159
|
+
"is_custom_role": true, // ← 错
|
|
160
|
+
"customized_fields": [...], // ← 错
|
|
161
|
+
"source_type": "custom" // ← 错
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
- 备注:`sync-engine.md` 字段映射表只标注了业务字段的 `role_data.xxx` 路径,容易让人误以为外壳字段也属于 `role_data` 内部。**写 JSON 时先问:这个字段是描述"角色有什么属性"(→ `role_data` 内),还是描述"这个角色数据本身是什么类型"(→ 外层)**
|
|
167
|
+
|
|
168
|
+
### 常见错误
|
|
169
|
+
|
|
170
|
+
- 把外壳字段(`customization_level`/`is_custom_role`/`customized_fields`/`source_type`)错放进 `role_data` 内 → 角色数据异常
|
|
171
|
+
- 把 `knowledge_level` 写成单个字符串
|
|
172
|
+
- 只生成业务按需画像,不补平台外壳字段
|
|
173
|
+
- `taboos_objections` 写成长段散文,无法稳定映射为列表
|
|
174
|
+
|
|
175
|
+
## 5. preview / apply 成功,不等于平台最终可正常解析
|
|
176
|
+
|
|
177
|
+
- 历史误区:只要 preview 通过、apply 成功,就等于配置闭环完成
|
|
178
|
+
- 真实结果:评分配置可能 UI 不渲染、角色数据可能异常、字段可能未同步
|
|
179
|
+
- 已验证做法:每个 Part(Part1/Part2/Part3/Part4/Part5)apply 后,都要再做一次 `soke-cli ai-training +get-scenario --raw` 验收,逐项检查目标字段是否已正确写入平台
|
|
180
|
+
|
|
181
|
+
## 6. 乐观锁必须每次重取最新 `updated_at`
|
|
182
|
+
|
|
183
|
+
- 历史误区:沿用上一个 Part 的 `updated_at`
|
|
184
|
+
- 真实结果:`base_updated_at` 过期导致冲突或误判
|
|
185
|
+
- 已验证做法:每次 preview/apply 前先 `soke-cli ai-training +get-scenario`,永远以最新 `updated_at` 作为基线
|
|
186
|
+
|
|
187
|
+
## 7. 身份字段不能作为授权/选租户依据
|
|
188
|
+
|
|
189
|
+
- 历史误区:把 `corp_id` / `company_id` / `user_id` / `implementation_corp_id` 写进请求体,当作显式选租户手段
|
|
190
|
+
- 真实结果:这些字段可能被代理剥离,也不应作为授权依据
|
|
191
|
+
- 已验证做法:先通过环境检查确认登录态和企业绑定;请求体里不要依赖这些字段实现租户切换
|
|
192
|
+
|
|
193
|
+
## 推荐执行顺序
|
|
194
|
+
|
|
195
|
+
1. 先做环境检测
|
|
196
|
+
2. Step1 创建前先准备封面
|
|
197
|
+
3. 每个 Part 同步前先 `soke-cli ai-training +get-scenario`
|
|
198
|
+
4. 先 preview,再 apply
|
|
199
|
+
5. apply 后立刻 `soke-cli ai-training +get-scenario --raw` 验收该 Part 的目标字段
|
|
200
|
+
6. Part2 一旦回读异常,优先检查 avatar / knowledge_level / custom role 外壳 / customized_fields / **background**,而不是盲目重试。**background 为 null 是最常见疏漏**
|
|
201
|
+
7. Part4 一旦回读异常,优先检查 `data.config.criteria_data` 三层嵌套完整性、`source_type`/`total_weight`/`tags` 元数据字段、维度 `id`/`sort_order`
|
|
202
|
+
8. Part5 仅检查练习配置字段(时长/次数/分数/难度/助答),不检查 closing_dialogue/gold_dialogue/key_points
|
|
203
|
+
|
|
204
|
+
## 8. `add_conversation_step` apply 成功但数据不持久化
|
|
205
|
+
|
|
206
|
+
- 历史误区:以为 `add_conversation_step` apply 返回 snapshot_id 就代表保存成功
|
|
207
|
+
- 真实结果:`+get-scenario` 永远返回 `conversation_steps: []`——数据完全不保存(CLI v1.0.65/1.0.66 均存在此 bug)
|
|
208
|
+
- 影响范围:`add_conversation_step`(平铺 data + data.step 格式均无效)、`replace_conversation_steps`(422 校验拒绝不支持此 operation type)
|
|
209
|
+
- 已验证做法:创建型流程的对话步骤目前只能通过 MentorAI Web 管理后台手动添加,CLI 无法写入对话流程
|
|
210
|
+
- 备注:全量创建 `+create-scenario --request-file` 中 `conversation_steps` 理论上可写入,但实测时 `ai_roles` 和 `scoring_criteria_config` 等其他复杂字段被同时忽略(见 §9)
|
|
211
|
+
|
|
212
|
+
## 9. 全量创建 `--request-file` 只保存基础字段
|
|
213
|
+
|
|
214
|
+
- 历史误区:以为 `+create-scenario --request-file` 支持一次性写入所有字段
|
|
215
|
+
- 真实结果:仅 `name`/`description`/`tags`/`key_points`/`scene_lang`/`scenario_cover` 基础字段持久化;`ai_roles`/`scoring_criteria_config`/`conversation_steps`/练习配置等复杂字段全部被忽略(get 后返回 0 或 null)
|
|
216
|
+
- 已验证做法:创建后必须通过 `+apply-scenario-update` 逐 Part 写入角色(replace_ai_roles/patch_ai_role)、评分(replace_scoring_criteria_config)、教练设置(update_basic);对话步骤使用 Web 后台
|
|
217
|
+
|
|
218
|
+
|