@shulex/cxclawctl 0.1.2 → 0.1.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.
- package/README.md +25 -22
- package/capabilities.lock.json +535 -131
- package/dist/cli.js +2203 -127
- package/dist/cli.js.map +1 -1
- package/package.json +20 -6
- 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,98 +0,0 @@
|
|
|
1
|
-
# 从网站产品/政策页提取 QA
|
|
2
|
-
|
|
3
|
-
→ 通用质量规则见 `/skills/kb-builder/references/qa-quality.md`(必读)
|
|
4
|
-
|
|
5
|
-
## 数据来源优先级
|
|
6
|
-
|
|
7
|
-
**优先读取已有的爬取缓存**(`workspace/state/kb-builder/crawl_cache.json`),不重复爬取。
|
|
8
|
-
|
|
9
|
-
用 `read_file` 工具读取 cache,按 `pages` 中的 `type` 字段分类处理:
|
|
10
|
-
- `type == "product"` → Product Introduction
|
|
11
|
-
- `type == "policy"` → Brand Policy
|
|
12
|
-
- `type == "help_center"` → 走 `qa-from-help-center.md`
|
|
13
|
-
- `type == "other"` → 跳过
|
|
14
|
-
|
|
15
|
-
⚠️ cache 里的 `snippet` 只有 ≤1200 字符摘要,**做 QA 必须对每个目标 URL 单独调 `web_fetch(url=...)` 拿全文**(产品规格、政策原文、表格图片等只在全文里)。
|
|
16
|
-
|
|
17
|
-
如果 cache 不存在(用户跳过了网站探查阶段,直接给若干产品页 / 政策页 URL)→ 直接对每个 URL 用 `web_fetch` 拿全文,按下面规则提取。
|
|
18
|
-
|
|
19
|
-
## FAQ / Q&A 结构
|
|
20
|
-
|
|
21
|
-
任何网站页面只要正文里有明确 FAQ / Q&A 结构,先按 `qa-quality.md` 的 FAQ 规则逐条提取,再按页面上下文归类:
|
|
22
|
-
|
|
23
|
-
- 产品详情页里的产品 FAQ → `Product Introduction` 对应品类 / 型号目录
|
|
24
|
-
- 政策页里的政策 FAQ → `Brand Policy` 对应政策目录
|
|
25
|
-
- 帮助中心 / 文档站 / 支持站 FAQ → `Help Center` 对应真实导航目录
|
|
26
|
-
|
|
27
|
-
FAQ 条数**不受**“产品整体介绍 1 条 + 潜在问题 ≤5 条”限制;页面有多少有效 FAQ 条目就提取多少条,只受 `upload.md` 的分批大小限制。
|
|
28
|
-
|
|
29
|
-
## 1. 品牌政策知识(→ Brand Policy 目录)
|
|
30
|
-
|
|
31
|
-
从政策页提取:售后政策、退换货政策、物流政策、质保 / 保修政策。
|
|
32
|
-
|
|
33
|
-
每条政策生成 1 条 QA,归入对应 Brand Policy 二级目录:
|
|
34
|
-
|
|
35
|
-
```json
|
|
36
|
-
{
|
|
37
|
-
"dir_path": ["Brand Policy", "Warranty Policy"],
|
|
38
|
-
"question": "Kasa Smart Products — What is the warranty period and coverage?",
|
|
39
|
-
"answer": "- 18-month limited warranty from date of purchase\n- Covers manufacturing defects and hardware failures\n- Does not cover physical damage, water damage, or misuse\n- Warranty valid for original purchaser only"
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## 2. 产品落地页知识(→ Product Introduction 目录)
|
|
44
|
-
|
|
45
|
-
对每个产品详情页,生成**两类** QA:
|
|
46
|
-
|
|
47
|
-
**第一类:产品整体介绍**(每款产品 1 条)
|
|
48
|
-
- Q:`[型号] — Product Overview` 或 `What is the [型号] and what does it do?`
|
|
49
|
-
- A:详细产品描述、规格参数、尺寸、功能、卖点、产品对比、购买链接
|
|
50
|
-
- **必须保留**落地页上的图片(``)和表格
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"dir_path": ["Product Introduction", "Smart Plugs", "Kasa EP25"],
|
|
55
|
-
"question": "Kasa EP25 Smart Plug — What is the Kasa EP25 and what does it do?",
|
|
56
|
-
"answer": "The Kasa EP25 is a dual-outlet smart plug with built-in energy monitoring.\n\n**Key Features:**\n- Two independently controlled outlets\n- Real-time energy monitoring\n- Compatible with Alexa, Google Home, and Apple Home\n- Max load: 15A / 1800W\n\n**Dimensions:** 2.1\" x 1.4\" x 1.4\"\n\n\n\n| Feature | EP25 | EP10 |\n|---------|------|------|\n| Dual outlet | ✓ | ✗ |\n| Energy monitor | ✓ | ✗ |"
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**第二类:产品潜在问题**(每款产品 ≤5 条)
|
|
61
|
-
|
|
62
|
-
参考落地页信息,生成消费者可能会问的具体问题(颜色规格、尺寸参数、功能差异等)。如果产品页本身已有 FAQ / Q&A 结构,FAQ 逐条提取,不占用这 ≤5 条“自行归纳潜在问题”的额度:
|
|
63
|
-
|
|
64
|
-
```json
|
|
65
|
-
[
|
|
66
|
-
{
|
|
67
|
-
"dir_path": ["Product Introduction", "Smart Plugs", "Kasa EP25"],
|
|
68
|
-
"question": "Kasa EP25 Smart Plug — What colors does the EP25 come in?",
|
|
69
|
-
"answer": "The Kasa EP25 is available in White only."
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"dir_path": ["Product Introduction", "Smart Plugs", "Kasa EP25"],
|
|
73
|
-
"question": "Kasa EP25 Smart Plug — What is the maximum wattage the EP25 supports?",
|
|
74
|
-
"answer": "The Kasa EP25 supports a maximum load of 15A / 1800W per outlet."
|
|
75
|
-
}
|
|
76
|
-
]
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## 目录前置自查
|
|
80
|
-
|
|
81
|
-
提取前先 `list-directories` 看现有目录是否覆盖本次产品的品类 / 型号,缺则用 `create-folder` 补建(详见 directory.md §5)。
|
|
82
|
-
|
|
83
|
-
## 产出文件(每批写到 tmp)
|
|
84
|
-
|
|
85
|
-
提取的 QA **不要**自己合并成 qa_plan,**也不要**一次 write_file 写完整数组。
|
|
86
|
-
每批 ≤ 4 KB 写到 `/workspace/tmp/kb-builder/qa_parts/qa_web_<topic>.json`(如 `qa_web_policy.json` / `qa_web_kasa-ep25.json`),
|
|
87
|
-
最后由 `import_qa.py --from-dir /workspace/tmp/kb-builder/qa_parts/` 自动合并 + 上传。
|
|
88
|
-
|
|
89
|
-
详见 `/skills/kb-builder/references/upload.md`。
|
|
90
|
-
|
|
91
|
-
## 常见错误
|
|
92
|
-
|
|
93
|
-
| 错误 | 正确做法 |
|
|
94
|
-
|------|----------|
|
|
95
|
-
| 只看 cache 里 1200 字 snippet 就生成 QA | 必须 web_fetch 全文 |
|
|
96
|
-
| 产品落地页只生成一类 QA | 两类必须都有:整体介绍 + ≤5 条潜在问题 |
|
|
97
|
-
| 产品页已有 FAQ 但只抽 5 条或放进 Help Center | FAQ 逐条提取,归 Product Introduction 对应产品目录 |
|
|
98
|
-
| 政策 QA 放进 Help Center 或 Product Introduction | 政策只进 Brand Policy 对应二级目录 |
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# QA 通用质量规则
|
|
2
|
-
|
|
3
|
-
无论 QA 来源(网站 / 帮助中心 / FAQ / PDF / 工单),所有生成的 QA 都必须遵守本文规则。
|
|
4
|
-
|
|
5
|
-
## 格式
|
|
6
|
-
|
|
7
|
-
**Answer 全部用 markdown**——Shulex 知识库后台和客服回复链路均按 markdown 渲染。
|
|
8
|
-
保留图片 ``、表格、列表 `-`、加粗 `**...**`、有序步骤 `1. ...`,不要写 HTML 标签。
|
|
9
|
-
抓取阶段(`web_fetch` / `web_crawl` / `read_file` PDF)返回的就是 markdown,可直接保留结构、按需精简。
|
|
10
|
-
|
|
11
|
-
**语言:** 用户明确指定的产物语言 > 会话上下文中的用户界面语言偏好 > 用户当前消息语言。Question、Answer 与新建的业务目录名使用目标语言;品牌名、产品型号和其他专有名词保留原文。网页、附件、PDF 或工单原文只是知识来源,不能单独改变目标语言。不得因为本文示例是英文而默认生成英文。
|
|
12
|
-
|
|
13
|
-
目录路径必须跟随当前任务的目录 schema。用户或 SOP 明确给出目录层级时,按该 schema 原样归类;未给出 schema 时才使用默认标准模板,默认一级目录 `Product Introduction` / `Brand Policy` / `Help Center` / `Pending Assignment` 保持英文。
|
|
14
|
-
|
|
15
|
-
## Question 格式
|
|
16
|
-
|
|
17
|
-
- 品类通用问题(多款产品共有)→ 用品类名:`[品类名] — [问题]`
|
|
18
|
-
- 特定型号专有问题 → 用型号名:`[型号名] — [问题]`
|
|
19
|
-
|
|
20
|
-
✅ `Smart Security Cameras — How do I reset my camera to factory settings?`(品类通用)
|
|
21
|
-
✅ `Kasa EP25 Smart Plug — What is the maximum wattage this plug supports?`(型号专有)
|
|
22
|
-
❌ `How do I reset it?` ← 无产品信息
|
|
23
|
-
❌ `Reset steps?` ← 不是完整问句
|
|
24
|
-
|
|
25
|
-
## FAQ / Q&A 结构提取规则
|
|
26
|
-
|
|
27
|
-
任何页面只要有明确 FAQ / Q&A 结构(条目标题是问题、正文是答案),都按下面规则处理:
|
|
28
|
-
|
|
29
|
-
- 逐条提取原页面的有效 FAQ;问题加品牌 / 品类 / 型号前缀,答案保留原文 markdown 内容
|
|
30
|
-
- 不受产品页“整体介绍 1 条 + 潜在问题 ≤5 条”限制;FAQ 有多少有效条目就提取多少条
|
|
31
|
-
- 目录归类仍按页面上下文决定:产品页里的产品 FAQ 归产品对应品类/型号目录;政策页里的政策 FAQ 归政策目录;帮助中心 / 文档站 FAQ 才归帮助中心目录。使用默认标准模板时,这些目录分别对应 Product Introduction、Brand Policy、Help Center。
|
|
32
|
-
- 真正的数量控制只在写文件和上传阶段:按 `upload.md` 每批 ≤4 KB 分片,避免截断
|
|
33
|
-
|
|
34
|
-
## Answer 强制过滤
|
|
35
|
-
|
|
36
|
-
- 删除所有向客户索要信息的话术(订单号、收据、产品照片、序列号等)
|
|
37
|
-
- 删除所有引导联系客服 / 提交工单 / 发邮件的话术
|
|
38
|
-
- 删除营销语言、品牌故事、公司介绍
|
|
39
|
-
- 格式清晰有条理:分点用 `-`,保留图片 ``,保留表格
|
|
40
|
-
|
|
41
|
-
## 全局排除话题(不生成 QA、不建目录)
|
|
42
|
-
|
|
43
|
-
- 物流 / 快递 / 配送时效 / 包裹追踪
|
|
44
|
-
- 订单查询 / 修改 / 取消
|
|
45
|
-
- 退货 / 退款 / 换货
|
|
46
|
-
- 账号管理
|
|
47
|
-
- 支付 / 账单
|
|
48
|
-
|
|
49
|
-
## 目录归类规则
|
|
50
|
-
|
|
51
|
-
每条 QA 归入最精确匹配的目录:
|
|
52
|
-
|
|
53
|
-
1. 能匹配三级目录 → 归入三级
|
|
54
|
-
2. 能匹配二级目录 → 归入二级
|
|
55
|
-
3. 无法判断 → 归入 `["Pending Assignment"]`
|
|
56
|
-
|
|
57
|
-
提取过程中发现品类/型号目录在 KB 里不存在时,**用 `create-folder` CLI 临时补建**,
|
|
58
|
-
不要直接归到 Pending Assignment(兜底是给真的无法分类的内容)。
|
|
59
|
-
|
|
60
|
-
## 常见错误
|
|
61
|
-
|
|
62
|
-
| 错误 | 正确做法 |
|
|
63
|
-
|------|----------|
|
|
64
|
-
| Question 不区分品类 / 型号 | 通用问题用品类名,型号专有问题用型号名 |
|
|
65
|
-
| Answer 里向客户索要信息(订单号 / 照片 / 序列号) | 整句删除 |
|
|
66
|
-
| Answer 里引导联系客服 / 提交工单 | 整句删除 |
|
|
67
|
-
| 用户已指定目录 schema 时仍套默认 Product Introduction | 用户 schema 优先,严格按指定层级归类 |
|
|
68
|
-
| 默认标准模板下自由发明一级目录名称 | 一级目录只有四个固定名称(见 directory.md) |
|
|
69
|
-
| Product Introduction 二级是产品名 | 二级必须是品类,三级才是产品名 |
|
|
70
|
-
| Brand Policy 下建了三级目录 | Brand Policy 只到二级 |
|
|
71
|
-
| 无法归类的内容随意放置 | 统一放入 Pending Assignment |
|
|
72
|
-
| 产品页 FAQ 被放进 Help Center | 产品页 FAQ 归 Product Introduction 对应产品目录 |
|
|
73
|
-
| FAQ 页面只抽 5 条 | FAQ 按有效条目逐条提取,不套产品页潜在问题 ≤5 条限制 |
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
# 回复模板库管理
|
|
2
|
-
|
|
3
|
-
优先用 `/skill-lib/solvea-api/solvea_api.py` 管理模板;用户上传 Excel / CSV 批量导入时,用 `scripts/import_templates.py`。
|
|
4
|
-
|
|
5
|
-
## 能力清单
|
|
6
|
-
|
|
7
|
-
| 用户要做什么 | 使用方式 | 是否需要确认 | 输出 / 结果 |
|
|
8
|
-
|--------------|----------|--------------|-------------|
|
|
9
|
-
| 查模板 | `list-templates` | 否 | 返回 `id/name/content/status/scene` |
|
|
10
|
-
| 创建单条模板 | `create-template` | 是 | 返回新模板 `id` |
|
|
11
|
-
| 修改单条模板(改名 / 内容 / 状态) | `update-template --id ...` | 是 | 返回更新后的模板 |
|
|
12
|
-
| 批量导入模板 | `import_templates.py --dry-run` → 用户确认 → 正式导入 | 是 | dry-run 生成 `template_import_plan_*`;正式导入生成 `template_import_result_*` |
|
|
13
|
-
| 保留首条并跳过重复名 | `import_templates.py --skip-duplicates` | 是 | `skipped_duplicates` 记录被跳过的行 |
|
|
14
|
-
| 删除模板 | `delete-templates --ids ... --confirm-delete` | 是,必须确认模板名称和 id | 按 id 删除 |
|
|
15
|
-
| 单条发布 / 下架 | `update-template --id ... --status ENABLED/DISABLED` | 是 | 改单条模板状态 |
|
|
16
|
-
| 批量发布 / 下架 | 暂无批量 CLI | 是 | 单条走 `update-template`;批量走前端“批量更新” |
|
|
17
|
-
|
|
18
|
-
## 管理 CLI
|
|
19
|
-
|
|
20
|
-
所有命令都走:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npx --yes @shulex/cxclawctl@latest api <command> [args]
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### `list-templates`
|
|
27
|
-
|
|
28
|
-
查询模板库。只读,可直接执行。
|
|
29
|
-
|
|
30
|
-
| 参数 | 必填 | 说明 |
|
|
31
|
-
|------|------|------|
|
|
32
|
-
| `--keyword` | 否 | 按模板名 / 内容关键字查询;传数字时也可用于定位 id |
|
|
33
|
-
| `--status` | 否 | 状态过滤,如 `ENABLED` / `DISABLED` |
|
|
34
|
-
| `--scene` | 否 | 场景过滤;可重复传。普通模板一般不传,语音短信模板传 `voice_sms` |
|
|
35
|
-
| `--page` | 否 | 页码,默认 `1` |
|
|
36
|
-
| `--page-size` | 否 | 每页数量,默认 `50` |
|
|
37
|
-
| `--pretty` | 否 | 格式化输出,排查时建议加 |
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
npx --yes @shulex/cxclawctl@latest api list-templates \
|
|
41
|
-
--keyword "广告" --page-size 20 --pretty
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### `create-template`
|
|
45
|
-
|
|
46
|
-
创建单条模板。执行前先向用户确认模板名称和内容。
|
|
47
|
-
|
|
48
|
-
| 参数 | 必填 | 说明 |
|
|
49
|
-
|------|------|------|
|
|
50
|
-
| `--name` | 是,除非用 `--data-file` | 模板名称,项目内必须唯一 |
|
|
51
|
-
| `--content` | 是,除非用 `--data-file` | 默认回复内容 |
|
|
52
|
-
| `--status` | 否 | 模板状态;不传时后端默认 `ENABLED` |
|
|
53
|
-
| `--scene` | 否 | 模板场景;普通模板不传,语音短信模板传 `voice_sms` |
|
|
54
|
-
| `--data` | 否 | JSON 字符串;适合传 `multiContent` 等复杂字段 |
|
|
55
|
-
| `--data-file` | 否 | JSON 文件路径;适合复杂模板 |
|
|
56
|
-
| `--pretty` | 否 | 格式化输出 |
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
npx --yes @shulex/cxclawctl@latest api create-template \
|
|
60
|
-
--name "广告关闭" \
|
|
61
|
-
--content "您好,您可以在APP右下角“我的”里关闭广告。" \
|
|
62
|
-
--status ENABLED \
|
|
63
|
-
--pretty
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
复杂模板用 JSON:
|
|
67
|
-
|
|
68
|
-
```json
|
|
69
|
-
{
|
|
70
|
-
"name": "广告关闭",
|
|
71
|
-
"content": "您好,您可以在APP右下角“我的”里关闭广告。",
|
|
72
|
-
"status": "ENABLED",
|
|
73
|
-
"multiContent": {
|
|
74
|
-
"AUTO": "您好,您可以在APP右下角“我的”里关闭广告。"
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### `update-template`
|
|
80
|
-
|
|
81
|
-
修改单条已有模板,**部分更新**:只传要改的字段,未传的保持不变。执行前先向用户确认改哪条、改成什么。
|
|
82
|
-
|
|
83
|
-
| 参数 | 必填 | 说明 |
|
|
84
|
-
|------|------|------|
|
|
85
|
-
| `--id` | 是 | 要修改的模板 id(templateId) |
|
|
86
|
-
| `--name` | 否 | 新模板名;项目内唯一,撞名会报 `template name is already existed` |
|
|
87
|
-
| `--content` | 否 | 新默认回复内容;后端会自动同步到 `multiContent.AUTO` |
|
|
88
|
-
| `--status` | 否 | `ENABLED` / `DISABLED` |
|
|
89
|
-
| `--data` / `--data-file` | 否 | JSON;传 `multiContent` 等多语种字段 |
|
|
90
|
-
| `--pretty` | 否 | 格式化输出 |
|
|
91
|
-
|
|
92
|
-
至少要传一个可改字段(`--name` / `--content` / `--status` / `multiContent`),否则报错。
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
# 下架
|
|
96
|
-
npx --yes @shulex/cxclawctl@latest api update-template --id 12008 --status DISABLED
|
|
97
|
-
|
|
98
|
-
# 改名 + 内容
|
|
99
|
-
npx --yes @shulex/cxclawctl@latest api update-template \
|
|
100
|
-
--id 12008 --name "转人工" --content "<p>这是转人工的模版文案</p>" --pretty
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
多语种内容用 JSON(`--data` / `--data-file`):
|
|
104
|
-
|
|
105
|
-
```json
|
|
106
|
-
{ "multiContent": { "AUTO": "<p>…</p>", "ENGLISH": "<p>…</p>" } }
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### `delete-templates`
|
|
110
|
-
|
|
111
|
-
按 id 批量删除模板。删除前必须向用户展示模板名称和 id,并要求回复“我已知晓删除影响并确认删除”或等价强确认。
|
|
112
|
-
|
|
113
|
-
| 参数 | 必填 | 说明 |
|
|
114
|
-
|------|------|------|
|
|
115
|
-
| `--ids` | 是,除非用 `--data-file` | 要删除的模板 id 列表 |
|
|
116
|
-
| `--data` | 否 | JSON 字符串,格式为 `{"templateIds":[123,124]}` 或 `{"ids":[123,124]}` |
|
|
117
|
-
| `--data-file` | 否 | JSON 文件路径 |
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
npx --yes @shulex/cxclawctl@latest api delete-templates --ids 123 124 125 --confirm-delete
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## 批量导入脚本
|
|
124
|
-
|
|
125
|
-
脚本路径:
|
|
126
|
-
|
|
127
|
-
```bash
|
|
128
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_templates.py [args]
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Excel / CSV 列
|
|
132
|
-
|
|
133
|
-
| 列 | 必填 | 说明 | 兼容表头 |
|
|
134
|
-
|----|------|------|----------|
|
|
135
|
-
| `name` | 是 | 模板名称,必须唯一 | `模板名称` / `模板名` / `模版名称` / `模版名` / `名称` / `标题` / `主题` |
|
|
136
|
-
| `content` | 是 | 默认回复内容 | `模板内容` / `模版内容` / `回复内容` / `回复话术` / `话术` / `答案` / `内容` |
|
|
137
|
-
| `status` | 否 | 模板状态,默认 `ENABLED` | `状态` / `发布状态` |
|
|
138
|
-
| `scene` | 否 | 普通模板留空;语音短信模板填 `voice_sms` | `场景` / `适用场景` |
|
|
139
|
-
| `AUTO` | 否 | 默认语言内容;为空时自动使用 `content` | `AUTO` |
|
|
140
|
-
| 其他语言列 | 否 | 多语言内容,如 `ENGLISH` / `CHINESE` / `JAPANESE` | 需使用脚本支持的语言枚举 |
|
|
141
|
-
|
|
142
|
-
### 参数
|
|
143
|
-
|
|
144
|
-
| 参数 | 必填 | 说明 |
|
|
145
|
-
|------|------|------|
|
|
146
|
-
| `--xlsx` | 二选一 | Excel / CSV 文件路径,支持 `.xlsx` / `.xlsm` / `.csv` |
|
|
147
|
-
| `--plan-file` | 二选一 | 已确认的 `template_import_plan_*.json` 路径;正式导入优先用它,避免跨轮依赖临时 Excel |
|
|
148
|
-
| `--sheet` | 否 | Excel sheet 名;不传用第一个 sheet |
|
|
149
|
-
| `--name-col` | 否 | 指定模板名称列;表头不标准时必传 |
|
|
150
|
-
| `--content-col` | 否 | 指定模板内容列;表头不标准时必传 |
|
|
151
|
-
| `--status-col` | 否 | 指定状态列 |
|
|
152
|
-
| `--scene-col` | 否 | 指定场景列 |
|
|
153
|
-
| `--lang-col` | 否 | 指定多语言列,可重复传,格式 `LANGUAGE=列名`,如 `CHINESE=中文话术` |
|
|
154
|
-
| `--skip-duplicates` | 否 | 文件内模板名重复时保留第一条,跳过后续同名行;结果写入 `skipped_duplicates` |
|
|
155
|
-
| `--dry-run` | 否 | 只解析并生成导入计划,不创建模板 |
|
|
156
|
-
|
|
157
|
-
`--xlsx` 和 `--plan-file` 二选一。dry-run 阶段通常用 `--xlsx`;正式导入阶段优先用 `--plan-file`。
|
|
158
|
-
|
|
159
|
-
## 标准流程
|
|
160
|
-
|
|
161
|
-
1. 先读用户文件表头和样例:
|
|
162
|
-
|
|
163
|
-
```text
|
|
164
|
-
read_file(file_path="/mounted/chat-files/user/templates.xlsx", limit=20)
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
2. 先 dry-run:
|
|
168
|
-
|
|
169
|
-
```bash
|
|
170
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_templates.py \
|
|
171
|
-
--xlsx /mounted/chat-files/user/templates.xlsx \
|
|
172
|
-
--dry-run
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
表头不标准时显式传列名:
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_templates.py \
|
|
179
|
-
--xlsx /mounted/chat-files/user/templates.xlsx \
|
|
180
|
-
--name-col "Topic" \
|
|
181
|
-
--content-col "Message" \
|
|
182
|
-
--scene-col "Usage" \
|
|
183
|
-
--lang-col "CHINESE=中文话术" \
|
|
184
|
-
--dry-run
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
如果确实需要临时处理用户文件,例如手工去重、改列、清洗内容:可以把处理后的文件写到 `/workspace/tmp` 供本轮 dry-run 使用,但用户确认后不能再依赖这个 tmp 文件。跨轮稳定输入是 dry-run 生成的 `template_import_plan_*`。
|
|
188
|
-
|
|
189
|
-
用户要求跳过重复模板名时,可以用脚本参数生成最终 plan:
|
|
190
|
-
|
|
191
|
-
```bash
|
|
192
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_templates.py \
|
|
193
|
-
--xlsx /mounted/chat-files/user/templates.xlsx \
|
|
194
|
-
--name-col "快捷词" \
|
|
195
|
-
--content-col "回复内容" \
|
|
196
|
-
--skip-duplicates \
|
|
197
|
-
--dry-run
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
3. 向用户汇报解析数量和计划文件,等待明确确认:
|
|
201
|
-
|
|
202
|
-
```text
|
|
203
|
-
已解析 X 条模板,计划文件:
|
|
204
|
-
/workspace/outputs/kb-builder/template_import_plan_<ts>.json
|
|
205
|
-
|
|
206
|
-
确认上传到模板库吗?
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
4. 用户明确回复“确认 / 上传吧 / 没问题”后,用已确认的 plan 正式导入:
|
|
210
|
-
|
|
211
|
-
```bash
|
|
212
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_templates.py \
|
|
213
|
-
--plan-file /workspace/outputs/kb-builder/template_import_plan_<ts>.json
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
正式导入输出:
|
|
217
|
-
|
|
218
|
-
```text
|
|
219
|
-
/workspace/outputs/kb-builder/template_import_result_<ts>.json
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
结果文件包含 `created_items`:
|
|
223
|
-
|
|
224
|
-
```json
|
|
225
|
-
[{"id": 123, "name": "Warranty reply"}]
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## 规则
|
|
229
|
-
|
|
230
|
-
- 查询模板可直接执行;创建、修改、正式批量导入、删除前必须等用户明确确认。
|
|
231
|
-
- `update-template` 是部分更新:只改传入字段,未传字段不变;改名同样受“名称唯一”校验;改单条状态(上架 / 下架)用 `update-template --status`,无需依赖前端。
|
|
232
|
-
- 删除模板前必须展示并确认模板名称和 id。
|
|
233
|
-
- 后端校验模板名唯一;脚本不会覆盖已有模板。
|
|
234
|
-
- Excel 导入没有后端批量创建接口,脚本会逐行调用单条创建接口。
|
|
235
|
-
- 正式导入不会生成新的 import plan,只生成 import result。
|
|
236
|
-
- 跨轮不要依赖 `/workspace/tmp` 临时文件;正式导入应使用 dry-run 生成的 `template_import_plan_*`。
|
|
237
|
-
- plan 是用户确认的导入内容快照;正式导入不要重新解析 Excel,避免文件消失、表头参数不一致或临时处理丢失。
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# 标签迁移与隔离关键词映射
|
|
2
|
-
|
|
3
|
-
标签与隔离关键词是两个独立概念。标签绑定知识使用 `editTags`;隔离关键词绑定知识使用隔离关键词批量接口。两者之间不能直接按字段或 ID 推断关系。
|
|
4
|
-
|
|
5
|
-
## 中间态文件
|
|
6
|
-
|
|
7
|
-
先生成:
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
/workspace/state/kb-builder/tag_isolation_keyword_mapping.json
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
格式:
|
|
14
|
-
|
|
15
|
-
```json
|
|
16
|
-
{
|
|
17
|
-
"mappings": [
|
|
18
|
-
{
|
|
19
|
-
"tag": "kb-test",
|
|
20
|
-
"isolationKeyword": "product-a",
|
|
21
|
-
"isolationKeywordId": 11,
|
|
22
|
-
"matchType": "semantic",
|
|
23
|
-
"status": "candidate",
|
|
24
|
-
"reason": "kb-test 与 product-a 都表示该知识内容属于 product-a 产品的测试知识范围"
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
- 文本完全一致时,`matchType` 为 `exact`。
|
|
31
|
-
- 文本不一致但语义匹配时,`matchType` 为 `semantic`,`reason` 只说明二者为什么匹配。
|
|
32
|
-
- 无法匹配或有歧义时,`status` 为 `unmatched`,不生成绑定项。
|
|
33
|
-
- `isolationKeywordId` 必须来自隔离关键词接口返回的真实 ID。
|
|
34
|
-
|
|
35
|
-
## 一次性迁移流程
|
|
36
|
-
|
|
37
|
-
1. 批量读取知识及顶层 `tags`:
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
npx --yes @shulex/cxclawctl@latest api list-knowledge \
|
|
41
|
-
--directory-id <directory_id> --type QA --include-tags --page-size 500 --pretty
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
测试环境使用 `--env staging`,生产环境使用 `--env prod`。根据总数继续分页。
|
|
45
|
-
2. 读取项目标签定义:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
npx --yes @shulex/cxclawctl@latest api list-knowledge-tags --pretty
|
|
49
|
-
```
|
|
50
|
-
3. 读取隔离关键词文本和真实 ID:
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
npx --yes @shulex/cxclawctl@latest api \
|
|
54
|
-
list-isolation-keywords --all --page-size 500 --pretty
|
|
55
|
-
```
|
|
56
|
-
4. CX 根据完全一致或语义关系生成中间态映射文件,并按映射生成知识到 `keywordIds` 的绑定计划。
|
|
57
|
-
5. 一次性展示映射文件、未匹配项、歧义项及全部新增绑定;用户只确认这一次。
|
|
58
|
-
6. 确认后调用隔离关键词批量绑定接口,整个迁移过程中不再逐条确认。
|
|
59
|
-
7. 回读知识,验证 `isolationKeywords`。
|
|
60
|
-
|
|
61
|
-
标签本身如需写入知识,另行使用 `editTags`;该动作也应纳入同一份迁移计划和同一次确认。
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# 知识库标签管理
|
|
2
|
-
|
|
3
|
-
知识库标签是知识条目上的字符串标签,不是 `tagSetting` 标签树。读取问答时使用 QA 详情接口;读取文档/网页时使用 DOCUMENT 详情接口;写入统一使用 `editTags`,并把对应的 `type` 一并传给接口。
|
|
4
|
-
|
|
5
|
-
## 接口
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
POST /sns_v1/project/{projectId}/editTags
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
请求体:
|
|
12
|
-
|
|
13
|
-
```json
|
|
14
|
-
{
|
|
15
|
-
"type": "QA",
|
|
16
|
-
"knowledgeIds": [488523],
|
|
17
|
-
"tagList": ["123", "kb-test"]
|
|
18
|
-
}
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
`tagList` 是最终标签列表。调用前必须先读取目标知识的顶层 `tags`,再按用户意图计算最终列表:默认追加;明确要求替换时覆盖;删除时计算差集。调用后重新读取知识核对 `tags`。
|
|
22
|
-
|
|
23
|
-
示例状态文件:
|
|
24
|
-
|
|
25
|
-
```json
|
|
26
|
-
{
|
|
27
|
-
"type": "QA",
|
|
28
|
-
"knowledgeIds": [488523],
|
|
29
|
-
"tagList": ["kb-test"],
|
|
30
|
-
"operation": "append"
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
`operation` 支持 `append`、`replace`、`remove`,默认是 `append`。`metadata.tags` 暂不作为标签写入字段;返回对象中的顶层 `tags` 是本能力的事实来源。
|
|
35
|
-
|
|
36
|
-
文档和网页分别传列表返回的 `FILE`、`WEBSITE`;不要因为二者底层都属于 DOCUMENT 就把 `type` 写成 `DOCUMENT`。
|
|
37
|
-
|
|
38
|
-
## 标签配置到知识
|
|
39
|
-
|
|
40
|
-
标签绑定知识只使用 `editTags`,不使用隔离关键词接口:
|
|
41
|
-
|
|
42
|
-
```text
|
|
43
|
-
测试环境:POST /sns_v1/project/{projectId}/editTags
|
|
44
|
-
生产环境:POST /api_v2/qam/project/{projectId}/editTags
|
|
45
|
-
```
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
# 合并 qa_plan 并上传
|
|
2
|
-
|
|
3
|
-
→ 通用质量规则见 `/skills/kb-builder/references/qa-quality.md`(必读)
|
|
4
|
-
|
|
5
|
-
各来源(网站 / 帮助中心 / FAQ / PDF / 工单)独立提取出 QA 后,按下面流程上传。
|
|
6
|
-
|
|
7
|
-
## 工作流:分批写 tmp,脚本自动合并
|
|
8
|
-
|
|
9
|
-
**核心思路**:agent 把每批 QA 写到 `/workspace/tmp/kb-builder/qa_parts/` 的多个小文件,
|
|
10
|
-
`import_qa.py --from-dir` 自动按文件名排序合并、写一份带时间戳的成品到 outputs,再做 dry-run / 上传。
|
|
11
|
-
|
|
12
|
-
### 为什么这样做
|
|
13
|
-
|
|
14
|
-
直接 `write_file` 一份完整 qa_plan 大概率被 endpoint max_tokens 截断(一份典型计划 50~200 条 QA、30~100 KB)。
|
|
15
|
-
任何 string 字段(write_file/edit_file 的 content/new_string)都是 LLM 一次性输出,**全部受 max_tokens 限制**。
|
|
16
|
-
不要用占位 sentinel + edit_file 多次替换的老办法——edit_file 的 new_string 同样会被截。
|
|
17
|
-
|
|
18
|
-
### 步骤
|
|
19
|
-
|
|
20
|
-
1. **先 mkdir 干净的 tmp 目录**(避免上轮残留污染本轮):
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
mkdir -p /workspace/tmp/kb-builder/qa_parts && rm -f /workspace/tmp/kb-builder/qa_parts/*.json
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
2. **每批 ≤ 4 KB 写一个 json 文件**到 `/workspace/tmp/kb-builder/qa_parts/`。
|
|
27
|
-
命名约定(任意,按文件名字母序合并):
|
|
28
|
-
|
|
29
|
-
| 文件名样例 | 来源 |
|
|
30
|
-
|-----------|------|
|
|
31
|
-
| `qa_web_policy.json` | 网站政策 QA |
|
|
32
|
-
| `qa_web_kasa-ep25.json` | 网站某产品 QA |
|
|
33
|
-
| `qa_help_setup.json` | 帮助中心某子目录 QA |
|
|
34
|
-
| `qa_pdf_av-d600_part1.json` `qa_pdf_av-d600_part2.json` | PDF 拆出来的 QA(分批) |
|
|
35
|
-
| `qa_tickets_camera.json` | 工单提炼出某品类 QA |
|
|
36
|
-
|
|
37
|
-
每个文件的 JSON 结构都是 **QA 数组**:
|
|
38
|
-
|
|
39
|
-
```json
|
|
40
|
-
[
|
|
41
|
-
{
|
|
42
|
-
"dir_path": ["Product Introduction", "Smart Plugs", "Kasa EP25"],
|
|
43
|
-
"question": "Kasa EP25 Smart Plug — What is the maximum wattage?",
|
|
44
|
-
"answer": "..."
|
|
45
|
-
}
|
|
46
|
-
]
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
`dir_path` 必须是目录名数组,不是字符串路径。不要写 `"/kb/Kasa EP25"`、
|
|
50
|
-
`"Product Introduction/Smart Plugs/Kasa EP25"` 或其他带 `/` 的单个字符串;脚本会在
|
|
51
|
-
dry-run 阶段报错。上传到现有 SKU / 产品目录时,先 `list-directories` 确认真实父目录,
|
|
52
|
-
再写完整数组,例如 `["Product Introduction", "Speakers", "B0117-03018-BK"]`。
|
|
53
|
-
|
|
54
|
-
含图片的答案必须在 `answer` 中保留 markdown 图片语法 ``。如果来源是 DOCX / PDF / 网页,
|
|
55
|
-
优先使用能保留图片 markdown 的读取结果;不要用只读段落文本的解析方式生成最终 QA。
|
|
56
|
-
|
|
57
|
-
3. **每批 size 控制**(防止单次 write_file 被截):
|
|
58
|
-
- 普通 QA 每条 200~500 字符 → 每批 8~10 条
|
|
59
|
-
- 长 answer(含图表 / 多步骤 / 规格表 / 说明书全文 QA)每条 1~3 KB → 每批 2~3 条
|
|
60
|
-
- **每批 new_string ≤ 4 KB**(≈ 1K output tokens,留足余量)
|
|
61
|
-
- 估不准就保守一点,少塞几条没关系
|
|
62
|
-
|
|
63
|
-
4. **被截的兜底**:如果某次 `write_file` 报 `content: Field required` 或日志出现
|
|
64
|
-
`output truncated by max_tokens`,**立刻把这批数量减半重写**。这是 max_tokens 截断信号。
|
|
65
|
-
|
|
66
|
-
5. **合并 + dry-run**(脚本会把合并结果写到 `/workspace/outputs/kb-builder/qa_plan_{ts}.json` 留档):
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_qa.py --from-dir /workspace/tmp/kb-builder/qa_parts/ --dry-run
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
6. **向用户汇报数量**,等待明确确认:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
即将上传 X 条 QA:
|
|
76
|
-
- Product Introduction: N1 条
|
|
77
|
-
- Brand Policy: N2 条
|
|
78
|
-
- Help Center: N3 条
|
|
79
|
-
- Pending Assignment: N4 条
|
|
80
|
-
|
|
81
|
-
合并产物:/workspace/outputs/kb-builder/qa_plan_{ts}.json
|
|
82
|
-
确认上传吗?
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
⚠️ 等用户回「确认」「上传吧」「没问题」后再正式上传。「可以」「好」「嗯」**不算**。
|
|
86
|
-
|
|
87
|
-
7. **正式上传**:
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_qa.py --from-dir /workspace/tmp/kb-builder/qa_parts/
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
或者用 dry-run 阶段已落盘的 qa_plan 文件(避免重新合并):
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_qa.py --qa-file /workspace/outputs/kb-builder/qa_plan_<ts>.json
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## 上传后验证
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
# 按 keyword 检索确认上传成功
|
|
103
|
-
npx --yes @shulex/cxclawctl@latest api list-knowledge --keyword "Kasa EP25" --page-size 50 --pretty
|
|
104
|
-
|
|
105
|
-
# 看目录的 kuCount 是否增加
|
|
106
|
-
npx --yes @shulex/cxclawctl@latest api list-directories --pretty
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## 已经有合并好的 qa_plan.json 时
|
|
110
|
-
|
|
111
|
-
直接传文件路径,不走 tmp:
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_qa.py --qa-file /path/to/qa_plan.json --dry-run
|
|
115
|
-
npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/import_qa.py --qa-file /path/to/qa_plan.json
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## 常见错误
|
|
119
|
-
|
|
120
|
-
| 错误 | 正确做法 |
|
|
121
|
-
|------|----------|
|
|
122
|
-
| 一次 `write_file` 写整份 qa_plan | 分批写到 `/workspace/tmp/kb-builder/qa_parts/`,由 `import_qa.py --from-dir` 合并 |
|
|
123
|
-
| 用占位 sentinel + 多次 `edit_file` 追加 | 已废弃。`edit_file` 的 `new_string` 同样受 max_tokens 限制,会被截 |
|
|
124
|
-
| 单批塞太多导致截断 | 每批 ≤ 4 KB;长 answer 每批 2~3 条;截断信号出现立刻减半重试 |
|
|
125
|
-
| 直接上传不先 dry-run | 必须先 dry-run 并向用户汇报数量 |
|
|
126
|
-
| 用「可以」「好」「嗯」当确认 | 必须收到明确「确认 / 上传吧 / 没问题」|
|
|
127
|
-
| `--qa-file` / `--from-dir` 路径用相对形式 | 用绝对路径 `/workspace/...` |
|
|
128
|
-
| 上传后知识无效果 | 检查 `published: true` 和 `forceIndex: true` 是否已设置 |
|
|
129
|
-
| `dir_path` 写成 `/kb/SKU` 字符串 | 改成目录名数组,例如 `["Product Introduction", "Speakers", "SKU"]` |
|
|
130
|
-
| 回复说保留图片但知识里没有图片 | 检查 QA plan 的 `answer` 是否真的包含 ``,上传脚本不会自动从原文补图 |
|