@shulex/cxclawctl 0.1.2 → 0.1.3
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 +25 -22
- package/dist/cli.js +2202 -127
- package/dist/cli.js.map +1 -1
- package/package.json +19 -6
- package/capabilities.lock.json +0 -898
- package/requirements-cli.txt +0 -2
- package/skills/__lib__/__init__.py +0 -0
- package/skills/__lib__/skill-runtime/bootstrap.py +0 -134
- package/skills/__lib__/solvea-api/__init__.py +0 -0
- package/skills/__lib__/solvea-api/client.py +0 -1944
- package/skills/__lib__/solvea-api/dashboard.py +0 -100
- package/skills/__lib__/solvea-api/solvea_api.py +0 -1341
- package/skills/agent-analytics/SKILL.md +0 -74
- package/skills/agent-analytics/references/chat-report-fields.md +0 -36
- package/skills/agent-analytics/references/report-fields.md +0 -130
- package/skills/agent-analytics/references/transcript.md +0 -110
- package/skills/agent-builder/SKILL.md +0 -42
- package/skills/agent-builder/interfaces/fallback-chatflow.md +0 -47
- package/skills/agent-builder/references/chatflow/graph-spec.md +0 -259
- package/skills/agent-builder/references/chatflow/node-selection.md +0 -89
- package/skills/agent-builder/references/chatflow/nodes/agent.md +0 -350
- package/skills/agent-builder/references/chatflow/nodes/business-track.md +0 -43
- package/skills/agent-builder/references/chatflow/nodes/code.md +0 -157
- package/skills/agent-builder/references/chatflow/nodes/collect-order.md +0 -47
- package/skills/agent-builder/references/chatflow/nodes/finish.md +0 -34
- package/skills/agent-builder/references/chatflow/nodes/human-review.md +0 -60
- package/skills/agent-builder/references/chatflow/nodes/if-else.md +0 -100
- package/skills/agent-builder/references/chatflow/nodes/intent.md +0 -79
- package/skills/agent-builder/references/chatflow/nodes/knowledge-reply.md +0 -43
- package/skills/agent-builder/references/chatflow/nodes/llm.md +0 -117
- package/skills/agent-builder/references/chatflow/nodes/note.md +0 -38
- package/skills/agent-builder/references/chatflow/nodes/question.md +0 -97
- package/skills/agent-builder/references/chatflow/nodes/rag-reply.md +0 -68
- package/skills/agent-builder/references/chatflow/nodes/reply.md +0 -97
- package/skills/agent-builder/references/chatflow/nodes/start.md +0 -35
- package/skills/agent-builder/references/chatflow/nodes/sub-graph.md +0 -48
- package/skills/agent-builder/references/chatflow/nodes/tool.md +0 -138
- package/skills/agent-builder/references/chatflow/nodes/transfer-to-human.md +0 -63
- package/skills/agent-builder/references/chatflow/nodes/variable-assignment.md +0 -52
- package/skills/agent-builder/references/chatflow/nodes/variable-extract.md +0 -50
- package/skills/agent-builder/references/chatflow/nodes/variable-process.md +0 -70
- package/skills/agent-builder/references/chatflow/overview.md +0 -53
- package/skills/agent-builder/references/chatflow/visual-translation.md +0 -64
- package/skills/agent-builder/references/chatflow/workflow.md +0 -134
- package/skills/agent-builder/references/multi-agent/create-update.md +0 -185
- package/skills/agent-builder/references/multi-agent/graph-spec.md +0 -246
- package/skills/agent-builder/references/multi-agent/graph-structure.md +0 -12
- package/skills/agent-builder/references/multi-agent/migrate-to-chatflow.md +0 -13
- package/skills/agent-builder/references/multi-agent/migration/large.md +0 -554
- package/skills/agent-builder/references/multi-agent/migration/principles.md +0 -446
- package/skills/agent-builder/references/multi-agent/migration/small.md +0 -225
- package/skills/agent-builder/references/multi-agent/orchestration.md +0 -11
- package/skills/agent-builder/references/multi-agent/overview.md +0 -48
- package/skills/agent-builder/references/multi-agent/update.md +0 -128
- package/skills/agent-builder/references/multi-agent/workflow.md +0 -87
- package/skills/agent-builder/references/single-agent/overview.md +0 -48
- package/skills/agent-builder/references/single-agent/prompt.md +0 -16
- package/skills/agent-builder/references/single-agent/tools.md +0 -36
- package/skills/agent-builder/references/single-agent/voice.md +0 -46
- package/skills/agent-builder/references/tools/http-tool.md +0 -315
- package/skills/agent-builder/references/tools/mock-tool.md +0 -279
- package/skills/agent-builder/references/tools/overview.md +0 -46
- package/skills/agent-builder/references/tools/tool-config.md +0 -43
- package/skills/agent-builder/references/tools/x-token.md +0 -34
- package/skills/agent-builder/scripts/chatflow/chatflow_builder.py +0 -3458
- package/skills/agent-builder/scripts/chatflow/validate_graph.py +0 -1697
- package/skills/agent-builder/scripts/copy_marketplace_agent.py +0 -61
- package/skills/agent-builder/scripts/multi-agent/legacy_graph_analyzer.py +0 -5974
- package/skills/agent-builder/scripts/multi-agent/replay_compare.py +0 -679
- package/skills/agent-builder/scripts/patch_agent_tools.py +0 -135
- package/skills/agent-builder/scripts/tools/validate_tool_config.py +0 -384
- package/skills/agent-tester/SKILL.md +0 -35
- package/skills/agent-tester/batch-test/overview.md +0 -86
- package/skills/agent-tester/scripts/batch_test_sheet.py +0 -213
- package/skills/agent-tester/single-test/badcase-retest.md +0 -85
- package/skills/agent-tester/single-test/direct-test.md +0 -24
- package/skills/agent-tester/single-test/overview.md +0 -142
- package/skills/delivery/SKILL.md +0 -112
- package/skills/delivery/interfaces/classify.md +0 -38
- package/skills/delivery/interfaces/create-agents.md +0 -89
- package/skills/delivery/interfaces/delivery-test.md +0 -67
- package/skills/delivery/references/flow.md +0 -40
- package/skills/delivery/references/validation.md +0 -15
- package/skills/delivery/scripts/batch_test.py +0 -704
- package/skills/delivery/scripts/classify.py +0 -22
- package/skills/delivery/scripts/create_agents.py +0 -695
- package/skills/delivery/scripts/gen_delivery_report.py +0 -335
- package/skills/delivery/scripts/gen_excel.py +0 -234
- package/skills/delivery/scripts/gen_report.py +0 -208
- package/skills/delivery/scripts/plan.py +0 -163
- package/skills/delivery/scripts/render.py +0 -713
- package/skills/delivery/scripts/render_summary.py +0 -38
- package/skills/delivery/scripts/sample_history_cases.py +0 -109
- package/skills/kb-builder/SKILL.md +0 -80
- package/skills/kb-builder/interfaces/qa-upload.md +0 -55
- package/skills/kb-builder/interfaces/web-kb.md +0 -84
- package/skills/kb-builder/references/directory.md +0 -373
- package/skills/kb-builder/references/export.md +0 -282
- package/skills/kb-builder/references/isolation-keywords.md +0 -113
- package/skills/kb-builder/references/knowledge.md +0 -153
- package/skills/kb-builder/references/product.md +0 -52
- package/skills/kb-builder/references/qa-from-help-center.md +0 -58
- package/skills/kb-builder/references/qa-from-pdf.md +0 -94
- package/skills/kb-builder/references/qa-from-tickets.md +0 -168
- package/skills/kb-builder/references/qa-from-web.md +0 -98
- package/skills/kb-builder/references/qa-quality.md +0 -73
- package/skills/kb-builder/references/reply-template.md +0 -237
- package/skills/kb-builder/references/tag-isolation-migration.md +0 -61
- package/skills/kb-builder/references/tags.md +0 -45
- package/skills/kb-builder/references/upload.md +0 -130
- package/skills/kb-builder/scripts/batch_extract_ticket_qa.py +0 -333
- package/skills/kb-builder/scripts/build_directory_plan.py +0 -144
- package/skills/kb-builder/scripts/crawl_site.py +0 -433
- package/skills/kb-builder/scripts/create_dirs.py +0 -146
- package/skills/kb-builder/scripts/export_knowledge.py +0 -454
- package/skills/kb-builder/scripts/extract_ticket_qa.py +0 -441
- package/skills/kb-builder/scripts/extract_web_qa.py +0 -118
- package/skills/kb-builder/scripts/import_qa.py +0 -219
- package/skills/kb-builder/scripts/import_source_documents.py +0 -143
- package/skills/kb-builder/scripts/import_templates.py +0 -409
- package/skills/poc/SKILL.md +0 -125
- package/skills/poc/assets/default_manual.css +0 -279
- package/skills/poc/assets/notice_escalate.png +0 -0
- package/skills/poc/assets/notice_escalate2.png +0 -0
- package/skills/poc/assets/notice_new_chat.png +0 -0
- package/skills/poc/assets/poc_test_template.html +0 -645
- package/skills/poc/assets/poc_test_template.md +0 -104
- package/skills/poc/assets/step3_preview.png +0 -0
- package/skills/poc/assets/step4_order_note.png +0 -0
- package/skills/poc/interfaces/classify.md +0 -38
- package/skills/poc/interfaces/create-agents.md +0 -108
- package/skills/poc/interfaces/poc-test.md +0 -94
- package/skills/poc/references/flow.md +0 -47
- package/skills/poc/references/kb-directory.md +0 -22
- package/skills/poc/references/validation.md +0 -17
- package/skills/poc/scripts/classify.py +0 -22
- package/skills/poc/scripts/create_agents.py +0 -818
- package/skills/poc/scripts/gen_excel.py +0 -234
- package/skills/poc/scripts/gen_poc_manual.py +0 -249
- package/skills/poc/scripts/gen_report.py +0 -208
- package/skills/poc/scripts/inspect_chatflow.py +0 -209
- package/skills/poc/scripts/plan.py +0 -178
- package/skills/poc/scripts/poc_test.py +0 -495
- package/skills/poc/scripts/render.py +0 -713
- package/skills/poc/scripts/render_summary.py +0 -41
- package/skills/runtime-inspector/SKILL.md +0 -51
- package/skills/runtime-inspector/references/frontend-rendering.md +0 -126
- package/skills/runtime-inspector/references/model.md +0 -59
- package/skills/runtime-inspector/references/sandbox.md +0 -131
- package/skills/runtime-inspector/scripts/model_inspect.py +0 -68
- package/skills/runtime-inspector/scripts/prepare.py +0 -98
- package/skills/runtime-inspector/scripts/process.py +0 -84
- package/skills/runtime-inspector/scripts/read_state.py +0 -32
- package/skills/runtime-inspector/scripts/sandbox_inspect.py +0 -463
- package/skills/runtime-inspector/scripts/test_claude_proxy.py +0 -49
- package/skills/runtime-inspector/scripts/test_openai_proxy.py +0 -41
- package/skills/runtime-inspector/scripts/verify_persistence.py +0 -101
- package/skills/runtime-inspector/scripts/write_test.py +0 -41
- package/skills/setup/SKILL.md +0 -17
- package/skills/shulex-support/SKILL.md +0 -39
- package/skills/shulex-support/references/badcase-analysis/overview.md +0 -34
- package/skills/shulex-support/references/badcase-analysis/text/conversation-record.md +0 -105
- package/skills/shulex-support/references/badcase-analysis/text/core-flow.md +0 -89
- package/skills/shulex-support/references/badcase-analysis/text/log-query-rules.md +0 -36
- package/skills/shulex-support/references/badcase-analysis/text/m1-entry.md +0 -53
- package/skills/shulex-support/references/badcase-analysis/text/m10-chatflow-service.md +0 -259
- package/skills/shulex-support/references/badcase-analysis/text/m11-algorithm-service.md +0 -148
- package/skills/shulex-support/references/badcase-analysis/text/m12-quality-inspection.md +0 -57
- package/skills/shulex-support/references/badcase-analysis/text/m2-intent.md +0 -120
- package/skills/shulex-support/references/badcase-analysis/text/m3-strategy.md +0 -126
- package/skills/shulex-support/references/badcase-analysis/text/m4-aifield.md +0 -121
- package/skills/shulex-support/references/badcase-analysis/text/m5-agent.md +0 -208
- package/skills/shulex-support/references/badcase-analysis/text/m6-tool.md +0 -115
- package/skills/shulex-support/references/badcase-analysis/text/m7-reply.md +0 -72
- package/skills/shulex-support/references/badcase-analysis/text/m8-error.md +0 -92
- package/skills/shulex-support/references/badcase-analysis/text/m9-knowledge-search.md +0 -147
- package/skills/shulex-support/references/badcase-analysis/text/sls-query.md +0 -283
- package/skills/shulex-support/references/badcase-analysis/voice/core-flow.md +0 -77
- package/skills/shulex-support/references/badcase-analysis/voice/dependencies.md +0 -19
- package/skills/shulex-support/references/badcase-analysis/voice/platform-api.md +0 -23
- package/skills/shulex-support/references/badcase-analysis/voice/sls-playbook.md +0 -31
- package/skills/shulex-support/references/product-docs.md +0 -70
- package/skills/shulex-support/references/tickets.md +0 -184
- package/skills/shulex-support/scripts/support.py +0 -427
- package/skills/solvea-desk/SKILL.md +0 -39
- package/skills/solvea-desk/references/report/fields.md +0 -82
- package/skills/solvea-desk/references/report/report-design.md +0 -200
- package/skills/solvea-desk/references/report/report-template.html +0 -44
- package/skills/solvea-desk/references/report/report.css +0 -517
- package/skills/solvea-desk/references/report/workflow.md +0 -464
- package/skills/solvea-desk/references/tickets/query.md +0 -103
- package/skills/solvea-desk/references/tickets/tags.md +0 -83
- package/skills/solvea-desk/scripts/report/fetch_sources.py +0 -580
- package/skills/solvea-desk/scripts/report/render_report.py +0 -763
- package/skills/solvea-desk/scripts/tickets/desk_api.py +0 -73
- package/skills/solvea-desk/scripts/tickets/fetch_tickets.py +0 -403
- package/skills/solvea-desk/scripts/tickets/ticket_tags.py +0 -305
- package/skills/solvea-kit/SKILL.md +0 -84
- package/skills/solvea-kit/references/agent.md +0 -145
- package/skills/solvea-kit/references/chat.md +0 -244
- package/skills/solvea-kit/references/intent.md +0 -69
- package/skills/solvea-kit/references/plugin.md +0 -53
- package/skills/solvea-kit/references/quality-inspection.md +0 -75
- package/skills/solvea-kit/references/strategy.md +0 -62
- package/skills/solvea-kit/references/tagging.md +0 -231
- package/skills/solvea-kit/references/variables.md +0 -53
- package/skills/solvea-kit/scripts/generate_label_import_file.py +0 -151
- package/skills/solvea-kit/scripts/intent_classify.py +0 -843
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# 隔离关键词管理
|
|
2
|
-
|
|
3
|
-
隔离关键词用于控制知识命中时的隔离条件。关键词资源和绑定关系分开管理;所有写入都必须先向用户展示变更并取得明确确认。
|
|
4
|
-
|
|
5
|
-
## 接口
|
|
6
|
-
|
|
7
|
-
接口前缀由 `SolveaClient` 根据环境自动选择:
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
prod /api_v2/qam
|
|
11
|
-
staging /sns_v1
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
项目 ID 使用当前 `projectId`。
|
|
15
|
-
|
|
16
|
-
| 能力 | 方法与路径 | 请求/参数 |
|
|
17
|
-
|------|------------|-----------|
|
|
18
|
-
| 搜索/查询 | `GET /project/{projectId}/isolation_keywords` | `keyword`、`pageIndex`、`pageSize` |
|
|
19
|
-
| 创建 | `POST /project/{projectId}/isolation_keyword` | `{ "keyword": "hihi,oo" }`;逗号分隔输入会拆成多个关键词 |
|
|
20
|
-
| 修改 | `POST /project/{projectId}/isolation_keyword/{id}` | `{ "keyword": "new-value" }` |
|
|
21
|
-
| 删除 | `DELETE /project/{projectId}/isolation_keyword/{id}` | 无请求体 |
|
|
22
|
-
| 绑定/解绑 | `POST /project/{projectId}/knowledge/isolation_keywords/batch` | 见下文 |
|
|
23
|
-
|
|
24
|
-
对应公开 CLI:
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
npx --yes @shulex/cxclawctl@latest api list-isolation-keywords --keyword "invoice" --pretty
|
|
28
|
-
npx --yes @shulex/cxclawctl@latest api create-isolation-keyword --keyword "invoice,test" --pretty
|
|
29
|
-
npx --yes @shulex/cxclawctl@latest api update-isolation-keyword --id 17 --keyword "0226" --pretty
|
|
30
|
-
npx --yes @shulex/cxclawctl@latest api delete-isolation-keyword --id 16 --confirm-delete --pretty
|
|
31
|
-
npx --yes @shulex/cxclawctl@latest api get-knowledge-isolation-keywords \
|
|
32
|
-
--id 486955 --type FILE --pretty
|
|
33
|
-
npx --yes @shulex/cxclawctl@latest api batch-update-isolation-keyword-bindings \
|
|
34
|
-
--data-file /workspace/state/kb-builder/isolation_keyword_binding.json --pretty
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
批量绑定命令的 JSON 文件在接口结构 `items`、`directoryIds`、`keywordIds` 之外,使用 `operation` 声明业务操作:`append`(追加)、`remove`(移除)或 `replace`(替换)。知识级操作省略时默认为 `append`。
|
|
38
|
-
|
|
39
|
-
查询结果通常是数组,每项包含:
|
|
40
|
-
|
|
41
|
-
```text
|
|
42
|
-
id / keyword / bindCount / projectId / tenantId / createdAt / updatedAt
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
创建结果包含 `duplicate`、`failed`、`success`;成功项包含 `keyword` 和 `rowNo`。删除和批量绑定接口成功时通常返回 `ok`。
|
|
46
|
-
|
|
47
|
-
## 绑定请求
|
|
48
|
-
|
|
49
|
-
CLI 计划中的 `knowledgeType` 使用知识列表返回的界面类型:`QA`、`LEARN_SELF`、`FILE`、`WEBSITE` 或 `PRODUCT`。client 会按最新后端契约转换绑定类型:问答和 AI自学习 → `QA`,文档和网页 → `DOCUMENT`,产品 → `PRODUCT`。Agent 不要自行把列表类型改成后端类型,也不向客户暴露这些内部值。
|
|
50
|
-
|
|
51
|
-
具体知识级绑定:
|
|
52
|
-
|
|
53
|
-
```json
|
|
54
|
-
{
|
|
55
|
-
"operation": "append",
|
|
56
|
-
"items": [
|
|
57
|
-
{
|
|
58
|
-
"knowledgeType": "QA",
|
|
59
|
-
"knowledgeId": 486955,
|
|
60
|
-
"keywordIds": [11, 13]
|
|
61
|
-
}
|
|
62
|
-
],
|
|
63
|
-
"directoryIds": [],
|
|
64
|
-
"keywordIds": [11, 13]
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
目录级绑定:
|
|
69
|
-
|
|
70
|
-
```json
|
|
71
|
-
{
|
|
72
|
-
"operation": "replace",
|
|
73
|
-
"confirmReplace": true,
|
|
74
|
-
"items": [],
|
|
75
|
-
"directoryIds": [32951],
|
|
76
|
-
"keywordIds": [11, 13]
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
`directoryIds`、`items`、`keywordIds` 都可以省略;但三者同时为空时不得调用接口。一次请求只处理一种目标:`items` 或 `directoryIds` 二选一,避免目录级和知识级语义混淆。client 会拒绝空更新、校验 ID、并对数组去重。
|
|
81
|
-
|
|
82
|
-
后端绑定接口始终把提交的关键词 ID 当作最终集合,会先删除旧关系再写入新关系。CLI 对具体知识会自动读取现有绑定并按 `operation` 计算最终集合;读取失败时停止,不得猜测。目录级接口不能安全读取和合并目录内每条知识的现状,因此只允许显式 `replace`,并要求 `confirmReplace: true`。
|
|
83
|
-
|
|
84
|
-
## 绑定与解绑流程
|
|
85
|
-
|
|
86
|
-
1. 用 `list_isolation_keywords` 搜索关键词,确认目标关键词 ID;不存在时先创建。
|
|
87
|
-
2. 绑定目录前用 `list-directories` 获取真实 `directoryId`,不要根据目录名称猜 ID。
|
|
88
|
-
3. 绑定具体知识前用 `list-knowledge` 获取 `knowledgeId` 和类型,再用带 `--type` 的 `get-knowledge` 读取详情。
|
|
89
|
-
4. 追加使用 `operation: "append"`,移除使用 `operation: "remove"`;两者都由 CLI 读取当前关系并计算最终集合。只有用户明确要求覆盖全部绑定时才使用 `operation: "replace"` 和 `confirmReplace: true`。
|
|
90
|
-
5. 展示变更差异并取得用户明确确认后调用 `batch_update_isolation_keyword_bindings` 提交;没有现状快照不得提交。
|
|
91
|
-
6. 调用 `get-knowledge-isolation-keywords --id ... --type ...` 回读绑定结果;结果不符合预期时停止,不自动覆盖重试。
|
|
92
|
-
|
|
93
|
-
不要把关键词文本直接当作 `keywordIds`;绑定接口要求使用隔离关键词的数字 ID。目录绑定和知识绑定都必须保留目标对象的真实 ID。
|
|
94
|
-
|
|
95
|
-
## 创建关键词前的查重
|
|
96
|
-
|
|
97
|
-
用户要求新建关键词时,禁止直接调用创建接口。必须先执行:
|
|
98
|
-
|
|
99
|
-
1. 用 `list_isolation_keywords` 分页拉取当前项目的关键词(需要全量查重时按 `totalCount` / 分页结果继续查询)。
|
|
100
|
-
2. 将用户输入按逗号拆分、去除首尾空格并在本次输入内去重。
|
|
101
|
-
3. 与现有关键词按规范化后的精确文本匹配;把已存在的关键词单独列出并告知用户,不重复提交。
|
|
102
|
-
4. 只对不存在的关键词发起创建,并在写入前向用户展示待创建清单、重复清单和失败风险,取得明确确认。
|
|
103
|
-
5. 根据创建响应的 `success`、`duplicate`、`failed` 汇报结果;创建失败的项不得自动重试或改名。
|
|
104
|
-
|
|
105
|
-
如果所有输入都已存在,不调用创建接口,只告知用户现有关键词及其 ID,并继续询问是否需要绑定。
|
|
106
|
-
|
|
107
|
-
## 用户交互要求
|
|
108
|
-
|
|
109
|
-
- 用户说“建立隔离关键词 xxx”时,先解析并去重关键词,再展示将创建的列表。
|
|
110
|
-
- 新建前必须先查询当前关键词并查重;重复项要明确告知用户,只创建不存在的项。
|
|
111
|
-
- 创建完成后,询问是否绑定到某个知识目录;用户明确说不绑定时,仅创建关键词。
|
|
112
|
-
- 用户指定目录名时,先查询目录树并展示匹配目录,确认后再绑定。
|
|
113
|
-
- 删除关键词前检查 `bindCount`,提示可能影响的知识/目录;要求用户回复“我已知晓删除影响并确认删除”或等价强确认,然后才能使用 `--confirm-delete`。
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
# 知识读取、更新与状态管理
|
|
2
|
-
|
|
3
|
-
## 列表与详情的类型边界
|
|
4
|
-
|
|
5
|
-
知识列表统一使用 `list-knowledge` / `getKnowledge`。后端返回同一套列表结构,但不同界面类型填充的字段不同:
|
|
6
|
-
|
|
7
|
-
- 问答 / AI自学习:主要是 `question`、`answer`
|
|
8
|
-
- 文档:主要是 `name`、`title`、`storageSize`
|
|
9
|
-
- 网页:主要是 `name`、`title`、`url`
|
|
10
|
-
- 产品:主要是 `productTitle`、`productId`、`sku`、`spuUrl` 等商品字段
|
|
11
|
-
|
|
12
|
-
每条列表记录都使用统一的 `knowledgeId`、`directoryId`、`type`、`knowledgeStatus`、`isolationKeywords`。必须保留并使用记录返回的类型,不能只拿 ID 猜实体。
|
|
13
|
-
|
|
14
|
-
详情接口按实体拆分:问答/AI自学习走 KU,文档/网页走 DOCUMENT,产品走 KU_PRODUCT。统一 CLI 用 `--type` 选择正确详情接口;这里的内部实体名只用于实现判断,不用于客户话术。
|
|
15
|
-
|
|
16
|
-
## 读取
|
|
17
|
-
|
|
18
|
-
已知知识 ID 时读取准确详情,不用关键词列表代替:
|
|
19
|
-
|
|
20
|
-
QA / AI自学习知识:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npx --yes @shulex/cxclawctl@latest api get-knowledge --id 3057821 --type QA --pretty
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
文档 / 网页知识使用同一个业务入口,但必须带对应类型;脚本会调用文档详情接口,而不是 QA 的详情接口:
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
npx --yes @shulex/cxclawctl@latest api get-knowledge --id 3057821 --type FILE --pretty
|
|
30
|
-
npx --yes @shulex/cxclawctl@latest api get-knowledge --id 3057821 --type WEBSITE --pretty
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
产品知识:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npx --yes @shulex/cxclawctl@latest api get-knowledge --id 3057821 --type PRODUCT --pretty
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## 更新问答 / AI自学习知识
|
|
40
|
-
|
|
41
|
-
当前 `update-knowledge` 对应 KU 更新接口,不用于文档、网页或产品。文档/网页内容更新需要文档更新原子能力,不能拿本命令代替。
|
|
42
|
-
|
|
43
|
-
1. 先读取当前知识,确认 ID、标题、内容和目录。
|
|
44
|
-
2. 只把要修改的字段写入稳定文件 `/workspace/state/kb-builder/knowledge_update.json`。
|
|
45
|
-
3. 向用户展示字段级变更,等待明确确认。
|
|
46
|
-
4. 确认后执行:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
npx --yes @shulex/cxclawctl@latest api update-knowledge --id 3057821 --data-file /workspace/state/kb-builder/knowledge_update.json --pretty
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
5. 再次读取同一 ID,核对实际结果。
|
|
53
|
-
|
|
54
|
-
更新文件支持 `title`、`content`、`published`、`directoryId`、`status`、`forceIndex`。仅写需要修改的字段;除非明确需要重建或删除索引,不要设置 `forceIndex`。
|
|
55
|
-
|
|
56
|
-
### 批量更新问答正文 / 标题
|
|
57
|
-
|
|
58
|
-
当需要修改多条问答知识时,严禁使用循环单条 `update-knowledge`,应使用批量更新命令 `batch-update-knowledge`。
|
|
59
|
-
|
|
60
|
-
将待修改列表写入 `/workspace/state/kb-builder/batch_knowledge_update.json`:
|
|
61
|
-
|
|
62
|
-
```json
|
|
63
|
-
[
|
|
64
|
-
{
|
|
65
|
-
"kuId": 3057821,
|
|
66
|
-
"content": "修改后的答案正文",
|
|
67
|
-
"directoryId": 145177
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"kuId": 3057822,
|
|
71
|
-
"content": "修改后的答案正文",
|
|
72
|
-
"directoryId": 145178
|
|
73
|
-
}
|
|
74
|
-
]
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
执行批量更新:
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
npx --yes @shulex/cxclawctl@latest api batch-update-knowledge --data-file /workspace/state/kb-builder/batch_knowledge_update.json --pretty
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
- 每条记录支持 `kuId`(或 `id`)、`title`、`content`、`directoryId`、`published` 等字段。
|
|
84
|
-
- 建议优先带上扫描时已获取的 `directoryId`;若未带 `directoryId`,CLI 会自动向后兼容继承原目录。
|
|
85
|
-
- 批量更新建议单批 50~100 条。
|
|
86
|
-
|
|
87
|
-
## 更新文档 / 网页正文
|
|
88
|
-
|
|
89
|
-
文档和网页共用同一个正文更新入口。CLI 会先读取当前详情,保留目录、文件名和元数据,再合并本次变更;不要用 `update-knowledge` 更新这两类知识。
|
|
90
|
-
|
|
91
|
-
将新正文写入 `/workspace/state/kb-builder/document_update.json`:
|
|
92
|
-
|
|
93
|
-
```json
|
|
94
|
-
{
|
|
95
|
-
"fileText": "更新后的 Markdown 或文本正文",
|
|
96
|
-
"title": "可选的新标题"
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
展示变更摘要并获得确认后执行:
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
# 文档
|
|
104
|
-
npx --yes @shulex/cxclawctl@latest api update-document-content --id 3057821 --type FILE --data-file /workspace/state/kb-builder/document_update.json --pretty
|
|
105
|
-
|
|
106
|
-
# 网页
|
|
107
|
-
npx --yes @shulex/cxclawctl@latest api update-document-content --id 3057821 --type WEBSITE --data-file /workspace/state/kb-builder/document_update.json --pretty
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
更新后用原类型重新读取详情。`filePath` 仅用于已上传的新 Markdown 文件;普通正文修改使用 `fileText`。
|
|
111
|
-
|
|
112
|
-
## 删除、移动、发布状态与可见性
|
|
113
|
-
|
|
114
|
-
这些操作支持界面上的五类知识。对客户只说“问答 / AI自学习 / 文档 / 网页 / 产品”;下表字段仅用于脚本计划文件:
|
|
115
|
-
|
|
116
|
-
| 界面操作 | `operateType` |
|
|
117
|
-
|---|---|
|
|
118
|
-
| 删除 | `DELETE` |
|
|
119
|
-
| 移动到目录 | `MOVE`,同时传 `directoryId` |
|
|
120
|
-
| 发布 | `PUBLISH` |
|
|
121
|
-
| 下架 | `UNPUBLISH` |
|
|
122
|
-
| 显示 | `VISIBLE` |
|
|
123
|
-
| 隐藏 | `INVISIBLE` |
|
|
124
|
-
|
|
125
|
-
计划文件 `/workspace/state/kb-builder/knowledge_operations.json` 是 JSON 数组:
|
|
126
|
-
|
|
127
|
-
```json
|
|
128
|
-
[
|
|
129
|
-
{"knowledgeType": "FILE", "knowledgeId": 3057821, "operateType": "MOVE", "directoryId": 32188},
|
|
130
|
-
{"knowledgeType": "WEBSITE", "knowledgeId": 3057822, "operateType": "UNPUBLISH"},
|
|
131
|
-
{"knowledgeType": "PRODUCT", "knowledgeId": 3057823, "operateType": "INVISIBLE"}
|
|
132
|
-
]
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
执行前必须:
|
|
136
|
-
|
|
137
|
-
1. 用 `get-knowledge --id ... --type ...` 读取每个目标,确认 ID 和界面类型一致。
|
|
138
|
-
2. 删除要列出具体标题和数量;移动要列出原目录和目标目录;状态变更要列出变更前后。
|
|
139
|
-
3. 等待用户明确确认。不得把“查看一下”视为删除或状态变更授权。
|
|
140
|
-
|
|
141
|
-
删除操作需要更强确认:展示影响后,要求用户明确回复“我已知晓删除影响并确认删除”或语义等价、同时包含“知晓影响”和“确认删除”的表达。英文用户可回复 `I understand the deletion impact and confirm deletion.`。只回复“确认”、`OK` 或“可以”不足以授权删除。
|
|
142
|
-
|
|
143
|
-
确认后执行:
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
# 非删除操作
|
|
147
|
-
npx --yes @shulex/cxclawctl@latest api operate-knowledge --data-file /workspace/state/kb-builder/knowledge_operations.json --pretty
|
|
148
|
-
|
|
149
|
-
# 计划中包含删除时,仅在收到上述强确认后增加
|
|
150
|
-
npx --yes @shulex/cxclawctl@latest api operate-knowledge --data-file /workspace/state/kb-builder/knowledge_operations.json --confirm-delete --pretty
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
CLI 会再次按类型读取每个目标,移动时还会确认目标目录存在,然后一次提交。提交后重新查询:删除要确认记录已不存在,其他操作要核对目录、发布状态或可见性。
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# 产品知识创建与更新
|
|
2
|
-
|
|
3
|
-
本 reference 只用于界面上的“产品”知识。对客户使用“产品 / Products”,不暴露内部实体名。
|
|
4
|
-
|
|
5
|
-
## 创建
|
|
6
|
-
|
|
7
|
-
创建计划写入 `/workspace/state/kb-builder/product_create.json`。至少包含:
|
|
8
|
-
|
|
9
|
-
- `title`:产品名称
|
|
10
|
-
- `spuUrl`:产品页地址,同一项目内不能重复
|
|
11
|
-
|
|
12
|
-
常用可选字段包括 `describe`、`image`、`price`、`compareAtPrice`、`currency`、`skuList`、`directoryId`、`metadata`、`specialTagMap`、`published`和 `isVisible`。CLI 默认补齐手工创建来源、已发布和已显示;如果用户要求其他状态,在计划中显式写出。
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
npx --yes @shulex/cxclawctl@latest api create-product-knowledge --data-file /workspace/state/kb-builder/product_create.json --pretty
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 更新
|
|
19
|
-
|
|
20
|
-
产品更新接口要求完整产品数据。使用下面的 CLI 时,它会先读取现有产品,再将变更字段合并到完整对象后提交,避免清空 SKU、图片、目录或状态。
|
|
21
|
-
|
|
22
|
-
只将要改的字段写入 `/workspace/state/kb-builder/product_update.json`,展示字段级 diff 并等待确认,然后执行:
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npx --yes @shulex/cxclawctl@latest api update-product-knowledge --id 3057823 --data-file /workspace/state/kb-builder/product_update.json --pretty
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
如果现有产品缺少后端更新所必需的标题、描述、产品地址、图片、来源、发布状态或可见性,CLI 会拒绝提交并列出缺失字段;先让用户补齐,不自行编造。更新后用 `get-knowledge --type PRODUCT` 重新读取核对。
|
|
29
|
-
|
|
30
|
-
## 批量更新产品状态
|
|
31
|
-
|
|
32
|
-
当需要批量设置多个产品的状态(如批量设为主推、批量启用/停用)时,使用 `batch-update-products` 命令:
|
|
33
|
-
|
|
34
|
-
将批量计划写入 `/workspace/state/kb-builder/batch_products_update.json`:
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
[
|
|
38
|
-
{ "id": 3057823, "mainPush": true },
|
|
39
|
-
{ "id": 3057824, "enable": false }
|
|
40
|
-
]
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
执行批量更新:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
npx --yes @shulex/cxclawctl@latest api batch-update-products --data-file /workspace/state/kb-builder/batch_products_update.json --pretty
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
- 每条记录支持 `id`(或 `kuProductId`)、`mainPush`(主推)、`enable`(或 `published`)。
|
|
50
|
-
- **注意**:该批量接口仅用于更新商品的主推与启停状态;若需修改商品标题、描述、价格或 SKU 等内容,请使用单条 `update-product-knowledge`。
|
|
51
|
-
|
|
52
|
-
产品的删除、移动、发布/下架、显示/隐藏统一按 [`knowledge.md`](knowledge.md) 的 `operate-knowledge` 流程执行。
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# 从帮助中心 / FAQ / 文档站提取 QA
|
|
2
|
-
|
|
3
|
-
→ 通用质量规则见 `/skills/kb-builder/references/qa-quality.md`(必读)
|
|
4
|
-
|
|
5
|
-
帮助中心目录在 KB 里建好后,此处直接提取知识内容。这里也适用于用户直接提供的 FAQ 页面、文档站、支持站、知识库文章列表。
|
|
6
|
-
|
|
7
|
-
## 流程
|
|
8
|
-
|
|
9
|
-
1. **拿帮助中心页面 URL 列表**:
|
|
10
|
-
- 优先从 `crawl_cache.json` 取出 `type == "help_center"` 的页面
|
|
11
|
-
- cache 不存在或不全 → 用户给帮助中心根 URL → `web_crawl(url=root, max_depth=2, limit=80)` 单独深抓一次
|
|
12
|
-
2. **逐页 `web_fetch`** 拿完整 markdown(cache 里 snippet 只有 1200 字符不够)
|
|
13
|
-
3. **提取 Q&A**:
|
|
14
|
-
- 页面本身已有明确的 FAQ / Q&A 结构(条目标题即问题、正文即答案)→ 按 `qa-quality.md` 的全局 FAQ 规则逐条提取
|
|
15
|
-
- 页面无明确 FAQ 结构(如产品说明、政策说明等连续正文)→ 自行归纳整理成 Q&A
|
|
16
|
-
4. **归入 KB 中现有的 Help Center 子目录**(如 KB 已有「Getting Started > Setup Guide」),**不重新发明目录**
|
|
17
|
-
5. 一个帮助页面若包含多个独立话题,可拆分为多条 QA
|
|
18
|
-
|
|
19
|
-
## Help Center / 文档站 FAQ 条数规则
|
|
20
|
-
|
|
21
|
-
帮助中心 / 文档站 / 支持站里的 FAQ / Q&A 页面不受 `qa-from-web.md` 中“产品整体介绍 1 条 + 潜在问题 ≤5 条”的产品页规则限制。
|
|
22
|
-
|
|
23
|
-
- 有明确 FAQ 条目的页面:按页面上的有效条目逐条提取,原则上不压缩条数
|
|
24
|
-
- 只有连续正文、没有 FAQ 结构的页面:按独立主题归纳为 QA
|
|
25
|
-
- 真正的数量控制只在写文件和上传阶段:按 `upload.md` 每批 ≤4 KB 分片,避免截断
|
|
26
|
-
|
|
27
|
-
## 示例
|
|
28
|
-
|
|
29
|
-
```json
|
|
30
|
-
{
|
|
31
|
-
"dir_path": ["Help Center", "Getting Started", "Setup Guide"],
|
|
32
|
-
"question": "Kasa Smart Plugs — How do I set up my Kasa smart plug for the first time?",
|
|
33
|
-
"answer": "1. Download the Kasa Smart app (iOS / Android)\n2. Open the app → tap '+' → select your device\n3. Follow the in-app setup wizard\n4. Connect to your 2.4GHz Wi-Fi network\n5. Name your device and assign it to a room\n\n"
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## 目录前置自查
|
|
38
|
-
|
|
39
|
-
`list-directories` 看现有 Help Center 子目录树。提取过程中遇到帮助中心新栏目而 KB 还没建对应子目录时:
|
|
40
|
-
- 该栏目内容不多 → 临时 `create-folder` 补建(详见 directory.md §5)
|
|
41
|
-
- 实在难归类 → `["Pending Assignment"]`
|
|
42
|
-
|
|
43
|
-
## 产出文件(每批写到 tmp)
|
|
44
|
-
|
|
45
|
-
提取的 QA **不要**自己合并成 qa_plan,**也不要**一次 write_file 写完整数组。
|
|
46
|
-
每批 ≤ 4 KB 写到 `/workspace/tmp/kb-builder/qa_parts/qa_help_<topic>.json`(如 `qa_help_setup.json` / `qa_help_troubleshooting.json`),
|
|
47
|
-
最后由 `import_qa.py --from-dir /workspace/tmp/kb-builder/qa_parts/` 自动合并 + 上传。
|
|
48
|
-
|
|
49
|
-
详见 `/skills/kb-builder/references/upload.md`。
|
|
50
|
-
|
|
51
|
-
## 常见错误
|
|
52
|
-
|
|
53
|
-
| 错误 | 正确做法 |
|
|
54
|
-
|------|----------|
|
|
55
|
-
| 帮助中心目录建好了但没提取知识 | 帮助中心页面内容也要提取为 QA |
|
|
56
|
-
| 自己发明 Help Center 子目录而非照搬网站导航 | Help Center 子目录直接对齐网站真实导航 |
|
|
57
|
-
| 只看 cache snippet 就写 QA | 必须 web_fetch 全文 |
|
|
58
|
-
| FAQ 页面只抽 5 条 | FAQ 按有效条目逐条提取,不套产品页 ≤5 条潜在问题限制 |
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# 从产品说明书 PDF 提取 QA
|
|
2
|
-
|
|
3
|
-
→ 通用质量规则见 `/skills/kb-builder/references/qa-quality.md`(必读)
|
|
4
|
-
|
|
5
|
-
## 读 PDF:直接用 `read_file`
|
|
6
|
-
|
|
7
|
-
**直接 `read_file` 读 PDF**,不要 inline `python3 -c "import pymupdf4llm..."`。read_file 工具内部已经把 PDF 解析链路封装好:
|
|
8
|
-
|
|
9
|
-
- 对 `.pdf` 后缀自动走 MinerU API(OCR + 结构识别)→ 失败或未配置 token 时 fallback 到 `pymupdf4llm`
|
|
10
|
-
- 解析结果按 markdown 返回,保留标题 / 段落 / 表格 / 列表 / 图片占位,已是 KB 期望的格式
|
|
11
|
-
- 同轮内缓存到 `workspace/tmp/parsed/{file_name}.md`,重复读不会重新解析
|
|
12
|
-
- 返回带行号 `lines X-Y of N`,长说明书用 `offset` / `limit` 分段读
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
read_file(file_path="/mounted/chat-files/user/manual.pdf")
|
|
16
|
-
# 长 PDF 分段:
|
|
17
|
-
read_file(file_path="/mounted/chat-files/user/manual.pdf", offset=0, limit=200)
|
|
18
|
-
read_file(file_path="/mounted/chat-files/user/manual.pdf", offset=200, limit=200)
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
⚠️ **单次返回上限 ~32K chars**。超出时 read_file 会直接报 "Requested range is too large" 并给建议 `limit`,按提示调小再读,不要试图绕过。
|
|
22
|
-
|
|
23
|
-
确认内容结构后,按下面规则拆 QA。
|
|
24
|
-
|
|
25
|
-
## 目录前置自查
|
|
26
|
-
|
|
27
|
-
提取前先 `list-directories` 看 Product Introduction 下是否已有本说明书产品的品类 / 型号目录。
|
|
28
|
-
缺品类(如新出的"Diagnostic Scanners")或型号目录 → 用 `create-folder` CLI 补建(详见 directory.md §5)。
|
|
29
|
-
**不要回头跑全流程目录搭建**——补建单个目录就够了。
|
|
30
|
-
|
|
31
|
-
## 拆 QA 规则
|
|
32
|
-
|
|
33
|
-
对每份说明书,生成**两类** QA:
|
|
34
|
-
|
|
35
|
-
### 第一类:说明书全文 QA(每份说明书 1 条)
|
|
36
|
-
|
|
37
|
-
- Q:`[型号] — User Manual / Product Manual`
|
|
38
|
-
- A:完整解读说明书全部内容,**保留 PDF 中的图片、表格、排版结构**,格式规范清晰
|
|
39
|
-
|
|
40
|
-
```json
|
|
41
|
-
{
|
|
42
|
-
"dir_path": ["Product Introduction", "Smart Plugs", "Kasa EP25"],
|
|
43
|
-
"question": "Kasa EP25 Smart Plug — User Manual",
|
|
44
|
-
"answer": "## Package Contents\n- 1x EP25 Smart Plug\n- 1x Quick Start Guide\n\n## Setup\n1. Plug into wall outlet\n2. Download Kasa app\n3. Follow in-app setup wizard\n\n## Specifications\n| Spec | Value |\n|------|-------|\n| Voltage | 120V AC |\n| Max Load | 15A / 1800W |\n| Dimensions | 2.1\" x 1.4\" x 1.4\" |"
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 第二类:说明书潜在问题(按内容密度拆,**不设条数上限**)
|
|
49
|
-
|
|
50
|
-
按说明书的独立子主题逐一拆 QA——每个独立功能 / 设置项 / 配件 / 故障排查问题都各成一条。覆盖参考维度:
|
|
51
|
-
|
|
52
|
-
- 产品概述(What is X / Key features)
|
|
53
|
-
- 包装清单 / 配件
|
|
54
|
-
- 技术规格 / 兼容性 / 适配范围
|
|
55
|
-
- 安装 / 连接 / 首次设置
|
|
56
|
-
- 各独立功能的使用步骤(按章节拆,每个功能 1 条)
|
|
57
|
-
- 设置项(语言 / 单位 / WiFi / 自检 / 恢复出厂等)
|
|
58
|
-
- 软件更新流程
|
|
59
|
-
- 故障排查(每个独立问题 1 条)
|
|
60
|
-
- 安全 / 警告事项(如有)
|
|
61
|
-
|
|
62
|
-
> 一份功能丰富的说明书(多功能诊断仪、多模式智能设备等)拆出 15~30 条 QA 是常见的;**不要为了控制条数把多个独立功能塞进同一条 answer**。同一功能的多个步骤可合并;不同功能必须拆开。
|
|
63
|
-
|
|
64
|
-
```json
|
|
65
|
-
[
|
|
66
|
-
{
|
|
67
|
-
"dir_path": ["Product Introduction", "Smart Plugs", "Kasa EP25"],
|
|
68
|
-
"question": "Kasa EP25 Smart Plug — What accessories are included in the box?",
|
|
69
|
-
"answer": "- 1x Kasa EP25 Smart Plug\n- 1x Quick Start Guide"
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"dir_path": ["Product Introduction", "Smart Plugs", "Kasa EP25"],
|
|
73
|
-
"question": "Kasa EP25 Smart Plug — How do I install and set up the EP25?",
|
|
74
|
-
"answer": "1. Plug the EP25 into any standard 120V wall outlet\n2. Download the Kasa Smart app\n3. Tap '+' to add a new device\n4. Follow the in-app setup wizard to connect to Wi-Fi"
|
|
75
|
-
}
|
|
76
|
-
]
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## 产出文件(每批写到 tmp)
|
|
80
|
-
|
|
81
|
-
提取的 QA **不要**自己合并成 qa_plan,**也不要**一次 write_file 写完整数组。
|
|
82
|
-
每批 ≤ 4 KB 写到 `/workspace/tmp/kb-builder/qa_parts/qa_pdf_<model>_<part>.json`,
|
|
83
|
-
最后由 `import_qa.py --from-dir /workspace/tmp/kb-builder/qa_parts/` 自动合并 + 上传。
|
|
84
|
-
|
|
85
|
-
详见 `/skills/kb-builder/references/upload.md`。
|
|
86
|
-
|
|
87
|
-
## 常见错误
|
|
88
|
-
|
|
89
|
-
| 错误 | 正确做法 |
|
|
90
|
-
|------|----------|
|
|
91
|
-
| inline `python3 -c "import pymupdf4llm..."` | 直接 `read_file(file_path="...pdf")` |
|
|
92
|
-
| 说明书只按段落切 QA | 必须生成两类:全文 1 条 + 按内容密度拆潜在问题 |
|
|
93
|
-
| 说明书潜在问题被压到 5 条以内、多个独立功能塞进同一条 answer | 无 ≤5 上限,每个独立功能 / 设置项 / 故障排查 / 配件主题独立成条 |
|
|
94
|
-
| 缺品类目录就归到 Pending Assignment | 优先 `create-folder` 补建对应品类 / 型号目录 |
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# 从历史工单 xlsx 提取 QA
|
|
2
|
-
|
|
3
|
-
→ 通用质量规则见 `/skills/kb-builder/references/qa-quality.md`(必读)
|
|
4
|
-
|
|
5
|
-
工单原始对话含有噪声(情绪语言、订单号、客服套话),不能直接粘贴进知识库。流程:读表头样例 → 判断数据源列 → dry-run → 分页/并发提炼到 state → 汇总去重到 outputs → 用户确认后再 dry-run 上传。
|
|
6
|
-
|
|
7
|
-
## 步骤一:检测 xlsx 格式
|
|
8
|
-
|
|
9
|
-
**直接 `read_file` 读 xlsx**,不要 inline `python3 -c "import pandas..."`。read_file 工具内部用 markitdown 把 xlsx 转成 markdown 表格:
|
|
10
|
-
|
|
11
|
-
- 每个 sheet 输出一段 `## SheetName` + 列名表头 + 数据行
|
|
12
|
-
- 直接看到列名、行数(看返回的 `lines X-Y of N`)、前几行内容样例
|
|
13
|
-
- 同一份 xlsx 同轮内缓存到 `workspace/tmp/parsed/`,重复读不会重新解析
|
|
14
|
-
- 单 cell 超过 500 字符会被截断(middleware 层 `_MAX_LINE_CHARS`),看格式 / 列名足够;长对话原文走 `extract_ticket_qa.py` 全量提炼时再处理
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
read_file(file_path="/mounted/chat-files/user/tickets.xlsx", limit=20)
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
返回示例:
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
File: tickets.xlsx (lines 1-20 of 532)
|
|
24
|
-
|
|
25
|
-
## Sheet1
|
|
26
|
-
| conversation_id | customer_message | agent_reply |
|
|
27
|
-
| --- | --- | --- |
|
|
28
|
-
| T001 | my charger broke | please send photos of the damaged item |
|
|
29
|
-
| T002 | battery drains fast | check motion sensitivity in app settings |
|
|
30
|
-
...
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
⚠️ 同样有 ~32K chars 上限。检测列名只读前 20 行就够,不要全文加载。
|
|
34
|
-
|
|
35
|
-
| 格式 | 特征 | 处理方式 |
|
|
36
|
-
|------|------|----------|
|
|
37
|
-
| **Shulex 导出** | 有 `conversations` 列 | 直接解析对话序列 |
|
|
38
|
-
| **自定义系统导出** | 列名不固定 | 自动检测问题列 / 回复列 |
|
|
39
|
-
|
|
40
|
-
## 步骤二:判断数据源列
|
|
41
|
-
|
|
42
|
-
先根据表头和前几行判断真实客诉对话列,像 POC / Delivery 分类脚本一样显式传给脚本:
|
|
43
|
-
|
|
44
|
-
| 参数 | 用途 | 常见列名 |
|
|
45
|
-
|------|------|----------|
|
|
46
|
-
| `--messages-col` | 完整对话列;或客户问题列 | `conversations` / `messages` / `comments_json` / `conversation` / `聊天记录` / `对话内容` / `customer_message` |
|
|
47
|
-
| `--title-col` | 工单标题 / 主题(可选) | `subject` / `title` / `主题` / `工单标题` |
|
|
48
|
-
| `--reply-col` | 客服回复列(仅问答分列时传) | `agent_reply` / `reply` / `answer` / `客服回复` |
|
|
49
|
-
|
|
50
|
-
如果无法判断哪列是真实客诉对话,不要直接跑提取;先问用户确认列名。
|
|
51
|
-
|
|
52
|
-
脚本保留自动检测兜底,但 agent 应优先显式传列名。
|
|
53
|
-
|
|
54
|
-
## 步骤三:dry-run 确认提取逻辑
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/extract_ticket_qa.py \
|
|
58
|
-
--xlsx /mounted/chat-files/user/tickets.xlsx --brand "{品牌名称}" \
|
|
59
|
-
--messages-col conversations --title-col subject \
|
|
60
|
-
--page 1 --page-size 100 --batch-size 5 --workers 3 --dry-run
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
dry-run 必须检查:
|
|
64
|
-
|
|
65
|
-
- `[detect]` 里的 `messages_col` / `reply_col` / `title_col` 是否符合表头判断
|
|
66
|
-
- sample thread 是否是真实客诉对话
|
|
67
|
-
- `Would call model=<模型> X times` 是否合理
|
|
68
|
-
|
|
69
|
-
## 步骤四:批量分页运行提炼(OpenAI-compatible 模型)
|
|
70
|
-
|
|
71
|
-
历史工单必须分页处理,避免单轮超过 20 分钟 SSE 上限。`page` 从 1 开始,`page-size` 最大 100。
|
|
72
|
-
|
|
73
|
-
推荐优先用批处理 wrapper,一次处理完整 xlsx,但内部仍按页跑:
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
# 全表分页提取:每页 100 行,页内每 5 条对话一次模型调用,并发 3 个 batch
|
|
77
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/batch_extract_ticket_qa.py \
|
|
78
|
-
--xlsx /mounted/chat-files/user/tickets.xlsx --brand "{品牌名称}" \
|
|
79
|
-
--messages-col conversations --title-col subject \
|
|
80
|
-
--page-size 100 --batch-size 5 --workers 3 --resume
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
wrapper 行为:
|
|
84
|
-
|
|
85
|
-
- 每页产物写入 `/workspace/state/kb-builder/ticket_extract/pages/page_001.json`
|
|
86
|
-
- 进度写入 `/workspace/state/kb-builder/ticket_extract/progress.json`
|
|
87
|
-
- 失败后可用同一命令 `--resume` 续跑,已完成 page 会跳过
|
|
88
|
-
- 最终合并、过滤、去重后输出 `/workspace/outputs/kb-builder/ticket_qa_merged_<ts>.json`
|
|
89
|
-
- **不会上传知识**
|
|
90
|
-
|
|
91
|
-
必要时也可以只跑单页 worker(调试或补页):
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/extract_ticket_qa.py \
|
|
95
|
-
--xlsx /mounted/chat-files/user/tickets.xlsx --brand "{品牌名称}" \
|
|
96
|
-
--messages-col conversations --title-col subject \
|
|
97
|
-
--page 2 --page-size 100 --batch-size 5 --workers 3
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## 步骤五:用户确认后再上传
|
|
101
|
-
|
|
102
|
-
批处理完成后,先向用户展示:
|
|
103
|
-
|
|
104
|
-
- 总行数 / 完成页 / 失败页
|
|
105
|
-
- 模型调用数 / 提取数 / 过滤数 / 去重数
|
|
106
|
-
- merged 输出文件路径
|
|
107
|
-
- 3-5 条样例 QA
|
|
108
|
-
|
|
109
|
-
用户确认后,再按 upload.md 进入 `import_qa.py --dry-run`。dry-run 通过后,用户再次确认才正式上传。
|
|
110
|
-
|
|
111
|
-
## 工单来源特有过滤规则
|
|
112
|
-
|
|
113
|
-
| 场景 | 处理方式 |
|
|
114
|
-
|------|---------|
|
|
115
|
-
| 与产品无关(发票 / 物流 / 订单流程) | 整条工单跳过,不提炼 |
|
|
116
|
-
| 产品物理破损(摔坏 / 撞坏 / 外壳损坏) | 整条工单直接忽略 |
|
|
117
|
-
| 向客户索要订单号 / 收据 / 照片 | 删除该句 |
|
|
118
|
-
| 引导联系客服 / 提交工单 | 删除该句 |
|
|
119
|
-
|
|
120
|
-
## 同一问题多种表达合并(重要)
|
|
121
|
-
|
|
122
|
-
如果多个消费者表达了同一个产品问题但措辞不同,将多种表达**合并**进同一条 QA 的 Question 里:
|
|
123
|
-
|
|
124
|
-
```json
|
|
125
|
-
{
|
|
126
|
-
"question": "Kasa EC70 Camera — Why is my camera battery draining fast / discharging quickly / running out of charge quickly?",
|
|
127
|
-
"answer": "- Check motion sensitivity settings — high sensitivity triggers more recordings\n- Reduce clip length in app settings\n- Enable scheduled recording only during active hours\n- Ensure firmware is up to date"
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## 目录归类
|
|
132
|
-
|
|
133
|
-
工单提炼出的知识**统一归入 Product Introduction** 目录下的对应产品文件夹:
|
|
134
|
-
|
|
135
|
-
- 能识别产品型号 → `["Product Introduction", "<品类>", "<产品名>"]`
|
|
136
|
-
- 只能识别品类 → `["Product Introduction", "<品类>"]`
|
|
137
|
-
- 无法识别产品 → `["Pending Assignment"]`
|
|
138
|
-
|
|
139
|
-
提取前用 `list-directories` 自查目录是否齐全;缺则 `create-folder` 补建(详见 directory.md §5)。
|
|
140
|
-
|
|
141
|
-
## 产出文件(接入 tmp 合并流程)
|
|
142
|
-
|
|
143
|
-
批处理 wrapper 的分页中间产物在 `/workspace/state/kb-builder/ticket_extract/pages/`,最终汇总产物在:
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
/workspace/outputs/kb-builder/ticket_qa_merged_<ts>.json
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
要把最终汇总产物接入合并上传流程时,**复制一份**到 tmp 目录(保留产物原文件):
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
cp /workspace/outputs/kb-builder/ticket_qa_merged_<ts>.json /workspace/tmp/kb-builder/qa_parts/qa_tickets_<brand>.json
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
然后由 `import_qa.py --from-dir /workspace/tmp/kb-builder/qa_parts/` 与其他来源一起合并上传。
|
|
156
|
-
|
|
157
|
-
详见 `/skills/kb-builder/references/upload.md`。
|
|
158
|
-
|
|
159
|
-
## 常见错误
|
|
160
|
-
|
|
161
|
-
| 错误 | 正确做法 |
|
|
162
|
-
|------|----------|
|
|
163
|
-
| 直接把工单原文粘贴进知识库 | 必须经过 `extract_ticket_qa.py` 提炼 |
|
|
164
|
-
| 工单里有物理破损场景也提炼了 | 物理破损整条工单直接忽略 |
|
|
165
|
-
| 无关工单(发票 / 物流 / 订单)也提炼 | 整条工单跳过 |
|
|
166
|
-
| 同一产品问题多种表达各自成条 | 合并到同一条 QA 的 Question 里 |
|
|
167
|
-
| 工单 QA 放进 Help Center | 工单知识统一归 Product Introduction 对应产品目录 |
|
|
168
|
-
| 续跑时重复处理前 600 行 | 用 `--page 6 --page-size 100` 只跑第 501-600 行 |
|