@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.
Files changed (208) hide show
  1. package/README.md +25 -22
  2. package/capabilities.lock.json +535 -131
  3. package/dist/cli.js +2203 -127
  4. package/dist/cli.js.map +1 -1
  5. package/package.json +20 -6
  6. package/requirements-cli.txt +0 -2
  7. package/skills/__lib__/__init__.py +0 -0
  8. package/skills/__lib__/skill-runtime/bootstrap.py +0 -134
  9. package/skills/__lib__/solvea-api/__init__.py +0 -0
  10. package/skills/__lib__/solvea-api/client.py +0 -1944
  11. package/skills/__lib__/solvea-api/dashboard.py +0 -100
  12. package/skills/__lib__/solvea-api/solvea_api.py +0 -1341
  13. package/skills/agent-analytics/SKILL.md +0 -74
  14. package/skills/agent-analytics/references/chat-report-fields.md +0 -36
  15. package/skills/agent-analytics/references/report-fields.md +0 -130
  16. package/skills/agent-analytics/references/transcript.md +0 -110
  17. package/skills/agent-builder/SKILL.md +0 -42
  18. package/skills/agent-builder/interfaces/fallback-chatflow.md +0 -47
  19. package/skills/agent-builder/references/chatflow/graph-spec.md +0 -259
  20. package/skills/agent-builder/references/chatflow/node-selection.md +0 -89
  21. package/skills/agent-builder/references/chatflow/nodes/agent.md +0 -350
  22. package/skills/agent-builder/references/chatflow/nodes/business-track.md +0 -43
  23. package/skills/agent-builder/references/chatflow/nodes/code.md +0 -157
  24. package/skills/agent-builder/references/chatflow/nodes/collect-order.md +0 -47
  25. package/skills/agent-builder/references/chatflow/nodes/finish.md +0 -34
  26. package/skills/agent-builder/references/chatflow/nodes/human-review.md +0 -60
  27. package/skills/agent-builder/references/chatflow/nodes/if-else.md +0 -100
  28. package/skills/agent-builder/references/chatflow/nodes/intent.md +0 -79
  29. package/skills/agent-builder/references/chatflow/nodes/knowledge-reply.md +0 -43
  30. package/skills/agent-builder/references/chatflow/nodes/llm.md +0 -117
  31. package/skills/agent-builder/references/chatflow/nodes/note.md +0 -38
  32. package/skills/agent-builder/references/chatflow/nodes/question.md +0 -97
  33. package/skills/agent-builder/references/chatflow/nodes/rag-reply.md +0 -68
  34. package/skills/agent-builder/references/chatflow/nodes/reply.md +0 -97
  35. package/skills/agent-builder/references/chatflow/nodes/start.md +0 -35
  36. package/skills/agent-builder/references/chatflow/nodes/sub-graph.md +0 -48
  37. package/skills/agent-builder/references/chatflow/nodes/tool.md +0 -138
  38. package/skills/agent-builder/references/chatflow/nodes/transfer-to-human.md +0 -63
  39. package/skills/agent-builder/references/chatflow/nodes/variable-assignment.md +0 -52
  40. package/skills/agent-builder/references/chatflow/nodes/variable-extract.md +0 -50
  41. package/skills/agent-builder/references/chatflow/nodes/variable-process.md +0 -70
  42. package/skills/agent-builder/references/chatflow/overview.md +0 -53
  43. package/skills/agent-builder/references/chatflow/visual-translation.md +0 -64
  44. package/skills/agent-builder/references/chatflow/workflow.md +0 -134
  45. package/skills/agent-builder/references/multi-agent/create-update.md +0 -185
  46. package/skills/agent-builder/references/multi-agent/graph-spec.md +0 -246
  47. package/skills/agent-builder/references/multi-agent/graph-structure.md +0 -12
  48. package/skills/agent-builder/references/multi-agent/migrate-to-chatflow.md +0 -13
  49. package/skills/agent-builder/references/multi-agent/migration/large.md +0 -554
  50. package/skills/agent-builder/references/multi-agent/migration/principles.md +0 -446
  51. package/skills/agent-builder/references/multi-agent/migration/small.md +0 -225
  52. package/skills/agent-builder/references/multi-agent/orchestration.md +0 -11
  53. package/skills/agent-builder/references/multi-agent/overview.md +0 -48
  54. package/skills/agent-builder/references/multi-agent/update.md +0 -128
  55. package/skills/agent-builder/references/multi-agent/workflow.md +0 -87
  56. package/skills/agent-builder/references/single-agent/overview.md +0 -48
  57. package/skills/agent-builder/references/single-agent/prompt.md +0 -16
  58. package/skills/agent-builder/references/single-agent/tools.md +0 -36
  59. package/skills/agent-builder/references/single-agent/voice.md +0 -46
  60. package/skills/agent-builder/references/tools/http-tool.md +0 -315
  61. package/skills/agent-builder/references/tools/mock-tool.md +0 -279
  62. package/skills/agent-builder/references/tools/overview.md +0 -46
  63. package/skills/agent-builder/references/tools/tool-config.md +0 -43
  64. package/skills/agent-builder/references/tools/x-token.md +0 -34
  65. package/skills/agent-builder/scripts/chatflow/chatflow_builder.py +0 -3458
  66. package/skills/agent-builder/scripts/chatflow/validate_graph.py +0 -1697
  67. package/skills/agent-builder/scripts/copy_marketplace_agent.py +0 -61
  68. package/skills/agent-builder/scripts/multi-agent/legacy_graph_analyzer.py +0 -5974
  69. package/skills/agent-builder/scripts/multi-agent/replay_compare.py +0 -679
  70. package/skills/agent-builder/scripts/patch_agent_tools.py +0 -135
  71. package/skills/agent-builder/scripts/tools/validate_tool_config.py +0 -384
  72. package/skills/agent-tester/SKILL.md +0 -35
  73. package/skills/agent-tester/batch-test/overview.md +0 -86
  74. package/skills/agent-tester/scripts/batch_test_sheet.py +0 -213
  75. package/skills/agent-tester/single-test/badcase-retest.md +0 -85
  76. package/skills/agent-tester/single-test/direct-test.md +0 -24
  77. package/skills/agent-tester/single-test/overview.md +0 -142
  78. package/skills/delivery/SKILL.md +0 -112
  79. package/skills/delivery/interfaces/classify.md +0 -38
  80. package/skills/delivery/interfaces/create-agents.md +0 -89
  81. package/skills/delivery/interfaces/delivery-test.md +0 -67
  82. package/skills/delivery/references/flow.md +0 -40
  83. package/skills/delivery/references/validation.md +0 -15
  84. package/skills/delivery/scripts/batch_test.py +0 -704
  85. package/skills/delivery/scripts/classify.py +0 -22
  86. package/skills/delivery/scripts/create_agents.py +0 -695
  87. package/skills/delivery/scripts/gen_delivery_report.py +0 -335
  88. package/skills/delivery/scripts/gen_excel.py +0 -234
  89. package/skills/delivery/scripts/gen_report.py +0 -208
  90. package/skills/delivery/scripts/plan.py +0 -163
  91. package/skills/delivery/scripts/render.py +0 -713
  92. package/skills/delivery/scripts/render_summary.py +0 -38
  93. package/skills/delivery/scripts/sample_history_cases.py +0 -109
  94. package/skills/kb-builder/SKILL.md +0 -80
  95. package/skills/kb-builder/interfaces/qa-upload.md +0 -55
  96. package/skills/kb-builder/interfaces/web-kb.md +0 -84
  97. package/skills/kb-builder/references/directory.md +0 -373
  98. package/skills/kb-builder/references/export.md +0 -282
  99. package/skills/kb-builder/references/isolation-keywords.md +0 -113
  100. package/skills/kb-builder/references/knowledge.md +0 -153
  101. package/skills/kb-builder/references/product.md +0 -52
  102. package/skills/kb-builder/references/qa-from-help-center.md +0 -58
  103. package/skills/kb-builder/references/qa-from-pdf.md +0 -94
  104. package/skills/kb-builder/references/qa-from-tickets.md +0 -168
  105. package/skills/kb-builder/references/qa-from-web.md +0 -98
  106. package/skills/kb-builder/references/qa-quality.md +0 -73
  107. package/skills/kb-builder/references/reply-template.md +0 -237
  108. package/skills/kb-builder/references/tag-isolation-migration.md +0 -61
  109. package/skills/kb-builder/references/tags.md +0 -45
  110. package/skills/kb-builder/references/upload.md +0 -130
  111. package/skills/kb-builder/scripts/batch_extract_ticket_qa.py +0 -333
  112. package/skills/kb-builder/scripts/build_directory_plan.py +0 -144
  113. package/skills/kb-builder/scripts/crawl_site.py +0 -433
  114. package/skills/kb-builder/scripts/create_dirs.py +0 -146
  115. package/skills/kb-builder/scripts/export_knowledge.py +0 -454
  116. package/skills/kb-builder/scripts/extract_ticket_qa.py +0 -441
  117. package/skills/kb-builder/scripts/extract_web_qa.py +0 -118
  118. package/skills/kb-builder/scripts/import_qa.py +0 -219
  119. package/skills/kb-builder/scripts/import_source_documents.py +0 -143
  120. package/skills/kb-builder/scripts/import_templates.py +0 -409
  121. package/skills/poc/SKILL.md +0 -125
  122. package/skills/poc/assets/default_manual.css +0 -279
  123. package/skills/poc/assets/notice_escalate.png +0 -0
  124. package/skills/poc/assets/notice_escalate2.png +0 -0
  125. package/skills/poc/assets/notice_new_chat.png +0 -0
  126. package/skills/poc/assets/poc_test_template.html +0 -645
  127. package/skills/poc/assets/poc_test_template.md +0 -104
  128. package/skills/poc/assets/step3_preview.png +0 -0
  129. package/skills/poc/assets/step4_order_note.png +0 -0
  130. package/skills/poc/interfaces/classify.md +0 -38
  131. package/skills/poc/interfaces/create-agents.md +0 -108
  132. package/skills/poc/interfaces/poc-test.md +0 -94
  133. package/skills/poc/references/flow.md +0 -47
  134. package/skills/poc/references/kb-directory.md +0 -22
  135. package/skills/poc/references/validation.md +0 -17
  136. package/skills/poc/scripts/classify.py +0 -22
  137. package/skills/poc/scripts/create_agents.py +0 -818
  138. package/skills/poc/scripts/gen_excel.py +0 -234
  139. package/skills/poc/scripts/gen_poc_manual.py +0 -249
  140. package/skills/poc/scripts/gen_report.py +0 -208
  141. package/skills/poc/scripts/inspect_chatflow.py +0 -209
  142. package/skills/poc/scripts/plan.py +0 -178
  143. package/skills/poc/scripts/poc_test.py +0 -495
  144. package/skills/poc/scripts/render.py +0 -713
  145. package/skills/poc/scripts/render_summary.py +0 -41
  146. package/skills/runtime-inspector/SKILL.md +0 -51
  147. package/skills/runtime-inspector/references/frontend-rendering.md +0 -126
  148. package/skills/runtime-inspector/references/model.md +0 -59
  149. package/skills/runtime-inspector/references/sandbox.md +0 -131
  150. package/skills/runtime-inspector/scripts/model_inspect.py +0 -68
  151. package/skills/runtime-inspector/scripts/prepare.py +0 -98
  152. package/skills/runtime-inspector/scripts/process.py +0 -84
  153. package/skills/runtime-inspector/scripts/read_state.py +0 -32
  154. package/skills/runtime-inspector/scripts/sandbox_inspect.py +0 -463
  155. package/skills/runtime-inspector/scripts/test_claude_proxy.py +0 -49
  156. package/skills/runtime-inspector/scripts/test_openai_proxy.py +0 -41
  157. package/skills/runtime-inspector/scripts/verify_persistence.py +0 -101
  158. package/skills/runtime-inspector/scripts/write_test.py +0 -41
  159. package/skills/setup/SKILL.md +0 -17
  160. package/skills/shulex-support/SKILL.md +0 -39
  161. package/skills/shulex-support/references/badcase-analysis/overview.md +0 -34
  162. package/skills/shulex-support/references/badcase-analysis/text/conversation-record.md +0 -105
  163. package/skills/shulex-support/references/badcase-analysis/text/core-flow.md +0 -89
  164. package/skills/shulex-support/references/badcase-analysis/text/log-query-rules.md +0 -36
  165. package/skills/shulex-support/references/badcase-analysis/text/m1-entry.md +0 -53
  166. package/skills/shulex-support/references/badcase-analysis/text/m10-chatflow-service.md +0 -259
  167. package/skills/shulex-support/references/badcase-analysis/text/m11-algorithm-service.md +0 -148
  168. package/skills/shulex-support/references/badcase-analysis/text/m12-quality-inspection.md +0 -57
  169. package/skills/shulex-support/references/badcase-analysis/text/m2-intent.md +0 -120
  170. package/skills/shulex-support/references/badcase-analysis/text/m3-strategy.md +0 -126
  171. package/skills/shulex-support/references/badcase-analysis/text/m4-aifield.md +0 -121
  172. package/skills/shulex-support/references/badcase-analysis/text/m5-agent.md +0 -208
  173. package/skills/shulex-support/references/badcase-analysis/text/m6-tool.md +0 -115
  174. package/skills/shulex-support/references/badcase-analysis/text/m7-reply.md +0 -72
  175. package/skills/shulex-support/references/badcase-analysis/text/m8-error.md +0 -92
  176. package/skills/shulex-support/references/badcase-analysis/text/m9-knowledge-search.md +0 -147
  177. package/skills/shulex-support/references/badcase-analysis/text/sls-query.md +0 -283
  178. package/skills/shulex-support/references/badcase-analysis/voice/core-flow.md +0 -77
  179. package/skills/shulex-support/references/badcase-analysis/voice/dependencies.md +0 -19
  180. package/skills/shulex-support/references/badcase-analysis/voice/platform-api.md +0 -23
  181. package/skills/shulex-support/references/badcase-analysis/voice/sls-playbook.md +0 -31
  182. package/skills/shulex-support/references/product-docs.md +0 -70
  183. package/skills/shulex-support/references/tickets.md +0 -184
  184. package/skills/shulex-support/scripts/support.py +0 -427
  185. package/skills/solvea-desk/SKILL.md +0 -39
  186. package/skills/solvea-desk/references/report/fields.md +0 -82
  187. package/skills/solvea-desk/references/report/report-design.md +0 -200
  188. package/skills/solvea-desk/references/report/report-template.html +0 -44
  189. package/skills/solvea-desk/references/report/report.css +0 -517
  190. package/skills/solvea-desk/references/report/workflow.md +0 -464
  191. package/skills/solvea-desk/references/tickets/query.md +0 -103
  192. package/skills/solvea-desk/references/tickets/tags.md +0 -83
  193. package/skills/solvea-desk/scripts/report/fetch_sources.py +0 -580
  194. package/skills/solvea-desk/scripts/report/render_report.py +0 -763
  195. package/skills/solvea-desk/scripts/tickets/desk_api.py +0 -73
  196. package/skills/solvea-desk/scripts/tickets/fetch_tickets.py +0 -403
  197. package/skills/solvea-desk/scripts/tickets/ticket_tags.py +0 -305
  198. package/skills/solvea-kit/SKILL.md +0 -84
  199. package/skills/solvea-kit/references/agent.md +0 -145
  200. package/skills/solvea-kit/references/chat.md +0 -244
  201. package/skills/solvea-kit/references/intent.md +0 -69
  202. package/skills/solvea-kit/references/plugin.md +0 -53
  203. package/skills/solvea-kit/references/quality-inspection.md +0 -75
  204. package/skills/solvea-kit/references/strategy.md +0 -62
  205. package/skills/solvea-kit/references/tagging.md +0 -231
  206. package/skills/solvea-kit/references/variables.md +0 -53
  207. package/skills/solvea-kit/scripts/generate_label_import_file.py +0 -151
  208. 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()