@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,350 +0,0 @@
1
- # AGENT
2
-
3
- ## 功能概述
4
-
5
- 让 LLM 承担一个局部、开放式的问题处理职责:在多轮上下文中综合判断、自主选择已绑定工具、解释
6
- 非结构化结果,并在当前职责确实结束后决定是否把流程交给另一个明确的下游职责。
7
-
8
- AGENT 是运行时 LLM 节点,不是通用流程容器,也不是给每个简单任务套一层 prompt 后再用
9
- `next_steps` 跳转的流程节点。适合 AGENT 的职责通常至少满足一项:
10
-
11
- - 需要多轮对话才能诊断、澄清或收敛结果,当前节点会直接回复并继续等待用户;
12
- - 是否调用某个工具、调用顺序或调用时机必须由模型结合自然语言上下文决定;
13
- - 工具、知识或用户输入是非结构化的,需要模型解释后继续处理;
14
- - 当前职责有一个或多个真正不同的后续业务动作,且必须由模型根据不断变化的上下文决定是否以及何时交接。
15
-
16
- 以下职责已有专用节点,不使用 AGENT:
17
-
18
- - 只把自然语言分到有限类别:`INTENT`;
19
- - 流程必须取得客户字段、附件、选择或确认后才能继续:`QUESTION`;
20
- - 只发送模板、固定话术或生成一段对客回复:`REPLY`;
21
- - 调用一个确定工具并按状态/字段分支:`TOOL` 加 actionStatus 出边或 `IF_ELSE`;
22
- - 对结构化值做条件判断:`IF_ELSE`;生成内部文本:`LLM`;知识检索并回答:`RAG_REPLY`;
23
- - 确定结束或转人工:`FINISH` / `TRANSFER_TO_HUMAN`。
24
-
25
- 选择 AGENT 时必须写出“为什么不能由上述专用节点表达”。仅因为旧图中的节点类型是 Agent、旧 PE
26
- 很长、当前步骤需要 LLM,或步骤完成后还有下游,都不能证明应创建 AGENT。
27
-
28
- ## 创建方式
29
-
30
- ```json
31
- {
32
- "key": "troubleshoot_device",
33
- "type": "agent",
34
- "prompt": "Diagnose the device issue over multiple turns, use the bound diagnostic tool when needed, and hand off only after troubleshooting reaches an explicit outcome.",
35
- "plugins": [12345],
36
- "ai_field_ids": [2744],
37
- "enable_knowledge_base": true,
38
- "knowledge_directory_ids": [32951],
39
- "knowledge_keyword_ids": [11, 13],
40
- "knowledge_keyword_selector": ["SYSTEM", "Custom", 301],
41
- "next_steps": [
42
- {
43
- "id": "START_REPLACEMENT",
44
- "title": "start_replacement",
45
- "prompt": "Use only after troubleshooting is exhausted, replacement is eligible, and the customer has chosen replacement so the downstream flow must collect replacement details."
46
- },
47
- {
48
- "id": "FINISH_RESOLVED",
49
- "title": "finish_resolved",
50
- "prompt": "Use only after the customer confirms that the issue is resolved and the downstream node only needs to close the flow.",
51
- "params": [
52
- {"name": "resolution", "type": "string", "describe": "Short description of the confirmed resolution", "required": false}
53
- ]
54
- }
55
- ]
56
- }
57
- ```
58
-
59
- ## 创建参数
60
-
61
- | 字段 | 说明 |
62
- |------|------|
63
- | prompt | source 阶段唯一需要 AI 编写的提示词;builder 会写入完整 graph 的 `displayPrompt`,并派生运行时 `prompt` |
64
- | plugins / usedPlugins | 可调用工具 id 数组,例如 `[12345]` |
65
- | ai_field_ids | prompt 可用的变量系统字段 id 数组;完整 graph 字段为 `aiFieldIds` |
66
- | enable_kb / kb_dirs | 是否启用知识库和目录 |
67
- | knowledge_keyword_ids | knowledgeKeywordIds;固定隔离关键词 ID 数组 |
68
- | knowledge_keyword_selector | knowledgeKeywordSelector;变量选择器,运行时值为隔离关键词名称或名称数组;按变量实际来源选择 `SYSTEM` / `TOOL` / `EXTRACT` / `CODE` / `LLM` / `AGENT` / `HUMAN_REVIEW` |
69
- | max_rounds | 最大轮数,默认 10 |
70
- | max_rounds_exceeded_action | `TRANSFER_TO_HUMAN`(默认)或 `FORCE_NEXT_STEP`;后者仅在存在可用的流程内分支工具时有意义 |
71
- | use_long_memory | 是否把长记忆注入模型上下文,默认 false |
72
- | disable_prev_node_results | 是否不注入前序节点结果,默认 false |
73
- | next_steps | 仅在 AGENT 需要由模型决定是否/何时交接给明确下游职责时配置;只生成内部流转工具,不是业务工具或转人工工具;source JSON 必须写对象数组,不使用字符串简写 |
74
- | next_steps[].id | 必填,出边 handle,edges 的 `on` 使用该值 |
75
- | next_steps[].title | 必填,分支名;推荐使用小写字母、数字和下划线,例如 `accept_wait` |
76
- | next_steps[].prompt | 必填,内部流转工具描述,用来告诉 LLM 何时选择该分支 |
77
- | next_steps[].params | 可选,流转时让 LLM 补充的参数,支持 string / number / boolean |
78
- | next_steps[].params[].name | 有 params 时必填;同一 AGENT 内必须唯一,格式 `/^(?!\d)[A-Za-z0-9_-]{1,64}$/` |
79
- | next_steps[].params[].type | 有 params 时必填;string / number / boolean |
80
- | next_steps[].params[].describe | 有 params 时必填;说明该参数业务含义 |
81
- | next_steps[].params[].required | 可选,默认 false;控制 LLM 调用内部流转工具时该参数是否必填 |
82
-
83
- ## Prompt Contract
84
-
85
- AGENT 的提示词必须写成可执行指令,不写成普通客服话术。默认使用固定结构:
86
-
87
- ```text
88
- # Role
89
- <当前节点的业务角色,只描述这个节点负责什么>
90
-
91
- # Task
92
- <本节点要完成的判断、工具调用、信息解释或多轮对话任务>
93
-
94
- # Constraints
95
- - <必须遵守的业务边界>
96
- - <不能做的动作,例如不要直接退款、不要承诺未确认事项>
97
-
98
- # Tools And Routing
99
- - <何时调用哪个真实工具;工具必须已绑定在 plugins 中>
100
- - <何时调用 transfer_to_<step>_node 进入 next_steps 分支>
101
- - <何时调用真实转人工工具;不要把转人工写成 next_steps 分支>
102
- ```
103
- ## 变量引用优先级
104
-
105
- 用户说“引用某变量/某内容”时,先确认它是否其实是上游工具的出参字段:
106
-
107
- 1. 读取工具定义和实际返回 schema,确认 `TOOL` selector 的完整 path;
108
- 2. 若不是工具出参,再查 `list-ai-fields`,选择已有 `SYSTEM` 变量字段;
109
- 3. 若仍不存在,再用 `VARIABLE_PROCESS` 抽取/赋值到 SYSTEM;
110
- 4. AGENT/REPLY prompt 内部变量引用时需说清楚来源(system、tool、node..)。
111
-
112
- 如果节点不需要工具或下游选择,省略 `# Tools And Routing`。如果只有固定回复、模板、转人工、
113
- finish、字段判断或工具 status 路由,不要创建 AGENT;改用 REPLY、TRANSFER_TO_HUMAN、IF_ELSE、
114
- TOOL、INTENT 或 QUESTION。
115
-
116
- ### next_steps And Transfer Tools
117
-
118
- `next_steps` 只表达 AGENT 可以选择的**流程内职责交接**。运行时会把每个 next step 生成为
119
- `transfer_to_<step>_node` 内部流转工具;语义是“结束当前 AGENT,并让另一个节点开始执行一个明确的
120
- 后续业务动作”。它不是任务清单、执行顺序或通用的“完成后下一步”,不能因为当前简单任务后面还有节点,
121
- 就为 AGENT 创建 `success`、`done`、`continue`、`next` 一类 next step。
122
-
123
- 创建每个 `next_steps[]` 前必须同时满足:
124
-
125
- 1. 当前职责本身符合 AGENT 的准入条件,而不是可由 INTENT、QUESTION、REPLY、TOOL、IF_ELSE 或 LLM 表达;
126
- 2. AGENT 在当前节点内可能经历多轮回复或自主工具调用,交接时机需要由模型判断;
127
- 3. 选择该 step 后确实有另一个节点要执行独立动作,例如开始收集 replacement 信息、进入退款处理子流程或结束已解决会话;
128
- 4. step 的选择条件来自非结构化上下文;若由工具 status、布尔值、枚举或固定顺序唯一决定,应在图上结构化路由。
129
-
130
- 若 AGENT 合理存在,但完成后永远进入同一个确定下游,使用一个 `SOURCE` 出边,不创建单个 next step。
131
- 若 AGENT 不满足准入条件,先替换成专用节点,再使用该节点自己的出边语义。
132
-
133
- 常见拆分如下:
134
-
135
- | 业务需求 | 正确表达 | 不要这样建 |
136
- |---|---|---|
137
- | 判断客户消息属于退款、换货还是其他 | `INTENT -> 各意图下游` | `AGENT + refund/replacement/other next_steps` |
138
- | 必须取得订单号后继续 | `QUESTION(VARIABLE) -> SOURCE` | `AGENT 询问订单号 + got_order next_step` |
139
- | 发送政策说明后进入确定下游 | `REPLY -> SOURCE` | `AGENT 发送话术 + continue next_step` |
140
- | 调工具后按明确状态分支 | `TOOL -> actionStatus` 或 `TOOL -> IF_ELSE` | `AGENT 调工具 + success/fail next_steps` |
141
- | 多轮排障后,由模型确认应开始 replacement | `AGENT -> start_replacement next_step` | 把排障中的每个小步骤都拆成 next step |
142
-
143
- 真正的转人工是 AGENT 可调用的 `TRANSFER_TO_HUMAN` 系统动作。需要模型结合上下文决定是否升级时,
144
- 在 `displayPrompt` 中插入 `transferHuman` LibraryBlock;该块会转换成运行时转人工指令,联网 compile
145
- 再从 Chatflow 专用插件目录按 `type=TRANSFER_TO_HUMAN` 找到当前项目的真实 ID 并放入 `usedPlugins`。
146
- `transferToHumans` 仍保持空数组。模型执行后,AGENT 节点结束并输出 `TRANSFER` / handoff
147
- 状态,不再按 `next_steps` 选择下游节点。达到 `max_rounds` 后仍未完成时,AGENT 也会按超轮兜底转人工
148
- 结束,不会自动选择某个 next step。
149
-
150
- 因此有三种出口,必须分清:
151
-
152
- | 出口 | 配置位置 | 运行语义 |
153
- |---|---|---|
154
- | 流程内分支 | `next_steps` + 对应边 | 生成 `transfer_to_<step>_node` 内部工具,进入下游节点 |
155
- | AGENT 自主转人工 | `displayPrompt` 中的 `transferHuman` LibraryBlock + `usedPlugins` 中真实 `TRANSFER_TO_HUMAN` 插件 ID | AGENT 输出 transfer / handoff,流程结束到人工 |
156
- | 确定性转人工 | 独立 `TRANSFER_TO_HUMAN` 节点或 `$transfer` | 上游结构化分支直接转人工 |
157
-
158
- 只有“模型完成当前开放式职责后,需要触发某个明确的后续业务动作,且交接条件必须由模型判断”才放进 `next_steps`。
159
- 如果分支结果是转人工,优先让 AGENT
160
- 调用真实转人工工具;如果转人工条件是确定性的,直接在画布上接 `TRANSFER_TO_HUMAN` 或 `$transfer`。
161
- 判断标准不是名字里有没有 `transfer`:`transfer_to_<step>_node` 是 nextStep 内部跳转工具;
162
- `TRANSFER_TO_HUMAN` 才是人工接管工具。
163
-
164
- AGENT 提示词里不能只写“根据上下文处理问题”“你是客服”这类泛化指令。每个 AGENT 都必须说明:
165
- 输入来源、可调用工具、何时回复用户、何时等待用户、何时选择哪个 `next_steps`。选择 AGENT
166
- 时要说明为什么该职责不能被结构化节点替代。
167
-
168
- ### Prompt / displayPrompt
169
-
170
- source JSON 阶段只维护一个 `prompt` 字段,减少上下文和双写错误。builder 编译完整 graph 时会保留两个字段:
171
-
172
- - `agentData.displayPrompt`:等于 source `prompt`,给前端编辑器和客户审阅使用,可包含 `LibraryBlock` chip。
173
- - `agentData.prompt`:由 `displayPrompt` 转换得到,给 chatflow 运行时模型使用;后端 AGENT 执行只读取这个字段,不把 `displayPrompt` 额外注入模型上下文。
174
-
175
- 模型基于节点职责决定是否引用某个变量或工具;不要为了“看起来完整”强行插入或绑定。只有模型决定提示词正文
176
- 需要展示该变量或工具引用时,才在 source `prompt` 中使用前端可识别的 `LibraryBlock`;前端会把它渲染成变量块 / 工具块,
177
- 而不是普通文本。变量作为运行时上下文注入但提示词正文不需要出现引用时,
178
- 可以只通过 `ai_field_ids` / `aiFieldIds` 表现为提示词下方的变量绑定区,例如 `Platform ×`。
179
-
180
- 维护已有 AGENT 的提示词时,优先从 inspect 得到的 `displayPrompt` 确认当前客户可见文本;在用户确认修改前,按
181
- 整体输出规则展示受影响片段的 `diff`,清楚对比原指令与拟更新内容。
182
-
183
- ### 可执行 LibraryBlock
184
-
185
- 模型需要结合上下文决定是否执行模板、转人工或普通工具,且该职责需要留在多轮 AGENT 内时,必须在
186
- source `prompt` 中插入以下块,不能只写“调用 xxx”的普通文字。
187
-
188
- 变量块:
189
-
190
- ```text
191
- {#LibraryBlock id=127609 type=variable name="c_order_number" #}
192
- ```
193
-
194
- 模板回复块;`id` 是具体模板内容 ID,不是 `TEMPLATE_REPLY` 系统插件 ID:
195
-
196
- ```text
197
- {#LibraryBlock id=1769 type=tool name=template_reply tool=template_reply #}
198
- ```
199
-
200
- 普通业务工具块:
201
-
202
- ```text
203
- {#LibraryBlock id=31893 type=tool name=Logistics_Anomaly_Register tool=Logistics_Anomaly_Register #}
204
- ```
205
-
206
- 转人工块;`name` 必须是业务要求的精确 reason,`tool_id` 是当前块的唯一数字实例 ID,不是插件 ID。
207
- 同一 AGENT 内每个转人工块都必须不同,不要复制示例 ID:
208
-
209
- ```text
210
- {#LibraryBlock tool_id=1790057523341 type=transferHuman name="want refund" transferType=INSTRUCTION action=NOT_REPLY templateContent="" templateId= #}
211
- ```
212
-
213
- 块前后仍要写完整执行过程:触发条件、首次调用、调用后是否等待、客户下一轮接受/坚持时分别做什么,
214
- 不能只把块孤立地贴进 prompt。例如:
215
-
216
- ```text
217
- ## Refund request
218
- If the customer requests a refund and no longer wants a replacement, first call:
219
-
220
- {#LibraryBlock id=1769 type=tool name=template_reply tool=template_reply #}
221
-
222
- After the template is sent, wait for the customer's next reply.
223
-
224
- - If the customer accepts continuing with replacement, continue the replacement flow.
225
- - If the customer still insists on a refund, use:
226
-
227
- {#LibraryBlock tool_id=1790057523342 type=transferHuman name="want refund" transferType=INSTRUCTION action=NOT_REPLY templateContent="" templateId= #}
228
- ```
229
-
230
- builder 会解析并严格校验这些块:
231
-
232
- - 模板块的 `id` 保持具体模板内容 ID;联网 compile 从 `/api_v2/gpt/chatflow/queryPlugin`
233
- (`forAgentNode=true`) 按 `type=TEMPLATE_REPLY` 解析真实系统插件 ID,并追加到 `usedPlugins`。
234
- - 普通工具块自动把块内工具 ID 追加到 `usedPlugins`,保留已有工具并去重。
235
- - 转人工块的 `tool_id` 只标识 PE 块实例;联网 compile 按 `type=TRANSFER_TO_HUMAN` 解析真实插件 ID
236
- 并追加到 `usedPlugins`,`transferToHumans` 仍为空数组。
237
- - 编译后的 `displayPrompt` 保留 LibraryBlock;runtime `prompt` 自动转换成可执行文字,两者必须同步。
238
- - 转人工 runtime 名称固定为 `Transfer_To_Agent`,大小写与前端 `formatChatflowAgentPrompt` 一致。
239
- - LibraryBlock 必须保持单行;PE 的 `/\{#LibraryBlock\s+(.+?)\s*#\}/g` 不会解析跨行属性。
240
- - 普通工具块的 `id` 必须存在于 `usedPlugins` 和当前 Chatflow 插件目录,`name` / `tool` 必须与该
241
- plugin 的真实名称一致。模板回复和转人工则按系统 plugin type 双向对账:有块必须有对应
242
- `usedPlugins`,绑定了对应系统 plugin 也必须有块,避免 PE chip 与运行时工具能力只保留一边。
243
- - 联网 compile 新建这些系统动作时必须从 Chatflow 插件目录取得真实类型绑定,目录不可用或缺少类型都会
244
- 失败;普通 validate / update / publish 的模板或插件元数据查询暂时不可用时只告警并跳过该项远端校验,
245
- 查询成功后确认资源不存在、模板状态不是 `ENABLED` 或对应系统插件类型未绑定时才校验失败。
246
- - PE 的 LibraryBlock 属性没有通用转义/解码合同。自动迁移不得把包含 `#}`、双引号、反斜杠、换行/
247
- 控制字符,或形如 `key=` 的独立属性 token 写进 `name` / reason;这些值无法在 PE 中无损表达,必须改用
248
- 独立节点或先调整值。普通空格、Unicode 和不构成 `#}` 的单独 `#` 可以保留。
249
-
250
- 提示词正文渲染和运行时绑定是两层,不要混为一谈:
251
-
252
- | 层 | 字段/格式 | 作用 |
253
- |---|---|---|
254
- | 提示词正文渲染 | variable / tool / template_reply / transferHuman LibraryBlock | 让前端显示可执行块,并让 builder 派生 runtime prompt |
255
- | 运行时绑定 | `ai_field_ids` / `plugins`,完整 graph 为 `aiFieldIds` / `usedPlugins` | 让 AGENT 运行时能读取变量、调用工具 |
256
-
257
- 因此,提示词正文插入变量块后仍应检查对应 `ai_field_ids`;工具和模板的 plugin 绑定由 builder 自动补齐,
258
- validate 会再次对账。模型决定提示词正文需要显示变量/工具/模板/转人工引用时,不要只写纯文本名称;
259
- 纯文本描述不会变成可执行动作。
260
-
261
- 只有在提示词正文确实需要引用某个变量或可执行动作时,才用 `{#LibraryBlock ... #}` 表达;如果不需要
262
- 在提示词正文中引用,只做运行时上下文注入,可只保留 `ai_field_ids` 变量绑定。找不到具体模板内容 ID、
263
- 工具 ID 或转人工 reason 时,记录缺口并判断是否补绑定、改写为独立节点或提问;禁止把任何猜测或系统
264
- 插件 ID 写成模板块的 `id`。
265
-
266
- 用户明确给出必须逐字保留的固定完整话术时,没有模板 ID 也不得概括或删段。节点选择先由整体流程决定;
267
- 如果最终由 AGENT 承载,就把完整话术逐段写入 `prompt`,并明确发送后的等待/继续行为。不要因为发现固定
268
- 话术就在本节点文档中把流程强制改成 REPLY;其他承载节点按各自节点合同写入实际 PE/文本字段。
269
-
270
- ## Edges
271
-
272
- - 无 `next_steps`:仅 `SOURCE`。
273
- - 有 `next_steps`:每个 step id 一条边;运行时 LLM 调用对应内部流转工具后,按 step id 路由。
274
- - `next_steps` 的边必须指向流程内节点;不要把人工接管写成某个 next step 再接转人工。
275
- - `next_steps[].params` 会作为 AGENT 输出参数传给被选中的下游路径;下游用 `["AGENT", "<this_node_id>", "<param_name>"]` 引用。
276
- - AGENT 没有 `next_steps` 且没有 `SOURCE` 出边时,validator 只给 warning;除非明确设计为终端对话节点,否则应连出 `SOURCE` 或配置 `next_steps`。
277
-
278
- 模型看到的分支工具名是 `transfer_to_<分支名>_node`。例如:
279
-
280
- ```text
281
- next_steps[].title = accept_wait
282
- 模型调用的工具名 = transfer_to_accept_wait_node
283
- ```
284
-
285
- ### Runtime Workflow
286
-
287
- 1. 进入 AGENT 后,模型会收到当前会话、选中的 `ai_field_ids`、可用业务工具,以及 `next_steps` 生成的分支工具。未开启 `disable_prev_node_results` 时,还会带上前序节点结果。
288
- 2. 模型调用普通业务工具时,Chatflow 先执行工具,再回到同一个 AGENT。模型会结合工具结果继续调用其他工具、回复用户或选择下一步;普通工具执行成功不代表节点已经完成。
289
- 3. 模型直接回复文本而没有调用工具时,本轮回复发送给用户,流程停在当前 AGENT 等待下一条用户消息。用户继续回复后仍进入当前 AGENT。
290
- 4. 只有模型调用 `transfer_to_<分支名>_node`,当前 AGENT 才结束并进入对应下游节点。系统根据该 `next_steps[].id` 选择出边,不根据提示词文本猜测分支。
291
- 5. 分支工具带有 `params` 时,模型调用工具时填写的参数会随该分支输出,下游节点可通过 AGENT selector 引用。
292
- 6. 模型调用真实转人工工具时,AGENT 直接输出 transfer/handoff 并结束到人工,不走 `next_steps`。
293
- 7. `max_rounds` 统计 AGENT 回复用户并等待下一轮输入的次数,不统计节点内部连续调用普通业务工具的次数。达到上限时,默认按超轮转人工结束;只有配置 `FORCE_NEXT_STEP` 且运行时可用流程内分支工具时,模型才会被要求选择一个 next step。无 next step 时该配置会退回转人工。
294
-
295
- 只有工具结果是非结构化的、必须由模型解释,而且 AGENT 本身也符合准入条件时,才把查询工具放入
296
- `plugins`,并按需要配置 `next_steps`。工具已有明确 actionStatus,或结果字段可确定判断时,使用独立
297
- `TOOL` 加状态边 / `IF_ELSE`;不要为了路由方便把确定性工具调用塞进 AGENT。
298
-
299
- ## Resource Dependencies
300
-
301
- ```bash
302
- npx --yes @shulex/cxclawctl@latest api list-plugins --pretty
303
- npx --yes @shulex/cxclawctl@latest api list-agent-ai-fields --pretty
304
- ```
305
-
306
- `ai_field_ids` 只能从 `list-agent-ai-fields` 选择;该命令与前端 Agent 字段范围校验一致。`list-ai-fields` 是 Chatflow 画布的 SYSTEM selector / Prompt 字段接口,不能替代 Agent 范围校验。字段服务偶发不可用时可以先不用 `ai_field_ids`,或复用已有 graph 中已确认的字段 id;不要把字段服务错误当成节点配置错误。启用知识库前需要确认目录 id。
307
-
308
- ## 限制
309
-
310
- - 使用 version 2。
311
- - `usedPlugins` 必须是工具 id 数组,例如 `[12345]`,不要写成 `[{"id": 12345}]`。
312
- - `aiFieldIds` 必须是变量系统字段 id 数组,例如 `[2744]`。
313
- - `enable_kb=true` 时通常配置 `kb_dirs`;未配置目录时没有可检索范围。固定隔离关键词使用 `knowledgeKeywordIds`,动态隔离关键词使用 `knowledgeKeywordSelector`。
314
- - `knowledgeKeywordIds` 只能填 `kb-builder` 查询到的数字 ID;`knowledgeKeywordSelector` 的运行时值必须是关键词名称或名称数组,不要填关键词 ID。
315
- - `knowledgeKeywordSelector` 必须引用真实存在且位于 AGENT 上游路径的变量/节点输出;模型根据关键词来源自动选择 selector 类型。
316
- - `knowledgeKeywordIds` 与 `knowledgeKeywordSelector` 默认互斥;后端合并语义未明确时不要同时配置。
317
- - 完整 graph 中 `prompt` 和 `displayPrompt` 都必须非空;source 阶段只写一个 `prompt`,由 builder 派生完整 graph 的两个字段。
318
- - 需要上游节点输出稳定进入 prompt 时,先用 VARIABLE_PROCESS 赋值到 SYSTEM 变量系统字段,再在 `ai_field_ids` 引用该字段。
319
- - 后端会把 `ai_field_ids` 对应字段作为额外系统上下文注入;上游节点结果也可能作为历史节点结果注入,但不要把它当成稳定 prompt 变量。
320
- - `transferToHumans` 必须为空数组;不要用它配置 AGENT 节点。需要模型结合上下文决定升级时,在
321
- `displayPrompt` 使用标准 `transferHuman` LibraryBlock,并让联网 compiler 按类型把隐藏的
322
- `TRANSFER_TO_HUMAN` 系统插件真实 ID 绑定到 `usedPlugins`;不要手写或复用旧 Multi-Agent 插件 ID。
323
- 确定性转人工仍使用独立 `TRANSFER_TO_HUMAN` 节点或 `$transfer`。
324
- - 不要把多个业务阶段机械映射成多个 AGENT 后再用边串联;每个 AGENT 都必须有不可结构化替代的理由。
325
- - 迁移或重建时,来源流程中的一个 Agent 节点、一条节点连接或一句“切换到其他 Agent”指令,都不能直接映射为目标 AGENT 或 `next_steps`;必须按目标职责重新通过准入检查。
326
- - 如果真实外部工具的执行结果有明确 actionStatus 分支,优先拆成独立 TOOL 节点;只有需要 LLM 自主选择是否调用工具时,才放入 `plugins`。
327
- - 如果 AGENT 后面只是固定流转、模板回复、finish 或转人工,改用结构化节点;不要把这些动作写进 prompt 让模型执行。
328
- - AGENT 经准入后若确需模型选择多个流程内下游,必须用 `next_steps`,不能多条 `SOURCE` 出边。
329
- - `next_steps` 只表示流程内下游;转人工不要作为 `next_steps` 项。
330
- - 每个 `next_steps[]` 都必须有非空 `id`、`title`、`prompt`,并且必须连出对应边。
331
- - `next_steps[].title` 推荐使用小写下划线格式,例如 `accept_wait`;提示词引用该分支时写完整工具名 `transfer_to_<title>_node`。历史流程中已有其他命名格式时,只要前端必填项和分支连线校验通过,也可以保留。
332
- - `next_steps[].prompt` 应描述选择该分支的业务条件,不要只重复 `title`。
333
- - 有 `params` 时,每个参数都必须写清楚 `name`、`type`、`describe`。
334
- - `params[].name` 是下游变量 selector 的第三段,必须稳定且唯一。
335
-
336
- ## Common Mistakes
337
-
338
- - prompt 里写“调用某工具”,但 `plugins` 没有真实工具 id。
339
- - 手写或复用旧 Multi-Agent 的 hidden/system 插件 ID;目标 Chatflow 的 `TEMPLATE_REPLY` /
340
- `TRANSFER_TO_HUMAN` ID 必须由联网 compiler 通过插件类型解析后写入 `usedPlugins`。
341
- - 用 AGENT 承载本可由 TOOL actionStatus、IF_ELSE、QUESTION、REPLY 或 TRANSFER_TO_HUMAN 表达的确定性流程。
342
- - 为了复刻已有节点数量,把多个业务阶段一对一迁成 AGENT。
343
- - 给 AGENT 一个简单的一次性任务,再创建 `success` / `done` / `continue` next step 跳到下一节点。
344
- - 想在 prompt 稳定使用上游输出,却没有先赋值到变量系统字段。
345
- - `usedPlugins` 写成对象数组,导致前端调用工具显示 `[object Object]`。
346
- - 把模板回复、转人工、业务工具只写成普通 prompt 文字,没有插入标准 LibraryBlock;或把本可确定执行的动作藏在 AGENT,而不拆成结构化节点。
347
- - 把转人工配置成 `next_steps` 分支,例如 `need_human` 后再接 `$transfer`。
348
- - 已确认需要由 AGENT 选择多个职责交接分支,却没有配置 `next_steps`。
349
- - `next_steps` 用字符串简写,导致没有 `prompt`,前端发布校验会失败。
350
- - 下游引用了未定义的 `next_steps[].params[].name`。
@@ -1,43 +0,0 @@
1
- # BUSINESS_TRACK
2
-
3
- ## 功能概述
4
-
5
- 发送一个或多个业务追踪事件,不向客户回复、不等待输入,也不改变业务判断。执行完成后沿唯一 `SOURCE`
6
- 出边继续。适合在已确认的业务里程碑记录分析/归因事件;不要用它代替 TOOL、条件判断或用户可见回复。
7
-
8
- ## 创建方式
9
-
10
- ```json
11
- {
12
- "key": "track_order_lookup",
13
- "type": "business_track",
14
- "trace_events": ["order_lookup_started", "after_sales_flow"]
15
- }
16
- ```
17
-
18
- ## 创建参数
19
-
20
- | 字段 | 说明 |
21
- |------|------|
22
- | trace_events | 非空业务事件编码数组;每一项必须是非空字符串 |
23
-
24
- ## Edges
25
-
26
- 仅 `SOURCE` 单出边。通常把它放在需要记录的业务动作之前或之后,并明确记录事件对应的阶段。
27
-
28
- ## Resource Dependencies
29
-
30
- 事件编码应来自已确认的业务埋点口径;不因名称相似臆造新的编码。
31
-
32
- ## 限制
33
-
34
- - 必须有入边和 `SOURCE` 出边。
35
- - 不发送客户消息,也不等待客户输入。
36
- - 不携带变量 selector;事件码是静态业务配置。
37
- - 不用它作为“看起来有动作”的占位节点;没有确认的追踪需求时不新增。
38
-
39
- ## Common Mistakes
40
-
41
- - 把用户回复、工具调用或状态判断塞进追踪节点。
42
- - 只写空数组或空事件字符串。
43
- - 将追踪节点作为终点,导致后续业务处理断开。
@@ -1,157 +0,0 @@
1
- # CODE
2
-
3
- ## 功能概述
4
-
5
- 执行少量确定性数据转换。不要用它承载业务 prompt、复杂流程或外部接口调用。
6
-
7
- ## CODE 节点使用方法
8
-
9
- 适合字段标准化、文本拆分/合并、日期/数字转换、从已存在结构化输入提取稳定字段、或者做字段的类型转换,更换变量名等。
10
-
11
- ```json
12
- {
13
- "key": "normalize_platform", "type": "code",
14
- "inputs": [{"field_name": "raw", "variable_selector": {"tool": "lookup", "path": ["platform"]}}],
15
- "source_code": "value = str(inputs.raw).strip().lower()\nreturn {'platform': value}",
16
- "outputs": [{"field_name": "platform", "field_type": "String"}]
17
- }
18
- ```
19
-
20
- 声明 inputs/outputs;所有路径都 `return`;只做纯计算,不访问网络/文件,不写长循环;异常数据返回空值/false/说明字符串交给下游判断。不要在 CODE 内写整段业务流程。chatflow 会把 `sourceCode` 包装成一个内部函数执行,函数体里已存在局部变量 `inputs`。
21
-
22
- CODE 只处理已经存在的上游值。写代码前先确认每个 input 的 selector 和每个 output 的下游用途;缺少 input 来源时先用 `QUESTION(VARIABLE)`、`VARIABLE_PROCESS` 或 TOOL 补齐,不要在代码里编造默认业务值。
23
-
24
- ## 创建方式
25
-
26
- ```json
27
- {
28
- "key": "normalize_order",
29
- "type": "code",
30
- "inputs": [
31
- {"field_name": "order_no", "variable_selector": {"system": {"category": "Order", "path": [3248, 3249]}}}
32
- ],
33
- "source_code": "return {\"normalized\": str(inputs.order_no).strip()}",
34
- "outputs": [
35
- {"field_name": "normalized", "field_type": "String"}
36
- ]
37
- }
38
- ```
39
-
40
- ## 创建参数
41
-
42
- | 字段 | 说明 |
43
- |------|------|
44
- | inputs[].field_name / fieldName | 输入变量名;编译后完整 graph 使用 `fieldName` |
45
- | inputs[].variable_selector / variableSelector | 输入来源;编译后完整 graph 使用 `variableSelector` |
46
- | source_code / sourceCode | Python 函数体代码;编译后完整 graph 使用 `sourceCode`,运行时已有 `inputs` 局部变量 |
47
- | outputs[].field_name / fieldName | 输出名;编译后完整 graph 使用 `fieldName` |
48
- | outputs[].field_type / fieldType | `String` / `Number` / `Boolean` / `Object` / `Array`;编译后完整 graph 使用 `fieldType` |
49
-
50
- ## Input / Output 引用规则
51
-
52
- CODE 的 input 是对上游 selector 的命名包装。运行时会先逐个解析 `inputs[].variableSelector`,再把结果组成顶层 `inputs` 字典;`source_code` 内优先通过 `inputs.<field_name>` 访问:
53
-
54
- ```json
55
- {
56
- "key": "build_refund_payload",
57
- "type": "code",
58
- "inputs": [
59
- {"field_name": "order_id", "variable_selector": {"system": {"category": "Order", "path": [3248, 3249]}}},
60
- {"field_name": "tool_status", "variable_selector": {"tool_status": "lookup_order"}},
61
- {"field_name": "items", "variable_selector": {"tool": "lookup_order", "path": ["order", "items"]}}
62
- ],
63
- "source_code": "items = inputs.items if isinstance(inputs.items, list) else []\nreturn {\"item_count\": len(items), \"has_items\": len(items) > 0}",
64
- "outputs": [
65
- {"field_name": "item_count", "field_type": "Number"},
66
- {"field_name": "has_items", "field_type": "Boolean"}
67
- ]
68
- }
69
- ```
70
-
71
- 下游 IF_ELSE / TOOL 引用 CODE 输出时,只能引用 `outputs[].field_name`。CODE 节点运行成功后写入的节点输出形态是:
72
-
73
- ```json
74
- {
75
- "exec_result": {"<fieldName>": "<assembled value>"},
76
- "stdout": "<print output or null>"
77
- }
78
- ```
79
-
80
- 变量选择器的 `CODE` 分支只读取 `exec_result`,不读取 `stdout`。
81
-
82
- ```json
83
- {"variableSelector": {"code": "build_refund_payload", "field": "has_items"}}
84
- ```
85
-
86
- source 简写会编译为完整 selector:
87
-
88
- ```json
89
- ["CODE", "<code_node_id>", "has_items"]
90
- ```
91
-
92
- 运行时只支持完整 selector 写成 `["CODE", "<code_node_id>"]` 或 `["CODE", "<code_node_id>", "fieldName"]`。IF_ELSE / TOOL 入参需要具体字段时应使用三段式。不能引用代码里的临时变量、局部对象路径或未声明字段,也不能写 `["CODE", node_id, "obj", "field"]`。需要输出对象/数组时,将整个对象声明为一个 output;若下游必须判断对象内部字段,优先在 CODE 中拆成稳定的标量 outputs。
93
-
94
- CODE input 的 selector 同样必须引用当前 CODE 的上游 predecessor。比如要整理工具返回数组,图上必须先有 `TOOL -> CODE`,然后 CODE input 才能引用该 TOOL 输出;不能跨图引用未连通工具。
95
-
96
- ## Edges
97
-
98
- 通常 `SOURCE`;作为终止转换节点时可无出边。
99
-
100
- ## Resource Dependencies
101
-
102
- 输入引用变量系统字段或上游节点时,先确认对应 id / key。
103
-
104
- ## 输出映射规则
105
-
106
- `return` 的值会按 `outputs` 组装到 `exec_result`:
107
-
108
- - `return dict`:按 `outputs[].fieldName` 取同名 key;缺失 key 输出 `None`;多余 key 会被忽略。
109
- - `return list/tuple`:按 `outputs` 顺序一一映射,长度必须和 output 数量完全一致。
110
- - 单 output 时可以直接 `return` 标量,运行时会自动包装成 `{fieldName: value}`。
111
- - 多 output 时不能返回标量。
112
- - 没有 output 的 CODE 配置会被校验拒绝;不要写“只 print 不 return”的代码节点。
113
- - 输出类型按 `fieldType` 校验:`String` 要求字符串但会把数字/布尔转成字符串;`Number` 接受 int/float 或可转数字字符串,但拒绝 bool;`Boolean` 必须是 bool;`Object` 必须是 dict;`Array` 必须是 list。
114
- - 输出值为 `None` 时允许通过类型校验,交给下游 IF_ELSE 用 `EMPTY` / `NOT_EMPTY` 或兜底逻辑处理。
115
-
116
- ## 限制
117
-
118
- - 必须声明 `source_code` 和至少一个 output。
119
- - 每个 input 必须有 `field_name` 和 `variable_selector`。
120
- - `inputs[].variable_selector` 引用上游变量,支持 `SYSTEM`、`TOOL`、`EXTRACT`、`CODE`、`LLM`、`AGENT`、`HUMAN_REVIEW`。
121
- - 判断工具状态映射时可用 `["TOOL", "<tool_node_id>", "ACTION_STATUS_NAME"]`。
122
- - TOOL 出参 selector 会按真实 plugin `responseParam` 校验:object 字段可下钻,array 字段按叶子处理;需要遍历数组时,把整个数组作为 CODE input,在 `source_code` 内处理。
123
- - `AGENT` selector 只能引用当前上游路径已连通 nextStep 的 `params[].name`。
124
- - EXTRACT selector 第三段是 extract `id`,不是 `name`。
125
- - 每个 output 必须有 `field_name` 和 `field_type`。
126
- - input/output 的 `field_name` 必须是合法 Python 标识符,不能重复,不能使用 Python 关键字,不能使用 `inputs`、`__inputs__`、`__chatflow_entry__`、`__builtins__` 或 dunder 形态。
127
- - `source_code` 必须在所有执行路径上 `return`。
128
- - 输入通过 `inputs.<field_name>` 访问;不要直接使用裸变量名。
129
- - 使用 `inputs.<field_name>` 时,`field_name` 必须已经在 `inputs` 中声明;校验器会检查这种直接属性引用。动态下标访问不适合作为迁移默认写法,因为字段缺失更难在编译期暴露。
130
- - 返回值优先使用 dict,key 必须对应 output 的 `field_name`;单输出可返回标量,多输出必须返回 dict 或等长 list/tuple。
131
- - 返回 dict 不能包含下游要依赖但未在 `outputs` 声明的业务字段;validator 只允许下游引用 `outputs[].fieldName` 中存在的字段。
132
- - 需要给 TOOL 组装 object/array 入参时,必须先确认工具 `requestParam` 子字段结构;无法确认 item identity 或数组元素结构时输出 `open_questions`,不要在 CODE 中把多个不相关字段拼成可执行补发/退款参数。
133
- - 允许 import 只有 `math`、`json`、`datetime`、`re`。
134
- - 可用内置函数仅限常见纯函数:`len/range/enumerate/zip/min/max/sum/sorted/reversed/any/all/abs/round/map/filter/list/dict/set/tuple/str/int/float/bool/isinstance/print`。
135
- - 使用 `for` / `while` / `if` / 列表、字典、集合推导等普通控制流,但必须保证所有路径最终 `return`。
136
- - 禁止 `eval/exec/compile/__import__/open/input/globals/locals/vars/dir/getattr/setattr/delattr/breakpoint/type`。
137
- - 禁止 async/yield/class、dunder 访问、危险属性访问(如 `.sys/.codecs/.builtins/._os`)。
138
- - 运行时提供常见异常类(如 `Exception`、`ValueError`、`KeyError`、`IndexError`、`TypeError` 等),但迁移代码不要依赖异常驱动主流程;遇到异常业务数据时优先返回空数组、空对象、`false` 或说明性字符串,由下游节点判断。
139
- - 不要主动 `raise` 作为业务分支;主动抛错会使 CODE 节点失败,而不是进入某个下游 case。
140
- - 运行时有超时、代码长度、输入大小、stdout、结果大小、内存限制;不要生成大循环、大对象或大量日志。
141
- - 不调用外部 HTTP;外部调用用 TOOL 或 AGENT with tools。
142
-
143
- ## Common Mistakes
144
-
145
- - 把 input 字段当成同名 Python 变量使用;输入应从 `inputs` 对象读取。
146
- - 用 extract `name` 当 selector 字段;应使用 extract `id`。
147
- - 用 CODE 写业务判断大流程。
148
- - 忘记声明输出字段。
149
- - 写 `result = {...}` 但没有 `return`。
150
- - `return {"status": ...}` 后下游引用 `code.status`,但 outputs 没有声明 `status`。
151
- - 以为可以引用 `["CODE", node_id, "obj", "field"]`;当前 CODE selector 只校验到 output 字段名,复杂对象内部字段应拆成单独 output。
152
- - 以为 CODE 可以直接读取全局变量、当前会话或工具完整结果;必须通过 `inputs` 显式传入。
153
- - 用 CODE 伪造缺失的订单、地址、商品数组、退款商品或工具状态;这些属于业务数据缺口,应询问用户或转人工。
154
- - 用 `raise Exception(...)` 表示业务分支;这会导致 CODE 执行失败,不会生成可供 IF_ELSE 判断的 output。
155
- - 依赖 `print` 结果给下游使用;下游 CODE selector 只读 `exec_result`,不读 `stdout`。
156
- - 用 `os/requests/pandas/open` 读文件或调接口。
157
- - 通过代码节点做网络请求、文件处理、长文本生成或复杂业务决策。
@@ -1,47 +0,0 @@
1
- # COLLECT_ORDER
2
-
3
- ## 功能概述
4
-
5
- 订单号收集专用兼容节点,用于维护已有电商客服订单场景。该节点即将下线,新建 CHAT_FLOW 默认不要使用。
6
-
7
- 新建订单号相关流程时,先确认变量系统是否已有订单号字段,再按业务合同组合:
8
-
9
- - 只需要向用户要订单号:`QUESTION(VARIABLE)`,变量选择订单号字段。
10
- - 已有订单号后要查订单或物流:订单查询 `TOOL`,工具 actionStatus 完整时直接按状态出边,否则接 `IF_ELSE` 判断结构化字段。
11
- - 需要模型多轮判断订单问题、解释工具结果或选择下一步:`QUESTION(VARIABLE)` -> `AGENT(next_steps)`,必要时把订单查询工具绑定到 AGENT。
12
- - 需要把上游结果稳定给 AGENT / REPLY prompt 使用:先用 `VARIABLE_PROCESS.assignments` 写入变量系统字段,再让下游通过 `ai_field_ids` 读取。
13
-
14
- ## 创建方式
15
-
16
- ```json
17
- {"key": "collect_order", "type": "collect_order", "max_rounds": 5}
18
- ```
19
-
20
- ## 创建参数
21
-
22
- | 字段 | 说明 |
23
- |------|------|
24
- | max_rounds | 最大追问轮数 |
25
- | collect_order_exception | 维护已有图时的异常回复数组;也接受 `collectOrderException`。每项含 `key`、`type=REPLY/TEMPLATE`、`reply` 或 `template_id` |
26
-
27
- ## Edges
28
-
29
- 通常 `SOURCE` 进入后续订单处理节点。
30
-
31
- ## Resource Dependencies
32
-
33
- 依赖项目启用订单相关变量系统字段。需要确认字段时查 `list-ai-fields`。
34
-
35
- ## 限制
36
-
37
- - 仅用于维护已有图、复刻旧行为,或用户明确要求保留 `COLLECT_ORDER` 兼容节点。
38
- - 新建图默认使用 `QUESTION(VARIABLE)` 收集订单号,不使用本节点。
39
- - 失败路径通常由节点内部异常配置或后续兜底转人工处理。
40
- - 维护已有异常配置时,每个异常项如果 `type=TEMPLATE` 必须有 `templateId`;否则必须有非空 `reply`。
41
- - 和 QUESTION / AGENT 一样,运行时会等待用户输入;不要在图层手动画回环。
42
-
43
- ## Common Mistakes
44
-
45
- - 新建图继续使用本节点,导致依赖即将下线能力。
46
- - 只因为字段叫订单号就选择本节点;新图应优先走变量系统字段 + QUESTION / TOOL / IF_ELSE / AGENT。
47
- - 在 source JSON 顶层写 `collectOrderException` 但没有放进 `config`,builder 不会自动识别。
@@ -1,34 +0,0 @@
1
- # FINISH
2
-
3
- ## 功能概述
4
-
5
- 结束流程,不发送回复、不转人工。
6
-
7
- ## 创建方式
8
-
9
- ```json
10
- {"from": "final_reply", "to": "$finish"}
11
- ```
12
-
13
- ## 创建参数
14
-
15
- 通常只通过 `$finish` 引用,不需要手写节点字段。
16
-
17
- ## Edges
18
-
19
- - 必须有入边。
20
- - 无出边。
21
-
22
- ## Resource Dependencies
23
-
24
- 无。
25
-
26
- ## 限制
27
-
28
- - 平台不强制 FINISH 唯一。
29
- - 默认使用单个共享 `$finish`,让终端路径汇聚,减少无意义终端节点。
30
-
31
- ## Common Mistakes
32
-
33
- - 把需要先回复的终止路径直接连 `$finish`,导致用户收不到结束话术。
34
- - 误以为平台要求只能有一个 FINISH;这是推荐约定,不是硬校验。