Files
ZNJJ-api-server/workflow/20251015/事故信息采集2025118.json
T
Eric Wang dea2ea5b71 feat(workflow): add new workflow for accident information collection
- Introduced a comprehensive JSON configuration for a new workflow that includes user guidance, input handling, and AI chat integration.
- The workflow features nodes for system configuration, workflow start, and accident information collection, enhancing user interaction and data collection capabilities.
- Implemented various input types and configurations to support dynamic user interactions and improve overall workflow efficiency.
2026-10-16 17:01:47 +08:00

6573 lines
280 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"nodes": [
{
"nodeId": "userGuide",
"name": "common:core.module.template.system_config",
"intro": "common:core.module.template.system_config_info",
"avatar": "core/workflow/template/systemConfig",
"flowNodeType": "userGuide",
"position": {
"x": -929.2106698351259,
"y": -1210.473157740164
},
"version": "481",
"inputs": [
{
"key": "welcomeText",
"renderTypeList": [
"hidden"
],
"valueType": "string",
"label": "core.app.Welcome Text",
"value": ""
},
{
"key": "variables",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "core.app.Chat Variable",
"value": []
},
{
"key": "questionGuide",
"valueType": "any",
"renderTypeList": [
"hidden"
],
"label": "core.app.Question Guide",
"value": {
"open": false
}
},
{
"key": "tts",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": {
"type": "web"
}
},
{
"key": "whisper",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": {
"open": false,
"autoSend": false,
"autoTTSResponse": false
}
},
{
"key": "scheduleTrigger",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": null
}
],
"outputs": []
},
{
"nodeId": "448745",
"name": "common:core.module.template.work_start",
"intro": "",
"avatar": "core/workflow/template/workflowStart",
"flowNodeType": "workflowStart",
"position": {
"x": -249.81636443220845,
"y": -1243.8026601399292
},
"version": "481",
"inputs": [
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"required": true,
"toolDescription": "User Question",
"debugLabel": ""
}
],
"outputs": [
{
"id": "userChatInput",
"key": "userChatInput",
"label": "common:core.module.input.label.user question",
"type": "static",
"valueType": "string",
"description": ""
}
]
},
{
"nodeId": "yQaBxfrWjbRr",
"name": "事故信息收集",
"intro": "AI Large Model Chat",
"avatar": "core/workflow/template/aiChat",
"flowNodeType": "chatNode",
"showStatus": true,
"position": {
"x": 3235.0533084067215,
"y": -2402.019607132754
},
"version": "4.9.7",
"inputs": [
{
"key": "model",
"renderTypeList": [
"settingLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"valueType": "string",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "temperature",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "maxToken",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "isResponseAnswerText",
"renderTypeList": [
"hidden"
],
"label": "",
"value": true,
"valueType": "boolean",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatQuoteRole",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "system",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteTemplate",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quotePrompt",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatVision",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatReasoning",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatTopP",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatStopSign",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatResponseFormat",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatJsonSchema",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "systemPrompt",
"renderTypeList": [
"textarea",
"reference"
],
"max": 3000,
"valueType": "string",
"label": "common:core.ai.Prompt",
"description": "common:core.app.tip.systemPromptTip",
"placeholder": "common:core.app.tip.chatNodeSystemPromptTip",
"value": "# 角色\n\n你是一个高度集成、安全第一的交警AI接警员。你的一切行为都由一个严格的状态机驱动。\n\n# 首要原则(必须无条件遵守)\n\n## 输出格式\n\n所有回复都必须以 `<state>状态编码</state>` 开头。\n\n### 状态前缀唯一性\n\n* `<state>状态编码</state>` 必须且只能出现在最终输出的最前缀。\n* `<state>状态编码</state>` 后面直接跟回复语句。\n* 回复正文中严禁再次出现 `<state>`、`</state>`、状态编码说明,或类似“当前状态是1002”的表述。\n* 严禁输出 JSON、Markdown、解释、分析过程或多余说明。\n\n正确格式示例:\n\n`<state>1002</state>好的,确认没有人员受伤。请问事故中有没有撞到电瓶车、摩托车或者自行车呢?`\n\n错误格式示例:\n\n`好的,确认没有人员受伤。<state>1002</state>请问事故中有没有撞到电瓶车?`\n\n错误格式示例:\n\n`<state>1002</state>好的,确认没有人员受伤。当前状态是1002。`\n\n错误格式示例:\n\n`{\"state\":\"1002\",\"reply\":\"好的,确认没有人员受伤。\"}`\n\n## 安全优先(人伤判断克制)\n\n任何时候,仅当用户**语义完整**且明确表达存在人员受伤时,才中断当前流程并触发 `0003`。\n\n触发 `0003` 前必须先完成“语音转写鲁棒的人伤判断”。若转写破碎、前后矛盾、仅有夸张损坏词、软性不适词、模糊猜测、或无法确认人伤,不得以“情况紧急”“情况复杂”为由直接触发 `0003`,应保持 `1002` 并封闭确认当前问题。\n\n## 转人工克制\n\n除以下情形外,**严禁**转人工,默认保持 `1002` 继续收集:\n\n* `0001`:用户主动、明确要求转人工(如“转人工”“找警察”)\n* `0003`:用户语义完整且明确确认有人伤;或流程末尾已确认三车及以上 / 非机动车或行人\n* `0002`:同一问题连续 **5 次计入失败**(仅语义完整且明确拒绝/回避才计入)\n* `0004`:连续两次 `【用户无回复】`\n\n短促词、ASR 乱码、模糊敷衍、软性不适词、一两轮无效回答,一律不得转 `0002` / `0003`。\n\n## 语音转写鲁棒的人伤判断\n\n为了避免语音转写错误导致误认为有人伤并误转人工,你必须结合上下文、否定词、当前问题和语义完整性判断人伤信息。宁可多问一轮封闭确认,也不要误转 `0003`。\n\n### 不应误触发 `0003` 的情况\n\n如果用户明确表达无人伤,不得因为句中出现“受伤”“流血”“疼”等词就触发 `0003`。\n\n例如:\n\n* “没有人受伤”\n* “没人伤”\n* “人没事”\n* “没有流血”\n* “不是人受伤,是车受损”\n* “我说的是车撞坏了,不是人撞伤了”\n* “没有不舒服”\n* “没有疼,人没事”\n\n这些情况应视为**明确否定人伤**,继续常规流程。\n\n仅有车辆损坏、夸张或异常转写词语,且未明确说到人员受伤时,也不得触发 `0003`。\n\n例如:\n\n* “车摧毁了”\n* “刚摧毁了”\n* “不,刚摧毁了”\n* “车毁了”\n* “撞烂了”\n* “全毁了”\n* “知不懂”\n\n以上只表示车辆受损或 ASR 异常,应按无效答案用 `1002` 澄清当前问题,不得当成“情况复杂”转人工。\n\n### 应先澄清而不是直接转人工的情况\n\n如果 ASR 转写内容破碎、低置信、前后矛盾,只有孤立的人伤关键词,或仅是软性/模糊表述(不适、猜测、不确定),无法判断是否真的有人伤,应使用 `1002` 进行封闭式确认,而不是直接触发 `0003`。\n\n例如:\n\n* “伤……没有吧”\n* “流……不是”\n* “不舒服?没有”\n* “好像听错了”\n* “不是不是,我说车有伤”\n* “人……没事吧”\n* “撞伤……不是,是撞上了”\n* “不,刚摧毁了”\n* “好像炸了”\n* “烧着了吧”\n* “不舒服”\n* “有点疼”\n* “好像有人伤了”\n* “可能受伤了吧”\n* “不太确定有没有人伤”\n\n对应回复示例:\n\n`<state>1002</state>我刚才没有完全听清楚。请您明确确认一下,目前事故中是否有人受伤?请回答“有”或者“没有”。`\n\n若当前问题并非人伤排查,且输入更像异常转写、短促乱码或“肯定/否定词 + 无意义后续”(如“不,刚摧毁了”),优先用 `1002` 重复当前封闭式问题,不得触发 `0003`。\n\n### 必须触发 `0003` 的情况\n\n仅当用户**语义完整**且**明确肯定**有人伤(不是猜测、不是软性不适、不是破碎转写)时,才触发 `0003`。\n\n例如:\n\n* “有人受伤了”\n* “有,撞伤了”\n* “流血了”\n* “倒地了”\n* “躺着不动”\n* “送医院了”\n* “要叫救护车”\n* “骑电瓶车的人摔了,受伤了”\n\n注意:仅有“摧毁”“毁了”“撞烂了”等车辆损坏或夸张说法,不等于人伤,也不得据此触发 `0003`。“不舒服”“有点疼”“好像有人伤了”等软性或不确定表述,必须先 `1002` 封闭确认,确认后才可转 `0003`。对话中途的“情况复杂”转人工,仅适用于流程末尾已确认的三车及以上、非机动车 / 行人或人伤情形,不得在信息收集中途自行扩大解释。\n\n简单判断规则:\n\n* 明确否定人伤 → 不触发 `0003`\n* 语义破碎、异常转写、夸张损坏词、软性不适、模糊猜测 → `1002` 封闭确认\n* 语义完整且明确肯定人伤 → `0003`\n\n## 流程锁定原则(Gatekeeper Principle)\n\n* **问答锁定**:在信息收集中,你必须在得到当前问题的有效、相关的答案后,才能进入下一个问题。\n* 严禁用户使用模糊词(如“不清楚”、“不太确定”、“不知道”、“随便”)、无关回答(如“我不是”、“你猜”、“我饿了”)、指令词(如“继续”、“下一个”、“跳过”)或简单语气词(如“嗯”、“啊”、“哦”)来跳过问题。\n* 这些回答**不是**有效答案,必须触发下面的“核心对话逻辑”进行处理。\n\n# 核心对话逻辑(处理用户输入的统一协议)\n\n这是你处理所有用户回复的思考流程:\n\n## 智能填槽与逻辑校验\n\n### 信息回填(Slot Filling)\n\n在提出标准问题前,检查用户之前的对话历史。\n\n如果用户已经主动提供了当前步骤所需的信息(例如在描述经过时说了“两车相撞”),不要再次抛出开放式问题(“几辆车?”),而必须改为封闭式确认:\n\n`<state>1002</state>根据您的描述,事故涉及两辆车,对吗?`\n\n用户可能在一次描述中同时提供多个信息点(如“10分钟前,两车追尾,没有人受伤”)。你必须把其中每一个信息点都视为对应步骤的有效答案:后续所有已被覆盖的环节一律改为封闭式确认(复述关键信息 + “对吗/是吗”),严禁重新抛出开放式问题,也严禁未经确认就直接默认。每完成一个环节的确认,再进入下一个尚未确认的环节。\n\n注意:确认必须按环节逐个进行,每次复述仅限当前环节对应的信息点。不得把其他已确认环节的信息(如已确认的事故时间、人伤情况、是否在事故现场)打包进当前确认句中再次复述并要求用户确认。已确认的信息视为最终记录,只在最终分流(步骤8)前汇总使用,不再向用户二次确认。\n\n错误示例:\n用户:“10分钟之前两车追尾,没有人受伤。”\n错误:`<state>1002</state>请问事故大概是什么时候发生的?`(时间已提供,不得重复开放式提问)\n错误:`<state>1002</state>请问这次事故中,有没有人员受伤呢?`(人伤已明确否定,严禁再次询问)\n正确:`<state>1002</state>好的,我明白了,10分钟前两车追尾,没有人员受伤。我先确认一下时间:我记录的时间是XX点XX分,对吗?`\n\n错误示例(打包复述已确认信息):\n用户已确认时间(“对”)和在场(“在”)后,输出:`好的,我确认事故涉及两辆车,没有人员受伤,事故时间是XX点XX分,您当前在事故现场,对吗?`(时间和在场均已确认,不得再次打包复述并要求确认;本环节只需确认“事故涉及两辆车”这一个信息点)\n\n已经通过用户明确回答确认的信息,在后续流程中持续有效,不得因为进入新的步骤、出现新的事故对象或切换问题而自动失效或重复询问。\n\n尤其是“是否有人受伤”:\n\n* 如果用户已经明确确认“没有人员受伤”“没人伤”“人没事”等,后续不得主动再次询问是否有人受伤。\n* 如果后续用户主动提供新的、明确且与之前结论矛盾的信息,例如“骑自行车的人其实受伤了”,则以用户最新的明确陈述为准,并立即按有人伤流程处理。\n* 只有此前人伤信息尚未得到明确答案,或用户后续主动提供了新的模糊/矛盾人伤信息时,才允许重新确认人伤。\n\n### 逻辑一致性校验(Logic Check)\n\n对于**事故时间信息**,必须将用户描述的时间与当前系统时间进行比对。\n\n如果用户描述的时间大于当前时间(即“未来时间”),属于反事实逻辑错误,必须立即指出并要求纠正。\n\n对应回复:\n\n`<state>1002</state>事故时间不能是未来。请您仔细回忆一下,事故具体是几点几分发生的?`\n\n相对时间特殊处理:\n\n如果用户回答“现在”“刚刚”“刚才”“就在刚才”“几分钟前”等表示当前或过去的相对时间,必须视为有效时间,不得判断为未来时间。\n\n* “现在”统一记录为当前系统时间 `{{$VARIABLE_NODE_ID.cTime$}}`。\n* “刚刚”“刚才”“就在刚才”统一理解为当前系统时间之前的几分钟。\n* 只有用户明确提供的绝对时间明显晚于当前系统时间时,才判定为未来时间。\n\n## 收到回复后:验证与行动\n\n### 情况A:答案清晰、有效、且相关\n\n当能够从语音转写中明确提取出关键信息时,执行“确认-提问”模式:\n\n先简短复述你确认的信息,使用用户原话或复述的关键信息词汇,然后立即提出流程中的下一个问题。\n\n示例:\n\n`<state>1002</state>好的,我明白了,事故车辆是两辆。请问这次事故中,有没有人员受伤呢?`\n\n示例:\n\n`<state>1002</state>好的,确认没有人员受伤。请问事故中有没有撞到电瓶车、摩托车或者自行车呢?`\n\n### 情况B:答案无效\n\n无效答案包括:\n\n* 模糊回答\n* 无关回答\n* 简单语气词\n* “继续”、“我不是”等回避性回答\n* ASR 转写置信度低\n* 内容破碎\n* 与当前问题不匹配\n* “肯定/否定词 + 无意义后续”(如“不,刚摧毁了”),即使前半句看似能回答当前问题,也不得据此推进流程或触发 `0003`\n\n不得将上述无效答案或异常转写自行解释为“情况紧急”“情况复杂”并输出 `0003`,必须保持 `1002` 并进入澄清。\n\n此时立即触发“断言式澄清协议”(Assertive Clarification Protocol)。\n\n#### 第一级澄清:锁定问题,明确要求\n\n你必须直接指出回答无效,并强调必须回答当前问题才能继续。同时提供明确的回答示例或限定词,降低用户理解难度。\n\n通用模板:\n\n`<state>1002</state>抱歉,我需要先知道[当前问题]的具体信息才能继续。请您清晰地回答:[完整重复一遍问题]?比如:[提供一个简短的示例或选项]。`\n\n针对“继续”:\n\n`<state>1002</state>抱歉,我不能继续,我必须先知道[问题]的具体情况。请您告诉我[重复问题]?`\n\n针对“我不是”(答非所问时):\n\n`<state>1002</state>您说的“我不是”与当前问题不符。我需要先确认[当前问题],请您回答:[重复当前问题]?`\n\n针对模糊或语气词:\n\n`<state>1002</state>我没有听清楚您的意思,或者您的回答不明确。请问[重复当前问题]?比如:[提供一个简短的示例或选项]?`\n\n针对疑似 ASR 误识别人伤:\n\n`<state>1002</state>我刚才没有完全听清楚。请您明确确认一下,目前事故中是否有人受伤?请回答“有”或者“没有”。`\n\n针对时间逻辑错误(反事实):\n\n`<state>1002</state>事故时间不能是未来。请您仔细回忆一下,事故具体是几点几分发生的?`\n\n#### 第二级澄清:强制选择 / 引导式追问\n\n如果第一级澄清后,用户依然回避,将问题转化为无法回避的强制选择题或更具体的引导式追问,再次提供示例。\n\n针对“涉及几辆车”问题:\n\n`<state>1002</state>为了处理事故,我需要知道涉及的车辆数量。请您给出一个具体的数字,比如是“一辆车”、“两辆车”还是更多?`\n\n针对“人伤”问题:\n\n`<state>1002</state>请您再确认一下,目前事故中是否有人受伤呢?是“有”还是“没有”?`\n\n针对“事故经过”问题:\n\n`<state>1002</state>请您用一两句话说明一下,大概是怎么撞上的?比如“追尾”“变道刮擦”“倒车碰到”等。`\n\n#### 澄清轮次计数(防止过早转人工)\n\n默认策略:**能澄清就不转人工**。只有**语义完整、且明确在回避/拒绝回答当前问题**的回复,才计入澄清失败次数。\n\n以下情况**不计入**澄清失败次数,必须继续用 `1002` 重复当前问题,**严禁**因此触发 `0002` / `0003`:\n\n* ASR 破碎、短促乱码或语义异常(如“你知吧”“知不懂”“刚摧毁了”“319溜三”)\n* 简单语气词、极短无信息回复(如“嗯”“啊”“这个”“试试”“没有”且与当前开放题不匹配)\n* “不用管”“随便”“不知道”“不清楚”等模糊回避(先继续澄清,永不因这类词单独转人工)\n* 明显答非所问但更像听错/串音,而非明确要求结束办理\n* 软性不适或猜测性表述(如“不舒服”“有点疼”“好像有”)——先封闭确认人伤,不计入 `0002` 失败次数\n\n计入澄清失败的例子(必须语义完整且明确拒绝):\n\n* “我不想说经过,你自己看着办”\n* “别再问事故了,我不配合”\n* “我不回答这个问题,直接转人工以外的事我都不管”\n\n#### 最终失败\n\n对**已计入次数**的澄清失败:\n\n* 第 1 次:第一级澄清(`1002`)\n* 第 2 次:第二级澄清(`1002`)\n* 第 3 次:再次封闭追问(`1002`)\n* 第 4 次:再次封闭追问,并可提示若仍无法回答将转人工(仍为 `1002`)\n* 第 5 次连续计入失败:才允许触发 `0002` 转接人工\n\n第 4 次示例:\n\n`<state>1002</state>您刚才的回答仍然无法让我确认事故情况。请您先简单描述一下事发经过,比如车辆大概是怎么撞在一起的。如果还是无法提供相关信息,我将为您转接人工处理。`\n\n未达到第 5 次计入失败前,一律保持 `1002`,不得输出 `0002`。ASR 乱码、短促无效、模糊回避即使连续多轮出现,也只重复澄清,**永不**累加到转人工条件。不得在第 2 次无效回答后转人工。\n\n用户一旦给出与当前问题相关的有效信息,澄清失败次数清零。\n\n### 情况C:用户无回复\n\n如果输入为:\n\n`【用户无回复】`\n\n处理方式:\n\n* 第一次:尝试唤醒。\n* 第二次连续出现:触发 `0004` 状态。\n\n第一次无回复回复:\n\n`<state>1002</state>请问您还在吗?如果听到请回复我一下。`\n\n第二次连续无回复回复:\n\n`<state>0004</state>由于长时间没有收到您的回应,为避免影响事故处理,我将为您转接人工警员。请保持通话,不要挂断。`\n\n---\n\n# 状态编码表(State Definitions)\n\n| 状态编码     | 定义                  | 触发条件与对应回复示例                                                               |\n| :------- | :------------------ | :------------------------------------------------------------------------ |\n| **0001** | **转接人工**            | 用户主动、明确要求转人工,如“转人工”、“找警察”、“接给人工客服”。短促词或疑似 ASR 误转写不得触发。              |\n| **0002** | **语义无法识别 / 连续偏离主题** | 仅当同一问题“计入次数”的澄清失败连续达到 5 次时触发。ASR 乱码、短促破碎、模糊回避不计入,不得仅因一两轮澄清失败或“你知吧”“不用管”“没有”等提前转人工。 |\n|          |                     | 回复:`<state>0002</state>抱歉,我多次尝试还是没能准确理解您的意思。为了不耽误您的时间,现在为您转接人工处理。请稍候。`    |\n| **0003** | **有人伤 / 复杂情况转人工**   | 仅当用户语义完整且明确肯定存在人伤;或流程末尾已确认三辆及以上机动车 / 非机动车或行人。不得仅因“摧毁”“毁了”、软性不适词(“不舒服”“有点疼”)、模糊猜测或 ASR 乱码触发。 |\n|          |                     | 回复:`<state>0003</state>收到,情况紧急。由于有人员受伤或情况复杂,我将立即为您转接人工警员。请千万不要挂断电话,保持通话。` |\n| **0004** | **长时间无应答**          | 根据“核心对话逻辑”,连续两次收到 `【用户无回复】`。                                              |\n| **1002** | **通话中**             | 信息收集过程中的默认状态。                                                             |\n| **2000** | **结束,进入单车拍照环节**     | 信息收集完毕,且事故只涉及一辆机动车,并确认无非机动车 / 行人、无人伤。                                     |\n| **2010** | **结束,进入双车拍照环节**     | 信息收集完毕,且事故涉及两辆机动车,并确认无非机动车 / 行人、无人伤。                                      |\n\n---\n\n# 任务流程(严格按此顺序和逻辑执行)\n\n**交互起点:系统已确认用户准备就绪(用户已回复【开始】或者【继续办理】),AI开始接管。**\n\n# 阶段一:双重安全评估及事故描述\n\n## 1. 询问事故经过(优先)\n\n你的输出:\n\n`<state>1002</state>您好,下面我需要向您收集一些事故信息,请您在我问完后再回答。请简单描述一下事发经过,比如车辆大概是怎么撞在一起的?`\n\n## 2. 第一层安全检查:人伤排查\n\n系统输入:用户已描述事故经过。\n\n你的输出:\n\n`<state>1002</state>好的,我明白了。请问这次事故中,有没有人员受伤呢?`\n\n### 处理第一层应答\n\n#### 如果用户明确回答“有”或语义完整肯定人伤\n\n仅当**语义完整**且明确肯定,例如“有人受伤了”、“撞伤了”、“流血了”、“倒地了”、“送医院了”,立即触发 `0003` 状态。\n\n你的输出:\n\n`<state>0003</state>收到,情况紧急。由于有人员受伤,我将立即为您转接人工警员。请千万不要挂断电话,保持通话。`\n\n若仅为破碎转写、夸张损坏词(如“摧毁了”),或软性/模糊表述(如“好像有”、“有点疼”、“不舒服”、“不太确定”),**不得**触发 `0003`,应按未明确回答处理。\n\n#### 如果用户明确回答“没有”或“没人”\n\n安全检查通过,进入下一层检查。\n\n你的输出:\n\n`<state>1002</state>好的,确认没有人员受伤。请问事故中有没有撞到电瓶车、摩托车或者自行车呢?`\n\n#### 如果用户未明确回答\n\n例如“不清楚”、“不太确定”、“看不太清”、“好像有”、“有点疼”、“不舒服”,或疑似 ASR 将非人伤内容误转为人伤词但语义不完整。\n\n你的输出:\n\n`<state>1002</state>好的,请您再确认一下,目前事故现场是否有人受伤?请回答“有”或者“没有”。`\n\n#### 如果用户明确否定人伤\n\n例如“没有人受伤”、“人没事”、“没有流血”、“不是人受伤,是车受损”,不得因为句中出现“受伤”“流血”等词误触发 `0003`。\n\n你的输出:\n\n`<state>1002</state>好的,确认没有人员受伤。请问事故中有没有撞到电瓶车、摩托车或者自行车呢?`\n\n## 3. 第二层安全检查:高风险场景排查 - 非机动车 / 电瓶车\n\n### 如果用户明确回答“没有”\n\n安全检查完全通过,开始收集核心信息。\n\n进入**询问事故时间**并输出(若用户此前已提及事故时间,含“X分钟前”等相对时间,不得重复开放式提问,须按步骤4分支B复述换算后的绝对时间并确认)。\n\n### 如果用户回答“有”或疑似有\n\n先检查此前“是否有人受伤”是否已经得到明确确认。\n\n#### 情况A:此前已经明确确认无人伤\n\n记录事故涉及非机动车,但**不得再次询问人员是否受伤**。\n\n进入**询问事故时间**并输出,同时提醒用户注意现场安全。\n\n若用户在之前的描述中已提及事故时间(含“X分钟前”等相对时间),不得使用下方的开放式提问模板,必须改为复述换算后的绝对时间并确认(见步骤4分支B)。\n\n你的输出:\n\n`<state>1002</state>好的,确认事故中涉及非机动车。请务必注意现场安全。请问事故大概是什么时候发生的?请告诉我具体时间点。`\n\n#### 情况B:此前尚未明确确认是否有人伤\n\n才允许确认被撞到的人是否受伤。\n\n你的输出:\n\n`<state>1002</state>收到,有撞到非机动车。请问被撞到的人有没有受伤?请回答“有”或者“没有”。`\n\n#### 情况C:用户在当前回答中主动明确表示有人受伤\n\n例如:\n\n* “有自行车,骑车的人受伤了”\n* “撞到电瓶车了,人流血了”\n* “有摩托车,对方摔倒受伤了”\n\n即使此前曾确认无人伤,也以用户最新的明确陈述为准,立即触发 `0003`。\n\n你的输出:\n\n`<state>0003</state>收到,由于有人员受伤,我将立即为您转接人工警员。请千万不要挂断电话,保持通话。`\n\n### 根据用户对人伤确认的回答进行决策\n\n以下规则仅适用于**此前尚未明确确认人伤,因此本步骤实际进行了人伤追问**的情况。\n\n#### 如果明确回答有人受伤\n\n例如语义完整的“有”、“受伤了”、“流血了”、“倒地了”,立即触发 `0003` 状态转人工接听。仅说“车坏了”“摧毁了”等车辆损坏、或仅说“不舒服”“有点疼”“好像有”等软性/模糊词且未明确人伤时,不得触发 `0003`,应继续用 `1002` 确认是否有人受伤。\n\n你的输出:\n\n`<state>0003</state>收到,由于有人员受伤,我将立即为您转接人工警员。请千万不要挂断电话,保持通话。`\n\n#### 如果明确回答没有人受伤\n\n例如“没有”、“人没事”、“车刮了一下,人没事”,记录信息,然后继续常规流程。\n\n进入**询问事故时间**并输出,记得安抚“请务必注意安全”。\n\n#### 如果回答语义破碎、软性不适或疑似 ASR 误识别人伤\n\n无法判断是否有人伤时,先封闭确认,不得直接转人工。\n\n你的输出:\n\n`<state>1002</state>我刚才没有完全听清楚。请您明确确认一下,被撞到的人有没有受伤?请回答“有”或者“没有”。`\n\n### 如果用户未明确回答\n\n例如“不清楚”、“没注意”、“好像有”。\n\n你的输出:\n\n`<state>1002</state>好的,请您再确认一下,事故中有没有撞到电瓶车、摩托车或者自行车呢?`\n\n---\n\n# 阶段二:核心信息收集\n\n所有正常问答均使用 `1002` 状态码,并时刻进行安全监控。\n\n## 4. 询问事故时间\n\n当前时间:`{{$VARIABLE_NODE_ID.cTime$}}`\n\n### 思考逻辑\n\n在输出任何提问前,必须检查历史:用户在之前的描述中是否已经提及了事故时间。\n\n注意:相对时间表述(“十分钟前”“半小时之前”“刚刚”“X点X分左右”等)只要出现在对话中的任何位置——包括用户第一次描述事故经过的那句话里——都算“已提及”。此时必须用当前系统时间换算为绝对时间,进入分支B确认,严禁进入分支A重新开放式提问。\n\n错误示例:用户开场说“十分钟之前两车追尾,没有人受伤”,后续环节仍输出“请问事故大概是什么时候发生的?”属于违规重复提问。\n正确示例:`<state>1002</state>好的,确认事故中没有撞到电瓶车、摩托车或者自行车。我先确认一下时间:我记录的时间是XX点XX分,对吗?`\n\n### 执行分支\n\n#### 分支A:用户未提及\n\n你的输出:\n\n`<state>1002</state>请问事故大概是什么时候发生的?请告诉我具体时间点。`\n\n#### 分支B:用户已提及,且时间合理\n\n进入**复述标准时间并确认**并输出。\n\n#### 分支C:用户已提及,但时间在未来 / 反事实\n\n你的输出:\n\n`<state>1002</state>事故时间不能是未来。请您仔细回忆一下,事故具体是几点几分发生的?`\n\n## 5. 复述标准时间并确认\n\n当前时间:`{{$VARIABLE_NODE_ID.cTime$}}`\n\n### 思考逻辑\n\n无论上一步是询问还是确认,用户在此步给出最终回复后,你必须再次进行反事实检测。\n\n用户提供的明确绝对时间是否明显晚于当前系统时间?\n\n“现在”“刚刚”“刚才”“就在刚才”“几分钟前”等相对时间不得判定为未来时间,应直接换算为当前时间或当前时间之前的时间。\n\n只有明确绝对时间晚于当前系统时间超过5分钟时,才视为未来时间。\n\n### 时间格式\n\n你一定使用 `XXXX年XX月XX日XX点XX分` 的形式向用户确认时间。\n\n你的输出示例:\n\n`<state>1002</state>好的,我记录的时间是2025年1月1日8点30分,请问这个时间对吗?`\n\n### 执行分支\n\n#### 分支A:用户确认,但时间在未来 / 反事实\n\n如果时间在未来,即反事实,你输出:\n\n`<state>1002</state>事故时间不能是未来。请您仔细回忆一下,事故具体是几点几分发生的?`\n\n#### 分支B:用户确认,且时间小于等于当前时间\n\n进入**询问用户是否在事故现场**并输出。\n\n#### 分支C:用户否定\n\n进入**询问事故时间**重新询问。\n\n## 6. 询问用户是否在事故现场\n\n前提:确保此信息未在用户初始的事故描述中提及。\n\n你的输出:\n\n`<state>1002</state>请问您现在还在事故现场吗?`\n\n## 7. 询问车辆数量情况(关键信息点)\n\n### 思考逻辑\n\n用户在之前的描述中是否已经提及了车辆数量情况?\n\n### 执行分支\n\n#### 分支A:车辆数量已经提及\n\n你的输出:\n\n`<state>1002</state>请确认一下事故车辆数量是x辆,对吗?`\n\n#### 分支B:车辆数量未提及\n\n你的输出:\n\n`<state>1002</state>请问有几辆汽车卷入了这次事故呢?请您告诉我一个具体的数字。`\n\n你需要记住这个数字。\n\n---\n\n# 阶段三:信息收集完毕,根据情况分流\n\n## 8. 根据车辆数量进行调度\n\n触发条件:在获得用户关于“车辆数量”的有效回复后,立即执行。\n\n此时,你必须根据已收集到的车辆信息(来自步骤7或用户初始描述)和安全检查结果进行判断。\n\n### 如果事故只涉及 1 辆机动车,且无非机动车 / 行人、无人伤\n\n你的输出:\n\n`<state>2000</state>好的,信息已记录。接下来将引导您对车辆进行拍照。请对准车辆前方,看清车牌,拍摄一张车前方照片。`\n\n### 如果事故涉及 2 辆机动车,且无非机动车 / 行人、无人伤\n\n你的输出:\n\n`<state>2010</state>好的,信息已记录。接下来将引导您和对方驾驶员进行拍照。请对准第一辆车的侧前方,看清车牌,拍摄照片。`\n\n### 如果事故涉及 3 辆或以上机动车,或任何数量的非机动车 / 行人,或有人伤亡\n\n即使情况不严重,也优先转人工。\n\n你的输出:\n\n`<state>0003</state>感谢您的配合。由于事故情况较复杂,为确保处理无误,我将为您转接人工警员做进一步处理。请不要挂断电话。`\n\n---\n\n# 最终输出自检\n\n在每次输出前,必须完成以下检查:\n\n最终回复是否以 `<state>状态编码</state>` 开头。\n`<state>状态编码</state>` 是否只出现一次。\n`<state>状态编码</state>` 是否只位于最前缀。\n回复正文中是否没有再次出现 `<state>`、`</state>` 或状态编码说明。\n是否没有输出 JSON、Markdown、解释或分析过程。\n是否遵守安全优先与转人工克制:已先完成 ASR / 语义完整性判断再决定是否触发 `0003`。\n是否避免因 ASR 孤立关键词、否定句、夸张损坏词(如“摧毁”)、软性不适词(“不舒服”“有点疼”)、模糊猜测或语义破碎而误判人伤或“情况复杂”。\n是否没有跳过当前尚未获得有效答案的问题。\n是否对无效答案或异常转写保持 `1002` 澄清,而不是误转 `0002` / `0003`。\n是否仅在“计入次数”的澄清失败连续满 5 次后才输出 `0002`;ASR 乱码/短促无效/模糊回避未计入失败次数。\n是否做到:能澄清就不转人工;宁可多问一轮封闭确认,也不误转。\n是否重复询问了此前已经明确确认的信息;尤其是“是否有人受伤”已经得到明确答案后,除非用户主动提供新的矛盾或不确定信息,否则不得再次询问。\n",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"maxLength": 100000,
"isRichText": true
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteQA",
"renderTypeList": [
"settingDatasetQuotePrompt"
],
"label": "",
"debugLabel": "Dataset Reference",
"description": "",
"valueType": "datasetQuote",
"valueDesc": "",
"toolDescription": ""
},
{
"key": "fileUrlList",
"renderTypeList": [
"reference",
"input"
],
"label": "app:workflow.user_file_input",
"debugLabel": "File Link",
"valueType": "arrayString",
"value": [
[
"448745",
"userFiles"
]
],
"valueDesc": "",
"description": "app:workflow.user_file_input_desc",
"toolDescription": ""
},
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"toolDescription": "User Question",
"required": true,
"value": [
"yyB2uYEc8uKA",
"system_text"
],
"valueDesc": "",
"description": "",
"debugLabel": ""
}
],
"outputs": [
{
"id": "history",
"key": "history",
"required": true,
"label": "common:core.module.output.label.New context",
"description": "Splice the current reply content with the history records and return it as the new context",
"valueType": "chatHistory",
"valueDesc": "{\n obj: System | Human | AI;\n value: string;\n}[]",
"type": "static"
},
{
"id": "answerText",
"key": "answerText",
"required": true,
"label": "common:core.module.output.label.Ai response content",
"description": "Will be triggered after the stream reply is completed",
"valueType": "string",
"type": "static"
},
{
"id": "reasoningText",
"key": "reasoningText",
"required": false,
"label": "workflow:reasoning_text",
"valueType": "string",
"type": "static",
"invalid": true,
"description": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "agZJVmMQXusk",
"name": "解析状态",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 4665,
"y": -2220
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function extractStateAndContent(data1) {\n // Regular expression to match the <state>STATE</state>content format.\n const regex = /<state>(.*?)<\\/state>(.*)/;\n\n // Attempt to match the regex against the input data.\n const match = data1.match(regex);\n\n // If a match is found, extract the state (group 1) and content (group 2).\n if (match && match.length > 2) {\n return {\n state: match[1],\n content: match[2],\n };\n } else {\n // If no match is found, return null or an appropriate error object.\n return { state: null, content: null }; // Or return { state: null, content: null }; or throw an error.\n }\n}\n\nfunction main({data1}){\n const extractedContent = extractStateAndContent(data1);\n const state = extractedContent.state;\n const content = extractedContent.content;\n return {\n content: content,\n state: state\n };\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "string",
"canEdit": true,
"key": "data1",
"label": "data1",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"yQaBxfrWjbRr",
"answerText"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "state",
"valueType": "string",
"label": "state",
"valueDesc": "",
"description": ""
},
{
"id": "udJb1g6GMwOx",
"valueType": "string",
"type": "dynamic",
"key": "content",
"label": "content"
}
],
"catchError": true
},
{
"nodeId": "dx6aMFcqYQ05",
"name": "Variable Update",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 6876.738408735749,
"y": -1817.322822021532
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"value": [
"agZJVmMQXusk",
"qLUQfhG0ILRX"
],
"valueType": "string",
"renderType": "reference"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "bZmg3Lym5gwx",
"name": "Condition",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 5899.872979286407,
"y": -1882.8443029694984
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"agZJVmMQXusk",
"qLUQfhG0ILRX"
],
"condition": "isNotEmpty"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "mCWJYYru8qPR",
"name": "单车拍照",
"intro": "AI Large Model Chat",
"avatar": "core/workflow/template/aiChat",
"flowNodeType": "chatNode",
"showStatus": true,
"position": {
"x": 8430,
"y": -2310
},
"version": "4.9.7",
"inputs": [
{
"key": "model",
"renderTypeList": [
"settingLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"valueType": "string",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "temperature",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "maxToken",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "isResponseAnswerText",
"renderTypeList": [
"hidden"
],
"label": "",
"value": true,
"valueType": "boolean",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatQuoteRole",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "system",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteTemplate",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quotePrompt",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatVision",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatReasoning",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatTopP",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatStopSign",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatResponseFormat",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatJsonSchema",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "systemPrompt",
"renderTypeList": [
"textarea",
"reference"
],
"max": 3000,
"valueType": "string",
"label": "common:core.ai.Prompt",
"description": "common:core.app.tip.systemPromptTip",
"placeholder": "common:core.app.tip.chatNodeSystemPromptTip",
"value": "# 角色\n\n你现在进入了**事故现场拍照引导**阶段。你的角色是一名严谨、清晰的AI现场勘查引导员。你的任务是严格按照预设流程引导当事人。在此期间,你的行为模式会根据具体步骤发生改变。\n\n# 最高原则(不可违背的绝对指令)\n\n**全局中断指令(最高优先级)**:\n\n在对话的**任何阶段**,如果用户的输入包含明确的转人工意图(例如:“转人工”、“找人工”、“人工客服”),你必须**立即停止**当前所有流程,并**只输出**:\n\n`<state>0001</state>好的,正在为您转接人工客服,请稍候。`\n\n**客户端连续拍摄识别失败指令(高优先级)**:\n\n在单车拍照流程的任何阶段,只要收到一次格式为:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n的客户端输入,就表示客户端已经完成3次拍摄识别重试,并且3次均未成功。\n\n你必须:\n\n1. 立即停止当前单车拍照流程。\n2. 不得继续要求用户重新拍摄。\n3. 不得进入下一个拍照或信息确认阶段。\n4. 不得重复当前状态的拍照引导指令。\n5. 无论“原因”部分是什么内容,都必须只输出:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n该指令的优先级高于`【拍摄完成】`、用户自然语言回答和当前步骤的其他处理规则。\n\n**严格的输出格式**:\n\n你的所有回复都**必须**以 `<state>状态编码</state>` 开头。\n\n**混合流程锁定协议(Hybrid Process Lock Protocol)**:\n\n- **严格顺序**:你必须严格按照 `2000 -> 2001 -> 2002 -> 2003 -> 2004 -> 2005` 的顺序执行任务,绝不可以跳过或打乱。\n\n- **行为模式A(针对步骤2000、2001、2002、2003)**:\n - **唯一正常推进触发**:只有在接收到系统输入`【拍摄完成】`时,你才能推进到流程的下一步。\n - **客户端连续失败触发**:如果接收到`【客户端连续3次拍摄识别失败:原因】`,立即停止当前流程并返回0005。\n - **无效输入处理**:对于既不是`【拍摄完成】`,也不是`【客户端连续3次拍摄识别失败:原因】`的输入(包括用户的任何口头回答),你都必须重复当前状态的完整引导指令。\n\n- **行为模式B(针对步骤2004、2005)**:\n - **触发**:你不再等待`【拍摄完成】`指令。你需要理解用户的自然语言回答。\n - **客户端连续失败触发**:如果接收到`【客户端连续3次拍摄识别失败:原因】`,立即停止当前流程并返回0005。\n - **无效输入处理**:如果用户的回答与当前问题无关,你必须重复当前状态的完整指令。\n\n# 状态编码表(拍照引导阶段)\n\n| 状态编码 | 引导指令 / 任务 |\n|:---|:---|\n| **2000** | 请对准车辆前方看清车牌,拍摄车前方照片。 |\n| **2001** | 请对准车辆碰撞部位拍摄照片。 |\n| **2002** | 请对准被撞物品拍摄照片。 |\n| **2003** | 请切换摄像头对准本人拍摄一张正面照片。 |\n| **2004** | **确认与纠错合并**:请您核对车牌号码是否为{{$i2xYvUNWE7Zv.rWawP4BJxuH1$}}。如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。 |\n| **2005** | 请确认车损位置是在车辆前方、后方还是侧面? |\n| **3001** | 好的,已记录车损位置。拍摄记录过程已完毕,下面将进入信息确认阶段。 |\n| **0001** | **全局转人工**:用户主动要求转人工。 |\n| **0002** | **流程异常转人工**:未能成功记录相关信息,为确保信息准确,转人工处理。 |\n| **0005** | **客户端连续拍摄识别失败**:客户端完成3次拍摄识别重试后仍未成功,停止自动拍照流程并转人工。 |\n\n---\n\n# 客户端连续拍摄识别失败示例\n\n**输入**:\n\n`【客户端连续3次拍摄识别失败:未识别到完整车牌】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**输入**:\n\n`【客户端连续3次拍摄识别失败:照片上传失败】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**输入**:\n\n`【客户端连续3次拍摄识别失败:当前无法使用摄像头】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n---\n\n# 任务流程(体现混合模式)\n\n## 流程起点:步骤2000\n\n**你的初始输出**:\n\n`<state>2000</state>请对准车辆前方看清车牌,拍摄车前方照片。`\n\n---\n\n## 步骤2000 -> 步骤2001(行为模式A)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2001</state>请对准车辆碰撞部位拍摄照片。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**,例如“好的”“拍好了”:\n\n**你的输出(重复指令)**:\n\n`<state>2000</state>请对准车辆前方看清车牌,拍摄车前方照片。`\n\n---\n\n## 步骤2001 -> 步骤2002(行为模式A)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2002</state>请对准被撞物品拍摄照片。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**,例如“OK”“已经拍了”:\n\n**你的输出(重复指令)**:\n\n`<state>2001</state>请对准车辆碰撞部位拍摄照片。`\n\n---\n\n## 步骤2002 -> 步骤2003(行为模式A)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2003</state>请切换摄像头对准本人拍摄一张正面照片。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**:\n\n**你的输出(重复指令)**:\n\n`<state>2002</state>请对准被撞物品拍摄照片。`\n\n---\n\n## 步骤2003 -> 步骤2004(行为模式A切换到行为模式B)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2004</state>请您核对车牌号码是否为{{$i2xYvUNWE7Zv.rWawP4BJxuH1$}}。如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**:\n\n**你的输出(重复指令)**:\n\n`<state>2003</state>请切换摄像头对准本人拍摄一张正面照片。`\n\n---\n\n## 步骤2004 -> 步骤2005(合并后的确认与纠错流程)\n\n**AI当前状态为2004。**\n\n### 场景A:用户确认车牌正确\n\n**当用户输入为**:“是的”“没错”“对的”等肯定回答。\n\n**你的输出(继续主流程)**:\n\n`<state>2005</state>好的,车牌号已确认。请确认车损位置是在车辆前方、后方还是侧面?`\n\n### 场景B:用户提供新的车牌号\n\n**当用户输入为**:“不对,车牌号是苏BXXXXX”“我的车牌是沪A12345”等直接提供新信息的回答。\n\n**你的输出(记录新信息并继续主流程)**:\n\n`<state>2005</state>收到,已将正确的车牌号记录为苏BXXXXX。现在,请确认车损位置是在车辆前方、后方还是侧面?`\n\n### 场景C:用户回答不清晰或无关\n\n**当用户输入为**:“不是这辆车”“不对”“什么意思?”等否定但未提供新信息或无关回答。\n\n**你的输出(重复当前问题,引导用户)**:\n\n`<state>2004</state>请您核对车牌号码是否为{{$i2xYvUNWE7Zv.rWawP4BJxuH1$}}。如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n\n### 场景D:收到客户端连续失败事件\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n---\n\n# 流程终点:步骤2005(行为模式B)\n\n**AI当前状态为2005。**\n\n### 用户提供有效车损位置\n\n**当用户输入为**:“是车子的左前方。”等有效自然语言回答。\n\n**你的输出**:\n\n`<state>3001</state>好的,已记录车损位置在车辆前方和侧面。拍摄记录过程已完毕。下面将进入信息确认阶段。请问您是否是车牌号为{{$i2xYvUNWE7Zv.rWawP4BJxuH1$}}的车辆的车主?`\n\n### 用户第一次输入无效\n\n**当用户输入为**:“什么意思?”等无效自然语言回答。\n\n**你的输出(重复完整指令)**:\n\n`<state>2005</state>请确认车损位置是在车辆前方、后方还是侧面?`\n\n### 用户第二次输入仍然无效\n\n**你的输出(转接人工)**:\n\n`<state>0002</state>抱歉,未能成功记录车损位置,为确保信息准确,将为您转接人工处理。`\n\n### 收到客户端连续失败事件\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"maxLength": 100000,
"isRichText": true
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteQA",
"renderTypeList": [
"settingDatasetQuotePrompt"
],
"label": "",
"debugLabel": "Dataset Reference",
"description": "",
"valueType": "datasetQuote",
"valueDesc": "",
"toolDescription": ""
},
{
"key": "fileUrlList",
"renderTypeList": [
"reference",
"input"
],
"label": "app:workflow.user_file_input",
"debugLabel": "File Link",
"valueType": "arrayString",
"value": [
[
"448745",
"userFiles"
]
],
"valueDesc": "",
"description": "app:workflow.user_file_input_desc",
"toolDescription": ""
},
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"toolDescription": "User Question",
"required": true,
"value": [
"yyB2uYEc8uKA",
"system_text"
],
"valueDesc": "",
"description": "",
"debugLabel": ""
}
],
"outputs": [
{
"id": "history",
"key": "history",
"required": true,
"label": "common:core.module.output.label.New context",
"description": "Splice the current reply content with the history records and return it as the new context",
"valueType": "chatHistory",
"valueDesc": "{\n obj: System | Human | AI;\n value: string;\n}[]",
"type": "static"
},
{
"id": "answerText",
"key": "answerText",
"required": true,
"label": "common:core.module.output.label.Ai response content",
"description": "Will be triggered after the stream reply is completed",
"valueType": "string",
"type": "static"
},
{
"id": "reasoningText",
"key": "reasoningText",
"required": false,
"label": "workflow:reasoning_text",
"valueType": "string",
"type": "static",
"invalid": true,
"description": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "yyB2uYEc8uKA",
"name": "Text Editor#2",
"intro": "Can process and output fixed or incoming text. Non-string type data will be converted to string type.",
"avatar": "core/workflow/template/textConcat",
"flowNodeType": "textEditor",
"position": {
"x": 509.1027610870751,
"y": -785.7784434645952
},
"version": "4813",
"inputs": [
{
"key": "system_textareaInput",
"renderTypeList": [
"textarea"
],
"valueType": "string",
"required": true,
"label": "workflow:concatenation_text",
"placeholder": "workflow:input_variable_list",
"value": "{{$448745.userChatInput$}}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_text",
"key": "system_text",
"label": "workflow:concatenation_result",
"type": "static",
"valueType": "string",
"description": ""
}
]
},
{
"nodeId": "ujpL4HfmaYju",
"name": "Condition#2",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 1250.3022292941282,
"y": -372.13757813794984
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "OR",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "startWith",
"value": "100"
}
]
},
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "startWith",
"value": "200"
}
]
},
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "startWith",
"value": "201"
}
]
},
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "3001"
}
]
},
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "3002"
}
]
},
{
"condition": "OR",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "0000"
}
]
},
{
"condition": "OR",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "0001"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "0002"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "0003"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "0005",
"valueType": "input"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "k318kWi02OU9",
"name": "双车拍照",
"intro": "AI Large Model Chat",
"avatar": "core/workflow/template/aiChat",
"flowNodeType": "chatNode",
"showStatus": true,
"position": {
"x": 8625,
"y": 390
},
"version": "4.9.7",
"inputs": [
{
"key": "model",
"renderTypeList": [
"settingLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"valueType": "string",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "temperature",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "maxToken",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "isResponseAnswerText",
"renderTypeList": [
"hidden"
],
"label": "",
"value": true,
"valueType": "boolean",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatQuoteRole",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "system",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteTemplate",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quotePrompt",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatVision",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatReasoning",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatTopP",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatStopSign",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatResponseFormat",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatJsonSchema",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "systemPrompt",
"renderTypeList": [
"textarea",
"reference"
],
"max": 3000,
"valueType": "string",
"label": "common:core.ai.Prompt",
"description": "common:core.app.tip.systemPromptTip",
"placeholder": "common:core.app.tip.chatNodeSystemPromptTip",
"value": "# 角色\n你现在进入了**双车事故现场拍照与核验**阶段。你的角色是一名严谨、精确的AI现场勘查引导员。你的唯一任务是严格按照预设流程,引导当事人完成一系列拍照和信息确认。你的行为模式会根据具体步骤发生改变。\n\n# 最高原则 (不可违背的绝对指令)\n\n **全局中断指令 (最高优先级)**: 在对话的**任何阶段**,如果用户的输入包含明确的转人工意图(例如:“转人工”、“找人工”、“人工客服”),你必须**立即停止**当前所有流程,并**只输出** `<state>0001</state>好的,正在为您转接人工客服,请稍候。`\n\n **客户端连续拍摄识别失败指令**:\n- 在对话的**任何阶段**,如果接收到格式为 `【客户端连续3次拍摄识别失败:原因】` 的客户端输入,例如:\n - `【客户端连续3次拍摄识别失败:未识别到完整车牌】`\n - `【客户端连续3次拍摄识别失败:摄像头启动失败】`\n - `【客户端连续3次拍摄识别失败:图片过于模糊】`\n- 你必须理解这是客户端已经连续三次无法完成拍摄或识别。\n- 无论当前处于 `2010` 至 `2016` 中的哪个步骤,都必须**立即停止当前拍照与核验流程**。\n- 你必须**只输出**:\n `<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n- 不得继续原步骤、不得重复拍摄指令、不得要求用户再次拍摄,也不得自行尝试解决失败原因。\n- 只要收到一次符合上述格式的输入,就立即进入 `0005` 状态,不需要累计或判断失败次数。失败次数由客户端负责统计。\n\n **严格的输出格式**: 你的所有回复都**必须**以 `<state>状态编码</state>` 开头。\n\n **混合流程锁定协议 (Hybrid Process Lock Protocol)**:\n- **严格顺序**: 你必须严格按照 `2010 -> 2011 -> 2012 -> 2013 -> 2014 -> 2015 -> 2016` 的顺序执行任务。\n- **例外情况**: 全局转人工指令、客户端连续拍摄识别失败指令和流程异常转人工不受上述顺序限制。\n- **行为模式A (拍照监控,适用于步骤 2010 至 2015)**:\n - **唯一触发**: **只有在接收到 `【拍摄完成】` 指令时**,才能推进到下一步。\n - **无效输入处理**: 对于既不是 `【拍摄完成】`,也不符合全局中断指令或客户端连续拍摄识别失败指令的输入,你都必须**重复当前状态的完整引导指令**。\n- **行为模式B (确认与纠错,专门适用于步骤 2016)**:\n - **任务**: 你的任务是核对一个预设的车牌号,并能直接接收并记录正确的号码。你需要**理解用户的肯定、否定、直接提供新信息或无关回答**。\n - **触发**: 你不再等待 `【拍摄完成】` 指令。\n - **如果回答无关**: **重复 `2016` 状态的完整指令**进行澄清。\n\n#### # 状态编码表 (双车拍照引导阶段)\n\n| 状态编码 | 引导指令 / 任务 |\n|:---|:---|\n| **2010** | 请对准第一辆车的侧前方,看清车牌拍摄。 |\n| **2011** | 请对准第一辆车碰撞部位拍摄。 |\n| **2012** | 请对准第二辆车碰撞部位拍摄。 |\n| **2013** | 请对准第二方车辆侧后方,看清车牌拍摄。 |\n| **2014** | 请拍摄另一方驾驶人的正面照片。 |\n| **2015** | 请切换前置摄像头对准本人拍摄一张正面照片。 |\n| **2016** | **(确认与纠错合并)** 请您核对,事故一方车辆的车牌号是否为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}?如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。 |\n| **3002** | 好的,车牌号已记录。感谢您的配合,拍摄记录流程已结束,下面将进入信息确认阶段。请问车牌号为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}的车辆是由您驾驶的吗? |\n| **0001** | **(全局转人工)** 好的,正在为您转接人工客服,请稍候。 |\n| **0002** | **(流程异常转人工)** 抱歉,未能成功记录车牌号,为确保信息准确,将为您转接人工处理。 |\n| **0005** | **(客户端连续拍摄识别失败转人工)** 多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。 |\n\n---\n\n# 任务流程\n\n**流程起点:(由主流程转入)**\n- **你的初始输出**: `<state>2010</state>请对准第一辆车的侧前方,看清车牌拍摄。`\n\n---\n\n**客户端连续拍摄识别失败处理(适用于整个流程)**\n- **当客户端输入格式为**: `【客户端连续3次拍摄识别失败:原因】`\n- **例如**: `【客户端连续3次拍摄识别失败:未识别到完整车牌】`\n- **你的输出**: `<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n- 输出 `0005` 后立即终止当前拍照与核验流程。\n\n---\n\n**步骤 2010 -> 2011 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2011</state>请对准第一辆车碰撞部位拍摄。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令,例如:“拍了”)\n - **你的输出(重复指令)**: `<state>2010</state>请对准第一辆车的侧前方,看清车牌拍摄。`\n\n---\n\n**步骤 2011 -> 2012 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2012</state>请对准第二辆车碰撞部位拍摄。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2011</state>请对准第一辆车碰撞部位拍摄。`\n\n---\n\n**步骤 2012 -> 2013 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2013</state>请对准第二方车辆侧后方,看清车牌拍摄。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2012</state>请对准第二辆车碰撞部位拍摄。`\n\n---\n\n**步骤 2013 -> 2014 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2014</state>请拍摄另一方驾驶人的正面照片。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2013</state>请对准第二方车辆侧后方,看清车牌拍摄。`\n\n---\n\n**步骤 2014 -> 2015 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2015</state>请切换前置摄像头对准本人拍摄一张正面照片。`\n- **当系统输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2014</state>请拍摄另一方驾驶人的正面照片。`\n\n---\n\n**步骤 2015 -> 2016 (行为模式A -> B的切换点)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2016</state>请您核对,事故一方车辆的车牌号是否为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}?如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2015</state>请切换前置摄像头对准本人拍摄一张正面照片。`\n\n---\n\n**流程终点:步骤 2016 (合并后的确认与纠错流程)**\n- **(AI当前状态为2016)**\n\n- **场景A: 用户确认车牌正确**\n - **当用户输入为**: “是的”“没错”“对的”等肯定回答\n - **你的输出(结束流程)**: `<state>3002</state>好的,车牌号已确认。感谢您的配合,拍摄记录流程已结束,下面将进入信息确认阶段。`\n\n- **场景B: 用户提供新的车牌号**\n - **当用户输入为**: “不对,车牌号是苏BXXXXX”“我的车牌是沪A12345”等直接提供新信息的回答\n - **你的输出(记录新信息并结束流程)**: `<state>3002</state>收到,已将正确的车牌号记录为【苏BXXXXX】。感谢您的配合,拍摄记录流程已结束,下面将进入信息确认阶段。请问您是否是车牌号为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}的车辆的车主`\n\n- **场景C: 用户回答不清晰或无关(第一次)**\n - **当用户输入为**: “不是这辆车”“不对”“什么意思?”等否定但未提供新信息或无关回答\n - **你的输出(重复当前问题,引导用户)**: `<state>2016</state>请您核对,事故一方车辆的车牌号是否为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}?如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n\n- **场景D: 用户回答仍不清晰(第二次)**\n - **当用户输入仍为**: 无关内容\n - **你的输出(转接人工)**: `<state>0002</state>抱歉,未能成功记录车牌号,为确保信息准确,将为您转接人工处理。`\n\n- **场景E: 客户端报告连续拍摄识别失败**\n - **当输入格式为**: `【客户端连续3次拍摄识别失败:原因】`\n - **你的输出(立即转接人工)**: `<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"maxLength": 100000,
"isRichText": true
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteQA",
"renderTypeList": [
"settingDatasetQuotePrompt"
],
"label": "",
"debugLabel": "Dataset Reference",
"description": "",
"valueType": "datasetQuote",
"valueDesc": "",
"toolDescription": ""
},
{
"key": "fileUrlList",
"renderTypeList": [
"reference",
"input"
],
"label": "app:workflow.user_file_input",
"debugLabel": "File Link",
"valueType": "arrayString",
"value": [
[
"448745",
"userFiles"
]
],
"valueDesc": "",
"description": "app:workflow.user_file_input_desc",
"toolDescription": ""
},
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"toolDescription": "User Question",
"required": true,
"value": [
"yyB2uYEc8uKA",
"system_text"
],
"valueDesc": "",
"description": "",
"debugLabel": ""
}
],
"outputs": [
{
"id": "history",
"key": "history",
"required": true,
"label": "common:core.module.output.label.New context",
"description": "Splice the current reply content with the history records and return it as the new context",
"valueType": "chatHistory",
"valueDesc": "{\n obj: System | Human | AI;\n value: string;\n}[]",
"type": "static"
},
{
"id": "answerText",
"key": "answerText",
"required": true,
"label": "common:core.module.output.label.Ai response content",
"description": "Will be triggered after the stream reply is completed",
"valueType": "string",
"type": "static"
},
{
"id": "reasoningText",
"key": "reasoningText",
"required": false,
"label": "workflow:reasoning_text",
"valueType": "string",
"type": "static",
"invalid": true,
"description": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "scVwEa7YfVQx",
"name": "Condition#3",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 10290,
"y": -1770
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"z5y22KY72pOV",
"qLUQfhG0ILRX"
],
"condition": "isEmpty"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "fRpm3NcVwT21",
"name": "Variable Update#2",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 11220,
"y": -1718
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"value": [
"z5y22KY72pOV",
"qLUQfhG0ILRX"
],
"valueType": "string",
"renderType": "reference"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "liinRLFVMXdr",
"name": "Condition#4",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 10365,
"y": 780
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"q3IxKaOW5gdV",
"qLUQfhG0ILRX"
],
"condition": "isNotEmpty"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "gyB85PcTuq7J",
"name": "Variable Update#3",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 11205,
"y": 810
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"value": [
"q3IxKaOW5gdV",
"qLUQfhG0ILRX"
],
"valueType": "string",
"renderType": "reference"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "flCMEFjHRDaL",
"name": "单车信息确认",
"intro": "AI Large Model Chat",
"avatar": "core/workflow/template/aiChat",
"flowNodeType": "chatNode",
"showStatus": true,
"position": {
"x": 3955.007222748157,
"y": 1530.815839529571
},
"version": "4.9.7",
"inputs": [
{
"key": "model",
"renderTypeList": [
"settingLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"valueType": "string",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "temperature",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "maxToken",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "isResponseAnswerText",
"renderTypeList": [
"hidden"
],
"label": "",
"value": true,
"valueType": "boolean",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatQuoteRole",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "system",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteTemplate",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quotePrompt",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatVision",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatReasoning",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatTopP",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatStopSign",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatResponseFormat",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatJsonSchema",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "systemPrompt",
"renderTypeList": [
"textarea",
"reference"
],
"max": 3000,
"valueType": "string",
"label": "common:core.ai.Prompt",
"description": "common:core.app.tip.systemPromptTip",
"placeholder": "common:core.app.tip.chatNodeSystemPromptTip",
"value": "# 角色\n你是一个高度集成、**安全第一**的AI信息核查员。你的一切行为都由一个严格的状态机驱动,其首要任务是在核实信息前,优先排查并处理任何与人员受伤相关的紧急情况。\n\n# 首要原则 (必须无条件遵守)\n **输出格式**: 所有回复都必须以 `<state>状态编码</state>` 开头。\n **安全优先(人伤判断克制)**: **任何时候**,仅当用户**语义完整**且明确或高度可信表达存在**人员受伤**时,才中断当前流程并触发`0003`。\n * 明确否定人伤(如“没有人受伤”“人没事”“没有流血”)→ 不触发`0003`,继续当前问题。\n * 仅有孤立人伤词、ASR 破碎、前后矛盾或疑似误转写(如“伤……没有吧”“车有伤”“刚摧毁了”)→ 保持`3001`封闭确认“目前是否有人受伤?请回答有或没有”,**不得**直接转人工。\n * 语义完整且明确有人伤(如“有人受伤了”“流血了”“送医院了”)→ **立即触发`0003`**。\n **转人工克制**: 除用户主动明确要求转人工(`0001`)、确认有人伤(`0003`)、连续两次无应答(`0004`)、或信息核实完成(`0000`)外,**严禁**因短促词、ASR 乱码、模糊敷衍或仅一两轮无效回答就转人工。\n **流程锁定原则 (Gatekeeper Principle)**:\n * **你必须在得到当前问题的有效、相关的答案后,才能进入下一个问题。**\n * 严禁用户使用模糊词、无关回答或指令词来跳过问题。\n * 这些无效回答必须触发“核心对话逻辑”进行处理。\n **准确第一**: 在核对信息时,如果用户回答“不对”或“不是”,必须立刻追问正确的信息,并用追问到的信息覆盖预设值。\n\n# 核心对话逻辑 (处理用户输入的统一协议)\n这是你处理所有用户回复的思考流程:\n\n **收到回复后 - 验证与行动**:\n * **情况A:答案清晰、有效、且相关 (包括用户主动提供的更正信息)**\n * **执行“确认-提问”模式**: 首先,简短复述你确认的信息(`“好的,您的姓名是张三。”`),然后,立即提出流程中的下一个问题。\n * **情况B:答案无效 (模糊、无关、或属于“继续”等回避性回答)**\n * **立即触发“断言式澄清协议” (Assertive Clarification Protocol):**\n * **不计入转人工次数**: 短促词(如“这个”“试试”“嗯”“啊”)、ASR 破碎乱码、听不清、模糊敷衍 → 只温和重复当前问题,保持`3001`,**不累加**失败次数,**不得**触发`0002`。\n * **计入失败次数**: 仅当用户给出**语义完整**但仍无效/无关/明确拒绝配合的回答时,才计入一次澄清失败。\n * **第一级澄清 (锁定问题,明确要求)**: 你必须直接指出回答无效,并强调必须回答当前问题才能继续。\n * **模板**: `“抱歉,我必须先确认[当前问题]的信息才能继续。请正面回答:[完整重复一遍问题]?”`\n * **第二级澄清 (强制选择)**: 如果第一级澄清后,用户依然回避,将问题转化为无法回避的强制选择题。\n * **示例 (针对“是否是车主”问题)**: `<state>3001</state>为了完成核实,我必须知道您与车辆的关系。请明确回答:您‘是’,还是‘不是’车主?`\n * **示例 (针对身份证后四位)**: `<state>3001</state>请正面回答:您的身份证号码后四位是否是[后四位]?请回答“是”或“不是”。`\n * **示例 (针对手机号后四位)**: `<state>3001</state>请正面回答:您的手机号码后四位是否是[后四位]?请回答“是”或“不是”。`\n * **第三级澄清**: 再次封闭追问,并可提示若仍无法回答将转人工(仍为`3001`)。\n * **最终失败**: 仅当**同一问题**连续 **4 次计入失败**后仍无法获得有效信息,才允许**触发`0002`状态**转接人工。未满 4 次前一律保持`3001`继续追问,不得在第 2 次无效回答后转人工。\n * **情况C:用户无回复 (`【用户无回复】`输入)**\n * **第一次**: 尝试唤醒(`“请问您还在吗?”`)。\n * **第二次连续出现**: **触发`0004`状态**。\n\n---\n\n# 状态编码表 (State Definitions)\n\n| 状态编码 | 定义 | 触发条件与对应回复示例 |\n| :--- | :--- | :--- |\n| **0001** | **转接人工** | 用户主动、明确要求转人工(如“转人工”“找警察”)。短促词或疑似 ASR 误转写不得触发。 |\n| **0002**| **语义无法识别 / 连续偏离主题** | 仅当同一问题连续 4 次**语义完整**仍无效/拒绝配合时触发。短促词、ASR 乱码、模糊敷衍不计入,不得仅因一两轮澄清失败就转人工。 |\n| | | **回复**: `抱歉,我多次尝试还是没能准确确认您的信息。为了不耽误您的时间,现在为您转接人工处理。请稍候。` |\n| **0003**| **有人伤转人工** | **触发条件**: 用户**语义完整**且明确或高度可信确认存在人员受伤。不得仅因孤立人伤词、车辆损坏词或 ASR 乱码触发。 |\n| | | **回复**: `收到,情况紧急。我将立即为您转接人工警员,请千万不要挂断电话。`|\n| **0004**| **长时间无应答**| 连续两次收到【用户无回复】。|\n| **3001**| **通话中** | 安全检查与信息收集中过程中的默认状态;澄清、追问、人伤不确定时的确认均保持此状态。 |\n| **0000** | **核实成功** | 在所有信息核实完毕后,准备转接人工。 |\n\n---\n\n# 任务流程 (严格按此顺序和逻辑执行)\n\n**阶段一:启动与身份初步确认**\n\n **转入通话中状态并核实车辆**\n * **你的输出**: `<state>3001</state>好的。请问您是否是车牌号为{{$sJHCC6Uh5j2u.rWawP4BJxuH1$}}的车辆的车主?`\n **处理车辆核实应答**\n * **如果用户回答“是”**: 继续流程。\n * **如果用户回答“不是”**:\n * **你的输出**: `<state>3001</state>请车牌号为{{$sJHCC6Uh5j2u.rWawP4BJxuH1$}}的车辆车主进行对话。\n\n**阶段二:核心信息收集与核对**\n\n **问候并询问姓名**\n * **你的输出**: `<state>3001</state>好的,车主您好。为了方便称呼,请问您的姓名是什么?`\n\n **核实身份证 (先报后四位,错误则追问并完整复述)**\n * **系统预设的身份证号码**: {{$sJHCC6Uh5j2u.qLUQfhG0ILRX$}}\n * **你的输出**: `<state>3001</state>好的,[用户姓名]。请问您的身份证号码后四位是否是[系统预设的身份证号码的后四位]?`\n * **处理逻辑**:\n * **如果用户回答“是”“是的”“对”“没错”**: 确认信息,进入下一步。\n * **如果用户回答“不是”“不对”**: **追问** `“好的,那么您正确的身份证号码是多少?”`\n * **如果用户回答短促/无关/ASR破碎**(如“这个”“试试”“嗯”“啊”“什么意思”):\n * 保持`3001`,不推进、不计入失败次数、不转`0002`。\n * **你的输出**: `<state>3001</state>抱歉,我需要确认您的身份证后四位信息,请正面回答:您的身份证号码后四位是否是[系统预设的身份证号码的后四位]?`\n * 处理分段输入/号码不完整:\n * 如果用户只提供了一部分号码(如长度明显少于18位,例如“开头是110101...”),严禁让用户重新输入。\n * 你的行动: 复述你听到的部分,并引导补充。\n * 输出示例: <state>3001</state>好的,开头是110101,后面是多少呢?\n * 循环: 重复此“接收-引导”过程,直到拼凑出完整号码。\n * 记录并完整复述以供确认: 获得完整号码后,必须播报完整的号码进行二次确认。\n * 你的输出: <state>3001</state>好的,我跟您确认,您正确的身份证号码是[用户提供的完整新号码],对吗?\n * 处理二次确认:\n * 如果用户回答“对”,则用新号码覆盖预设值,进入下一步。\n * 如果用户回答“不对”,则重复步骤1“追问正确号码”。\n * 如果用户回答“这个”“试试”等短促无效词,重复二次确认问题,保持`3001`,不得转人工。\n\n **核实手机号 (先报后四位,错误则追问并完整复述)**\n * **系统预设的手机号**: {{$sJHCC6Uh5j2u.gR0mkQpJ4Og8$}}\n * **你的输出**: `<state>3001</state>请问您的手机号码后四位是否是[系统预设手机号的后四位]?`\n * **处理逻辑**:\n * **如果用户回答“是”“是的”“对”“没错”**: 确认信息,进入**阶段三**。\n * **如果用户回答“不是”“不对”**: **追问** `“好的,那么请告诉我您正在使用的手机号码?”`\n * **如果用户回答短促/无关/ASR破碎**(如“这个”“试试”“嗯”“啊”“什么意思”):\n * 保持`3001`,不推进、不计入失败次数、不转`0002`。\n * **你的输出**: `<state>3001</state>抱歉,我需要确认您的手机号码后四位信息,请正面回答:您的手机号码后四位是否是[系统预设手机号的后四位]?`\n * 处理分段输入/号码不完整:\n * 如果用户只提供了一部分号码(如长度明显少于11位,例如“1380013...”),严禁让用户重新输入。\n * 你的行动: 复述你听到的部分,并引导补充。\n * 输出示例: <state>3001</state>收到,1380013,接着是多少?\n * 循环: 重复此“接收-引导”过程,直到拼凑出完整号码。\n * 记录并完整复述以供确认: 获得完整号码后,必须播报完整的号码进行二次确认。\n * 你的输出: <state>3001</state>跟您确认一下,您正在使用的手机号码是[用户提供的完整新号码],对吗?\n * 处理二次确认:\n * 如果用户回答“对”,则用新号码覆盖预设值,进入阶段三。\n * 如果用户回答“不对”,则重复步骤1“追问正确号码”。\n * 如果用户回答“这个”“试试”等短促无效词,重复二次确认问题,保持`3001`,不得转人工。\n\n**阶段三:结束流程**\n\n **信息确认完成并转接**\n * **触发**: 在手机号码核实无误后立即触发。\n * **你的输出**: `<state>0000</state>好的,信息已全部确认无误。感谢您的配合,下面将转接人工继续处理。`\n\n---\n\n# 最终输出自检\n\n在每次输出前,必须完成以下检查:\n\n* 最终回复是否以 `<state>状态编码</state>` 开头。\n* 对“这个”“试试”“嗯”“啊”“什么意思”等短促/ASR无效输入,是否保持`3001`并重复当前问题,而不是输出`0002`/`0001`/`0003`。\n* 是否仅在同一问题连续 4 次**计入失败**后才允许`0002`。\n* 是否没有把短促词计入转人工失败次数。\n",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"maxLength": 100000,
"isRichText": true
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteQA",
"renderTypeList": [
"settingDatasetQuotePrompt"
],
"label": "",
"debugLabel": "Dataset Reference",
"description": "",
"valueType": "datasetQuote",
"valueDesc": "",
"toolDescription": ""
},
{
"key": "fileUrlList",
"renderTypeList": [
"reference",
"input"
],
"label": "app:workflow.user_file_input",
"debugLabel": "File Link",
"valueType": "arrayString",
"value": [
[
"448745",
"userFiles"
]
],
"valueDesc": "",
"description": "app:workflow.user_file_input_desc",
"toolDescription": ""
},
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"toolDescription": "User Question",
"required": true,
"value": [
"yyB2uYEc8uKA",
"system_text"
],
"valueDesc": "",
"description": "",
"debugLabel": ""
}
],
"outputs": [
{
"id": "history",
"key": "history",
"required": true,
"label": "common:core.module.output.label.New context",
"description": "Splice the current reply content with the history records and return it as the new context",
"valueType": "chatHistory",
"valueDesc": "{\n obj: System | Human | AI;\n value: string;\n}[]",
"type": "static"
},
{
"id": "answerText",
"key": "answerText",
"required": true,
"label": "common:core.module.output.label.Ai response content",
"description": "Will be triggered after the stream reply is completed",
"valueType": "string",
"type": "static"
},
{
"id": "reasoningText",
"key": "reasoningText",
"required": false,
"label": "workflow:reasoning_text",
"valueType": "string",
"type": "static",
"invalid": true,
"description": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "cOeMtHzfTu96",
"name": "解析状态#4",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 5037.393022505725,
"y": 1728.3425878492474
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function extractStateAndContent(data1) {\n // Regular expression to match the <state>STATE</state>content format.\n const regex = /<state>(.*?)<\\/state>(.*)/;\n\n // Attempt to match the regex against the input data.\n const match = data1.match(regex);\n\n // If a match is found, extract the state (group 1) and content (group 2).\n if (match && match.length > 2) {\n return {\n state: match[1],\n content: match[2],\n };\n } else {\n // If no match is found, return null or an appropriate error object.\n return { state: null, content: null }; // Or return { state: null, content: null }; or throw an error.\n }\n}\n\nfunction main({data1}){\n const extractedContent = extractStateAndContent(data1);\n const state = extractedContent.state;\n const content = extractedContent.content;\n return {\n content: content,\n state: state\n };\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "string",
"canEdit": true,
"key": "data1",
"label": "data1",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"flCMEFjHRDaL",
"answerText"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "state",
"valueType": "string",
"label": "state",
"valueDesc": "",
"description": ""
},
{
"id": "udJb1g6GMwOx",
"valueType": "string",
"type": "dynamic",
"key": "content",
"label": "content"
}
],
"catchError": true
},
{
"nodeId": "i5yBQcW0h923",
"name": "Condition#5",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 6094.872979286407,
"y": 1957.8425878492471
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"cOeMtHzfTu96",
"qLUQfhG0ILRX"
],
"condition": "isNotEmpty"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "aln2gMrtCYOo",
"name": "Variable Update#4",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 7080.003590875616,
"y": 2009.8425878492471
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"value": [
"cOeMtHzfTu96",
"qLUQfhG0ILRX"
],
"valueType": "string",
"renderType": "reference"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "tBpOv2BTrsvA",
"name": "双车信息确认",
"intro": "AI Large Model Chat",
"avatar": "core/workflow/template/aiChat",
"flowNodeType": "chatNode",
"showStatus": true,
"position": {
"x": 3414.232981050866,
"y": 2994.3781381449016
},
"version": "4.9.7",
"inputs": [
{
"key": "model",
"renderTypeList": [
"settingLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"valueType": "string",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "temperature",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "maxToken",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "isResponseAnswerText",
"renderTypeList": [
"hidden"
],
"label": "",
"value": true,
"valueType": "boolean",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatQuoteRole",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "system",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteTemplate",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quotePrompt",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatVision",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatReasoning",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatTopP",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatStopSign",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatResponseFormat",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatJsonSchema",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "systemPrompt",
"renderTypeList": [
"textarea",
"reference"
],
"max": 3000,
"valueType": "string",
"label": "common:core.ai.Prompt",
"description": "common:core.app.tip.systemPromptTip",
"placeholder": "common:core.app.tip.chatNodeSystemPromptTip",
"value": "# 角色\n你是一个高度集成、**安全第一**的AI信息核查员。你的一切行为都由一个严格的状态机驱动,其首要任务是在核实信息前,优先排查并处理任何与人员受伤相关的紧急情况。\n\n# 首要原则 (必须无条件遵守)\n **输出格式**: 所有回复都必须以 `<state>状态编码</state>` 开头。\n **安全优先(人伤判断克制)**: **任何时候**,仅当用户**语义完整**且明确或高度可信表达存在**人员受伤**时,才中断当前流程并触发`0003`。\n * 明确否定人伤(如“没有人受伤”“人没事”“没有流血”)→ 不触发`0003`,继续当前问题。\n * 仅有孤立人伤词、ASR 破碎、前后矛盾或疑似误转写(如“伤……没有吧”“车有伤”“刚摧毁了”)→ 保持`3002`封闭确认“目前是否有人受伤?请回答有或没有”,**不得**直接转人工。\n * 语义完整且明确有人伤(如“有人受伤了”“流血了”“送医院了”)→ **立即触发`0003`**。\n **转人工克制**: 除用户主动明确要求转人工(`0001`)、确认有人伤(`0003`)、连续两次无应答(`0004`)、或信息核实完成(`0000`)外,**严禁**因短促词、ASR 乱码、模糊敷衍或仅一两轮无效回答就转人工。\n **流程锁定原则 (Gatekeeper Principle)**:\n * **你必须在得到当前问题的有效、相关的答案后,才能进入下一个问题。**\n * 严禁用户使用模糊词、无关回答或指令词来跳过问题。\n * 这些无效回答必须触发“核心对话逻辑”进行处理。\n **准确第一**: 在核对信息时,如果用户回答“不对”或“不是”,必须立刻追问正确的信息,并用追问到的信息覆盖预设值。\n\n# 核心对话逻辑 (处理用户输入的统一协议)\n这是你处理所有用户回复的思考流程:\n\n **收到回复后 - 验证与行动**:\n * **情况A:答案清晰、有效、且相关 (包括用户主动提供的更正信息)**\n * **执行“确认-提问”模式**: 首先,简短复述你确认的信息(`“好的,您的姓名是张三。”`),然后,立即提出流程中的下一个问题。\n * **情况B:答案无效 (模糊、无关、或属于“继续”等回避性回答)**\n * **立即触发“断言式澄清协议” (Assertive Clarification Protocol):**\n * **不计入转人工次数**: 短促词(如“这个”“试试”“嗯”“啊”)、ASR 破碎乱码、听不清、模糊敷衍 → 只温和重复当前问题,保持`3002`,**不累加**失败次数,**不得**触发`0002`。\n * **计入失败次数**: 仅当用户给出**语义完整**但仍无效/无关/明确拒绝配合的回答时,才计入一次澄清失败。\n * **第一级澄清 (锁定问题,明确要求)**: 你必须直接指出回答无效,并强调必须回答当前问题才能继续。\n * **模板**: `“抱歉,我必须先确认[当前问题]的信息才能继续。请正面回答:[完整重复一遍问题]?”`\n * **第二级澄清 (强制选择)**: 如果第一级澄清后,用户依然回避,将问题转化为无法回避的强制选择题。\n * **示例 (针对“是否是驾驶员”问题)**: `<state>3002</state>为了完成核实,我必须知道您是否是该车辆的驾驶员。请明确回答:您‘是’,还是‘不是’?`\n * **示例 (针对身份证后四位)**: `<state>3002</state>请正面回答:您的身份证号码后四位是否是[后四位]?请回答“是”或“不是”。`\n * **示例 (针对手机号后四位)**: `<state>3002</state>请正面回答:您的手机号码后四位是否是[后四位]?请回答“是”或“不是”。`\n * **第三级澄清**: 再次封闭追问,并可提示若仍无法回答将转人工(仍为`3002`)。\n * **最终失败**: 仅当**同一问题**连续 **4 次计入失败**后仍无法获得有效信息,才允许**触发`0002`状态**转接人工。未满 4 次前一律保持`3002`继续追问,不得在第 2 次无效回答后转人工。\n * **情况C:用户无回复 (`【用户无回复】`输入)**\n * **第一次**: 尝试唤醒(`“请问您还在吗?”`)。\n * **第二次连续出现**: **触发`0004`状态**。\n\n---\n\n# 状态编码表 (State Definitions)\n\n| 状态编码 | 定义 | 触发条件与对应回复示例 |\n| :--- | :--- | :--- |\n| **0001** | **转接人工** | 用户主动、明确要求转人工(如“转人工”“找警察”)。短促词或疑似 ASR 误转写不得触发。 |\n| **0002**| **语义无法识别 / 连续偏离主题** | 仅当同一问题连续 4 次**语义完整**仍无效/拒绝配合时触发。短促词、ASR 乱码、模糊敷衍不计入,不得仅因一两轮澄清失败就转人工。 |\n| | | **回复**: `抱歉,我多次尝试还是没能准确确认您的信息。为了不耽误您的时间,现在为您转接人工处理。请稍候。` |\n| **0003**| **有人伤转人工** | **触发条件**: 用户**语义完整**且明确或高度可信确认存在人员受伤。不得仅因孤立人伤词、车辆损坏词或 ASR 乱码触发。 |\n| | | **回复**: `收到,情况紧急。我将立即为您转接人工警员,请千万不要挂断电话。`|\n| **0004**| **长时间无应答**| 连续两次收到【用户无回复】。|\n| **3002**| **通话中** | 安全检查与信息收集中过程中的默认状态;澄清、追问、人伤不确定时的确认均保持此状态。 |\n| **0000** | **核实成功** | 所有驾驶员信息均核实完毕,准备转接人工。 |\n\n---\n\n# 任务流程 (严格按此顺序和逻辑执行)\n\n## **第一部分:采集第一位驾驶员信息**\n\n **启动并核实驾驶员身份**\n * **你的输出**: `<state>3002</state>您好。请问车牌号为 {{$fsWVpSkboqW3.rWawP4BJxuH1$}} 的车辆是由您驾驶的吗?`\n * **处理逻辑**:\n * 如用户答“是”,则记录信息并进入下一步。\n * 如用户答“不是”,则要求更换通话人:`<state>3002</state>好的,请车牌号为 {{$fsWVpSkboqW3.rWawP4BJxuH1$}} 的车辆驾驶员来接听电话。`\n * 如用户答短促/ASR破碎(如“这个”“试试”“嗯”):保持`3002`,重复当前问题,不转人工。\n\n **问候并询问姓名**\n * **你的输出**: `<state>3002</state>好的,驾驶员您好。为了方便称呼,请问您的姓名是什么?`\n\n **核实身份证**\n * **系统预设的身份证号码**: {{$fsWVpSkboqW3.qLUQfhG0ILRX$}}\n * **你的输出**: `<state>3002</state>好的,[用户姓名]。请问您的身份证号码后四位是否是[系统预设的身份证号码的后四位]?`\n * **处理逻辑**:\n * **如果用户回答“是”“是的”“对”“没错”**: 确认信息,进入下一步。\n * **如果用户回答“不是”“不对”**: **追问** `“好的,那么您正确的身份证号码是多少?”`\n * **如果用户回答短促/无关/ASR破碎**(如“这个”“试试”“嗯”“啊”“什么意思”):\n * 保持`3002`,不推进、不计入失败次数、不转`0002`。\n * **你的输出**: `<state>3002</state>抱歉,我需要确认您的身份证后四位信息,请正面回答:您的身份证号码后四位是否是[系统预设的身份证号码的后四位]?`\n * 处理分段输入/号码不完整:\n * 如果用户只提供了一部分号码(如长度明显少于18位,例如“开头是110101...”),严禁让用户重新输入。\n * 你的行动: 复述你听到的部分,并引导补充。\n * 输出示例: <state>3002</state>好的,开头是110101,后面是多少呢?\n * 循环: 重复此“接收-引导”过程,直到拼凑出完整号码。\n * 记录并完整复述以供确认: 获得完整号码后,必须播报完整的号码进行二次确认。\n * 你的输出: <state>3002</state>好的,我跟您确认,您正确的身份证号码是[用户提供的完整新号码],对吗?\n * 处理二次确认:\n * 如果用户回答“对”,则用新号码覆盖预设值,进入下一步。\n * 如果用户回答“不对”,则重复步骤1“追问正确号码”。\n * 如果用户回答“这个”“试试”等短促无效词,重复二次确认问题,保持`3002`,不得转人工。\n\n **核实手机号**\n * **系统预设的手机号**: {{$fsWVpSkboqW3.gR0mkQpJ4Og8$}}\n * **你的输出**: `<state>3002</state>请问您的手机号码后四位是否是[系统预设手机号的后四位]?`\n * **处理逻辑**:\n * **如果用户回答“是”“是的”“对”“没错”**: 确认信息,进入**第二部分**。\n * **如果用户回答“不是”“不对”**: **追问** `“好的,那么请告诉我您正在使用的手机号码?”`\n * **如果用户回答短促/无关/ASR破碎**(如“这个”“试试”“嗯”“啊”“什么意思”):\n * 保持`3002`,不推进、不计入失败次数、不转`0002`。\n * **你的输出**: `<state>3002</state>抱歉,我需要确认您的手机号码后四位信息,请正面回答:您的手机号码后四位是否是[系统预设手机号的后四位]?`\n * 处理分段输入/号码不完整:\n * 如果用户只提供了一部分号码(如长度明显少于11位,例如“1380013...”),严禁让用户重新输入。\n * 你的行动: 复述你听到的部分,并引导补充。\n * 输出示例: <state>3002</state>收到,1380013,接着是多少?\n * 循环: 重复此“接收-引导”过程,直到拼凑出完整号码。\n * 记录并完整复述以供确认: 获得完整号码后,必须播报完整的号码进行二次确认。\n * 你的输出: <state>3002</state>跟您确认一下,您正在使用的手机号码是[用户提供的完整新号码],对吗?\n * 处理二次确认:\n * 如果用户回答“对”,则用新号码覆盖预设值,进入第二部分。\n * 如果用户回答“不对”,则重复步骤1“追问正确号码”。\n * 如果用户回答“这个”“试试”等短促无效词,重复二次确认问题,保持`3002`,不得转人工。\n\n## **第二部分:采集第二位驾驶员信息**\n\n **请求转接电话**\n * **触发**: 第一位驾驶员手机号核实完毕后。\n * **你的输出**: `<state>3002</state>好的,第一位驾驶员的信息已核实完毕。现在请您将电话交给另一位当事驾驶员,然后告诉我移交完毕。`\n\n **核实第二位驾驶员身份**\n * **你的输出**: `<state>3002</state>您好。请问车牌号为 {{$fsWVpSkboqW3.wHUmHTU2Rhlb$}} 的车辆是由您驾驶的吗?`\n * **处理逻辑**:\n * 如用户答“是”,则记录信息并进入下一步。\n * 如用户答“不是”,则必须要求更换通话人:`<state>3002</state>好的,为了完成核实,必须由该车驾驶员本人接听。请将电话交给他。` 然后**停留在此步骤**,直到确认为本人。\n * 如用户答短促/ASR破碎:保持`3002`,重复当前问题,不转人工。\n\n **询问姓名**\n * **你的输出**: `<state>3002</state>好的,驾驶员您好。请问您的姓名是?`\n\n **核实身份证**\n * **系统预设的身份证号码**: {{$fsWVpSkboqW3.cUeHVjpSQUr1$}}\n * **你的输出**: `<state>3002</state>好的,[用户姓名]。请问您的身份证号码后四位是否是[系统预设的身份证号码的后四位]?`\n * **处理逻辑**: 与第一位驾驶员相同,确认后进入下一步。短促/ASR无效输入保持`3002`重复当前问题,不得转人工。\n\n **核实手机号**\n * **系统预设的手机号**: {{$fsWVpSkboqW3.bXzM05j1bbwn$}}\n * **你的输出**: `<state>3002</state>请问您的手机号码后四位是否是[系统预设手机号的后四位]?`\n * **处理逻辑**: 与第一位驾驶员相同。确认后进入**第三部分**。短促/ASR无效输入保持`3002`重复当前问题,不得转人工。\n\n## **第三部分:结束流程**\n\n**完成核实并转接**\n * **触发条件**: 第二位驾驶员手机号核实完毕后。\n * **你的输出**: `<state>0000</state>好的,两位驾驶员的信息均已核实完毕。感谢您的配合,下面将转接人工继续处理。`\n\n---\n\n# 最终输出自检\n\n在每次输出前,必须完成以下检查:\n\n* 最终回复是否以 `<state>状态编码</state>` 开头。\n* 对“这个”“试试”“嗯”“啊”“什么意思”等短促/ASR无效输入,是否保持`3002`并重复当前问题,而不是输出`0002`/`0001`/`0003`。\n* 是否仅在同一问题连续 4 次**计入失败**后才允许`0002`。\n* 是否没有把短促词计入转人工失败次数。\n* 是否没有因孤立人伤词、车辆损坏词或 ASR 乱码误触发`0003`。\n",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"maxLength": 100000,
"isRichText": true
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteQA",
"renderTypeList": [
"settingDatasetQuotePrompt"
],
"label": "",
"debugLabel": "Dataset Reference",
"description": "",
"valueType": "datasetQuote",
"valueDesc": "",
"toolDescription": ""
},
{
"key": "fileUrlList",
"renderTypeList": [
"reference",
"input"
],
"label": "app:workflow.user_file_input",
"debugLabel": "File Link",
"valueType": "arrayString",
"value": [
[
"448745",
"userFiles"
]
],
"valueDesc": "",
"description": "app:workflow.user_file_input_desc",
"toolDescription": ""
},
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"toolDescription": "User Question",
"required": true,
"value": [
"yyB2uYEc8uKA",
"system_text"
],
"valueDesc": "",
"description": "",
"debugLabel": ""
}
],
"outputs": [
{
"id": "history",
"key": "history",
"required": true,
"label": "common:core.module.output.label.New context",
"description": "Splice the current reply content with the history records and return it as the new context",
"valueType": "chatHistory",
"valueDesc": "{\n obj: System | Human | AI;\n value: string;\n}[]",
"type": "static"
},
{
"id": "answerText",
"key": "answerText",
"required": true,
"label": "common:core.module.output.label.Ai response content",
"description": "Will be triggered after the stream reply is completed",
"valueType": "string",
"type": "static"
},
{
"id": "reasoningText",
"key": "reasoningText",
"required": false,
"label": "workflow:reasoning_text",
"valueType": "string",
"type": "static",
"invalid": true,
"description": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "k4pGjQ0cd04e",
"name": "解析状态#5",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 4885.7185029331395,
"y": 3121.0631098659824
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function extractStateAndContent(data1) {\n // Regular expression to match the <state>STATE</state>content format.\n const regex = /<state>(.*?)<\\/state>(.*)/;\n\n // Attempt to match the regex against the input data.\n const match = data1.match(regex);\n\n // If a match is found, extract the state (group 1) and content (group 2).\n if (match && match.length > 2) {\n return {\n state: match[1],\n content: match[2],\n };\n } else {\n // If no match is found, return null or an appropriate error object.\n return { state: null, content: null }; // Or return { state: null, content: null }; or throw an error.\n }\n}\n\nfunction main({data1}){\n const extractedContent = extractStateAndContent(data1);\n const state = extractedContent.state;\n const content = extractedContent.content;\n return {\n content: content,\n state: state\n };\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "string",
"canEdit": true,
"key": "data1",
"label": "data1",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"tBpOv2BTrsvA",
"answerText"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "state",
"valueType": "string",
"label": "state",
"valueDesc": "",
"description": ""
},
{
"id": "udJb1g6GMwOx",
"valueType": "string",
"type": "dynamic",
"key": "content",
"label": "content"
}
],
"catchError": true
},
{
"nodeId": "euRwFTajqcRO",
"name": "Condition#6",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 5853.466296984162,
"y": 3338.8749119355352
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"k4pGjQ0cd04e",
"qLUQfhG0ILRX"
],
"condition": "isEmpty"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "io07e4nO84k2",
"name": "Variable Update#5",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 7154.397349538959,
"y": 3465.415610920879
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"value": [
"k4pGjQ0cd04e",
"qLUQfhG0ILRX"
],
"valueType": "string",
"renderType": "reference"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "krClalszmq68",
"name": "Condition#7",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 3235.0533084067215,
"y": -785.7784434645952
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "OR",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2000"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2001"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2002"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2003"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "sUStm4ekiYNS",
"name": "Condition#9",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 3534.6261499054604,
"y": 226.47271316136192
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "OR",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2010"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2011"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2012"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2013"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2014"
},
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"condition": "equalTo",
"value": "2015"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "fsWVpSkboqW3",
"name": "Code Sandbox#7",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 2587.8879951603426,
"y": 2099.7067792182334
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function main({state}){\n return {driver1License: state.hphm1,\n driver1ID: state.driver1ID,\n driver1Phonenumber: state.driver1Phonenumber,\n driver2License: state.hphm2,\n driver2ID: state.driver2ID,\n driver2Phonenumber: state.driver2Phonenumber\n }\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "object",
"canEdit": true,
"key": "state",
"label": "state",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"value": [
"VARIABLE_NODE_ID",
"state"
]
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "driver1ID",
"valueType": "string",
"label": "driver1ID",
"valueDesc": "",
"description": ""
},
{
"id": "gR0mkQpJ4Og8",
"type": "dynamic",
"key": "driver1Phonenumber",
"valueType": "string",
"label": "driver1Phonenumber",
"valueDesc": "",
"description": ""
},
{
"id": "wHUmHTU2Rhlb",
"valueType": "string",
"type": "dynamic",
"key": "driver2License",
"label": "driver2License"
},
{
"id": "cUeHVjpSQUr1",
"valueType": "string",
"type": "dynamic",
"key": "driver2ID",
"label": "driver2ID"
},
{
"id": "rWawP4BJxuH1",
"valueType": "string",
"type": "dynamic",
"key": "driver1License",
"label": "driver1License"
},
{
"id": "bXzM05j1bbwn",
"valueType": "string",
"type": "dynamic",
"key": "driver2Phonenumber",
"label": "driver2Phonenumber"
}
],
"catchError": true
},
{
"nodeId": "sJHCC6Uh5j2u",
"name": "Code Sandbox#10",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 3135,
"y": 945
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function main({state}){\n return {driver1License: state.hphm1,\n driver1ID: state.driver1ID,\n driver1Phonenumber: state.driver1Phonenumber,\n driver2License: state.hphm2,\n driver2ID: state.driver2ID,\n driver2Phonenumber: state.driver2Phonenumber\n }\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "object",
"canEdit": true,
"key": "state",
"label": "state",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"value": [
"VARIABLE_NODE_ID",
"state"
]
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "driver1ID",
"valueType": "string",
"label": "driver1ID",
"valueDesc": "",
"description": ""
},
{
"id": "gR0mkQpJ4Og8",
"type": "dynamic",
"key": "driver1Phonenumber",
"valueType": "string",
"label": "driver1Phonenumber",
"valueDesc": "",
"description": ""
},
{
"id": "wHUmHTU2Rhlb",
"valueType": "string",
"type": "dynamic",
"key": "driver2License",
"label": "driver2License"
},
{
"id": "cUeHVjpSQUr1",
"valueType": "string",
"type": "dynamic",
"key": "driver2ID",
"label": "driver2ID"
},
{
"id": "rWawP4BJxuH1",
"valueType": "string",
"type": "dynamic",
"key": "driver1License",
"label": "driver1License"
},
{
"id": "bXzM05j1bbwn",
"valueType": "string",
"type": "dynamic",
"key": "driver2Phonenumber",
"label": "driver2Phonenumber"
}
],
"catchError": true
},
{
"nodeId": "mbP4DRmqf3qT",
"name": "Code Sandbox#9",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 4885.7185029331395,
"y": 168.96756250333965
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function main({state}){\n return {driver1License: state.hphm1,\n driver1ID: state.driver1ID,\n driver1Phonenumber: state.driver1Phonenumber,\n driver2License: state.hphm2,\n driver2ID: state.driver2ID,\n driver2Phonenumber: state.driver2Phonenumber\n }\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "object",
"canEdit": true,
"key": "state",
"label": "state",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"value": [
"VARIABLE_NODE_ID",
"state"
]
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "driver1ID",
"valueType": "string",
"label": "driver1ID",
"valueDesc": "",
"description": ""
},
{
"id": "gR0mkQpJ4Og8",
"type": "dynamic",
"key": "driver1Phonenumber",
"valueType": "string",
"label": "driver1Phonenumber",
"valueDesc": "",
"description": ""
},
{
"id": "wHUmHTU2Rhlb",
"valueType": "string",
"type": "dynamic",
"key": "driver2License",
"label": "driver2License"
},
{
"id": "cUeHVjpSQUr1",
"valueType": "string",
"type": "dynamic",
"key": "driver2ID",
"label": "driver2ID"
},
{
"id": "rWawP4BJxuH1",
"valueType": "string",
"type": "dynamic",
"key": "driver1License",
"label": "driver1License"
},
{
"id": "bXzM05j1bbwn",
"valueType": "string",
"type": "dynamic",
"key": "driver2Phonenumber",
"label": "driver2Phonenumber"
}
],
"catchError": true
},
{
"nodeId": "i2xYvUNWE7Zv",
"name": "Code Sandbox#9",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 5138.581271863097,
"y": -999.6250337216792
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function main({state}){\n return {driver1License: state.hphm1,\n driver1ID: state.driver1ID,\n driver1Phonenumber: state.driver1Phonenumber,\n driver2License: state.hphm2,\n driver2ID: state.driver2ID,\n driver2Phonenumber: state.driver2Phonenumber\n }\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "object",
"canEdit": true,
"key": "state",
"label": "state",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"value": [
"VARIABLE_NODE_ID",
"state"
]
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "driver1ID",
"valueType": "string",
"label": "driver1ID",
"valueDesc": "",
"description": ""
},
{
"id": "gR0mkQpJ4Og8",
"type": "dynamic",
"key": "driver1Phonenumber",
"valueType": "string",
"label": "driver1Phonenumber",
"valueDesc": "",
"description": ""
},
{
"id": "wHUmHTU2Rhlb",
"valueType": "string",
"type": "dynamic",
"key": "driver2License",
"label": "driver2License"
},
{
"id": "cUeHVjpSQUr1",
"valueType": "string",
"type": "dynamic",
"key": "driver2ID",
"label": "driver2ID"
},
{
"id": "rWawP4BJxuH1",
"valueType": "string",
"type": "dynamic",
"key": "driver1License",
"label": "driver1License"
},
{
"id": "bXzM05j1bbwn",
"valueType": "string",
"type": "dynamic",
"key": "driver2Phonenumber",
"label": "driver2Phonenumber"
}
],
"catchError": true
},
{
"nodeId": "z5y22KY72pOV",
"name": "解析状态#10",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 9390,
"y": -2109
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function extractStateAndContent(data1) {\n // Regular expression to match the <state>STATE</state>content format.\n const regex = /<state>(.*?)<\\/state>(.*)/;\n\n // Attempt to match the regex against the input data.\n const match = data1.match(regex);\n\n // If a match is found, extract the state (group 1) and content (group 2).\n if (match && match.length > 2) {\n return {\n state: match[1],\n content: match[2],\n };\n } else {\n // If no match is found, return null or an appropriate error object.\n return { state: null, content: null }; // Or return { state: null, content: null }; or throw an error.\n }\n}\n\nfunction main({data1}){\n const extractedContent = extractStateAndContent(data1);\n const state = extractedContent.state;\n const content = extractedContent.content;\n return {\n content: content,\n state: state\n };\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "string",
"canEdit": true,
"key": "data1",
"label": "data1",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"mCWJYYru8qPR",
"answerText"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "state",
"valueType": "string",
"label": "state",
"valueDesc": "",
"description": ""
},
{
"id": "udJb1g6GMwOx",
"valueType": "string",
"type": "dynamic",
"key": "content",
"label": "content"
}
],
"catchError": true
},
{
"nodeId": "q3IxKaOW5gdV",
"name": "解析状态#9",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 9495,
"y": 495
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function extractStateAndContent(data1) {\n // Regular expression to match the <state>STATE</state>content format.\n const regex = /<state>(.*?)<\\/state>(.*)/;\n\n // Attempt to match the regex against the input data.\n const match = data1.match(regex);\n\n // If a match is found, extract the state (group 1) and content (group 2).\n if (match && match.length > 2) {\n return {\n state: match[1],\n content: match[2],\n };\n } else {\n // If no match is found, return null or an appropriate error object.\n return { state: null, content: null }; // Or return { state: null, content: null }; or throw an error.\n }\n}\n\nfunction main({data1}){\n const extractedContent = extractStateAndContent(data1);\n const state = extractedContent.state;\n const content = extractedContent.content;\n return {\n content: content,\n state: state\n };\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "string",
"canEdit": true,
"key": "data1",
"label": "data1",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"k318kWi02OU9",
"answerText"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "state",
"valueType": "string",
"label": "state",
"valueDesc": "",
"description": ""
},
{
"id": "udJb1g6GMwOx",
"valueType": "string",
"type": "dynamic",
"key": "content",
"label": "content"
}
],
"catchError": true
},
{
"nodeId": "kbba6T0A0cME",
"name": "Assigned Reply#2",
"intro": "This module can directly reply with a specified content. Commonly used for guidance or prompts. Non-string content will be converted to string for output.",
"avatar": "core/workflow/template/reply",
"flowNodeType": "answerNode",
"position": {
"x": 2091.8142617646504,
"y": 1167.9675625033396
},
"version": "481",
"inputs": [
{
"key": "text",
"renderTypeList": [
"textarea",
"reference"
],
"valueType": "any",
"required": true,
"label": "common:core.module.input.label.Response content",
"description": "common:core.module.input.description.Response content",
"placeholder": "common:core.module.input.description.Response content",
"value": "<state>{{$VARIABLE_NODE_ID.status_code$}}</state>所有信息以收集完毕,正在转接人工,请稍候",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"isRichText": false,
"maxLength": 100000
}
],
"outputs": []
},
{
"nodeId": "mzDpCKsdDlZd",
"name": "Assigned Reply#3",
"intro": "This module can directly reply with a specified content. Commonly used for guidance or prompts. Non-string content will be converted to string for output.",
"avatar": "core/workflow/template/reply",
"flowNodeType": "answerNode",
"position": {
"x": 1873.8183718024648,
"y": 1684.8778651206744
},
"version": "481",
"inputs": [
{
"key": "text",
"renderTypeList": [
"textarea",
"reference"
],
"valueType": "any",
"required": true,
"label": "common:core.module.input.label.Response content",
"description": "common:core.module.input.description.Response content",
"placeholder": "common:core.module.input.description.Response content",
"value": "<state>{{$VARIABLE_NODE_ID.status_code$}}</state>正在转接人工,请稍候",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"isRichText": false,
"maxLength": 100000
}
],
"outputs": []
},
{
"nodeId": "xWEWw9JV6GFa",
"name": "Assigned Reply#3",
"intro": "This module can directly reply with a specified content. Commonly used for guidance or prompts. Non-string content will be converted to string for output.",
"avatar": "core/workflow/template/reply",
"flowNodeType": "answerNode",
"position": {
"x": 555,
"y": -2010
},
"version": "481",
"inputs": [
{
"key": "text",
"renderTypeList": [
"textarea",
"reference"
],
"valueType": "any",
"required": true,
"label": "common:core.module.input.label.Response content",
"description": "common:core.module.input.description.Response content",
"placeholder": "common:core.module.input.description.Response content",
"value": "<state>1001</state>您好,这里是无锡交警,我将为您远程处理交通事故。请将人员撤离至路侧安全区域,开启危险报警双闪灯、放置三角警告牌、做好安全防护,谨防二次事故伤害。若您已经准备好了,请点击继续办理,如需人工服务,请说转人工。",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"isRichText": false,
"maxLength": 100000
}
],
"outputs": []
},
{
"nodeId": "mErEqe061uAd",
"name": "Variable Update#6",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 585,
"y": -2505
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"is_first_message"
],
"value": [
"",
""
],
"valueType": "boolean",
"renderType": "input"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "ffV7U6t2Wrkc",
"name": "Condition#9",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 436.7701670253358,
"y": -1391.7660436128006
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"is_first_message"
],
"condition": "equalTo",
"value": "true"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "dDTqgmBFNDPh0DwX",
"name": "Condition#10",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 3075,
"y": -3165
},
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"zl8sNWrf"
],
"condition": "equalTo",
"value": "true",
"valueType": "input"
}
]
}
],
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"valueDesc": "",
"description": ""
}
]
},
{
"nodeId": "znnXN7FuRHfCwJmw",
"name": "文本内容提取事故信息",
"intro": "Can extract specified data from text, such as SQL statements, search keywords, code, etc.",
"avatar": "core/workflow/template/extractJson",
"flowNodeType": "contentExtract",
"showStatus": true,
"position": {
"x": 4140,
"y": -3510.019607132754
},
"version": "4.9.2",
"inputs": [
{
"key": "model",
"renderTypeList": [
"selectLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"required": true,
"valueType": "string",
"llmModelType": "extractFields",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "description",
"renderTypeList": [
"textarea",
"reference"
],
"valueType": "string",
"label": "workflow:extraction_requirements_description",
"description": "workflow:extraction_requirements_description_detail",
"placeholder": "workflow:extraction_requirements_placeholder",
"value": "你是交通事故信息提取器。根据对话历史,对照「目前表单」,只提取本次可以更新的字段。\n\n目前表单为:\n{{$VARIABLE_NODE_ID.bNJkeXot$}}\n\n# 可更新字段(仅允许这些 key)\n- has_injury: boolean,是否有人受伤\n- has_non_motor_vehicle_hit: boolean,有无非机动车(电瓶车/自行车等)被撞\n- accident_time: string,事故发生时间\n- is_on_scene: boolean,报警人是否在事故现场\n- accident_cause: string,事故发生原因(追尾、变道、未让行、违反信号、逆行、倒车、溜车、撞停、超速、其他)\n- vehicle_count: number,事故车辆数量(机动车辆数)\n\n# 最高原则(必须遵守)\n1. **只根据对话中的明确表述提取,禁止推断、联想、补全。**\n2. 对话里没问到、用户也没主动明确说过的字段,**一律不返回**。\n3. 不得因为“报警人在描述事故细节”“口吻像在现场”“常识上应该在现场”等理由,自行填写 `is_on_scene` 或其他字段。\n4. 不得用目前表单已有值、流程默认假设、角色设定来“补齐”未确认字段。\n\n# 明确证据要求(逐字段)\n只有出现可直接对应的明确证据时才可提取;否则跳过该字段。\n\n- has_injury:用户明确说有人伤/无人伤(如“有人受伤了”“人没事”“没有流血”)。仅说“车坏了”“撞得很严重”不等于人伤。\n- has_non_motor_vehicle_hit:用户明确说撞到/没撞到电瓶车、自行车等非机动车。未提及则不返回。\n- accident_time:用户明确给出可换算的时间,或“现在/刚刚/刚才”等相对时间。未给时间不返回。\n- is_on_scene:仅当用户明确回答在/不在现场(如“我还在现场”“我已经离开了”“不在现场”)才返回。 \n **禁止**因未询问现场、或用户只是在描述事故,就默认 `true`。\n- accident_cause:用户明确说明原因或可明确归入枚举的原因。猜测不返回。\n- vehicle_count:用户明确说出车辆数量(如“两辆车”)。未明确数字不返回。\n\n# 提取规则\n1. 仅提取「相对目前表单可以更新」的数据:\n - 对话新出现、或与目前表单不同、或目前为空且现已明确 → 写入 formUpdate\n - 与目前表单相同、未明确提及、无法确认 → 不返回该字段\n2. 不确定就不返回;宁缺毋滥。\n3. 布尔字段:明确肯定→true,明确否定→false;含糊、暗示、间接信息不返回。\n4. accident_time 格式固定:YYYY年M月D日H点m分 \n 示例:2026年6月17日10点51分 \n - “现在/刚刚/刚才”按当前系统时间换算 \n - 无法精确到分则不返回\n5. vehicle_count 只填明确数字;accident_cause 优先归入枚举,无法归类用“其他”或用户原意简述。\n\n# 反例(这些情况都不得提取)\n- 没问“是否在事故现场”,用户也没说在不在 → 不返回 is_on_scene\n- 用户说“两车追尾”,未说人伤 → 不返回 has_injury\n- 用户说“刚才撞了”,未说非机动车 → 不返回 has_non_motor_vehicle_hit\n- 仅从语气/场景感觉“应该在现场” → 禁止返回 is_on_scene:true\n\n# 输出要求\n只输出一个 JSON 字符串到 formUpdate,内容为待更新字段的对象。\n无任何可更新字段时返回:{}\n\n输出示例:\n{\"accident_time\":\"2026年6月17日10点51分\",\"vehicle_count\":2}\n{\"has_injury\":false,\"has_non_motor_vehicle_hit\":true}\n{}",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"debugLabel": "",
"toolDescription": ""
},
{
"key": "content",
"renderTypeList": [
"reference",
"textarea"
],
"label": "workflow:text_to_extract",
"required": true,
"valueType": "string",
"toolDescription": "Content to Retrieve",
"value": [
"448745",
"userChatInput"
],
"debugLabel": ""
},
{
"key": "extractKeys",
"renderTypeList": [
"custom"
],
"label": "",
"valueType": "any",
"description": "workflow:target_fields_description",
"value": [
{
"valueType": "object",
"required": true,
"defaultValue": "",
"desc": "表单更新数据",
"key": "formUpdate",
"enum": ""
}
],
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "success",
"key": "success",
"label": "workflow:full_field_extraction",
"required": true,
"description": "Returns true when all fields are fully extracted (success includes model extraction or using default values)",
"valueType": "boolean",
"type": "static",
"valueDesc": ""
},
{
"id": "fields",
"key": "fields",
"label": "workflow:complete_extraction_result",
"required": true,
"description": "A JSON string, e.g., {\"name\":\"YY\",\"Time\":\"2023/7/2 18:00\"}",
"valueType": "string",
"type": "static",
"valueDesc": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"valueDesc": "",
"description": ""
},
{
"id": "t304GMFxQwoG9Gqk",
"key": "formUpdate",
"label": "Extraction Results-formUpdate",
"valueType": "object",
"type": "static"
}
],
"catchError": false
},
{
"nodeId": "ywRJRfv7ytNbITE9",
"name": "更新表单",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 5160,
"y": -3465
},
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "js",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"valueType": "string",
"value": "function main({ form, formUpdate }) {\n // 1. 规范化 form:必须是普通对象,否则用空对象\n const baseForm =\n form && typeof form === \"object\" && !Array.isArray(form) ? form : {};\n\n // 2. 规范化 formUpdate:LLM 可能返回 JSON 字符串,需先解析\n let updateData = formUpdate;\n if (typeof updateData === \"string\") {\n try {\n updateData = JSON.parse(updateData);\n } catch (e) {\n updateData = {};\n }\n }\n if (!updateData || typeof updateData !== \"object\" || Array.isArray(updateData)) {\n updateData = {};\n }\n\n // 判断是否为有效更新值(空字符串 / null / undefined 视为无效)\n function hasMeaningfulValue(v) {\n return !(v === undefined || v === null || v === \"\");\n }\n\n // 比较新旧值是否相同(数字与数字字符串视为相等,如 2 与 \"2\")\n function isSameValue(a, b) {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (\n (typeof a === \"number\" || typeof b === \"number\") &&\n !Number.isNaN(Number(a)) &&\n !Number.isNaN(Number(b))\n ) {\n return Number(a) === Number(b);\n }\n return String(a).trim() === String(b).trim();\n }\n\n // 3. 合并完整表单,并收集真正发生变化的字段\n const formNew = { ...baseForm }; // 完整合并后的表单(写回变量)\n const changed = {}; // 仅包含实际更新的字段(给前端)\n\n // 只遍历表单已有字段,LLM 多提取的无关 key 直接忽略\n for (const key of Object.keys(baseForm)) {\n if (!Object.prototype.hasOwnProperty.call(updateData, key)) continue;\n\n const next = updateData[key];\n\n // 无效值:不更新\n if (!hasMeaningfulValue(next)) continue;\n\n // 与现有值相同:筛掉,不计入更新\n if (isSameValue(baseForm[key], next)) continue;\n\n // 真正有变化:写入完整表单,并记入变更集\n formNew[key] = next;\n changed[key] = next;\n }\n\n return {\n formNew, // 完整合并结果 → 更新 {{$VARIABLE_NODE_ID.bNJkeXot$}}\n formUpdate: changed // 仅变更字段 → 下游 / SSE 推送\n };\n}",
"debugLabel": "",
"toolDescription": ""
},
{
"renderTypeList": [
"reference"
],
"valueType": "object",
"canEdit": true,
"key": "formUpdate",
"label": "formUpdate",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"znnXN7FuRHfCwJmw",
"t304GMFxQwoG9Gqk"
]
},
{
"renderTypeList": [
"reference"
],
"valueType": "object",
"canEdit": true,
"key": "form",
"label": "form",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"VARIABLE_NODE_ID",
"bNJkeXot"
]
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"valueDesc": "",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"valueType": "string",
"type": "error",
"valueDesc": "",
"description": ""
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "formNew",
"valueType": "object",
"label": "formNew",
"valueDesc": "",
"description": ""
},
{
"id": "vk38Nc",
"type": "dynamic",
"key": "formUpdate",
"label": "formUpdate",
"valueType": "object",
"valueDesc": "",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "zbwLMJrAICiypHwX",
"name": "Variable Update#7",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 6420,
"y": -3030
},
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"bNJkeXot"
],
"value": [
"ywRJRfv7ytNbITE9",
"qLUQfhG0ILRX"
],
"valueType": "object",
"renderType": "reference"
}
],
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "hg1kXAGZQXdySAwt",
"name": "Condition#11",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 6060,
"y": -525
},
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"kEF7CNwD"
],
"condition": "equalTo",
"value": "direct",
"valueType": "input"
}
]
}
],
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"valueDesc": "",
"description": ""
}
]
},
{
"nodeId": "wzURZDVRotLrao1G",
"name": "Condition#12",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 5985,
"y": 630
},
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"VARIABLE_NODE_ID",
"kEF7CNwD"
],
"condition": "equalTo",
"value": "direct",
"valueType": "input"
}
]
}
],
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"valueDesc": "",
"description": ""
}
]
},
{
"nodeId": "hSsBFAZ03mSHSUQm",
"name": "单车拍照#6",
"intro": "AI Large Model Chat",
"avatar": "core/workflow/template/aiChat",
"flowNodeType": "chatNode",
"showStatus": true,
"position": {
"x": 8415,
"y": -975
},
"version": "4.9.7",
"inputs": [
{
"key": "model",
"renderTypeList": [
"settingLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"valueType": "string",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "temperature",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "maxToken",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "isResponseAnswerText",
"renderTypeList": [
"hidden"
],
"label": "",
"value": true,
"valueType": "boolean",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatQuoteRole",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "system",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteTemplate",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quotePrompt",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatVision",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatReasoning",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatTopP",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatStopSign",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatResponseFormat",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatJsonSchema",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "systemPrompt",
"renderTypeList": [
"textarea",
"reference"
],
"max": 3000,
"valueType": "string",
"label": "common:core.ai.Prompt",
"description": "common:core.app.tip.systemPromptTip",
"placeholder": "common:core.app.tip.chatNodeSystemPromptTip",
"value": "# 角色\n\n你现在进入了**事故现场拍照引导**阶段。你的角色是一名严谨、清晰的AI现场勘查引导员。你的任务是严格按照预设流程引导当事人。在此期间,你的行为模式会根据具体步骤发生改变。\n\n# 最高原则(不可违背的绝对指令)\n\n**全局中断指令(最高优先级)**:\n\n在对话的**任何阶段**,如果用户的输入包含明确的转人工意图(例如:“转人工”、“找人工”、“人工客服”),你必须**立即停止**当前所有流程,并**只输出**:\n\n`<state>0001</state>好的,正在为您转接人工客服,请稍候。`\n\n**客户端连续拍摄识别失败指令(高优先级)**:\n\n在单车拍照流程的任何阶段,只要收到一次格式为:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n的客户端输入,就表示客户端已经完成3次拍摄识别重试,并且3次均未成功。\n\n你必须:\n\n1. 立即停止当前单车拍照流程。\n2. 不得继续要求用户重新拍摄。\n3. 不得进入下一个拍照或信息确认阶段。\n4. 不得重复当前状态的拍照引导指令。\n5. 无论“原因”部分是什么内容,都必须只输出:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n该指令的优先级高于`【拍摄完成】`、用户自然语言回答和当前步骤的其他处理规则。\n\n**严格的输出格式**:\n\n你的所有回复都**必须**以 `<state>状态编码</state>` 开头。\n\n**混合流程锁定协议(Hybrid Process Lock Protocol)**:\n\n- **严格顺序**:你必须严格按照 `2000 -> 2001 -> 2002 -> 2003 -> 2004 -> 2005` 的顺序执行任务,绝不可以跳过或打乱。\n\n- **行为模式A(针对步骤2000、2001、2002、2003)**:\n - **唯一正常推进触发**:只有在接收到系统输入`【拍摄完成】`时,你才能推进到流程的下一步。\n - **客户端连续失败触发**:如果接收到`【客户端连续3次拍摄识别失败:原因】`,立即停止当前流程并返回0005。\n - **无效输入处理**:对于既不是`【拍摄完成】`,也不是`【客户端连续3次拍摄识别失败:原因】`的输入(包括用户的任何口头回答),你都必须重复当前状态的完整引导指令。\n\n- **行为模式B(针对步骤2004、2005)**:\n - **触发**:你不再等待`【拍摄完成】`指令。你需要理解用户的自然语言回答。\n - **客户端连续失败触发**:如果接收到`【客户端连续3次拍摄识别失败:原因】`,立即停止当前流程并返回0005。\n - **无效输入处理**:如果用户的回答与当前问题无关,你必须重复当前状态的完整指令。\n\n# 状态编码表(拍照引导阶段)\n\n| 状态编码 | 引导指令 / 任务 |\n|:---|:---|\n| **2000** | 请对准车辆前方看清车牌,拍摄车前方照片。 |\n| **2001** | 请对准车辆碰撞部位拍摄照片。 |\n| **2002** | 请对准被撞物品拍摄照片。 |\n| **2003** | 请切换摄像头对准本人拍摄一张正面照片。 |\n| **2004** | **确认与纠错合并**:请您核对车牌号码是否为{{$i2xYvUNWE7Zv.rWawP4BJxuH1$}}。如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。 |\n| **2005** | 请确认车损位置是在车辆前方、后方还是侧面? |\n| **0000** | **核实成功**:在所有信息核实完毕后,准备转接人工。 |\n| **0001** | **全局转人工**:用户主动要求转人工。 |\n| **0002** | **流程异常转人工**:未能成功记录相关信息,为确保信息准确,转人工处理。 |\n| **0005** | **客户端连续拍摄识别失败**:客户端完成3次拍摄识别重试后仍未成功,停止自动拍照流程并转人工。 |\n\n---\n\n# 客户端连续拍摄识别失败示例\n\n**输入**:\n\n`【客户端连续3次拍摄识别失败:未识别到完整车牌】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**输入**:\n\n`【客户端连续3次拍摄识别失败:照片上传失败】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**输入**:\n\n`【客户端连续3次拍摄识别失败:当前无法使用摄像头】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n---\n\n# 任务流程(体现混合模式)\n\n## 流程起点:步骤2000\n\n**你的初始输出**:\n\n`<state>2000</state>请对准车辆前方看清车牌,拍摄车前方照片。`\n\n---\n\n## 步骤2000 -> 步骤2001(行为模式A)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2001</state>请对准车辆碰撞部位拍摄照片。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**,例如“好的”“拍好了”:\n\n**你的输出(重复指令)**:\n\n`<state>2000</state>请对准车辆前方看清车牌,拍摄车前方照片。`\n\n---\n\n## 步骤2001 -> 步骤2002(行为模式A)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2002</state>请对准被撞物品拍摄照片。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**,例如“OK”“已经拍了”:\n\n**你的输出(重复指令)**:\n\n`<state>2001</state>请对准车辆碰撞部位拍摄照片。`\n\n---\n\n## 步骤2002 -> 步骤2003(行为模式A)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2003</state>请切换摄像头对准本人拍摄一张正面照片。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**:\n\n**你的输出(重复指令)**:\n\n`<state>2002</state>请对准被撞物品拍摄照片。`\n\n---\n\n## 步骤2003 -> 步骤2004(行为模式A切换到行为模式B)\n\n**当系统输入为**:\n\n`【拍摄完成】`\n\n**你的输出**:\n\n`<state>2004</state>请您核对车牌号码是否为{{$i2xYvUNWE7Zv.rWawP4BJxuH1$}}。如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n**当用户输入为任何其他内容时**:\n\n**你的输出(重复指令)**:\n\n`<state>2003</state>请切换摄像头对准本人拍摄一张正面照片。`\n\n---\n\n## 步骤2004 -> 步骤2005(合并后的确认与纠错流程)\n\n**AI当前状态为2004。**\n\n### 场景A:用户确认车牌正确\n\n**当用户输入为**:“是的”“没错”“对的”等肯定回答。\n\n**你的输出(继续主流程)**:\n\n`<state>2005</state>好的,车牌号已确认。请确认车损位置是在车辆前方、后方还是侧面?`\n\n### 场景B:用户提供新的车牌号\n\n**当用户输入为**:“不对,车牌号是苏BXXXXX”“我的车牌是沪A12345”等直接提供新信息的回答。\n\n**你的输出(记录新信息并继续主流程)**:\n\n`<state>2005</state>收到,已将正确的车牌号记录为苏BXXXXX。现在,请确认车损位置是在车辆前方、后方还是侧面?`\n\n### 场景C:用户回答不清晰或无关\n\n**当用户输入为**:“不是这辆车”“不对”“什么意思?”等否定但未提供新信息或无关回答。\n\n**你的输出(重复当前问题,引导用户)**:\n\n`<state>2004</state>请您核对车牌号码是否为{{$i2xYvUNWE7Zv.rWawP4BJxuH1$}}。如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n\n### 场景D:收到客户端连续失败事件\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n\n---\n\n# 流程终点:步骤2005(行为模式B)\n\n**AI当前状态为2005。**\n\n### 用户提供有效车损位置\n\n**当用户输入为**:“是车子的左前方。”等有效自然语言回答。\n\n**你的输出**:\n\n`<state>0000</state>好的,已完成所有信息核实,正在为您转接人工客服,请稍候。`\n\n### 用户第一次输入无效\n\n**当用户输入为**:“什么意思?”等无效自然语言回答。\n\n**你的输出(重复完整指令)**:\n\n`<state>2005</state>请确认车损位置是在车辆前方、后方还是侧面?`\n\n### 用户第二次输入仍然无效\n\n**你的输出(转接人工)**:\n\n`<state>0002</state>抱歉,未能成功记录车损位置,为确保信息准确,将为您转接人工处理。`\n\n### 收到客户端连续失败事件\n\n**当系统输入为**:\n\n`【客户端连续3次拍摄识别失败:原因】`\n\n**你的输出**:\n\n`<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"maxLength": 100000,
"isRichText": true
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteQA",
"renderTypeList": [
"settingDatasetQuotePrompt"
],
"label": "",
"debugLabel": "Dataset Reference",
"description": "",
"valueType": "datasetQuote",
"valueDesc": "",
"toolDescription": ""
},
{
"key": "fileUrlList",
"renderTypeList": [
"reference",
"input"
],
"label": "app:workflow.user_file_input",
"debugLabel": "File Link",
"valueType": "arrayString",
"value": [
[
"448745",
"userFiles"
]
],
"valueDesc": "",
"description": "app:workflow.user_file_input_desc",
"toolDescription": ""
},
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"toolDescription": "User Question",
"required": true,
"value": [
"yyB2uYEc8uKA",
"system_text"
],
"valueDesc": "",
"description": "",
"debugLabel": ""
}
],
"outputs": [
{
"id": "history",
"key": "history",
"required": true,
"label": "common:core.module.output.label.New context",
"description": "Splice the current reply content with the history records and return it as the new context",
"valueType": "chatHistory",
"valueDesc": "{\n obj: System | Human | AI;\n value: string;\n}[]",
"type": "static"
},
{
"id": "answerText",
"key": "answerText",
"required": true,
"label": "common:core.module.output.label.Ai response content",
"description": "Will be triggered after the stream reply is completed",
"valueType": "string",
"type": "static"
},
{
"id": "reasoningText",
"key": "reasoningText",
"required": false,
"label": "workflow:reasoning_text",
"valueType": "string",
"type": "static",
"invalid": true,
"description": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "ylvN5qwzsw8j3LnT",
"name": "解析状态#11",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 9420,
"y": -930
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function extractStateAndContent(data1) {\n // Regular expression to match the <state>STATE</state>content format.\n const regex = /<state>(.*?)<\\/state>(.*)/;\n\n // Attempt to match the regex against the input data.\n const match = data1.match(regex);\n\n // If a match is found, extract the state (group 1) and content (group 2).\n if (match && match.length > 2) {\n return {\n state: match[1],\n content: match[2],\n };\n } else {\n // If no match is found, return null or an appropriate error object.\n return { state: null, content: null }; // Or return { state: null, content: null }; or throw an error.\n }\n}\n\nfunction main({data1}){\n const extractedContent = extractStateAndContent(data1);\n const state = extractedContent.state;\n const content = extractedContent.content;\n return {\n content: content,\n state: state\n };\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "string",
"canEdit": true,
"key": "data1",
"label": "data1",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"hSsBFAZ03mSHSUQm",
"answerText"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "state",
"valueType": "string",
"label": "state",
"valueDesc": "",
"description": ""
},
{
"id": "udJb1g6GMwOx",
"valueType": "string",
"type": "dynamic",
"key": "content",
"label": "content"
}
],
"catchError": true
},
{
"nodeId": "fSWy5uYoZealvm87",
"name": "Condition#13",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 10245,
"y": -705
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"ylvN5qwzsw8j3LnT",
"qLUQfhG0ILRX"
],
"condition": "isEmpty"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "zB5oqzVbnlVsBaxB",
"name": "Variable Update#8",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 11175,
"y": -653
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"value": [
"ylvN5qwzsw8j3LnT",
"qLUQfhG0ILRX"
],
"valueType": "string",
"renderType": "reference"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
},
{
"nodeId": "gXEVZvyKwp23cyQT",
"name": "双车拍照#7",
"intro": "AI Large Model Chat",
"avatar": "core/workflow/template/aiChat",
"flowNodeType": "chatNode",
"showStatus": true,
"position": {
"x": 8625,
"y": 1635
},
"version": "4.9.7",
"inputs": [
{
"key": "model",
"renderTypeList": [
"settingLLMModel",
"reference"
],
"label": "common:core.module.input.label.aiModel",
"valueType": "string",
"value": [
"VARIABLE_NODE_ID",
"mC3bEH2A"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"selectedTypeIndex": 1
},
{
"key": "temperature",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "maxToken",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "isResponseAnswerText",
"renderTypeList": [
"hidden"
],
"label": "",
"value": true,
"valueType": "boolean",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatQuoteRole",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"value": "system",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteTemplate",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quotePrompt",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatVision",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatReasoning",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "boolean",
"value": true,
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatTopP",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "number",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatStopSign",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatResponseFormat",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "aiChatJsonSchema",
"renderTypeList": [
"hidden"
],
"label": "",
"valueType": "string",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "systemPrompt",
"renderTypeList": [
"textarea",
"reference"
],
"max": 3000,
"valueType": "string",
"label": "common:core.ai.Prompt",
"description": "common:core.app.tip.systemPromptTip",
"placeholder": "common:core.app.tip.chatNodeSystemPromptTip",
"value": "# 角色\n你现在进入了**双车事故现场拍照与核验**阶段。你的角色是一名严谨、精确的AI现场勘查引导员。你的唯一任务是严格按照预设流程,引导当事人完成一系列拍照和信息确认。你的行为模式会根据具体步骤发生改变。\n\n# 最高原则 (不可违背的绝对指令)\n\n **全局中断指令 (最高优先级)**: 在对话的**任何阶段**,如果用户的输入包含明确的转人工意图(例如:“转人工”、“找人工”、“人工客服”),你必须**立即停止**当前所有流程,并**只输出** `<state>0001</state>好的,正在为您转接人工客服,请稍候。`\n\n **客户端连续拍摄识别失败指令**:\n- 在对话的**任何阶段**,如果接收到格式为 `【客户端连续3次拍摄识别失败:原因】` 的客户端输入,例如:\n - `【客户端连续3次拍摄识别失败:未识别到完整车牌】`\n - `【客户端连续3次拍摄识别失败:摄像头启动失败】`\n - `【客户端连续3次拍摄识别失败:图片过于模糊】`\n- 你必须理解这是客户端已经连续三次无法完成拍摄或识别。\n- 无论当前处于 `2010` 至 `2016` 中的哪个步骤,都必须**立即停止当前拍照与核验流程**。\n- 你必须**只输出**:\n `<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n- 不得继续原步骤、不得重复拍摄指令、不得要求用户再次拍摄,也不得自行尝试解决失败原因。\n- 只要收到一次符合上述格式的输入,就立即进入 `0005` 状态,不需要累计或判断失败次数。失败次数由客户端负责统计。\n\n **严格的输出格式**: 你的所有回复都**必须**以 `<state>状态编码</state>` 开头。\n\n **混合流程锁定协议 (Hybrid Process Lock Protocol)**:\n- **严格顺序**: 你必须严格按照 `2010 -> 2011 -> 2012 -> 2013 -> 2014 -> 2015 -> 2016` 的顺序执行任务。\n- **例外情况**: 全局转人工指令、客户端连续拍摄识别失败指令和流程异常转人工不受上述顺序限制。\n- **行为模式A (拍照监控,适用于步骤 2010 至 2015)**:\n - **唯一触发**: **只有在接收到 `【拍摄完成】` 指令时**,才能推进到下一步。\n - **无效输入处理**: 对于既不是 `【拍摄完成】`,也不符合全局中断指令或客户端连续拍摄识别失败指令的输入,你都必须**重复当前状态的完整引导指令**。\n- **行为模式B (确认与纠错,专门适用于步骤 2016)**:\n - **任务**: 你的任务是核对一个预设的车牌号,并能直接接收并记录正确的号码。你需要**理解用户的肯定、否定、直接提供新信息或无关回答**。\n - **触发**: 你不再等待 `【拍摄完成】` 指令。\n - **如果回答无关**: **重复 `2016` 状态的完整指令**进行澄清。\n\n#### # 状态编码表 (双车拍照引导阶段)\n\n| 状态编码 | 引导指令 / 任务 |\n|:---|:---|\n| **2010** | 请对准第一辆车的侧前方,看清车牌拍摄。 |\n| **2011** | 请对准第一辆车碰撞部位拍摄。 |\n| **2012** | 请对准第二辆车碰撞部位拍摄。 |\n| **2013** | 请对准第二方车辆侧后方,看清车牌拍摄。 |\n| **2014** | 请拍摄另一方驾驶人的正面照片。 |\n| **2015** | 请切换前置摄像头对准本人拍摄一张正面照片。 |\n| **2016** | **(确认与纠错合并)** 请您核对,事故一方车辆的车牌号是否为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}?如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。 |\n| **0000** | **(核实成功)** 在所有信息核实完毕后,准备转接人工。 |\n| **0001** | **(全局转人工)** 好的,正在为您转接人工客服,请稍候。 |\n| **0002** | **(流程异常转人工)** 抱歉,未能成功记录车牌号,为确保信息准确,将为您转接人工处理。 |\n| **0005** | **(客户端连续拍摄识别失败转人工)** 多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。 |\n\n---\n\n# 任务流程\n\n**流程起点:(由主流程转入)**\n- **你的初始输出**: `<state>2010</state>请对准第一辆车的侧前方,看清车牌拍摄。`\n\n---\n\n**客户端连续拍摄识别失败处理(适用于整个流程)**\n- **当客户端输入格式为**: `【客户端连续3次拍摄识别失败:原因】`\n- **例如**: `【客户端连续3次拍摄识别失败:未识别到完整车牌】`\n- **你的输出**: `<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`\n- 输出 `0005` 后立即终止当前拍照与核验流程。\n\n---\n\n**步骤 2010 -> 2011 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2011</state>请对准第一辆车碰撞部位拍摄。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令,例如:“拍了”)\n - **你的输出(重复指令)**: `<state>2010</state>请对准第一辆车的侧前方,看清车牌拍摄。`\n\n---\n\n**步骤 2011 -> 2012 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2012</state>请对准第二辆车碰撞部位拍摄。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2011</state>请对准第一辆车碰撞部位拍摄。`\n\n---\n\n**步骤 2012 -> 2013 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2013</state>请对准第二方车辆侧后方,看清车牌拍摄。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2012</state>请对准第二辆车碰撞部位拍摄。`\n\n---\n\n**步骤 2013 -> 2014 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2014</state>请拍摄另一方驾驶人的正面照片。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2013</state>请对准第二方车辆侧后方,看清车牌拍摄。`\n\n---\n\n**步骤 2014 -> 2015 (行为模式A)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2015</state>请切换前置摄像头对准本人拍摄一张正面照片。`\n- **当系统输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2014</state>请拍摄另一方驾驶人的正面照片。`\n\n---\n\n**步骤 2015 -> 2016 (行为模式A -> B的切换点)**\n- **当系统输入为**: `【拍摄完成】`\n - **你的输出**: `<state>2016</state>请您核对,事故一方车辆的车牌号是否为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}?如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n- **当用户输入为**: **任何其他内容**(不包括全局中断指令和客户端连续拍摄识别失败指令)\n - **你的输出(重复指令)**: `<state>2015</state>请切换前置摄像头对准本人拍摄一张正面照片。`\n\n---\n\n**流程终点:步骤 2016 (合并后的确认与纠错流程)**\n- **(AI当前状态为2016)**\n\n- **场景A: 用户确认车牌正确**\n - **当用户输入为**: “是的”“没错”“对的”等肯定回答\n - **你的输出(结束流程)**: `<state>0000</state>核实成功,所有信息已确认完毕,正在为您准备转接人工。`\n\n- **场景B: 用户提供新的车牌号**\n - **当用户输入为**: “不对,车牌号是苏BXXXXX”“我的车牌是沪A12345”等直接提供新信息的回答\n - **你的输出(记录新信息并结束流程)**: `<state>0000</state>收到,已记录您提供的正确车牌号。核实成功,所有信息已确认完毕,正在为您准备转接人工。`\n\n- **场景C: 用户回答不清晰或无关(第一次)**\n - **当用户输入为**: “不是这辆车”“不对”“什么意思?”等否定但未提供新信息或无关回答\n - **你的输出(重复当前问题,引导用户)**: `<state>2016</state>请您核对,事故一方车辆的车牌号是否为{{$mbP4DRmqf3qT.rWawP4BJxuH1$}}?如果正确请回答“是的”,如果错误,请直接说出或输入正确的车牌号码。`\n\n- **场景D: 用户回答仍不清晰(第二次)**\n - **当用户输入仍为**: 无关内容\n - **你的输出(转接人工)**: `<state>0002</state>抱歉,未能成功记录车牌号,为确保信息准确,将为您转接人工处理。`\n\n- **场景E: 客户端报告连续拍摄识别失败**\n - **当输入格式为**: `【客户端连续3次拍摄识别失败:原因】`\n - **你的输出(立即转接人工)**: `<state>0005</state>多次拍摄识别仍未成功,为确保信息准确,正在为您转接人工处理,请稍候。`",
"valueDesc": "",
"debugLabel": "",
"toolDescription": "",
"maxLength": 100000,
"isRichText": true
},
{
"key": "history",
"renderTypeList": [
"numberInput",
"reference"
],
"valueType": "chatHistory",
"label": "common:core.module.input.label.chat history",
"description": "workflow:max_dialog_rounds",
"required": true,
"min": 0,
"max": 50,
"value": 50,
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "quoteQA",
"renderTypeList": [
"settingDatasetQuotePrompt"
],
"label": "",
"debugLabel": "Dataset Reference",
"description": "",
"valueType": "datasetQuote",
"valueDesc": "",
"toolDescription": ""
},
{
"key": "fileUrlList",
"renderTypeList": [
"reference",
"input"
],
"label": "app:workflow.user_file_input",
"debugLabel": "File Link",
"valueType": "arrayString",
"value": [
[
"448745",
"userFiles"
]
],
"valueDesc": "",
"description": "app:workflow.user_file_input_desc",
"toolDescription": ""
},
{
"key": "userChatInput",
"renderTypeList": [
"reference",
"textarea"
],
"valueType": "string",
"label": "workflow:user_question",
"toolDescription": "User Question",
"required": true,
"value": [
"yyB2uYEc8uKA",
"system_text"
],
"valueDesc": "",
"description": "",
"debugLabel": ""
}
],
"outputs": [
{
"id": "history",
"key": "history",
"required": true,
"label": "common:core.module.output.label.New context",
"description": "Splice the current reply content with the history records and return it as the new context",
"valueType": "chatHistory",
"valueDesc": "{\n obj: System | Human | AI;\n value: string;\n}[]",
"type": "static"
},
{
"id": "answerText",
"key": "answerText",
"required": true,
"label": "common:core.module.output.label.Ai response content",
"description": "Will be triggered after the stream reply is completed",
"valueType": "string",
"type": "static"
},
{
"id": "reasoningText",
"key": "reasoningText",
"required": false,
"label": "workflow:reasoning_text",
"valueType": "string",
"type": "static",
"invalid": true,
"description": ""
},
{
"id": "system_error_text",
"key": "system_error_text",
"type": "error",
"valueType": "string",
"label": "workflow:error_text",
"description": ""
}
],
"catchError": false
},
{
"nodeId": "vtG8IQYG071kclcl",
"name": "解析状态#12",
"intro": "Execute a simple script code, usually for complex data processing.",
"avatar": "core/workflow/template/codeRun",
"flowNodeType": "code",
"showStatus": true,
"position": {
"x": 9435,
"y": 1710
},
"version": "482",
"inputs": [
{
"key": "system_addInputParam",
"renderTypeList": [
"addInputParam"
],
"valueType": "dynamic",
"label": "",
"required": false,
"description": "workflow:these_variables_will_be_input_parameters_for_code_execution",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"valueDesc": "",
"debugLabel": "",
"toolDescription": ""
},
{
"key": "codeType",
"renderTypeList": [
"hidden"
],
"label": "",
"value": "js",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"key": "code",
"renderTypeList": [
"custom"
],
"label": "",
"value": "function extractStateAndContent(data1) {\n // Regular expression to match the <state>STATE</state>content format.\n const regex = /<state>(.*?)<\\/state>(.*)/;\n\n // Attempt to match the regex against the input data.\n const match = data1.match(regex);\n\n // If a match is found, extract the state (group 1) and content (group 2).\n if (match && match.length > 2) {\n return {\n state: match[1],\n content: match[2],\n };\n } else {\n // If no match is found, return null or an appropriate error object.\n return { state: null, content: null }; // Or return { state: null, content: null }; or throw an error.\n }\n}\n\nfunction main({data1}){\n const extractedContent = extractStateAndContent(data1);\n const state = extractedContent.state;\n const content = extractedContent.content;\n return {\n content: content,\n state: state\n };\n}",
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": "",
"valueType": "string"
},
{
"renderTypeList": [
"reference"
],
"valueType": "string",
"canEdit": true,
"key": "data1",
"label": "data1",
"customInputConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": true
},
"required": true,
"value": [
"gXEVZvyKwp23cyQT",
"answerText"
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "system_rawResponse",
"key": "system_rawResponse",
"label": "workflow:full_response_data",
"valueType": "object",
"type": "static",
"description": ""
},
{
"id": "error",
"key": "error",
"label": "workflow:error_text",
"description": "Error information of code execution, returns empty on success",
"valueType": "string",
"type": "error"
},
{
"id": "system_addOutputParam",
"key": "system_addOutputParam",
"type": "dynamic",
"valueType": "dynamic",
"label": "",
"customFieldConfig": {
"selectValueTypeList": [
"string",
"number",
"boolean",
"object",
"arrayString",
"arrayNumber",
"arrayBoolean",
"arrayObject",
"arrayAny",
"any",
"chatHistory",
"datasetQuote",
"dynamic",
"selectDataset",
"selectApp"
],
"showDescription": false,
"showDefaultValue": false
},
"description": "Pass the object returned in the code as output to the next nodes. The variable name needs to correspond to the return key.",
"valueDesc": ""
},
{
"id": "qLUQfhG0ILRX",
"type": "dynamic",
"key": "state",
"valueType": "string",
"label": "state",
"valueDesc": "",
"description": ""
},
{
"id": "udJb1g6GMwOx",
"valueType": "string",
"type": "dynamic",
"key": "content",
"label": "content"
}
],
"catchError": true
},
{
"nodeId": "hts2Ex8HM0rIENRc",
"name": "Condition#14",
"intro": "Execute different branches based on conditions.",
"avatar": "core/workflow/template/ifelse",
"flowNodeType": "ifElseNode",
"showStatus": true,
"position": {
"x": 10320,
"y": 1890
},
"version": "481",
"inputs": [
{
"key": "ifElseList",
"renderTypeList": [
"hidden"
],
"valueType": "any",
"label": "",
"value": [
{
"condition": "AND",
"list": [
{
"variable": [
"vtG8IQYG071kclcl",
"qLUQfhG0ILRX"
],
"condition": "isEmpty"
}
]
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": [
{
"id": "ifElseResult",
"key": "ifElseResult",
"label": "workflow:judgment_result",
"valueType": "string",
"type": "static",
"description": ""
}
]
},
{
"nodeId": "gZ3XQXpB22Hfzuy6",
"name": "Variable Update#9",
"intro": "Can update the output value of a specified node or update global variables",
"avatar": "core/workflow/template/variableUpdate",
"flowNodeType": "variableUpdate",
"showStatus": false,
"position": {
"x": 11175,
"y": 1965
},
"version": "481",
"inputs": [
{
"key": "updateList",
"valueType": "any",
"label": "",
"renderTypeList": [
"hidden"
],
"value": [
{
"variable": [
"VARIABLE_NODE_ID",
"status_code"
],
"value": [
"vtG8IQYG071kclcl",
"qLUQfhG0ILRX"
],
"valueType": "string",
"renderType": "reference"
}
],
"valueDesc": "",
"description": "",
"debugLabel": "",
"toolDescription": ""
}
],
"outputs": []
}
],
"edges": [
{
"source": "yQaBxfrWjbRr",
"target": "agZJVmMQXusk",
"sourceHandle": "yQaBxfrWjbRr-source-right",
"targetHandle": "agZJVmMQXusk-target-left"
},
{
"source": "agZJVmMQXusk",
"target": "bZmg3Lym5gwx",
"sourceHandle": "agZJVmMQXusk-source-right",
"targetHandle": "bZmg3Lym5gwx-target-left"
},
{
"source": "bZmg3Lym5gwx",
"target": "dx6aMFcqYQ05",
"sourceHandle": "bZmg3Lym5gwx-source-IF",
"targetHandle": "dx6aMFcqYQ05-target-left"
},
{
"source": "yyB2uYEc8uKA",
"target": "ujpL4HfmaYju",
"sourceHandle": "yyB2uYEc8uKA-source-right",
"targetHandle": "ujpL4HfmaYju-target-left"
},
{
"source": "ujpL4HfmaYju",
"target": "yQaBxfrWjbRr",
"sourceHandle": "ujpL4HfmaYju-source-IF",
"targetHandle": "yQaBxfrWjbRr-target-left"
},
{
"source": "flCMEFjHRDaL",
"target": "cOeMtHzfTu96",
"sourceHandle": "flCMEFjHRDaL-source-right",
"targetHandle": "cOeMtHzfTu96-target-left"
},
{
"source": "cOeMtHzfTu96",
"target": "i5yBQcW0h923",
"sourceHandle": "cOeMtHzfTu96-source-right",
"targetHandle": "i5yBQcW0h923-target-left"
},
{
"source": "tBpOv2BTrsvA",
"target": "k4pGjQ0cd04e",
"sourceHandle": "tBpOv2BTrsvA-source-right",
"targetHandle": "k4pGjQ0cd04e-target-left"
},
{
"source": "k4pGjQ0cd04e",
"target": "euRwFTajqcRO",
"sourceHandle": "k4pGjQ0cd04e-source-right",
"targetHandle": "euRwFTajqcRO-target-left"
},
{
"source": "euRwFTajqcRO",
"target": "io07e4nO84k2",
"sourceHandle": "euRwFTajqcRO-source-ELSE",
"targetHandle": "io07e4nO84k2-target-left"
},
{
"source": "ujpL4HfmaYju",
"target": "krClalszmq68",
"sourceHandle": "ujpL4HfmaYju-source-ELSE IF 1",
"targetHandle": "krClalszmq68-target-left"
},
{
"source": "ujpL4HfmaYju",
"target": "sUStm4ekiYNS",
"sourceHandle": "ujpL4HfmaYju-source-ELSE IF 2",
"targetHandle": "sUStm4ekiYNS-target-left"
},
{
"source": "ujpL4HfmaYju",
"target": "fsWVpSkboqW3",
"sourceHandle": "ujpL4HfmaYju-source-ELSE IF 4",
"targetHandle": "fsWVpSkboqW3-target-left"
},
{
"source": "fsWVpSkboqW3",
"target": "tBpOv2BTrsvA",
"sourceHandle": "fsWVpSkboqW3-source-right",
"targetHandle": "tBpOv2BTrsvA-target-left"
},
{
"source": "ujpL4HfmaYju",
"target": "sJHCC6Uh5j2u",
"sourceHandle": "ujpL4HfmaYju-source-ELSE IF 3",
"targetHandle": "sJHCC6Uh5j2u-target-left"
},
{
"source": "sJHCC6Uh5j2u",
"target": "flCMEFjHRDaL",
"sourceHandle": "sJHCC6Uh5j2u-source-right",
"targetHandle": "flCMEFjHRDaL-target-left"
},
{
"source": "sUStm4ekiYNS",
"target": "mbP4DRmqf3qT",
"sourceHandle": "sUStm4ekiYNS-source-IF",
"targetHandle": "mbP4DRmqf3qT-target-left"
},
{
"source": "sUStm4ekiYNS",
"target": "mbP4DRmqf3qT",
"sourceHandle": "sUStm4ekiYNS-source-ELSE",
"targetHandle": "mbP4DRmqf3qT-target-left"
},
{
"source": "krClalszmq68",
"target": "i2xYvUNWE7Zv",
"sourceHandle": "krClalszmq68-source-IF",
"targetHandle": "i2xYvUNWE7Zv-target-left"
},
{
"source": "krClalszmq68",
"target": "i2xYvUNWE7Zv",
"sourceHandle": "krClalszmq68-source-ELSE",
"targetHandle": "i2xYvUNWE7Zv-target-left"
},
{
"source": "mCWJYYru8qPR",
"target": "z5y22KY72pOV",
"sourceHandle": "mCWJYYru8qPR-source-right",
"targetHandle": "z5y22KY72pOV-target-left"
},
{
"source": "z5y22KY72pOV",
"target": "scVwEa7YfVQx",
"sourceHandle": "z5y22KY72pOV-source-right",
"targetHandle": "scVwEa7YfVQx-target-left"
},
{
"source": "k318kWi02OU9",
"target": "q3IxKaOW5gdV",
"sourceHandle": "k318kWi02OU9-source-right",
"targetHandle": "q3IxKaOW5gdV-target-left"
},
{
"source": "q3IxKaOW5gdV",
"target": "liinRLFVMXdr",
"sourceHandle": "q3IxKaOW5gdV-source-right",
"targetHandle": "liinRLFVMXdr-target-left"
},
{
"source": "scVwEa7YfVQx",
"target": "fRpm3NcVwT21",
"sourceHandle": "scVwEa7YfVQx-source-ELSE",
"targetHandle": "fRpm3NcVwT21-target-left"
},
{
"source": "liinRLFVMXdr",
"target": "gyB85PcTuq7J",
"sourceHandle": "liinRLFVMXdr-source-IF",
"targetHandle": "gyB85PcTuq7J-target-left"
},
{
"source": "i5yBQcW0h923",
"target": "aln2gMrtCYOo",
"sourceHandle": "i5yBQcW0h923-source-IF",
"targetHandle": "aln2gMrtCYOo-target-left"
},
{
"source": "ujpL4HfmaYju",
"target": "kbba6T0A0cME",
"sourceHandle": "ujpL4HfmaYju-source-ELSE IF 5",
"targetHandle": "kbba6T0A0cME-target-left"
},
{
"source": "ujpL4HfmaYju",
"target": "mzDpCKsdDlZd",
"sourceHandle": "ujpL4HfmaYju-source-ELSE IF 6",
"targetHandle": "mzDpCKsdDlZd-target-left"
},
{
"source": "xWEWw9JV6GFa",
"target": "mErEqe061uAd",
"sourceHandle": "xWEWw9JV6GFa-source-right",
"targetHandle": "mErEqe061uAd-target-left"
},
{
"source": "448745",
"target": "ffV7U6t2Wrkc",
"sourceHandle": "448745-source-right",
"targetHandle": "ffV7U6t2Wrkc-target-left"
},
{
"source": "ffV7U6t2Wrkc",
"target": "xWEWw9JV6GFa",
"sourceHandle": "ffV7U6t2Wrkc-source-IF",
"targetHandle": "xWEWw9JV6GFa-target-left"
},
{
"source": "ffV7U6t2Wrkc",
"target": "yyB2uYEc8uKA",
"sourceHandle": "ffV7U6t2Wrkc-source-ELSE",
"targetHandle": "yyB2uYEc8uKA-target-left"
},
{
"source": "agZJVmMQXusk",
"target": "bZmg3Lym5gwx",
"sourceHandle": "agZJVmMQXusk-source_catch-right",
"targetHandle": "bZmg3Lym5gwx-target-left"
},
{
"source": "cOeMtHzfTu96",
"target": "i5yBQcW0h923",
"sourceHandle": "cOeMtHzfTu96-source_catch-right",
"targetHandle": "i5yBQcW0h923-target-left"
},
{
"source": "k4pGjQ0cd04e",
"target": "euRwFTajqcRO",
"sourceHandle": "k4pGjQ0cd04e-source_catch-right",
"targetHandle": "euRwFTajqcRO-target-left"
},
{
"source": "fsWVpSkboqW3",
"target": "tBpOv2BTrsvA",
"sourceHandle": "fsWVpSkboqW3-source_catch-right",
"targetHandle": "tBpOv2BTrsvA-target-left"
},
{
"source": "sJHCC6Uh5j2u",
"target": "flCMEFjHRDaL",
"sourceHandle": "sJHCC6Uh5j2u-source_catch-right",
"targetHandle": "flCMEFjHRDaL-target-left"
},
{
"source": "z5y22KY72pOV",
"target": "scVwEa7YfVQx",
"sourceHandle": "z5y22KY72pOV-source_catch-right",
"targetHandle": "scVwEa7YfVQx-target-left"
},
{
"source": "q3IxKaOW5gdV",
"target": "liinRLFVMXdr",
"sourceHandle": "q3IxKaOW5gdV-source_catch-right",
"targetHandle": "liinRLFVMXdr-target-left"
},
{
"source": "dDTqgmBFNDPh0DwX",
"target": "znnXN7FuRHfCwJmw",
"sourceHandle": "dDTqgmBFNDPh0DwX-source-IF",
"targetHandle": "znnXN7FuRHfCwJmw-target-left"
},
{
"source": "znnXN7FuRHfCwJmw",
"target": "ywRJRfv7ytNbITE9",
"sourceHandle": "znnXN7FuRHfCwJmw-source-right",
"targetHandle": "ywRJRfv7ytNbITE9-target-left"
},
{
"source": "ywRJRfv7ytNbITE9",
"target": "zbwLMJrAICiypHwX",
"sourceHandle": "ywRJRfv7ytNbITE9-source-right",
"targetHandle": "zbwLMJrAICiypHwX-target-left"
},
{
"source": "yyB2uYEc8uKA",
"target": "dDTqgmBFNDPh0DwX",
"sourceHandle": "yyB2uYEc8uKA-source-right",
"targetHandle": "dDTqgmBFNDPh0DwX-target-left"
},
{
"source": "i2xYvUNWE7Zv",
"target": "hg1kXAGZQXdySAwt",
"sourceHandle": "i2xYvUNWE7Zv-source-right",
"targetHandle": "hg1kXAGZQXdySAwt-target-left"
},
{
"source": "i2xYvUNWE7Zv",
"target": "hg1kXAGZQXdySAwt",
"sourceHandle": "i2xYvUNWE7Zv-source_catch-right",
"targetHandle": "hg1kXAGZQXdySAwt-target-left"
},
{
"source": "hg1kXAGZQXdySAwt",
"target": "mCWJYYru8qPR",
"sourceHandle": "hg1kXAGZQXdySAwt-source-IF",
"targetHandle": "mCWJYYru8qPR-target-left"
},
{
"source": "mbP4DRmqf3qT",
"target": "wzURZDVRotLrao1G",
"sourceHandle": "mbP4DRmqf3qT-source-right",
"targetHandle": "wzURZDVRotLrao1G-target-left"
},
{
"source": "mbP4DRmqf3qT",
"target": "wzURZDVRotLrao1G",
"sourceHandle": "mbP4DRmqf3qT-source_catch-right",
"targetHandle": "wzURZDVRotLrao1G-target-left"
},
{
"source": "wzURZDVRotLrao1G",
"target": "k318kWi02OU9",
"sourceHandle": "wzURZDVRotLrao1G-source-IF",
"targetHandle": "k318kWi02OU9-target-left"
},
{
"source": "hg1kXAGZQXdySAwt",
"target": "hSsBFAZ03mSHSUQm",
"sourceHandle": "hg1kXAGZQXdySAwt-source-ELSE",
"targetHandle": "hSsBFAZ03mSHSUQm-target-left"
},
{
"source": "hSsBFAZ03mSHSUQm",
"target": "ylvN5qwzsw8j3LnT",
"sourceHandle": "hSsBFAZ03mSHSUQm-source-right",
"targetHandle": "ylvN5qwzsw8j3LnT-target-left"
},
{
"source": "ylvN5qwzsw8j3LnT",
"target": "fSWy5uYoZealvm87",
"sourceHandle": "ylvN5qwzsw8j3LnT-source-right",
"targetHandle": "fSWy5uYoZealvm87-target-left"
},
{
"source": "ylvN5qwzsw8j3LnT",
"target": "fSWy5uYoZealvm87",
"sourceHandle": "ylvN5qwzsw8j3LnT-source_catch-right",
"targetHandle": "fSWy5uYoZealvm87-target-left"
},
{
"source": "fSWy5uYoZealvm87",
"target": "zB5oqzVbnlVsBaxB",
"sourceHandle": "fSWy5uYoZealvm87-source-ELSE",
"targetHandle": "zB5oqzVbnlVsBaxB-target-left"
},
{
"source": "wzURZDVRotLrao1G",
"target": "gXEVZvyKwp23cyQT",
"sourceHandle": "wzURZDVRotLrao1G-source-ELSE",
"targetHandle": "gXEVZvyKwp23cyQT-target-left"
},
{
"source": "gXEVZvyKwp23cyQT",
"target": "vtG8IQYG071kclcl",
"sourceHandle": "gXEVZvyKwp23cyQT-source-right",
"targetHandle": "vtG8IQYG071kclcl-target-left"
},
{
"source": "vtG8IQYG071kclcl",
"target": "hts2Ex8HM0rIENRc",
"sourceHandle": "vtG8IQYG071kclcl-source-right",
"targetHandle": "hts2Ex8HM0rIENRc-target-left"
},
{
"source": "vtG8IQYG071kclcl",
"target": "hts2Ex8HM0rIENRc",
"sourceHandle": "vtG8IQYG071kclcl-source_catch-right",
"targetHandle": "hts2Ex8HM0rIENRc-target-left"
},
{
"source": "hts2Ex8HM0rIENRc",
"target": "gZ3XQXpB22Hfzuy6",
"sourceHandle": "hts2Ex8HM0rIENRc-source-ELSE",
"targetHandle": "gZ3XQXpB22Hfzuy6-target-left"
}
],
"chatConfig": {
"welcomeText": "",
"variables": [
{
"id": "nnh2u7",
"key": "status_code",
"label": "status_code",
"type": "input",
"description": "",
"required": false,
"valueType": "string",
"list": [
{
"value": "",
"label": ""
}
],
"defaultValue": "1001",
"enums": [
{
"value": "",
"label": ""
}
],
"icon": "core/workflow/inputType/customVariable"
},
{
"id": "rskg77",
"key": "state",
"label": "state",
"type": "custom",
"description": "",
"required": false,
"valueType": "object",
"list": [
{
"value": "",
"label": ""
}
],
"defaultValue": "{\"is_first_message\": true, \"user_is_ready\": false, \"accident_info_complete\": false,\n\"driver_info_check\": false,\n\"drivers_info_check\": false,\n\"driver_info_complete\": false,\n\"drivers_info_complete\": false,\n\"hpzl1\": \"小型蓝色车辆\",\n\"hphm1\": \"沪C1121\",\n\"driver1Phonenumber\": \"12918881212\",\n\"driver1ID\": \"310111198812223323\",\n\"hpzl2\": \"小型黄色车辆\",\n\"hphm2\": \"沪C1122\",\n\"driver2Phonenumber\": \"13918881212\",\n\"driver2ID\": \"310111198912223323\",\n\"user_no_response\": 0}",
"enums": [
{
"value": "",
"label": ""
}
]
},
{
"id": "5e7q2c",
"key": "is_first_message",
"label": "is_first_message",
"type": "custom",
"description": "",
"required": false,
"valueType": "boolean",
"list": [
{
"value": "",
"label": ""
}
],
"defaultValue": "true",
"enums": [
{
"value": "",
"label": ""
}
],
"icon": "core/workflow/inputType/customVariable"
},
{
"type": "switch",
"key": "zl8sNWrf",
"label": "needFormUpdate",
"valueType": "boolean",
"description": "是否更新表单数据",
"required": false,
"defaultValue": false
},
{
"type": "custom",
"key": "bNJkeXot",
"label": "form",
"valueType": "object",
"description": "表单数据",
"required": false,
"defaultValue": "{\r\n \"has_injury\": \"\",\r\n \"has_non_motor_vehicle_hit\": \"\",\r\n \"accident_time\": \"\",\r\n \"is_on_scene\": \"\",\r\n \"accident_cause\": \"\",\r\n \"vehicle_count\": \"\"\r\n}"
},
{
"type": "select",
"key": "kEF7CNwD",
"label": "clientMode",
"valueType": "string",
"description": "",
"required": false,
"defaultValue": "direct",
"list": [
{
"label": "direct",
"value": "direct"
},
{
"label": "browser_addon",
"value": "browser_addon"
}
]
},
{
"type": "llmSelect",
"key": "mC3bEH2A",
"label": "modelName",
"valueType": "string",
"description": "",
"required": false,
"defaultValue": "deepseek-v4.1-flash"
}
],
"scheduledTriggerConfig": {
"cronString": "",
"timezone": "Asia/Shanghai",
"defaultPrompt": ""
},
"_id": "68cb747c86197e19f7339dc3"
}
}