@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,231 +0,0 @@
|
|
|
1
|
-
# 标签树管理
|
|
2
|
-
|
|
3
|
-
这里对接的是 `tagSetting` 页面使用的标签树,用于维护标签组、标签节点,以及通过 Excel 批量初始化或更新标签。
|
|
4
|
-
|
|
5
|
-
注意:当前页面使用的是 `/api_v2/gpt/label/project/...` 这组接口;`/ai-tag/*` 是另一套标签能力,不在本流程内。
|
|
6
|
-
|
|
7
|
-
## API
|
|
8
|
-
|
|
9
|
-
| 操作 | 方法 | 路径 | 说明 |
|
|
10
|
-
|------|------|------|------|
|
|
11
|
-
| 标签组列表 | GET | `/api_v2/gpt/label/project/{pid}/getTreeInfo` | 获取标签组,返回 `id/treeName/treeDescribe/condition` |
|
|
12
|
-
| 创建/更新/删除标签组 | POST | `/api_v2/gpt/label/project/{pid}/updateTreeInfo` | body 用 `operateType=CREATE/UPDATE/DELETE` |
|
|
13
|
-
| 标签树 | GET | `/api_v2/gpt/label/project/{pid}/getTagTree` | 参数 `treeId` 必填,`name` 可选 |
|
|
14
|
-
| 标签详情 | POST | `/api_v2/gpt/label/project/{pid}/getDetailTree` | 支持 `nodeIds/nodeNames/parentIds` |
|
|
15
|
-
| 创建/更新/删除标签节点 | POST | `/api_v2/gpt/label/project/{pid}/updateNode` | body 用 `operateType=CREATE/UPDATE/DELETE` |
|
|
16
|
-
| 下载导入模板 | GET | `/api_v2/gpt/label/project/{pid}/downloadLabelTemplate` | 排查或人工编辑时使用,普通流程不用 |
|
|
17
|
-
| 下载当前标签 | GET | `/api_v2/gpt/label/project/{pid}/downloadLabel` | 用于导出现有标签,更新后再导入 |
|
|
18
|
-
| 批量导入标签 | POST | `/api_v2/gpt/label/project/{pid}/uploadLabel` | body 传 `treeId/file/uploadWay`;`file` 是上传到临时 S3 后的 key |
|
|
19
|
-
|
|
20
|
-
## CLI
|
|
21
|
-
|
|
22
|
-
### 标签组
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npx --yes @shulex/cxclawctl@latest api list-label-groups --pretty
|
|
26
|
-
npx --yes @shulex/cxclawctl@latest api list-label-groups --name "Default" --pretty
|
|
27
|
-
|
|
28
|
-
npx --yes @shulex/cxclawctl@latest api create-label-group \
|
|
29
|
-
--name "售后问题" --pretty
|
|
30
|
-
|
|
31
|
-
npx --yes @shulex/cxclawctl@latest api update-label-group --id <group_id> \
|
|
32
|
-
--data-file /workspace/state/solvea-kit/label_group_update.json --pretty
|
|
33
|
-
|
|
34
|
-
npx --yes @shulex/cxclawctl@latest api delete-label-group --id <group_id> --pretty
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
`update-label-group` 的 data-file 示例:
|
|
38
|
-
|
|
39
|
-
```json
|
|
40
|
-
{
|
|
41
|
-
"treeName": "售后问题",
|
|
42
|
-
"treeDescribe": "",
|
|
43
|
-
"condition": null,
|
|
44
|
-
"isMultiTag": true
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 标签节点
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
npx --yes @shulex/cxclawctl@latest api get-label-tree \
|
|
52
|
-
--tree-id <tree_id> --pretty
|
|
53
|
-
|
|
54
|
-
npx --yes @shulex/cxclawctl@latest api get-label-tree \
|
|
55
|
-
--tree-id <tree_id> --name "退款" --pretty
|
|
56
|
-
|
|
57
|
-
npx --yes @shulex/cxclawctl@latest api get-label-detail-tree \
|
|
58
|
-
--tree-id <tree_id> --node-ids <node_id> --pretty
|
|
59
|
-
|
|
60
|
-
npx --yes @shulex/cxclawctl@latest api create-label-node \
|
|
61
|
-
--tree-id <tree_id> --name "退货退款" --content "用户咨询退货、退款、取消订单等售后问题" --pretty
|
|
62
|
-
|
|
63
|
-
npx --yes @shulex/cxclawctl@latest api update-label-node \
|
|
64
|
-
--tree-id <tree_id> --id <node_id> \
|
|
65
|
-
--data-file /workspace/state/solvea-kit/label_node_update.json --pretty
|
|
66
|
-
|
|
67
|
-
npx --yes @shulex/cxclawctl@latest api delete-label-node \
|
|
68
|
-
--tree-id <tree_id> --id <node_id> --pretty
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
`create-label-node` / `update-label-node` 的 data-file 示例:
|
|
72
|
-
|
|
73
|
-
```json
|
|
74
|
-
{
|
|
75
|
-
"nodeName": "退货退款",
|
|
76
|
-
"describe": "用户咨询退货、退款、取消订单等售后问题",
|
|
77
|
-
"parentId": 0,
|
|
78
|
-
"isTag": true,
|
|
79
|
-
"exampleList": [
|
|
80
|
-
"How can I return my order?",
|
|
81
|
-
"I want a refund."
|
|
82
|
-
]
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
`parentId=0` 表示一级标签。`isTag=false` 表示该节点不参与打标;关闭父节点时后端会影响子节点。
|
|
87
|
-
|
|
88
|
-
## 批量导入
|
|
89
|
-
|
|
90
|
-
主流程不是让用户下载模板手填。用户描述标签需求后,agent 应先整理标签树结构,写成 JSON,生成符合导入接口模板的 xlsx,再上传导入。
|
|
91
|
-
|
|
92
|
-
推荐流程:
|
|
93
|
-
|
|
94
|
-
1. 先 `list-label-groups` / `get-label-tree` 确认目标标签组是否为空、现有节点是什么。
|
|
95
|
-
2. 根据用户描述整理标签层级、描述、样例,写入 `/workspace/state/solvea-kit/labels.json`。
|
|
96
|
-
3. 用 `/skills/solvea-kit/scripts/generate_label_import_file.py` 生成 xlsx。
|
|
97
|
-
4. 给用户展示将导入的层级摘要,确认后执行 `upload-labels`。
|
|
98
|
-
|
|
99
|
-
### 生成导入文件
|
|
100
|
-
|
|
101
|
-
空标签组初始化用 `--init`,JSON 示例:
|
|
102
|
-
|
|
103
|
-
```json
|
|
104
|
-
{
|
|
105
|
-
"labels": [
|
|
106
|
-
{
|
|
107
|
-
"path": ["售后问题", "物流问题", "配送延迟"],
|
|
108
|
-
"describe": "用户反馈包裹未按预计时间送达、配送时效过慢或物流长时间未更新。",
|
|
109
|
-
"examples": [
|
|
110
|
-
"My package is delayed.",
|
|
111
|
-
"Tracking has not updated for several days."
|
|
112
|
-
]
|
|
113
|
-
}
|
|
114
|
-
]
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
```bash
|
|
119
|
-
npx --yes @shulex/cxclawctl@latest script skills/solvea-kit/scripts/generate_label_import_file.py \
|
|
120
|
-
--init \
|
|
121
|
-
--input /workspace/state/solvea-kit/labels.json \
|
|
122
|
-
--output /workspace/state/solvea-kit/labels_init.xlsx --pretty
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
已有标签更新或追加时,优先先 `download-labels` 导出现有标签,或 `get-label-tree` 查询节点 ID,再生成更新格式。JSON 示例:
|
|
126
|
-
|
|
127
|
-
```json
|
|
128
|
-
{
|
|
129
|
-
"labels": [
|
|
130
|
-
{
|
|
131
|
-
"id": "",
|
|
132
|
-
"name": "配送延迟",
|
|
133
|
-
"describe": "用户反馈包裹未按预计时间送达、配送时效过慢或物流长时间未更新。",
|
|
134
|
-
"parentId": 123456,
|
|
135
|
-
"isTag": true,
|
|
136
|
-
"examples": [
|
|
137
|
-
"My package is delayed.",
|
|
138
|
-
"Tracking has not updated for several days."
|
|
139
|
-
],
|
|
140
|
-
"path": "售后问题/物流问题/配送延迟"
|
|
141
|
-
}
|
|
142
|
-
]
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
npx --yes @shulex/cxclawctl@latest script skills/solvea-kit/scripts/generate_label_import_file.py \
|
|
148
|
-
--input /workspace/state/solvea-kit/labels.json \
|
|
149
|
-
--output /workspace/state/solvea-kit/labels_update.xlsx --pretty
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### 上传导入
|
|
153
|
-
|
|
154
|
-
空标签组初始化:
|
|
155
|
-
|
|
156
|
-
```bash
|
|
157
|
-
npx --yes @shulex/cxclawctl@latest api upload-labels \
|
|
158
|
-
--tree-id <tree_id> \
|
|
159
|
-
--file /workspace/state/solvea-kit/labels_init.xlsx \
|
|
160
|
-
--init --pretty
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
已有标签更新:
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
npx --yes @shulex/cxclawctl@latest api upload-labels \
|
|
167
|
-
--tree-id <tree_id> \
|
|
168
|
-
--file /workspace/state/solvea-kit/labels_update.xlsx --pretty
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### 模板下载(排查用)
|
|
172
|
-
|
|
173
|
-
一般不需要让用户下载模板。只有在核对线上模板变化、排查导入失败,或需要人工离线编辑时才下载。普通场景直接用上面的生成脚本。
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
npx --yes @shulex/cxclawctl@latest api download-label-template \
|
|
177
|
-
--template-type update \
|
|
178
|
-
--output /workspace/state/solvea-kit/label_template.xlsx --pretty
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
更新已有标签时,优先先导出现有标签,在导出的 xlsx 上修改:
|
|
182
|
-
|
|
183
|
-
```bash
|
|
184
|
-
npx --yes @shulex/cxclawctl@latest api download-labels \
|
|
185
|
-
--tree-id <tree_id> \
|
|
186
|
-
--output /workspace/state/solvea-kit/current_labels.xlsx --pretty
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
## Excel 模板口径
|
|
190
|
-
|
|
191
|
-
当前标签导出 / 更新格式:
|
|
192
|
-
|
|
193
|
-
| 列 | 含义 |
|
|
194
|
-
|---|---|
|
|
195
|
-
| `id` | 已有节点 ID;为空表示新增标签 |
|
|
196
|
-
| `name` | 标签名称,不能为空;同一 parent 下不能重复 |
|
|
197
|
-
| `describe` | 标签描述,供模型理解标签含义 |
|
|
198
|
-
| `example1` ~ `example5` | 样例表达 |
|
|
199
|
-
| `is_tag` | `1` 参与打标,`0` 不参与打标;为空按 `1` |
|
|
200
|
-
| `level` | 展示字段,更新时主要依赖 `parent_id` |
|
|
201
|
-
| `parent_id` | 父节点 ID;一级标签填 `0` 或空 |
|
|
202
|
-
| `path` | 展示字段,便于人工核对路径 |
|
|
203
|
-
|
|
204
|
-
初始化格式:
|
|
205
|
-
|
|
206
|
-
| 列 | 含义 |
|
|
207
|
-
|---|---|
|
|
208
|
-
| `first_level` | 一级标签,不能为空 |
|
|
209
|
-
| `second_level` | 二级标签,可空 |
|
|
210
|
-
| `third_level` | 三级标签,可空 |
|
|
211
|
-
| `fourth_level` | 四级标签,可空 |
|
|
212
|
-
| `describe` | 叶子标签描述 |
|
|
213
|
-
| `example1` ~ `example5` | 样例表达 |
|
|
214
|
-
|
|
215
|
-
后端限制:
|
|
216
|
-
|
|
217
|
-
- Excel 空数据会失败。
|
|
218
|
-
- 最多支持 2000 个标签,超过会失败。
|
|
219
|
-
- `id` / `parent_id` 必须是数字或空。
|
|
220
|
-
- `id` 必须属于当前租户项目已有节点;`parent_id` 必须存在。
|
|
221
|
-
- 同一父节点下的 `name` 不能重复。
|
|
222
|
-
- 普通更新模板要求至少 12 列。
|
|
223
|
-
|
|
224
|
-
## 操作原则
|
|
225
|
-
|
|
226
|
-
- 新增或更新前,先 `list-label-groups` / `get-label-tree` 确认现状。
|
|
227
|
-
- 删除标签组或标签节点前,先展示将删除的对象,并得到用户明确确认。
|
|
228
|
-
- 批量导入前先基于用户描述整理结构化 JSON,再生成 xlsx;不要让用户手填模板。
|
|
229
|
-
- 更新已有标签时,先查现有树或导出现有标签,避免 parentId / id 写错。
|
|
230
|
-
- 批量导入文件放 `/workspace/state/solvea-kit/`,先说明影响范围,再执行 `upload-labels`。
|
|
231
|
-
- 标签分析、分布报表、AI 测试不属于本页基础管理能力;需要时走分析类能力单独处理。
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# 变量系统字段
|
|
2
|
-
|
|
3
|
-
变量系统字段为策略条件、工具参数、CHAT_FLOW 节点和 Agent prompt 提供结构化上下文。配置事实源是 Tars;CHAT_FLOW 画布的字段接口只用于画布兼容,不能代替这里的管理流程。
|
|
4
|
-
|
|
5
|
-
## 查询与初始化
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npx --yes @shulex/cxclawctl@latest api get-ai-field-guide --pretty
|
|
9
|
-
npx --yes @shulex/cxclawctl@latest api list-managed-ai-fields --page 1 --page-size 50 --pretty
|
|
10
|
-
npx --yes @shulex/cxclawctl@latest api get-managed-ai-field --id <field_id> --pretty
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
若 `get-ai-field-guide` 显示未初始化,先说明将创建系统预装字段,得到确认后再执行:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
npx --yes @shulex/cxclawctl@latest api initialize-ai-fields --pretty
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## 创建与更新
|
|
20
|
-
|
|
21
|
-
先列出或读取已有字段,展示名称、描述、数据类型、选项、应用范围和预期用途,再请求确认。确认后的 JSON 写入 `/workspace/state/solvea-kit/`,通过 CLI 提交:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
npx --yes @shulex/cxclawctl@latest api create-managed-ai-field \
|
|
25
|
-
--data-file /workspace/state/solvea-kit/ai_field_create.json --pretty
|
|
26
|
-
npx --yes @shulex/cxclawctl@latest api update-managed-ai-field \
|
|
27
|
-
--data-file /workspace/state/solvea-kit/ai_field_update.json --pretty
|
|
28
|
-
npx --yes @shulex/cxclawctl@latest api toggle-managed-ai-field --id <field_id> --pretty
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
常用字段:`name`、`description`、`dataType`、`aiFieldValueDTOS`(单选/多选选项)、`applyRang`、`useAgent`、`parentId`。不要猜测数据类型编码或应用范围;先读取同租户同类型字段作为模板。
|
|
32
|
-
|
|
33
|
-
## 删除
|
|
34
|
-
|
|
35
|
-
删除前必须先读取详情和列表中的 `usedIn`。字段已被使用时,不承诺可删除;先说明影响并引导用户迁移 Agent、策略、模板或 CHAT_FLOW 引用。仅在字段未使用且用户确认后执行:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
npx --yes @shulex/cxclawctl@latest api delete-managed-ai-field --id <field_id> --pretty
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## 使用场景
|
|
42
|
-
|
|
43
|
-
| 场景 | 说明 |
|
|
44
|
-
|---|---|
|
|
45
|
-
| 策略条件 | 条件实体或 metadata 依赖变量系统字段提取结果 |
|
|
46
|
-
| 工具参数 | 工具 requestParam 可从 LLM / METADATA / 固定值等来源取值 |
|
|
47
|
-
| CHAT_FLOW | QUESTION(VARIABLE)、IF_ELSE、TOOL、VARIABLE_PROCESS 等节点会引用变量系统字段 |
|
|
48
|
-
| AGENT / REPLY prompt | 通过 `ai_field_ids` 引用变量系统字段 |
|
|
49
|
-
|
|
50
|
-
## 边界
|
|
51
|
-
|
|
52
|
-
- 排查变量提取异常走 `shulex-support` Agent 会话诊断场景的 M4 变量系统字段链路。
|
|
53
|
-
- CHAT_FLOW 内如何引用变量、如何把上游输出桥接到变量系统字段,走 `agent-builder` 的 chatflow 文档。
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Generate label-tree import xlsx from structured JSON.
|
|
3
|
-
|
|
4
|
-
This is a solvea-kit workflow helper, not a backend API wrapper. The generated
|
|
5
|
-
xlsx is meant to be passed to:
|
|
6
|
-
|
|
7
|
-
npx --yes @shulex/cxclawctl@latest api upload-labels --tree-id <id> --file <xlsx>
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import os
|
|
11
|
-
import sys
|
|
12
|
-
sys.path.insert(0, os.path.join(
|
|
13
|
-
os.environ.get("SOLVEA_LIB_DIR", os.path.join(os.path.dirname(__file__), "..", "..", "__lib__")),
|
|
14
|
-
"skill-runtime",
|
|
15
|
-
))
|
|
16
|
-
from bootstrap import STATE_DIR # noqa: E402
|
|
17
|
-
|
|
18
|
-
import argparse
|
|
19
|
-
import json
|
|
20
|
-
from pathlib import Path
|
|
21
|
-
|
|
22
|
-
from openpyxl import Workbook
|
|
23
|
-
from openpyxl.styles import Alignment, Font, PatternFill
|
|
24
|
-
from openpyxl.utils import get_column_letter
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
INIT_NOTICE = (
|
|
28
|
-
"The information of this row cannot be deleted! Tips:\n"
|
|
29
|
-
"1. first_level is the first level that is not empty.\n"
|
|
30
|
-
"2. second_level is the second level.\n"
|
|
31
|
-
"3. third_level is the third level.\n"
|
|
32
|
-
"4. fourth_level is the fourth level.\n"
|
|
33
|
-
"5. \"Name\", \"describe\" and \"example\" are for the use of the large model. Do not repeat them."
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
UPDATE_NOTICE = (
|
|
37
|
-
"The information of this row cannot be deleted! Tips:\n"
|
|
38
|
-
"1. The \"id\" is automatically generated by the program. When it is empty, it indicates adding a new tag. When it is an existing ID, it represents updating the current tag information.\n"
|
|
39
|
-
"2. \"Name\", \"describe\" and \"example\" are for the use of the large model. Do not repeat them.\n"
|
|
40
|
-
"3. Fill in the \"parent_ID\" with the ID of the parent node tag.\n"
|
|
41
|
-
"4.If \"is_Tag\" is 1, it represents tagging as a tag. If it is 0, it will not be tagged to the work order."
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def _load_labels(path: Path) -> list[dict]:
|
|
46
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
47
|
-
labels = data.get("labels") if isinstance(data, dict) else data
|
|
48
|
-
if not isinstance(labels, list) or not labels:
|
|
49
|
-
raise ValueError("input requires a non-empty labels array")
|
|
50
|
-
for label in labels:
|
|
51
|
-
if not isinstance(label, dict):
|
|
52
|
-
raise ValueError("each label must be a JSON object")
|
|
53
|
-
return labels
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _examples(label: dict) -> list[str]:
|
|
57
|
-
examples = label.get("examples") or label.get("exampleList") or []
|
|
58
|
-
if not isinstance(examples, list):
|
|
59
|
-
raise ValueError("examples must be an array")
|
|
60
|
-
return [str(value).strip() for value in examples[:5]] + [""] * max(0, 5 - len(examples))
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def _init_rows(labels: list[dict]) -> list[list]:
|
|
64
|
-
rows = [
|
|
65
|
-
[INIT_NOTICE],
|
|
66
|
-
["first_level", "second_level", "third_level", "fourth_level",
|
|
67
|
-
"describe", "example1", "example2", "example3", "example4", "example5"],
|
|
68
|
-
]
|
|
69
|
-
for label in labels:
|
|
70
|
-
path = label.get("path") or [
|
|
71
|
-
label.get("firstLevel") or label.get("first_level") or "",
|
|
72
|
-
label.get("secondLevel") or label.get("second_level") or "",
|
|
73
|
-
label.get("thirdLevel") or label.get("third_level") or "",
|
|
74
|
-
label.get("fourthLevel") or label.get("fourth_level") or "",
|
|
75
|
-
]
|
|
76
|
-
if not isinstance(path, list) or not path or not str(path[0]).strip():
|
|
77
|
-
raise ValueError("init labels require path or first_level/firstLevel")
|
|
78
|
-
path = [str(value).strip() for value in path[:4]] + [""] * max(0, 4 - len(path))
|
|
79
|
-
rows.append(path[:4] + [label.get("describe", "")] + _examples(label)[:5])
|
|
80
|
-
return rows
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def _update_rows(labels: list[dict]) -> list[list]:
|
|
84
|
-
rows = [
|
|
85
|
-
[UPDATE_NOTICE],
|
|
86
|
-
["id", "name", "describe", "example1", "example2", "example3", "example4", "example5",
|
|
87
|
-
"is_tag", "level", "parent_id", "path"],
|
|
88
|
-
]
|
|
89
|
-
for label in labels:
|
|
90
|
-
name = label.get("name") or label.get("nodeName")
|
|
91
|
-
if not name:
|
|
92
|
-
raise ValueError("update labels require name or nodeName")
|
|
93
|
-
is_tag = label.get("isTag", label.get("is_tag", 1))
|
|
94
|
-
if isinstance(is_tag, bool):
|
|
95
|
-
is_tag = 1 if is_tag else 0
|
|
96
|
-
rows.append([
|
|
97
|
-
label.get("id", ""),
|
|
98
|
-
name,
|
|
99
|
-
label.get("describe", label.get("nodeDescribe", "")),
|
|
100
|
-
*_examples(label)[:5],
|
|
101
|
-
is_tag,
|
|
102
|
-
label.get("level", ""),
|
|
103
|
-
label.get("parentId", label.get("parent_id", 0)),
|
|
104
|
-
label.get("path", ""),
|
|
105
|
-
])
|
|
106
|
-
return rows
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
def write_workbook(labels: list[dict], output_path: Path, init: bool = False) -> dict:
|
|
110
|
-
rows = _init_rows(labels) if init else _update_rows(labels)
|
|
111
|
-
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
112
|
-
|
|
113
|
-
wb = Workbook()
|
|
114
|
-
ws = wb.active
|
|
115
|
-
ws.title = "labels"
|
|
116
|
-
for row in rows:
|
|
117
|
-
ws.append(row)
|
|
118
|
-
|
|
119
|
-
ws["A1"].font = Font(bold=True, color="9C6500")
|
|
120
|
-
ws["A1"].fill = PatternFill("solid", fgColor="FFF2CC")
|
|
121
|
-
ws["A1"].alignment = Alignment(wrap_text=True, vertical="top")
|
|
122
|
-
ws.row_dimensions[1].height = 78
|
|
123
|
-
for cell in ws[2]:
|
|
124
|
-
cell.font = Font(bold=True)
|
|
125
|
-
cell.fill = PatternFill("solid", fgColor="D9EAF7")
|
|
126
|
-
for column in range(1, ws.max_column + 1):
|
|
127
|
-
ws.column_dimensions[get_column_letter(column)].width = 18
|
|
128
|
-
|
|
129
|
-
wb.save(output_path)
|
|
130
|
-
return {
|
|
131
|
-
"file": str(output_path),
|
|
132
|
-
"format": "init" if init else "update",
|
|
133
|
-
"rows": len(labels),
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def main() -> None:
|
|
138
|
-
parser = argparse.ArgumentParser(description="Generate label-tree import xlsx from JSON")
|
|
139
|
-
parser.add_argument("--input", "--data-file", dest="input", required=True, help="JSON file with labels array")
|
|
140
|
-
parser.add_argument("--output", help="Output xlsx path")
|
|
141
|
-
parser.add_argument("--init", action="store_true", help="Generate initialization format for empty trees")
|
|
142
|
-
parser.add_argument("--pretty", action="store_true", help="Pretty print JSON result")
|
|
143
|
-
args = parser.parse_args()
|
|
144
|
-
|
|
145
|
-
output_path = Path(args.output) if args.output else STATE_DIR / ("labels_init.xlsx" if args.init else "labels_update.xlsx")
|
|
146
|
-
result = write_workbook(_load_labels(Path(args.input)), output_path, init=args.init)
|
|
147
|
-
print(json.dumps(result, indent=2 if args.pretty else None, ensure_ascii=False))
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
if __name__ == "__main__":
|
|
151
|
-
main()
|