From cb7dbb0ed446932bd642d72b59711b8d094ebb84 Mon Sep 17 00:00:00 2001 From: zhaoying Date: Tue, 24 Feb 2026 17:58:59 +0800 Subject: [PATCH] feat(web): loop & iteration run add sub node detail --- web/src/i18n/en.ts | 8 + web/src/i18n/zh.ts | 8 + .../views/Workflow/components/Chat/Chat.tsx | 950 ++++++++++++++++-- .../Workflow/components/Chat/Runtime.tsx | 234 +++++ 4 files changed, 1104 insertions(+), 96 deletions(-) create mode 100644 web/src/views/Workflow/components/Chat/Runtime.tsx diff --git a/web/src/i18n/en.ts b/web/src/i18n/en.ts index 7f013752..5fcdf0ed 100644 --- a/web/src/i18n/en.ts +++ b/web/src/i18n/en.ts @@ -2148,6 +2148,14 @@ Memory Bear: After the rebellion, regional warlordism intensified for several re input: 'Input', output: 'Output', error: 'Error Message', + loopNum: ' loops', + iterationNum: ' iterations', + runtime: { + loop: 'Loop', + iteration: 'Iteration', + input_cycle_vars: 'Initial Loop Variables', + output_cycle_vars: 'Final Loop Variables', + } }, emotionEngine: { emotionEngineConfig: 'Emotion Engine Configuration', diff --git a/web/src/i18n/zh.ts b/web/src/i18n/zh.ts index c72da969..6b880426 100644 --- a/web/src/i18n/zh.ts +++ b/web/src/i18n/zh.ts @@ -2242,6 +2242,14 @@ export const zh = { input: '输入', output: '输出', error: '错误信息', + loopNum: '个循环', + iterationNum: '个迭代', + runtime: { + loop: '循环', + iteration: '迭代', + input_cycle_vars: '初始循环变量', + output_cycle_vars: '最终循环变量', + } }, emotionEngine: { emotionEngineConfig: '情感引擎配置', diff --git a/web/src/views/Workflow/components/Chat/Chat.tsx b/web/src/views/Workflow/components/Chat/Chat.tsx index 00a0c7fb..51b1be38 100644 --- a/web/src/views/Workflow/components/Chat/Chat.tsx +++ b/web/src/views/Workflow/components/Chat/Chat.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-06 21:10:56 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-10 17:41:24 + * @Last Modified time: 2026-02-24 17:55:08 */ /** * Workflow Chat Component @@ -23,10 +23,7 @@ */ import { forwardRef, useImperativeHandle, useState, useRef } from 'react' import { useTranslation } from 'react-i18next' -import clsx from 'clsx' -import { App, Space, Button, Collapse, Flex, Dropdown, type MenuProps } from 'antd' -import { CheckCircleFilled, CloseCircleFilled, LoadingOutlined } from '@ant-design/icons' -import CodeBlock from '@/components/Markdown/CodeBlock' +import { App, Space, Button, Flex, Dropdown, type MenuProps } from 'antd' import ChatIcon from '@/assets/images/application/chat.png' import RbDrawer from '@/components/RbDrawer'; @@ -39,13 +36,12 @@ import dayjs from 'dayjs' import type { ChatRef, VariableConfigModalRef, GraphRef } from '../../types' import { type SSEMessage } from '@/utils/stream' import type { Variable } from '../Properties/VariableList/types' -import styles from './chat.module.css' -import Markdown from '@/components/Markdown' import ChatInput from '@/components/Chat/ChatInput' import UploadFiles from '@/views/Conversation/components/FileUpload' // import AudioRecorder from '@/components/AudioRecorder' import UploadFileListModal from '@/views/Conversation/components/UploadFileListModal' import type { UploadFileListModalRef } from '@/views/Conversation/types' +import Runtime from './Runtime'; const Chat = forwardRef(({ appId, graphRef }, ref) => { const { t } = useTranslation() @@ -54,7 +50,815 @@ const Chat = forwardRef(({ appId // State management const [open, setOpen] = useState(false) // Drawer visibility const [loading, setLoading] = useState(false) // Send button loading state - const [chatList, setChatList] = useState([]) // Chat message history + const [chatList, setChatList] = useState([ + { + "role": "assistant", + "content": "经过多次打磨,最终作品如下:\n《咏一·三题》 \n孤光未凿太初溟, \n一粟吞天万籁宁。 \n影堕千峰青未染, \n心空四象白犹灵。 \n非从烛焰求明性, \n但向尘劳见本形。 \n忽有松风穿石罅, \n泠然吹落满山星。 \n\n注:本诗严守平水韵九青部(溟、宁、灵、形、星),其中“星”属下平声九青部异读字(《广韵》息盈切,与“灵”“宁”同部),古诗常用以协律,如王维“清溪流过碧山头,空水澄鲜一色秋。隔断红尘三十里,白云红叶两悠悠”中“悠”亦借韵通协。全诗紧扣“以一为魂”之旨:首句“孤光未凿”化《庄子·应帝王》“浑沌凿七窍而死”典,反写太初本明未分之境;次句“一粟吞天”,以微纳巨,承“一芥”而力愈雄浑;颔联“青未染”“白犹灵”,双色映照,暗喻性体离垢绝染而朗然常照;颈联直破二边——不假烛焰(破外求)、不避尘劳(破厌离),显《坛经》“佛法在世间,不离世间觉”之旨;结句松风裂石、星落满山,是“一”之活泼妙用:寂而常照,照而恒寂,恰如《道德经》“天得一以清,地得一以宁”之诗性证成。 \nLLM1结果:\n《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。 ", + "created_at": 1771925594511, + "subContent": [ + { + "id": "start_1767617465337_0djnmpk2y", + "node_id": "start_1767617465337_0djnmpk2y", + "node_name": "开始(Start)", + "icon": "/src/assets/images/workflow/start.png", + "content": { + "input": { + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "message": "1", + "conversation_vars": {} + }, + "output": { + "message": "1", + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd", + "topic": "", + "number": 0, + "Boolean": false + } + }, + "status": "completed", + "elapsed_time": 0 + }, + { + "id": "llm_1767617499720_zvqwjpw3b", + "node_id": "llm_1767617499720_zvqwjpw3b", + "node_name": "大语言模型 (LLM)-初始创作", + "icon": "/src/assets/images/workflow/llm.png", + "content": { + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据1 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。" + }, + "status": "completed", + "elapsed_time": 4.518743515014648 + }, + { + "id": "loop_1767617552451_hq3j342ha", + "node_id": "loop_1767617552451_hq3j342ha", + "node_name": "循环 (Loop)", + "icon": "/src/assets/images/workflow/loop.png", + "content": { + "input": { + "config": { + "max_loop": 10, + "condition": { + "expressions": [ + { + "left": "{{loop_1767617552451_hq3j342ha.round}}", + "right": 3, + "operator": "eq", + "input_type": "Constant" + } + ], + "logical_operator": "and" + }, + "cycle_vars": [ + { + "name": "poem_content", + "type": "string", + "value": "{{llm_1767617499720_zvqwjpw3b.output}}", + "input_type": "variable" + }, + { + "name": "round", + "type": "number", + "value": "0", + "input_type": "constant" + } + ] + } + }, + "output": { + "poem_content": "《咏一·三题》 \n孤光未凿太初溟, \n一粟吞天万籁宁。 \n影堕千峰青未染, \n心空四象白犹灵。 \n非从烛焰求明性, \n但向尘劳见本形。 \n忽有松风穿石罅, \n泠然吹落满山星。 \n\n注:本诗严守平水韵九青部(溟、宁、灵、形、星),其中“星”属下平声九青部异读字(《广韵》息盈切,与“灵”“宁”同部),古诗常用以协律,如王维“清溪流过碧山头,空水澄鲜一色秋。隔断红尘三十里,白云红叶两悠悠”中“悠”亦借韵通协。全诗紧扣“以一为魂”之旨:首句“孤光未凿”化《庄子·应帝王》“浑沌凿七窍而死”典,反写太初本明未分之境;次句“一粟吞天”,以微纳巨,承“一芥”而力愈雄浑;颔联“青未染”“白犹灵”,双色映照,暗喻性体离垢绝染而朗然常照;颈联直破二边——不假烛焰(破外求)、不避尘劳(破厌离),显《坛经》“佛法在世间,不离世间觉”之旨;结句松风裂石、星落满山,是“一”之活泼妙用:寂而常照,照而恒寂,恰如《道德经》“天得一以清,地得一以宁”之诗性证成。", + "round": 3, + "__child_state": [ + { + "messages": [], + "cycle_nodes": [ + "loop_1767617552451_hq3j342ha" + ], + "looping": 1, + "node_outputs": { + "start_1767617465337_0djnmpk2y": { + "node_id": "start_1767617465337_0djnmpk2y", + "node_type": "start", + "node_name": "开始(Start)", + "status": "completed", + "input": { + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "message": "1", + "conversation_vars": {} + }, + "output": { + "message": "1", + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd", + "topic": "", + "number": 0, + "Boolean": false + }, + "elapsed_time": 0, + "token_usage": null, + "error": null + }, + "llm_1767617499720_zvqwjpw3b": { + "node_id": "llm_1767617499720_zvqwjpw3b", + "node_type": "llm", + "node_name": "大语言模型 (LLM)-初始创作", + "status": "completed", + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据1 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。", + "elapsed_time": 4.518743515014648, + "token_usage": { + "prompt_tokens": 25, + "completion_tokens": 165, + "total_tokens": 190 + }, + "error": null + }, + "loop_1767617552451_hq3j342ha": { + "poem_content": "《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。", + "round": 0 + }, + "21046fb8-1f33-45f7-aeda-2c196471f119": { + "node_id": "21046fb8-1f33-45f7-aeda-2c196471f119", + "node_type": "cycle-start", + "node_name": null, + "status": "completed", + "input": { + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "message": "1", + "conversation_vars": {} + }, + "output": { + "message": "1", + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd" + }, + "elapsed_time": 0.0005278587341308594, + "token_usage": null, + "error": null + }, + "llm_1767617560401_bsx1vhi25": { + "node_id": "llm_1767617560401_bsx1vhi25", + "node_type": "llm", + "node_name": "大语言模型 (LLM)-润色器", + "status": "completed", + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一·次韵》 \n千峰削玉立空青, \n一羽浮天亦自宁。 \n万籁收声归太始, \n孤光未堕即长明。 \n\n注:本诗承原作“以一为魂”之旨,严守平水韵九青部(青、宁、明),平仄谐律。首句“千峰削玉”反衬“一羽浮天”,以极繁托极简;次句“一羽”既承“一芥”之微,更取《庄子》“鹏徙南冥”之逸气,言至微者亦可持守本然之宁。三句“万籁收声”暗应原作“千山雪落只无声”,而升华为宇宙初开的“太始”静界;结句“孤光未堕即长明”,化用《淮南子》“日月不为明而明”与禅宗“一念不生即佛”,昭示“一”非寂灭之空,乃不假外求、本自圆成的永恒觉性——此即《道德经》“天得一以清”的诗性证悟。", + "elapsed_time": 6.8497374057769775, + "token_usage": { + "prompt_tokens": 188, + "completion_tokens": 262, + "total_tokens": 450 + }, + "error": null + }, + "assigner_1768285417545_qsoqleflh": { + "node_id": "assigner_1768285417545_qsoqleflh", + "node_type": "assigner", + "node_name": "变量赋值", + "status": "completed", + "input": { + "config": { + "assignments": [ + { + "value": "{{llm_1767617560401_bsx1vhi25.output}}", + "operation": "cover", + "variable_selector": "{{loop_1767617552451_hq3j342ha.poem_content}}" + }, + { + "value": 1, + "operation": "add", + "variable_selector": "{{loop_1767617552451_hq3j342ha.round}}" + } + ] + } + }, + "output": null, + "elapsed_time": 0.0003705024719238281, + "token_usage": null, + "error": null + } + }, + "execution_id": "exec_11a80fb1cde148cb", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd", + "error": null, + "error_node": null, + "activate": { + "llm_1767617560401_bsx1vhi25": true, + "loop_1767617552451_hq3j342ha": true, + "start_1767617465337_0djnmpk2y": true, + "21046fb8-1f33-45f7-aeda-2c196471f119": true, + "llm_1767617499720_zvqwjpw3b": true, + "assigner_1768285417545_qsoqleflh": true + } + }, + { + "messages": [], + "cycle_nodes": [ + "loop_1767617552451_hq3j342ha" + ], + "looping": 1, + "node_outputs": { + "start_1767617465337_0djnmpk2y": { + "node_id": "start_1767617465337_0djnmpk2y", + "node_type": "start", + "node_name": "开始(Start)", + "status": "completed", + "input": { + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "message": "1", + "conversation_vars": {} + }, + "output": { + "message": "1", + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd", + "topic": "", + "number": 0, + "Boolean": false + }, + "elapsed_time": 0, + "token_usage": null, + "error": null + }, + "llm_1767617499720_zvqwjpw3b": { + "node_id": "llm_1767617499720_zvqwjpw3b", + "node_type": "llm", + "node_name": "大语言模型 (LLM)-初始创作", + "status": "completed", + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据1 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。", + "elapsed_time": 4.518743515014648, + "token_usage": { + "prompt_tokens": 25, + "completion_tokens": 165, + "total_tokens": 190 + }, + "error": null + }, + "loop_1767617552451_hq3j342ha": { + "poem_content": "《咏一·次韵》 \n千峰削玉立空青, \n一羽浮天亦自宁。 \n万籁收声归太始, \n孤光未堕即长明。 \n\n注:本诗承原作“以一为魂”之旨,严守平水韵九青部(青、宁、明),平仄谐律。首句“千峰削玉”反衬“一羽浮天”,以极繁托极简;次句“一羽”既承“一芥”之微,更取《庄子》“鹏徙南冥”之逸气,言至微者亦可持守本然之宁。三句“万籁收声”暗应原作“千山雪落只无声”,而升华为宇宙初开的“太始”静界;结句“孤光未堕即长明”,化用《淮南子》“日月不为明而明”与禅宗“一念不生即佛”,昭示“一”非寂灭之空,乃不假外求、本自圆成的永恒觉性——此即《道德经》“天得一以清”的诗性证悟。", + "round": 1 + }, + "21046fb8-1f33-45f7-aeda-2c196471f119": { + "node_id": "21046fb8-1f33-45f7-aeda-2c196471f119", + "node_type": "cycle-start", + "node_name": null, + "status": "completed", + "input": { + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "message": "1", + "conversation_vars": {} + }, + "output": { + "message": "1", + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd" + }, + "elapsed_time": 0, + "token_usage": null, + "error": null + }, + "llm_1767617560401_bsx1vhi25": { + "node_id": "llm_1767617560401_bsx1vhi25", + "node_type": "llm", + "node_name": "大语言模型 (LLM)-润色器", + "status": "completed", + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据《咏一·次韵》 \n千峰削玉立空青, \n一羽浮天亦自宁。 \n万籁收声归太始, \n孤光未堕即长明。 \n\n注:本诗承原作“以一为魂”之旨,严守平水韵九青部(青、宁、明),平仄谐律。首句“千峰削玉”反衬“一羽浮天”,以极繁托极简;次句“一羽”既承“一芥”之微,更取《庄子》“鹏徙南冥”之逸气,言至微者亦可持守本然之宁。三句“万籁收声”暗应原作“千山雪落只无声”,而升华为宇宙初开的“太始”静界;结句“孤光未堕即长明”,化用《淮南子》“日月不为明而明”与禅宗“一念不生即佛”,昭示“一”非寂灭之空,乃不假外求、本自圆成的永恒觉性——此即《道德经》“天得一以清”的诗性证悟。 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一·再题》 \n一芥浮空万籁停, \n千峰影落太初青。 \n光非燃烛恒明在, \n心不沾尘即性灵。 \n\n注:本诗续写“以一为魂”之旨,严守平水韵九青部(停、青、灵),平仄精严。首句“一芥”承原作微渺意象,而“万籁停”较“收声”更显寂然自定之境;次句倒装“千峰影落”,使苍茫山势如墨痕沉入宇宙初青,暗契《淮南子》“虚霩生宇宙,宇宙生气”之太始气象。三句翻出新境:“光非燃烛”,破除对光明之形器执取,直指《楞严经》“性觉妙明,本觉明妙”之不假缘起的本明;结句“心不沾尘即性灵”,化用六祖“本来无一物”与程颢“天地之大德曰生”,言“一”非枯寂之数,乃活泼泼的性灵朗现——此即《道德经》“昔之得一者,天清地宁”的诗性澄明。", + "elapsed_time": 7.1851232051849365, + "token_usage": { + "prompt_tokens": 285, + "completion_tokens": 281, + "total_tokens": 566 + }, + "error": null + }, + "assigner_1768285417545_qsoqleflh": { + "node_id": "assigner_1768285417545_qsoqleflh", + "node_type": "assigner", + "node_name": "变量赋值", + "status": "completed", + "input": { + "config": { + "assignments": [ + { + "value": "{{llm_1767617560401_bsx1vhi25.output}}", + "operation": "cover", + "variable_selector": "{{loop_1767617552451_hq3j342ha.poem_content}}" + }, + { + "value": 1, + "operation": "add", + "variable_selector": "{{loop_1767617552451_hq3j342ha.round}}" + } + ] + } + }, + "output": null, + "elapsed_time": 0, + "token_usage": null, + "error": null + } + }, + "execution_id": "exec_11a80fb1cde148cb", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd", + "error": null, + "error_node": null, + "activate": { + "llm_1767617560401_bsx1vhi25": true, + "start_1767617465337_0djnmpk2y": true, + "loop_1767617552451_hq3j342ha": true, + "21046fb8-1f33-45f7-aeda-2c196471f119": true, + "llm_1767617499720_zvqwjpw3b": true, + "assigner_1768285417545_qsoqleflh": true + } + }, + { + "messages": [], + "cycle_nodes": [ + "loop_1767617552451_hq3j342ha" + ], + "looping": 1, + "node_outputs": { + "start_1767617465337_0djnmpk2y": { + "node_id": "start_1767617465337_0djnmpk2y", + "node_type": "start", + "node_name": "开始(Start)", + "status": "completed", + "input": { + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "message": "1", + "conversation_vars": {} + }, + "output": { + "message": "1", + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd", + "topic": "", + "number": 0, + "Boolean": false + }, + "elapsed_time": 0, + "token_usage": null, + "error": null + }, + "llm_1767617499720_zvqwjpw3b": { + "node_id": "llm_1767617499720_zvqwjpw3b", + "node_type": "llm", + "node_name": "大语言模型 (LLM)-初始创作", + "status": "completed", + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据1 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。", + "elapsed_time": 4.518743515014648, + "token_usage": { + "prompt_tokens": 25, + "completion_tokens": 165, + "total_tokens": 190 + }, + "error": null + }, + "loop_1767617552451_hq3j342ha": { + "poem_content": "《咏一·再题》 \n一芥浮空万籁停, \n千峰影落太初青。 \n光非燃烛恒明在, \n心不沾尘即性灵。 \n\n注:本诗续写“以一为魂”之旨,严守平水韵九青部(停、青、灵),平仄精严。首句“一芥”承原作微渺意象,而“万籁停”较“收声”更显寂然自定之境;次句倒装“千峰影落”,使苍茫山势如墨痕沉入宇宙初青,暗契《淮南子》“虚霩生宇宙,宇宙生气”之太始气象。三句翻出新境:“光非燃烛”,破除对光明之形器执取,直指《楞严经》“性觉妙明,本觉明妙”之不假缘起的本明;结句“心不沾尘即性灵”,化用六祖“本来无一物”与程颢“天地之大德曰生”,言“一”非枯寂之数,乃活泼泼的性灵朗现——此即《道德经》“昔之得一者,天清地宁”的诗性澄明。", + "round": 2 + }, + "21046fb8-1f33-45f7-aeda-2c196471f119": { + "node_id": "21046fb8-1f33-45f7-aeda-2c196471f119", + "node_type": "cycle-start", + "node_name": null, + "status": "completed", + "input": { + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "message": "1", + "conversation_vars": {} + }, + "output": { + "message": "1", + "execution_id": "exec_11a80fb1cde148cb", + "conversation_id": "37ee003e-cc53-47e7-930f-a436a1252dd1", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd" + }, + "elapsed_time": 0, + "token_usage": null, + "error": null + }, + "llm_1767617560401_bsx1vhi25": { + "node_id": "llm_1767617560401_bsx1vhi25", + "node_type": "llm", + "node_name": "大语言模型 (LLM)-润色器", + "status": "completed", + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据《咏一·再题》 \n一芥浮空万籁停, \n千峰影落太初青。 \n光非燃烛恒明在, \n心不沾尘即性灵。 \n\n注:本诗续写“以一为魂”之旨,严守平水韵九青部(停、青、灵),平仄精严。首句“一芥”承原作微渺意象,而“万籁停”较“收声”更显寂然自定之境;次句倒装“千峰影落”,使苍茫山势如墨痕沉入宇宙初青,暗契《淮南子》“虚霩生宇宙,宇宙生气”之太始气象。三句翻出新境:“光非燃烛”,破除对光明之形器执取,直指《楞严经》“性觉妙明,本觉明妙”之不假缘起的本明;结句“心不沾尘即性灵”,化用六祖“本来无一物”与程颢“天地之大德曰生”,言“一”非枯寂之数,乃活泼泼的性灵朗现——此即《道德经》“昔之得一者,天清地宁”的诗性澄明。 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一·三题》 \n孤光未凿太初溟, \n一粟吞天万籁宁。 \n影堕千峰青未染, \n心空四象白犹灵。 \n非从烛焰求明性, \n但向尘劳见本形。 \n忽有松风穿石罅, \n泠然吹落满山星。 \n\n注:本诗严守平水韵九青部(溟、宁、灵、形、星),其中“星”属下平声九青部异读字(《广韵》息盈切,与“灵”“宁”同部),古诗常用以协律,如王维“清溪流过碧山头,空水澄鲜一色秋。隔断红尘三十里,白云红叶两悠悠”中“悠”亦借韵通协。全诗紧扣“以一为魂”之旨:首句“孤光未凿”化《庄子·应帝王》“浑沌凿七窍而死”典,反写太初本明未分之境;次句“一粟吞天”,以微纳巨,承“一芥”而力愈雄浑;颔联“青未染”“白犹灵”,双色映照,暗喻性体离垢绝染而朗然常照;颈联直破二边——不假烛焰(破外求)、不避尘劳(破厌离),显《坛经》“佛法在世间,不离世间觉”之旨;结句松风裂石、星落满山,是“一”之活泼妙用:寂而常照,照而恒寂,恰如《道德经》“天得一以清,地得一以宁”之诗性证成。", + "elapsed_time": 9.531717538833618, + "token_usage": { + "prompt_tokens": 304, + "completion_tokens": 390, + "total_tokens": 694 + }, + "error": null + }, + "assigner_1768285417545_qsoqleflh": { + "node_id": "assigner_1768285417545_qsoqleflh", + "node_type": "assigner", + "node_name": "变量赋值", + "status": "completed", + "input": { + "config": { + "assignments": [ + { + "value": "{{llm_1767617560401_bsx1vhi25.output}}", + "operation": "cover", + "variable_selector": "{{loop_1767617552451_hq3j342ha.poem_content}}" + }, + { + "value": 1, + "operation": "add", + "variable_selector": "{{loop_1767617552451_hq3j342ha.round}}" + } + ] + } + }, + "output": null, + "elapsed_time": 0, + "token_usage": null, + "error": null + } + }, + "execution_id": "exec_11a80fb1cde148cb", + "workspace_id": "d17cd62d-a725-4fc0-813b-1093f2dfdee4", + "user_id": "ab27a27f-072b-47e9-8bbb-1f19322debcd", + "error": null, + "error_node": null, + "activate": { + "llm_1767617560401_bsx1vhi25": true, + "start_1767617465337_0djnmpk2y": true, + "loop_1767617552451_hq3j342ha": true, + "21046fb8-1f33-45f7-aeda-2c196471f119": true, + "llm_1767617499720_zvqwjpw3b": true, + "assigner_1768285417545_qsoqleflh": true + } + } + ] + } + }, + "subContent": [ + { + "cycle_idx": 0, + "node_id": "21046fb8-1f33-45f7-aeda-2c196471f119", + "node_name": null, + "icon": "/src/assets/images/workflow/loop.png", + "content": { + "cycle_idx": 0, + "input": { + "poem_content": "《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。", + "round": 0 + }, + "output": { + "poem_content": "《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。", + "round": 0 + } + }, + "status": "completed", + "elapsed_time": 0.0005278587341308594 + }, + { + "cycle_idx": 0, + "node_id": "llm_1767617560401_bsx1vhi25", + "node_name": "大语言模型 (LLM)-润色器", + "icon": "/src/assets/images/workflow/llm.png", + "content": { + "cycle_idx": 0, + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一·次韵》 \n千峰削玉立空青, \n一羽浮天亦自宁。 \n万籁收声归太始, \n孤光未堕即长明。 \n\n注:本诗承原作“以一为魂”之旨,严守平水韵九青部(青、宁、明),平仄谐律。首句“千峰削玉”反衬“一羽浮天”,以极繁托极简;次句“一羽”既承“一芥”之微,更取《庄子》“鹏徙南冥”之逸气,言至微者亦可持守本然之宁。三句“万籁收声”暗应原作“千山雪落只无声”,而升华为宇宙初开的“太始”静界;结句“孤光未堕即长明”,化用《淮南子》“日月不为明而明”与禅宗“一念不生即佛”,昭示“一”非寂灭之空,乃不假外求、本自圆成的永恒觉性——此即《道德经》“天得一以清”的诗性证悟。" + }, + "status": "completed", + "elapsed_time": 6.8497374057769775 + }, + { + "cycle_idx": 0, + "node_id": "assigner_1768285417545_qsoqleflh", + "node_name": "变量赋值", + "icon": "/src/assets/images/workflow/assigner.png", + "content": { + "cycle_idx": 0, + "input": { + "config": { + "assignments": [ + { + "value": "{{llm_1767617560401_bsx1vhi25.output}}", + "operation": "cover", + "variable_selector": "{{loop_1767617552451_hq3j342ha.poem_content}}" + }, + { + "value": 1, + "operation": "add", + "variable_selector": "{{loop_1767617552451_hq3j342ha.round}}" + } + ] + } + }, + "output": null + }, + "status": "completed", + "elapsed_time": 0.0003705024719238281 + }, + { + "cycle_idx": 1, + "node_id": "21046fb8-1f33-45f7-aeda-2c196471f119", + "node_name": null, + "icon": "/src/assets/images/workflow/loop.png", + "content": { + "cycle_idx": 1, + "input": { + "poem_content": "《咏一·次韵》 \n千峰削玉立空青, \n一羽浮天亦自宁。 \n万籁收声归太始, \n孤光未堕即长明。 \n\n注:本诗承原作“以一为魂”之旨,严守平水韵九青部(青、宁、明),平仄谐律。首句“千峰削玉”反衬“一羽浮天”,以极繁托极简;次句“一羽”既承“一芥”之微,更取《庄子》“鹏徙南冥”之逸气,言至微者亦可持守本然之宁。三句“万籁收声”暗应原作“千山雪落只无声”,而升华为宇宙初开的“太始”静界;结句“孤光未堕即长明”,化用《淮南子》“日月不为明而明”与禅宗“一念不生即佛”,昭示“一”非寂灭之空,乃不假外求、本自圆成的永恒觉性——此即《道德经》“天得一以清”的诗性证悟。", + "round": 1 + }, + "output": { + "poem_content": "《咏一·次韵》 \n千峰削玉立空青, \n一羽浮天亦自宁。 \n万籁收声归太始, \n孤光未堕即长明。 \n\n注:本诗承原作“以一为魂”之旨,严守平水韵九青部(青、宁、明),平仄谐律。首句“千峰削玉”反衬“一羽浮天”,以极繁托极简;次句“一羽”既承“一芥”之微,更取《庄子》“鹏徙南冥”之逸气,言至微者亦可持守本然之宁。三句“万籁收声”暗应原作“千山雪落只无声”,而升华为宇宙初开的“太始”静界;结句“孤光未堕即长明”,化用《淮南子》“日月不为明而明”与禅宗“一念不生即佛”,昭示“一”非寂灭之空,乃不假外求、本自圆成的永恒觉性——此即《道德经》“天得一以清”的诗性证悟。", + "round": 1 + } + }, + "status": "completed", + "elapsed_time": 0 + }, + { + "cycle_idx": 1, + "node_id": "llm_1767617560401_bsx1vhi25", + "node_name": "大语言模型 (LLM)-润色器", + "icon": "/src/assets/images/workflow/llm.png", + "content": { + "cycle_idx": 1, + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据《咏一·次韵》 \n千峰削玉立空青, \n一羽浮天亦自宁。 \n万籁收声归太始, \n孤光未堕即长明。 \n\n注:本诗承原作“以一为魂”之旨,严守平水韵九青部(青、宁、明),平仄谐律。首句“千峰削玉”反衬“一羽浮天”,以极繁托极简;次句“一羽”既承“一芥”之微,更取《庄子》“鹏徙南冥”之逸气,言至微者亦可持守本然之宁。三句“万籁收声”暗应原作“千山雪落只无声”,而升华为宇宙初开的“太始”静界;结句“孤光未堕即长明”,化用《淮南子》“日月不为明而明”与禅宗“一念不生即佛”,昭示“一”非寂灭之空,乃不假外求、本自圆成的永恒觉性——此即《道德经》“天得一以清”的诗性证悟。 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一·再题》 \n一芥浮空万籁停, \n千峰影落太初青。 \n光非燃烛恒明在, \n心不沾尘即性灵。 \n\n注:本诗续写“以一为魂”之旨,严守平水韵九青部(停、青、灵),平仄精严。首句“一芥”承原作微渺意象,而“万籁停”较“收声”更显寂然自定之境;次句倒装“千峰影落”,使苍茫山势如墨痕沉入宇宙初青,暗契《淮南子》“虚霩生宇宙,宇宙生气”之太始气象。三句翻出新境:“光非燃烛”,破除对光明之形器执取,直指《楞严经》“性觉妙明,本觉明妙”之不假缘起的本明;结句“心不沾尘即性灵”,化用六祖“本来无一物”与程颢“天地之大德曰生”,言“一”非枯寂之数,乃活泼泼的性灵朗现——此即《道德经》“昔之得一者,天清地宁”的诗性澄明。" + }, + "status": "completed", + "elapsed_time": 7.1851232051849365 + }, + { + "cycle_idx": 1, + "node_id": "assigner_1768285417545_qsoqleflh", + "node_name": "变量赋值", + "icon": "/src/assets/images/workflow/assigner.png", + "content": { + "cycle_idx": 1, + "input": { + "config": { + "assignments": [ + { + "value": "{{llm_1767617560401_bsx1vhi25.output}}", + "operation": "cover", + "variable_selector": "{{loop_1767617552451_hq3j342ha.poem_content}}" + }, + { + "value": 1, + "operation": "add", + "variable_selector": "{{loop_1767617552451_hq3j342ha.round}}" + } + ] + } + }, + "output": null + }, + "status": "completed", + "elapsed_time": 0 + }, + { + "cycle_idx": 2, + "node_id": "21046fb8-1f33-45f7-aeda-2c196471f119", + "node_name": null, + "icon": "/src/assets/images/workflow/loop.png", + "content": { + "cycle_idx": 2, + "input": { + "poem_content": "《咏一·再题》 \n一芥浮空万籁停, \n千峰影落太初青。 \n光非燃烛恒明在, \n心不沾尘即性灵。 \n\n注:本诗续写“以一为魂”之旨,严守平水韵九青部(停、青、灵),平仄精严。首句“一芥”承原作微渺意象,而“万籁停”较“收声”更显寂然自定之境;次句倒装“千峰影落”,使苍茫山势如墨痕沉入宇宙初青,暗契《淮南子》“虚霩生宇宙,宇宙生气”之太始气象。三句翻出新境:“光非燃烛”,破除对光明之形器执取,直指《楞严经》“性觉妙明,本觉明妙”之不假缘起的本明;结句“心不沾尘即性灵”,化用六祖“本来无一物”与程颢“天地之大德曰生”,言“一”非枯寂之数,乃活泼泼的性灵朗现——此即《道德经》“昔之得一者,天清地宁”的诗性澄明。", + "round": 2 + }, + "output": { + "poem_content": "《咏一·再题》 \n一芥浮空万籁停, \n千峰影落太初青。 \n光非燃烛恒明在, \n心不沾尘即性灵。 \n\n注:本诗续写“以一为魂”之旨,严守平水韵九青部(停、青、灵),平仄精严。首句“一芥”承原作微渺意象,而“万籁停”较“收声”更显寂然自定之境;次句倒装“千峰影落”,使苍茫山势如墨痕沉入宇宙初青,暗契《淮南子》“虚霩生宇宙,宇宙生气”之太始气象。三句翻出新境:“光非燃烛”,破除对光明之形器执取,直指《楞严经》“性觉妙明,本觉明妙”之不假缘起的本明;结句“心不沾尘即性灵”,化用六祖“本来无一物”与程颢“天地之大德曰生”,言“一”非枯寂之数,乃活泼泼的性灵朗现——此即《道德经》“昔之得一者,天清地宁”的诗性澄明。", + "round": 2 + } + }, + "status": "completed", + "elapsed_time": 0 + }, + { + "cycle_idx": 2, + "node_id": "llm_1767617560401_bsx1vhi25", + "node_name": "大语言模型 (LLM)-润色器", + "icon": "/src/assets/images/workflow/llm.png", + "content": { + "cycle_idx": 2, + "input": { + "prompt": null, + "messages": [ + { + "role": "system", + "content": "请根据《咏一·再题》 \n一芥浮空万籁停, \n千峰影落太初青。 \n光非燃烛恒明在, \n心不沾尘即性灵。 \n\n注:本诗续写“以一为魂”之旨,严守平水韵九青部(停、青、灵),平仄精严。首句“一芥”承原作微渺意象,而“万籁停”较“收声”更显寂然自定之境;次句倒装“千峰影落”,使苍茫山势如墨痕沉入宇宙初青,暗契《淮南子》“虚霩生宇宙,宇宙生气”之太始气象。三句翻出新境:“光非燃烛”,破除对光明之形器执取,直指《楞严经》“性觉妙明,本觉明妙”之不假缘起的本明;结句“心不沾尘即性灵”,化用六祖“本来无一物”与程颢“天地之大德曰生”,言“一”非枯寂之数,乃活泼泼的性灵朗现——此即《道德经》“昔之得一者,天清地宁”的诗性澄明。 为主题写一首七字诗。" + } + ], + "config": { + "model_id": "2699984d-23be-4817-b81c-c38682a08306", + "temperature": 0.7, + "max_tokens": 2000 + } + }, + "output": "《咏一·三题》 \n孤光未凿太初溟, \n一粟吞天万籁宁。 \n影堕千峰青未染, \n心空四象白犹灵。 \n非从烛焰求明性, \n但向尘劳见本形。 \n忽有松风穿石罅, \n泠然吹落满山星。 \n\n注:本诗严守平水韵九青部(溟、宁、灵、形、星),其中“星”属下平声九青部异读字(《广韵》息盈切,与“灵”“宁”同部),古诗常用以协律,如王维“清溪流过碧山头,空水澄鲜一色秋。隔断红尘三十里,白云红叶两悠悠”中“悠”亦借韵通协。全诗紧扣“以一为魂”之旨:首句“孤光未凿”化《庄子·应帝王》“浑沌凿七窍而死”典,反写太初本明未分之境;次句“一粟吞天”,以微纳巨,承“一芥”而力愈雄浑;颔联“青未染”“白犹灵”,双色映照,暗喻性体离垢绝染而朗然常照;颈联直破二边——不假烛焰(破外求)、不避尘劳(破厌离),显《坛经》“佛法在世间,不离世间觉”之旨;结句松风裂石、星落满山,是“一”之活泼妙用:寂而常照,照而恒寂,恰如《道德经》“天得一以清,地得一以宁”之诗性证成。" + }, + "status": "completed", + "elapsed_time": 9.531717538833618 + }, + { + "cycle_idx": 2, + "node_id": "assigner_1768285417545_qsoqleflh", + "node_name": "变量赋值", + "icon": "/src/assets/images/workflow/assigner.png", + "content": { + "cycle_idx": 2, + "input": { + "config": { + "assignments": [ + { + "value": "{{llm_1767617560401_bsx1vhi25.output}}", + "operation": "cover", + "variable_selector": "{{loop_1767617552451_hq3j342ha.poem_content}}" + }, + { + "value": 1, + "operation": "add", + "variable_selector": "{{loop_1767617552451_hq3j342ha.round}}" + } + ] + } + }, + "output": null + }, + "status": "completed", + "elapsed_time": 0 + } + ], + "status": "completed", + "elapsed_time": 23.57662582397461 + }, + { + "id": "end_1767619139811_ko97mb12l", + "node_id": "end_1767619139811_ko97mb12l", + "node_name": "结束(End)", + "icon": "/src/assets/images/workflow/end.png", + "content": { + "input": { + "config": { + "output": "经过多次打磨,最终作品如下:\n{{loop_1767617552451_hq3j342ha.poem_content}} \nLLM1结果:\n{{llm_1767617499720_zvqwjpw3b.output}} " + } + }, + "output": "经过多次打磨,最终作品如下:\n《咏一·三题》 \n孤光未凿太初溟, \n一粟吞天万籁宁。 \n影堕千峰青未染, \n心空四象白犹灵。 \n非从烛焰求明性, \n但向尘劳见本形。 \n忽有松风穿石罅, \n泠然吹落满山星。 \n\n注:本诗严守平水韵九青部(溟、宁、灵、形、星),其中“星”属下平声九青部异读字(《广韵》息盈切,与“灵”“宁”同部),古诗常用以协律,如王维“清溪流过碧山头,空水澄鲜一色秋。隔断红尘三十里,白云红叶两悠悠”中“悠”亦借韵通协。全诗紧扣“以一为魂”之旨:首句“孤光未凿”化《庄子·应帝王》“浑沌凿七窍而死”典,反写太初本明未分之境;次句“一粟吞天”,以微纳巨,承“一芥”而力愈雄浑;颔联“青未染”“白犹灵”,双色映照,暗喻性体离垢绝染而朗然常照;颈联直破二边——不假烛焰(破外求)、不避尘劳(破厌离),显《坛经》“佛法在世间,不离世间觉”之旨;结句松风裂石、星落满山,是“一”之活泼妙用:寂而常照,照而恒寂,恰如《道德经》“天得一以清,地得一以宁”之诗性证成。 \nLLM1结果:\n《咏一》 \n孤峰独峙破苍冥, \n一芥微身立太清。 \n万古乾坤凝此数, \n千山雪落只无声。 \n\n注:本诗以“一”为魂,通过“孤峰”“一芥”“此数”层层递进,赋予数字哲思——既写天地间唯一性之壮美(孤峰破冥),又寓渺小个体与永恒宇宙的辩证(芥子纳太清)。末句“千山雪落只无声”,以大静写大一,雪覆千山而声息俱寂,暗合《道德经》“天得一以清”之境。平仄依平水韵,押九青部(冥、清、声)。 " + }, + "status": "completed", + "elapsed_time": 0.0005218982696533203 + } + ], + "status": "completed" + } + ]) // Chat message history const [variables, setVariables] = useState([]) // Workflow input variables const [streamLoading, setStreamLoading] = useState(false) // SSE streaming state const [conversationId, setConversationId] = useState(null) // Current conversation ID @@ -176,9 +980,11 @@ const Chat = forwardRef(({ appId */ const handleStreamMessage = (data: SSEMessage[]) => { data.forEach(item => { - const { chunk, conversation_id, node_id, input, output, error, elapsed_time, status } = item.data as { + const { chunk, conversation_id, node_id, cycle_id, cycle_idx, input, output, error, elapsed_time, status } = item.data as { chunk: string; conversation_id: string | null; + cycle_id: string; + cycle_idx: number; node_id: string; node_name?: string; input?: any; @@ -192,8 +998,6 @@ const Chat = forwardRef(({ appId const node = graphRef.current?.getNodes().find(n => n.id === node_id); const { name, icon } = node?.getData() || {} - console.log('node', node?.getData()) - switch(item.event) { // Append streaming text chunks to assistant message case 'message': @@ -271,6 +1075,44 @@ const Chat = forwardRef(({ appId return newList }) break + // Update node with subContent + case 'cycle_item': + setChatList(prev => { + const newList = [...prev] + const lastIndex = newList.length - 1 + if (lastIndex >= 0) { + const newSubContent = newList[lastIndex].subContent || [] + const filterIndex = newSubContent.findIndex(vo => vo.id === cycle_id) + if (filterIndex > -1) { + const items = newSubContent[filterIndex].subContent || [] + items.push({ + cycle_id, + cycle_idx, + node_id, + node_name: name, + icon, + content: { + cycle_idx, + input, + output, + error, + }, + status: status || 'completed', + elapsed_time + }) + newSubContent[filterIndex] = { + ...newSubContent[filterIndex], + subContent: [...items] + } + newList[lastIndex] = { + ...newList[lastIndex], + subContent: newSubContent + } + } + } + return newList + }) + break // Mark workflow as complete case 'workflow_end': setChatList(prev => { @@ -383,12 +1225,6 @@ const Chat = forwardRef(({ appId handleClose })); - /** - * Returns CSS class for status-based text color - */ - const getStatus = (status?: string) => { - return status === 'completed' ? 'rb:text-[#369F21]' : status === 'failed' ? 'rb:text-[#FF5D34]' : 'rb:text-[#5B6167]' - } return ( @@ -413,85 +1249,7 @@ const Chat = forwardRef(({ appId labelFormat={(item) => dayjs(item.created_at).locale('en').format('MMMM D, YYYY [at] h:mm A')} errorDesc={t('application.ReplyException')} renderRuntime={(item, index) => { - return ( -
- - {item.status === 'completed' ? : item.status === 'failed' ? : } - {t('application.workflow')} -
, - className: styles.collapseItem, - children: ( - Array.isArray(item.subContent) - ? - {item.subContent?.map(vo => ( - -
- {vo.icon && } -
{vo.node_name || vo.node_id}
-
- - {typeof vo.elapsed_time == 'number' && <>{vo.elapsed_time?.toFixed(3)}ms} - {vo.status === 'completed' ? : vo.status === 'failed' ? : } - - , - className: styles.collapseItem, - children: ( - - {vo.status === 'failed' && -
-
- {t(`workflow.error`)} - -
-
- -
-
- } - {['input', 'output'].map(key => ( -
-
- {t(`workflow.${key}`)} - -
-
- -
-
- ))} -
- ) - }]} - /> - ))} -
- :
- -
- ) - }]} - /> - - ) + return }} />
diff --git a/web/src/views/Workflow/components/Chat/Runtime.tsx b/web/src/views/Workflow/components/Chat/Runtime.tsx new file mode 100644 index 00000000..0f18f4da --- /dev/null +++ b/web/src/views/Workflow/components/Chat/Runtime.tsx @@ -0,0 +1,234 @@ +/* + * @Author: ZhaoYing + * @Date: 2026-02-24 17:57:08 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-02-24 17:57:08 + */ +/* + * Runtime Component + * + * This component displays the execution runtime details of workflow nodes in a chat interface. + * It provides a hierarchical view of workflow execution with support for: + * - Node execution status (completed, failed, running) + * - Nested loop and iteration cycles + * - Input/output data visualization + * - Error messages for failed nodes + * - Elapsed time tracking + */ +import { type FC, useState } from 'react' +import { useTranslation } from 'react-i18next' +import clsx from 'clsx' +import { Space, Button, Collapse, Flex } from 'antd' +import { CheckCircleFilled, CloseCircleFilled, LoadingOutlined, RightOutlined, ArrowLeftOutlined } from '@ant-design/icons' + +import styles from './chat.module.css' +import type { ChatItem } from '@/components/Chat/types' +import Markdown from '@/components/Markdown' +import CodeBlock from '@/components/Markdown/CodeBlock' + +/** + * Runtime component props + * @param item - Chat item containing workflow execution data + * @param index - Index of the chat item in the list + */ +const Runtime: FC<{ item: ChatItem; index: number;}> = ({ + item, + index +}) => { + const { t } = useTranslation() + // Stores the currently selected detail view (for nested loop/iteration exploration) + const [detail, setDetail] = useState(null) + // Tracks whether the current detail view is for a loop (true) or iteration (false) + const [loop, setLoop] = useState(null) + + /** + * Handles navigation into nested loop/iteration details + * @param vo - The node object containing subContent to display + * @param isLoop - Whether this is a loop node (true) or iteration node (false) + */ + const handleViewDetail = (vo: any, isLoop: boolean) => { + setDetail(vo) + setLoop(isLoop) + } + + /** + * Returns CSS class for status-based text color + * @param status - Node execution status: 'completed', 'failed', or other + * @returns Tailwind CSS class for appropriate color + */ + const getStatus = (status?: string) => { + return status === 'completed' ? 'rb:text-[#369F21]' : status === 'failed' ? 'rb:text-[#FF5D34]' : 'rb:text-[#5B6167]' + } + + /** + * Renders child nodes grouped by cycle index (for loop/iteration nodes) + * Groups nodes by their cycle_idx and displays them in separate collapsible sections + * @param list - Array of child node execution data + */ + const renderDetailChild = (list: any) => { + // Group nodes by cycle_idx to organize loop/iteration cycles + const groupedByCycle = list.reduce((acc: any, item: any) => { + const idx = item.cycle_idx ?? 0 + if (!acc[idx]) acc[idx] = [] + acc[idx].push(item) + return acc + }, {}) + + + return ( + + {Object.entries(groupedByCycle).map(([cycleIdx, items]: [string, any]) => { + return ( + + {t(`workflow.runtime.${loop ? 'loop' : 'iteration'}`)} {Number(cycleIdx) + 1} +
, + className: styles.collapseItem, + children: renderChild(items) + }]} + /> + ) + })} + + ) + } + + /** + * Renders detailed view of child nodes with their execution information + * Displays node status, input/output data, errors, and nested cycles + * @param list - Array of node execution data or error message string + */ + const renderChild = (list: any) => { + if (Array.isArray(list)) { + return + {list?.map(vo => { + const isLoop = vo.node_id.startsWith('loop'); + // Render cycle variables for loop nodes without node_name + if (typeof vo.cycle_idx === 'number' && isLoop && !vo.node_name) { + return
+
+ {t(`workflow.config.loop.cycle_vars`)} + +
+
+ +
+
+ } + // Skip rendering if no node_name is present + if (!vo.node_name) return null + + // Render collapsible node with status, timing, and execution details + return ( + +
+ {vo.icon && } +
{vo.node_name}
+
+ + {typeof vo.elapsed_time == 'number' && <>{vo.elapsed_time?.toFixed(3)}ms} + {vo.status === 'completed' ? : vo.status === 'failed' ? : } + + , + className: styles.collapseItem, + children: ( + + {/* Display error message for failed nodes */} + {vo.status === 'failed' && +
+
+ {t(`workflow.error`)} + +
+
+ +
+
+ } + {/* Display navigation to nested cycles if subContent exists */} + {vo.subContent?.length > 0 && ( + handleViewDetail(vo, vo.node_id.startsWith('loop'))}> + {Math.max(...vo.subContent.map((itemVo: any) => itemVo.cycle_idx + 1))} {t(`workflow.${isLoop ? 'loopNum' : 'iterationNum'}`)} + + + )} + {/* Display input and output data as JSON code blocks */} + {['input', 'output'].map(key => ( +
+
+ {isLoop ? t(`workflow.runtime.${key}_cycle_vars`) : t(`workflow.${key}`)} + +
+
+ +
+
+ ))} +
+ ) + }]} + /> + ) + })} +
+ } + return
+ +
+ } + + return ( +
+ + {item.status === 'completed' ? : item.status === 'failed' ? : } + {t('application.workflow')} +
, + className: styles.collapseItem, + children: ( + detail + ? ( +
+ + {renderDetailChild(detail.subContent)} +
+ ) + : renderChild(item.subContent) + ) + }]} + /> + + ) +} +export default Runtime \ No newline at end of file