@puyinkai/xiaobao-cli 0.1.0 → 0.1.8
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/dist/{api-Ccj5dLMo.mjs → api-CX99_4K7.mjs} +22 -5
- package/dist/{api-client-DwySN6x-.mjs → api-client-zDBFgk0y.mjs} +5 -3
- package/dist/{audio-VmDQMq59.mjs → audio-ShfvRomP.mjs} +2 -2
- package/dist/{auth-ChHvqjCS.mjs → auth-DpK81Vp5.mjs} +3 -3
- package/dist/cli.mjs +15 -11
- package/dist/{consultant-ABFTL_jx.mjs → consultant-CS9B42d3.mjs} +1 -1
- package/dist/current-CfDExInT.mjs +33 -0
- package/dist/{customer-DtSnQqy_.mjs → customer-B1cxRbJ9.mjs} +1 -1
- package/dist/{focus-BDYuP2vZ.mjs → focus-DfNPPhm5.mjs} +1 -1
- package/dist/{format-BZvv8lYc.mjs → format-yjmxrbNm.mjs} +15 -7
- package/dist/{list-Bkyi95YO.mjs → list-CD08BRLk.mjs} +6 -6
- package/dist/{list-CzB9_Jho.mjs → list-CKlx8YuL.mjs} +6 -6
- package/dist/{list-DW6KAAaC.mjs → list-CnlFIFiY.mjs} +6 -6
- package/dist/{list-iwd9cH1I.mjs → list-Cu6WzPpA.mjs} +5 -5
- package/dist/{list-CVKSGNu4.mjs → list-D56gEqiB.mjs} +6 -6
- package/dist/{list--o5Q_PI8.mjs → list-DCcCS6LM.mjs} +6 -6
- package/dist/{list-CGACp0y-.mjs → list-DI1OD95x.mjs} +3 -3
- package/dist/login-CUUcjWPd.mjs +156 -0
- package/dist/{logout-BJm9pjje.mjs → logout-DP7REhCd.mjs} +10 -7
- package/dist/{project-Ba05YzJ5.mjs → project-BuQQewOs.mjs} +3 -2
- package/dist/{project-store-Bz5kf-EI.mjs → project-store-CKVJa54T.mjs} +4 -3
- package/dist/{qa-D-B9FV9W.mjs → qa-CKsKiQIm.mjs} +5 -5
- package/dist/{resistance-Cf7zsdB3.mjs → resistance-DsE-Ha6Y.mjs} +1 -1
- package/dist/{text-BLH4R3xv.mjs → text-C3jhdPoe.mjs} +5 -5
- package/dist/{token-store-CHZ_rJQk.mjs → token-store-CXizLE2_.mjs} +46 -6
- package/dist/{use-DV9Ii3Tn.mjs → use-BZES4FZC.mjs} +2 -2
- package/dist/{visit-Ct3Vea8I.mjs → visit-CX0Mc1n6.mjs} +1 -1
- package/dist/{whoami-DwTHvI4B.mjs → whoami-CZVez-rm.mjs} +2 -2
- package/package.json +2 -2
- package/skills/wangxiaobao-audio-query/SKILL.md +51 -106
- package/skills/wangxiaobao-audio-wiki/SKILL.md +31 -77
- package/skills/wangxiaobao-audio-wiki/references/audio-wiki-schema.md +386 -0
- package/skills/wangxiaobao-audio-wiki/references/llm-wiki-ingest.md +450 -0
- package/skills/wangxiaobao-customer-focus-query/SKILL.md +37 -87
- package/skills/wangxiaobao-customer-query/SKILL.md +41 -90
- package/skills/wangxiaobao-customer-resistance-query/SKILL.md +32 -86
- package/skills/wangxiaobao-quick-qa/SKILL.md +41 -92
- package/skills/wangxiaobao-shared/SKILL.md +194 -0
- package/skills/wangxiaobao-switch-project/SKILL.md +51 -77
- package/skills/wangxiaobao-visit-query/SKILL.md +41 -88
- package/dist/login-BwkrByMm.mjs +0 -91
- package/dist/{device-flow-BgsZipYA.mjs → device-flow-D6JVcEap.mjs} +1 -1
- /package/dist/{headers-D79npewp.mjs → headers-DSnR4sjk.mjs} +0 -0
- /package/dist/{util-DgwkUfV9.mjs → util-CaPQBlNa.mjs} +0 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
# 旺小宝录音 Wiki — 业务 Schema
|
|
2
|
+
|
|
3
|
+
本文档定义 `wangxiaobao-audio-wiki` skill 落地的 wiki 目录结构、
|
|
4
|
+
frontmatter 字段约束、wikilinks 规则、标签词表来源。
|
|
5
|
+
|
|
6
|
+
**继承关系**:在 [`llm-wiki-ingest.md`](llm-wiki-ingest.md)(Karpathy LLM
|
|
7
|
+
Wiki 通用规范,Layer 1/2/3 分层、index/log 机制、wikilinks 最少数量等
|
|
8
|
+
框架)之上**叠加**这套业务 schema。先读通用规范再读本文。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Layer 0 — `projects/` 项目维度(最外层)
|
|
13
|
+
|
|
14
|
+
所有 wiki 内容**先按项目分组**。用户在 `wangxiaobao-switch-project` skill
|
|
15
|
+
切项目后,wiki 写入路径都落到对应项目目录下,避免不同项目的录音 / 顾问
|
|
16
|
+
画像 / 客户档案串味。
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
wiki/
|
|
20
|
+
└── projects/
|
|
21
|
+
└── {projectId}-{projectName}/ # 第 0 层:项目(projectId 锚稳定,name 给人看)
|
|
22
|
+
├── raw/audio/... # 第 1-3 层(顾问/日期/录音,见下文)
|
|
23
|
+
├── consultants/ # Layer 2 子目录
|
|
24
|
+
├── customers/
|
|
25
|
+
├── topics/
|
|
26
|
+
├── scripts/
|
|
27
|
+
├── index.md # Layer 3:本项目索引
|
|
28
|
+
├── log.md # Layer 3:本项目 ingest 日志
|
|
29
|
+
└── SCHEMA.md # Layer 3:本项目标签词表
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 为什么是 `{projectId}-{projectName}`
|
|
33
|
+
|
|
34
|
+
跟下文顾问目录同思路:`projectId`(前缀)稳定唯一,`projectName`(后缀)
|
|
35
|
+
给人看。项目改名是低频事件,靠 frontmatter `project_id` 字段做稳定关联。
|
|
36
|
+
|
|
37
|
+
### projectName 同样要 sanitize
|
|
38
|
+
|
|
39
|
+
删 `/ \ : * ? " < > |` 和空格;保留中文 / 字母 / 数字 / `-` / `.`。
|
|
40
|
+
|
|
41
|
+
示例:`"成都小黄鸭一号"` → 直接用;`"销售/管理 试点"` → `销售管理试点`。
|
|
42
|
+
|
|
43
|
+
### 多项目共存怎么办
|
|
44
|
+
|
|
45
|
+
一个 cwd 下可以同时存放多个项目的 wiki —— `wiki/projects/9001-成都项目甲/`
|
|
46
|
+
和 `wiki/projects/9002-成都项目乙/` 并存。用户切项目时(CLI 全局
|
|
47
|
+
active-project 变了,由 `xiaobao-cli project use` 命令 写入
|
|
48
|
+
`~/.xiaobao/active-project.json`),sync / ingest
|
|
49
|
+
**只动当前 project 目录**,老项目的 wiki 不受影响。
|
|
50
|
+
|
|
51
|
+
### SCHEMA.md / index.md / log.md 项目独立
|
|
52
|
+
|
|
53
|
+
每个项目有自己的标签词表(话题分类 / 话术分类)、自己的索引、自己的入库
|
|
54
|
+
日志。如果两个项目想共享词表,用软链接或者复制;默认是**每项目独立**。
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 2. Layer 1 — `raw/audio/` 三层目录(在项目目录下)
|
|
59
|
+
|
|
60
|
+
录音原始数据按 **顾问 / 日期 / 录音** 三层嵌套,挂在项目目录下:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
wiki/projects/{projectId}-{projectName}/
|
|
64
|
+
└── raw/
|
|
65
|
+
└── audio/
|
|
66
|
+
├── {userId}-{saleName}/ # 第 1 层:置业顾问(user-id 锚稳定,名字给人看)
|
|
67
|
+
│ ├── 2026-05-09/ # 第 2 层:录音发生日期(startTime 的日期)
|
|
68
|
+
│ │ ├── 12345.md # 第 3 层:单条录音(文件名 = audioId)
|
|
69
|
+
│ │ ├── 12346.md
|
|
70
|
+
│ │ └── 12347.md
|
|
71
|
+
│ └── 2026-05-10/
|
|
72
|
+
│ └── 12348.md
|
|
73
|
+
└── 200-李四/
|
|
74
|
+
└── 2026-05-09/
|
|
75
|
+
└── 12349.md
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 为什么用 `{userId}-{saleName}` 作目录名
|
|
79
|
+
|
|
80
|
+
- `userId`(前缀)保证**稳定唯一**:即使顾问改名 / 离职后重新入职,路径
|
|
81
|
+
不会乱
|
|
82
|
+
- `saleName`(后缀)保证**人能直接看懂**:浏览 `raw/audio/` 时无需查 id
|
|
83
|
+
- 顾问改名是低频事件,路径漂移可接受;ingest 阶段从 frontmatter 拿
|
|
84
|
+
`consultant_user_id` 关联(不依赖路径里的名字字符串)
|
|
85
|
+
|
|
86
|
+
### saleName 字符 sanitize
|
|
87
|
+
|
|
88
|
+
- 删除:空格、`/` `\` `:` `*` `?` `"` `<` `>` `|`
|
|
89
|
+
- 保留:中文 / 字母 / 数字 / `-` / `.`
|
|
90
|
+
|
|
91
|
+
示例:`"张 三·王"` → `张三王`,最终目录 `100-张三王/`
|
|
92
|
+
|
|
93
|
+
### Layer 1 不可变
|
|
94
|
+
|
|
95
|
+
`raw/audio/` 下任何文件**只写一次**:
|
|
96
|
+
- audio-wiki sync 阶段写入
|
|
97
|
+
- 后续 ingest 阶段**只读**
|
|
98
|
+
- 即使录音数据变化,也不 overwrite —— 业务上不应该出现
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 3. Layer 1 录音文件 frontmatter
|
|
103
|
+
|
|
104
|
+
每条 `raw/audio/.../{audioId}.md` 的 frontmatter 必填字段:
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
---
|
|
108
|
+
# 出处与稳定锚点
|
|
109
|
+
source: wangxiaobao-audio
|
|
110
|
+
audio_id: 12345 # 主键,跟文件名一致
|
|
111
|
+
file_id: "..." # 上游 fileId
|
|
112
|
+
file_url: "..." # 18000 秒过期的播放链接(仅出处参考)
|
|
113
|
+
|
|
114
|
+
# 多租户隔离锚
|
|
115
|
+
tenant_id: "395809723556831232" # CLI active-project.tenantId
|
|
116
|
+
project_id: "434616948240678912" # CLI active-project.projectId
|
|
117
|
+
|
|
118
|
+
# 时间锚(LocalDateTime 不带时区,跟上游 API 一致)
|
|
119
|
+
recorded_start: "2026-05-09 10:23:11"
|
|
120
|
+
recorded_end: "2026-05-09 10:35:42"
|
|
121
|
+
duration_sec: 751
|
|
122
|
+
|
|
123
|
+
# 置业顾问关联(ingest 时建 wikilink 用)
|
|
124
|
+
consultant_user_id: 100
|
|
125
|
+
consultant_name: 张三
|
|
126
|
+
|
|
127
|
+
# 说话人占比(来自 xiaobao-cli audio text 的 talkRatios)
|
|
128
|
+
talk_ratios:
|
|
129
|
+
- role: 销售
|
|
130
|
+
ratio: 0.62
|
|
131
|
+
- role: 客户
|
|
132
|
+
ratio: 0.38
|
|
133
|
+
|
|
134
|
+
# Layer 关系(让 LLM 一眼分清层级)
|
|
135
|
+
layer: raw
|
|
136
|
+
parent_consultant: "[[consultants/100-张三]]" # wikilink,指向 Layer 2 顾问页
|
|
137
|
+
---
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
正文:把 `xiaobao-cli audio text` 返回的 `texts[]` 按 "speaker: content"
|
|
141
|
+
逐行排好。每行可带时间戳:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
[10:23:15] 销售:您好张总,我是旺小宝的小张,咱们那个项目...
|
|
145
|
+
[10:23:22] 客户:嗯嗯你说
|
|
146
|
+
...
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 4. Layer 2 — 三层知识页
|
|
152
|
+
|
|
153
|
+
ingest 阶段从 `raw/audio/` 提炼出知识页,按"顾问 → 客户/话题 → 话术"组织:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
wiki/projects/{projectId}-{projectName}/
|
|
157
|
+
├── consultants/ # ┐
|
|
158
|
+
│ ├── 100-张三.md # │ 第 1 层:置业顾问画像
|
|
159
|
+
│ └── 200-李四.md # ┘
|
|
160
|
+
├── customers/ # ┐
|
|
161
|
+
│ ├── 王总.md # │ 第 2 层(A):客户画像
|
|
162
|
+
│ └── 李女士.md # ┘
|
|
163
|
+
├── topics/ # ┐
|
|
164
|
+
│ ├── 户型疑虑.md # │ 第 2 层(B):话题/场景
|
|
165
|
+
│ └── 价格异议.md # ┘
|
|
166
|
+
└── scripts/ # ┐
|
|
167
|
+
├── 破冰寒暄.md # │ 第 3 层:可复用话术
|
|
168
|
+
└── 户型介绍.md # ┘
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
> 第 2 层有两个并列子类(客户 / 话题),它们之间不分先后;scripts/
|
|
172
|
+
> 是从 topics 进一步抽象出的"可复用话术"。
|
|
173
|
+
|
|
174
|
+
### 3.1 `consultants/{userId}-{saleName}.md` — 置业顾问画像
|
|
175
|
+
|
|
176
|
+
```yaml
|
|
177
|
+
---
|
|
178
|
+
layer: consultant
|
|
179
|
+
consultant_user_id: 100
|
|
180
|
+
consultant_name: 张三
|
|
181
|
+
tags: [置业顾问, consultant] # 标签必须来自 SCHEMA.md 词表
|
|
182
|
+
|
|
183
|
+
# 至少 2 个 wikilinks
|
|
184
|
+
recent_audios:
|
|
185
|
+
- "[[raw/audio/100-张三/2026-05-09/12345]]"
|
|
186
|
+
- "[[raw/audio/100-张三/2026-05-09/12346]]"
|
|
187
|
+
top_customers: # 高频对接客户
|
|
188
|
+
- "[[customers/王总]]"
|
|
189
|
+
- "[[customers/李女士]]"
|
|
190
|
+
top_topics:
|
|
191
|
+
- "[[topics/户型疑虑]]"
|
|
192
|
+
- "[[topics/价格异议]]"
|
|
193
|
+
|
|
194
|
+
# 时间维度(按月聚合,让顾问表现可追踪)
|
|
195
|
+
monthly_stats:
|
|
196
|
+
"2026-05":
|
|
197
|
+
audio_count: 23
|
|
198
|
+
avg_duration_min: 12
|
|
199
|
+
new_customers: 5
|
|
200
|
+
---
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
正文:人话总结这位顾问的沟通风格、擅长话题、典型客户类型、近期表现。
|
|
204
|
+
正文要引用至少 2 条 raw audio 作为证据,比如:
|
|
205
|
+
|
|
206
|
+
> 张三在「价格异议」话题处理上有稳定模式(见 [[raw/audio/100-张三/2026-05-09/12345]]
|
|
207
|
+
> 第 8 分钟),通常先共情再给方案……
|
|
208
|
+
|
|
209
|
+
### 3.2 `customers/{customerName}.md` — 客户画像
|
|
210
|
+
|
|
211
|
+
```yaml
|
|
212
|
+
---
|
|
213
|
+
layer: customer
|
|
214
|
+
customer_name: 王总
|
|
215
|
+
tags: [客户]
|
|
216
|
+
|
|
217
|
+
# 跟客户对接的顾问(可能不止一位)
|
|
218
|
+
consultants:
|
|
219
|
+
- "[[consultants/100-张三]]"
|
|
220
|
+
audio_references: # 至少 2 个
|
|
221
|
+
- "[[raw/audio/100-张三/2026-05-09/12345]]"
|
|
222
|
+
- "[[raw/audio/100-张三/2026-05-12/12389]]"
|
|
223
|
+
related_topics:
|
|
224
|
+
- "[[topics/户型疑虑]]"
|
|
225
|
+
- "[[topics/价格异议]]"
|
|
226
|
+
|
|
227
|
+
# 跟进状态(业务字段,可选)
|
|
228
|
+
status: 跟进中 # 跟进中 / 已成交 / 已流失
|
|
229
|
+
first_contact: "2026-05-09"
|
|
230
|
+
last_contact: "2026-05-12"
|
|
231
|
+
audio_count: 3
|
|
232
|
+
---
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
正文:客户兴趣点、决策路径、关心议题、跟进历史时间线。
|
|
236
|
+
|
|
237
|
+
### 3.3 `topics/{topic}.md` — 话题/场景
|
|
238
|
+
|
|
239
|
+
```yaml
|
|
240
|
+
---
|
|
241
|
+
layer: topic
|
|
242
|
+
topic: 户型疑虑
|
|
243
|
+
tags: [话题, 销售场景]
|
|
244
|
+
|
|
245
|
+
# 跟话题相关的录音 + 客户 + 顾问处理范式
|
|
246
|
+
audio_references: # 至少 2 个
|
|
247
|
+
- "[[raw/audio/100-张三/2026-05-09/12345]]"
|
|
248
|
+
- "[[raw/audio/200-李四/2026-05-10/12349]]"
|
|
249
|
+
customers:
|
|
250
|
+
- "[[customers/王总]]"
|
|
251
|
+
consultants:
|
|
252
|
+
- "[[consultants/100-张三]]"
|
|
253
|
+
related_scripts:
|
|
254
|
+
- "[[scripts/户型介绍]]"
|
|
255
|
+
---
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
正文:这个话题客户常问的具体问题、销售常用回应、最佳实践。
|
|
259
|
+
|
|
260
|
+
### 3.4 `scripts/{scriptName}.md` — 可复用话术
|
|
261
|
+
|
|
262
|
+
```yaml
|
|
263
|
+
---
|
|
264
|
+
layer: script
|
|
265
|
+
script_name: 户型介绍
|
|
266
|
+
tags: [话术, 销售话术]
|
|
267
|
+
|
|
268
|
+
source_topics: # 这条话术从哪些话题抽象来
|
|
269
|
+
- "[[topics/户型疑虑]]"
|
|
270
|
+
source_audios: # 至少 2 个实际录音作为出处
|
|
271
|
+
- "[[raw/audio/100-张三/2026-05-09/12345]]"
|
|
272
|
+
- "[[raw/audio/100-张三/2026-05-12/12389]]"
|
|
273
|
+
contributors: # 哪些顾问贡献了这个话术
|
|
274
|
+
- "[[consultants/100-张三]]"
|
|
275
|
+
---
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
正文:完整可复用的话术模板,分段写"开场 / 引导 / 异议处理 / 收尾"。引用
|
|
279
|
+
实际录音片段作为证据。
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 5. Layer 3 — index / log / SCHEMA
|
|
284
|
+
|
|
285
|
+
每个项目独立一套 Layer 3 文件,都在 `wiki/projects/{projectId}-{projectName}/`
|
|
286
|
+
根下:
|
|
287
|
+
|
|
288
|
+
| 文件 | 作用 | 谁维护 |
|
|
289
|
+
| --- | --- | --- |
|
|
290
|
+
| `index.md` | 本项目索引:entity / concept 名 → wikilink + 出现次数 | ingest 每次跑完追加新条目 |
|
|
291
|
+
| `log.md` | 本项目增量同步日志:每次 ingest 写一行(时间 + 新增页数 + 跳过数) | ingest 每次跑完 append 一行 |
|
|
292
|
+
| `SCHEMA.md` | 本项目稳定词表:话题分类 / 标签词汇 / 话术分类 | **人**维护,ingest 只读 |
|
|
293
|
+
|
|
294
|
+
### SCHEMA.md 词表结构(示例)
|
|
295
|
+
|
|
296
|
+
```markdown
|
|
297
|
+
# wangxiaobao audio wiki schema
|
|
298
|
+
|
|
299
|
+
## 话题词表(topics/)
|
|
300
|
+
- 户型疑虑
|
|
301
|
+
- 价格异议
|
|
302
|
+
- 周末看房
|
|
303
|
+
- 物业咨询
|
|
304
|
+
- 学区房
|
|
305
|
+
- ...
|
|
306
|
+
|
|
307
|
+
## 话术词表(scripts/)
|
|
308
|
+
- 破冰寒暄
|
|
309
|
+
- 户型介绍
|
|
310
|
+
- 成交逼定
|
|
311
|
+
- 异议处理
|
|
312
|
+
- 客户关怀
|
|
313
|
+
- ...
|
|
314
|
+
|
|
315
|
+
## 标签词表(tags 字段值)
|
|
316
|
+
- 置业顾问
|
|
317
|
+
- consultant
|
|
318
|
+
- 客户
|
|
319
|
+
- 话题
|
|
320
|
+
- 销售场景
|
|
321
|
+
- 话术
|
|
322
|
+
- 销售话术
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
ingest 阶段创建 Layer 2 页时:
|
|
326
|
+
- `tags` 字段值必须从 SCHEMA.md「标签词表」选
|
|
327
|
+
- `topic` / `script_name` 字段值必须从对应词表选
|
|
328
|
+
- 遇到词表外的新词 → **不要私自创建**,先提示用户加进 SCHEMA.md 再 ingest
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## 6. Wikilinks 规则
|
|
333
|
+
|
|
334
|
+
继承 [`llm-wiki-ingest.md`](llm-wiki-ingest.md) 的"每页至少 2 个 wikilinks"约束。
|
|
335
|
+
针对本业务,**最小连接图**:
|
|
336
|
+
|
|
337
|
+
| 页类型 | 必须 wikilink 到 |
|
|
338
|
+
| --- | --- |
|
|
339
|
+
| `raw/audio/.../*.md` | 1 个 `parent_consultant` |
|
|
340
|
+
| `consultants/*.md` | ≥ 2 个 `recent_audios` 或 `top_customers` |
|
|
341
|
+
| `customers/*.md` | ≥ 1 个 `consultants` + ≥ 2 个 `audio_references` |
|
|
342
|
+
| `topics/*.md` | ≥ 2 个 `audio_references` + ≥ 1 个 `customers` 或 `consultants` |
|
|
343
|
+
| `scripts/*.md` | ≥ 1 个 `source_topics` + ≥ 2 个 `source_audios` |
|
|
344
|
+
|
|
345
|
+
raw/ 是 Layer 1 不可变,wikilink 只指向 Layer 2,**不被其他页指向(除了
|
|
346
|
+
顾问页的 `recent_audios`)** —— 这样删一条 raw 不会破坏 Layer 2 网络。
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## 7. ingest 入库流程(业务版)
|
|
351
|
+
|
|
352
|
+
通用 ingest 流程见 [`llm-wiki-ingest.md`](llm-wiki-ingest.md)。本业务的具体
|
|
353
|
+
落地步骤:
|
|
354
|
+
|
|
355
|
+
所有路径都在当前项目目录下(`wiki/projects/{projectId}-{projectName}/`):
|
|
356
|
+
|
|
357
|
+
1. 从 CLI active-project state(`~/.xiaobao/active-project.json`)
|
|
358
|
+
读 `projectId` / `projectName` → 定位项目目录
|
|
359
|
+
2. 读项目目录下 `SCHEMA.md`(拿到话题/话术/标签词表)
|
|
360
|
+
3. 读项目目录下 `index.md`(拿到已存在的 entity/concept 列表)
|
|
361
|
+
4. 读最近的项目目录下 `log.md`(拿到上次 ingest 截止时间)
|
|
362
|
+
5. 扫描项目目录下 `raw/audio/` 下**新于 log 截止时间**的所有录音文件
|
|
363
|
+
6. 对每条 raw audio:
|
|
364
|
+
- 从 frontmatter 拿 `consultant_user_id` → 找/建 `consultants/<id>-<name>.md`
|
|
365
|
+
- 从正文识别 **客户名 / 主要话题** → 找/建 `customers/...` + `topics/...`
|
|
366
|
+
- 如果话题有清晰可复用话术 → 找/建 `scripts/...`
|
|
367
|
+
- 4 层之间建立 wikilinks
|
|
368
|
+
7. 更新项目目录下 `index.md`:新建的 entity / concept 加进索引
|
|
369
|
+
8. 写项目目录下 `log.md` 一行:`2026-05-12T14:30:00 ingest: new=12 update=8 skip=3`
|
|
370
|
+
|
|
371
|
+
**绝不要**跨项目读写——一次 ingest 只动一个项目的目录。
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## 8. 常见错误与排查
|
|
376
|
+
|
|
377
|
+
- **创建 Layer 2 页时 tag 不在 SCHEMA.md 词表** — 不要私自新建词。先 prompt
|
|
378
|
+
用户:「这个 tag/topic/script 名称 SCHEMA.md 里没有,要加进词表后再 ingest 吗?」
|
|
379
|
+
- **同一客户两个顾问对接 → customers 页冲突** — 一个 customer 文件,
|
|
380
|
+
`consultants` 列表里两个 wikilink;按时间线写跟进历史,不要分两个文件
|
|
381
|
+
- **顾问改名** — `consultants/{userId}-{oldName}.md` 改成
|
|
382
|
+
`consultants/{userId}-{newName}.md`(git mv 保留历史),所有指向它的
|
|
383
|
+
wikilink 用编辑器批量替换。**不要**两个文件并存
|
|
384
|
+
- **wikilinks 数量不够** — Layer 2 页强约束 ≥ 2 个 wikilinks。如果 ingest
|
|
385
|
+
阶段确实拿不到 2 个有效引用,**先不创建这页**,把这条 raw audio 留到下次
|
|
386
|
+
ingest 累积够引用再建(避免"孤儿页"污染知识图)
|