Created
July 17, 2024 12:12
-
-
Save rainchen/cc486f9fe2b169cbcf20a10f490b6f1d to your computer and use it in GitHub Desktop.
iteration node demo break-while-loop poc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| app: | |
| description: '' | |
| icon: "\U0001F916" | |
| icon_background: '#FFEAD5' | |
| mode: advanced-chat | |
| name: 'iteration node demo: break-while-loop-poc' | |
| workflow: | |
| features: | |
| file_upload: | |
| image: | |
| enabled: false | |
| number_limits: 3 | |
| transfer_methods: | |
| - local_file | |
| - remote_url | |
| opening_statement: click go to start | |
| retriever_resource: | |
| enabled: false | |
| sensitive_word_avoidance: | |
| enabled: false | |
| speech_to_text: | |
| enabled: false | |
| suggested_questions: | |
| - go | |
| suggested_questions_after_answer: | |
| enabled: false | |
| text_to_speech: | |
| enabled: false | |
| language: '' | |
| voice: '' | |
| graph: | |
| edges: | |
| - data: | |
| isInIteration: false | |
| sourceType: iteration | |
| targetType: code | |
| id: 1721200808708-source-1721202208578-target | |
| source: '1721200808708' | |
| sourceHandle: source | |
| target: '1721202208578' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 0 | |
| - data: | |
| isInIteration: false | |
| sourceType: code | |
| targetType: answer | |
| id: 1721202208578-source-answer-target | |
| source: '1721202208578' | |
| sourceHandle: source | |
| target: answer | |
| targetHandle: target | |
| type: custom | |
| zIndex: 0 | |
| - data: | |
| isInIteration: true | |
| iteration_id: '1721200808708' | |
| sourceType: code | |
| targetType: if-else | |
| id: 1721204234263-source-1721204196722-target | |
| source: '1721204234263' | |
| sourceHandle: source | |
| target: '1721204196722' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 1002 | |
| - data: | |
| isInIteration: true | |
| iteration_id: '1721200808708' | |
| sourceType: code | |
| targetType: code | |
| id: 1721213193234-source-1721204234263-target | |
| source: '1721213193234' | |
| sourceHandle: source | |
| target: '1721204234263' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 1002 | |
| - data: | |
| isInIteration: true | |
| iteration_id: '1721200808708' | |
| sourceType: code | |
| targetType: code | |
| id: 1721214225930-source-1721201702365-target | |
| source: '1721214225930' | |
| sourceHandle: source | |
| target: '1721201702365' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 1002 | |
| - data: | |
| isInIteration: true | |
| iteration_id: '1721200808708' | |
| sourceType: if-else | |
| targetType: code | |
| id: 1721204196722-true-1721215004550-target | |
| source: '1721204196722' | |
| sourceHandle: 'true' | |
| target: '1721215004550' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 1002 | |
| - data: | |
| isInIteration: true | |
| iteration_id: '1721200808708' | |
| sourceType: code | |
| targetType: code | |
| id: 1721215004550-source-1721214225930-target | |
| source: '1721215004550' | |
| sourceHandle: source | |
| target: '1721214225930' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 1002 | |
| - data: | |
| isInIteration: false | |
| sourceType: code | |
| targetType: iteration | |
| id: 1721201056657-source-1721200808708-target | |
| source: '1721201056657' | |
| sourceHandle: source | |
| target: '1721200808708' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 0 | |
| - data: | |
| isInIteration: false | |
| sourceType: code | |
| targetType: code | |
| id: 1721213003983-source-1721201056657-target | |
| source: '1721213003983' | |
| sourceHandle: source | |
| target: '1721201056657' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 0 | |
| - data: | |
| isInIteration: false | |
| sourceType: start | |
| targetType: code | |
| id: 1721200069100-source-1721213003983-target | |
| source: '1721200069100' | |
| sourceHandle: source | |
| target: '1721213003983' | |
| targetHandle: target | |
| type: custom | |
| zIndex: 0 | |
| nodes: | |
| - data: | |
| desc: '' | |
| selected: false | |
| title: Start | |
| type: start | |
| variables: | |
| - label: max_iteration | |
| max_length: 256 | |
| options: [] | |
| required: true | |
| type: number | |
| variable: max_iteration | |
| - label: stop_flag | |
| max_length: 48 | |
| options: [] | |
| required: true | |
| type: number | |
| variable: stop_flag | |
| height: 116 | |
| id: '1721200069100' | |
| position: | |
| x: 30 | |
| y: 396 | |
| positionAbsolute: | |
| x: 30 | |
| y: 396 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| - data: | |
| answer: '{{#1721202208578.result#}}' | |
| desc: '' | |
| selected: false | |
| title: Answer | |
| type: answer | |
| variables: [] | |
| height: 107 | |
| id: answer | |
| position: | |
| x: 3091 | |
| y: 396 | |
| positionAbsolute: | |
| x: 3091 | |
| y: 396 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| - data: | |
| desc: '' | |
| height: 392 | |
| iterator_selector: | |
| - '1721201056657' | |
| - result | |
| output_selector: | |
| - '1721201702365' | |
| - result | |
| output_type: array[string] | |
| selected: false | |
| startNodeType: code | |
| start_node_id: '1721213193234' | |
| title: Iteration | |
| type: iteration | |
| width: 1785.1428571428573 | |
| height: 392 | |
| id: '1721200808708' | |
| position: | |
| x: 942 | |
| y: 396 | |
| positionAbsolute: | |
| x: 942 | |
| y: 396 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 1785 | |
| zIndex: 1 | |
| - data: | |
| code: "\ndef main(index: int, item: int) -> dict:\n result = f\"index:{index},\ | |
| \ item:{item}\"\n return {\n \"result\": result,\n }\n" | |
| code_language: python3 | |
| desc: return an list of string like "index:{index}, item:{item}" | |
| isInIteration: true | |
| isIterationStart: false | |
| iteration_id: '1721200808708' | |
| outputs: | |
| result: | |
| children: null | |
| type: string | |
| selected: false | |
| title: Code:return_result | |
| type: code | |
| variables: | |
| - value_selector: | |
| - '1721200808708' | |
| - item | |
| variable: item | |
| - value_selector: | |
| - '1721200808708' | |
| - index | |
| variable: index | |
| extent: parent | |
| height: 102 | |
| id: '1721201702365' | |
| parentId: '1721200808708' | |
| position: | |
| x: 1525.1428571428573 | |
| y: 116.42857142857144 | |
| positionAbsolute: | |
| x: 2467.1428571428573 | |
| y: 512.4285714285714 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| zIndex: 1001 | |
| - data: | |
| code: "\ndef main(max_iteration: int) -> dict:\n arr = list(range(1, max_iteration\ | |
| \ + 1))\n return {\n \"result\": arr,\n }\n" | |
| code_language: python3 | |
| desc: creates an array based on the given max_iteration value | |
| outputs: | |
| result: | |
| children: null | |
| type: array[number] | |
| selected: false | |
| title: Code:create_array | |
| type: code | |
| variables: | |
| - value_selector: | |
| - '1721200069100' | |
| - max_iteration | |
| variable: max_iteration | |
| height: 102 | |
| id: '1721201056657' | |
| position: | |
| x: 638 | |
| y: 396 | |
| positionAbsolute: | |
| x: 638 | |
| y: 396 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| - data: | |
| code: "\ndef main(iteration_result: list) -> dict:\n return {\n \ | |
| \ \"result\": \"\\n\".join(iteration_result),\n }\n" | |
| code_language: python3 | |
| desc: join the list into a string with "\n" | |
| outputs: | |
| result: | |
| children: null | |
| type: string | |
| selected: false | |
| title: Code:join_iteration_result | |
| type: code | |
| variables: | |
| - value_selector: | |
| - '1721200808708' | |
| - output | |
| variable: iteration_result | |
| height: 84 | |
| id: '1721202208578' | |
| position: | |
| x: 2787 | |
| y: 396 | |
| positionAbsolute: | |
| x: 2787 | |
| y: 396 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| - data: | |
| author: admin | |
| desc: '' | |
| height: 91 | |
| selected: false | |
| showAuthor: false | |
| text: '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"setup | |
| a Code node to pass a \"session\" dict object since dict object is mutable","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}' | |
| theme: blue | |
| title: '' | |
| type: '' | |
| width: 259 | |
| height: 91 | |
| id: '1721203889515' | |
| position: | |
| x: 325.2536823280344 | |
| y: 535.8401952112322 | |
| positionAbsolute: | |
| x: 325.2536823280344 | |
| y: 535.8401952112322 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom-note | |
| width: 259 | |
| - data: | |
| conditions: | |
| - comparison_operator: is | |
| id: '1721204199550' | |
| value: '0' | |
| variable_selector: | |
| - '1721204234263' | |
| - result | |
| desc: if result is 0 then continue following flow | |
| isInIteration: true | |
| isIterationStart: false | |
| iteration_id: '1721200808708' | |
| logical_operator: and | |
| selected: false | |
| title: IF:compare_stop_flag | |
| type: if-else | |
| extent: parent | |
| height: 174 | |
| id: '1721204196722' | |
| parentId: '1721200808708' | |
| position: | |
| x: 684.560100721648 | |
| y: 85 | |
| positionAbsolute: | |
| x: 1626.560100721648 | |
| y: 481 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| zIndex: 1002 | |
| - data: | |
| code: "def main(stop_flag: str, session: dict) -> dict:\n result = 1 if\ | |
| \ stop_flag == session[\"stop_flag\"] else 0\n\n return {\n \"\ | |
| result\": str(result),\n }" | |
| code_language: python3 | |
| dependencies: [] | |
| desc: result = 1 if session["stop_flag"] == stop_flag else 0 | |
| isInIteration: true | |
| isIterationStart: false | |
| iteration_id: '1721200808708' | |
| outputs: | |
| result: | |
| children: null | |
| type: string | |
| selected: false | |
| title: Code:compare_stop_flag | |
| type: code | |
| variables: | |
| - value_selector: | |
| - '1721200069100' | |
| - stop_flag | |
| variable: stop_flag | |
| - value_selector: | |
| - '1721213003983' | |
| - session | |
| variable: session | |
| extent: parent | |
| height: 102 | |
| id: '1721204234263' | |
| parentId: '1721200808708' | |
| position: | |
| x: 409.85714285714266 | |
| y: 85 | |
| positionAbsolute: | |
| x: 1351.8571428571427 | |
| y: 481 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| zIndex: 1002 | |
| - data: | |
| code: "import random\ndef main() -> dict:\n output = random.randint(1,\ | |
| \ 3)\n output = 2 # assume random result is 2\n return {\n \ | |
| \ \"text\": str(output),\n }\n" | |
| code_language: python3 | |
| desc: generate a random number in range of 1~3 | |
| isInIteration: true | |
| isIterationStart: false | |
| iteration_id: '1721200808708' | |
| outputs: | |
| text: | |
| children: null | |
| type: string | |
| selected: false | |
| title: Code:simulate_llm | |
| type: code | |
| variables: [] | |
| extent: parent | |
| height: 102 | |
| id: '1721215004550' | |
| parentId: '1721200808708' | |
| position: | |
| x: 958.5505379228609 | |
| y: 112.16374779142473 | |
| positionAbsolute: | |
| x: 1900.550537922861 | |
| y: 508.1637477914247 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| zIndex: 1002 | |
| - data: | |
| code: "\ndef main() -> dict:\n session = {\"key1\": \"item1\", \"key2\"\ | |
| : \"item2\", \"key3\": \"item3\", \"stop_flag\": \"\"}\n return {\n \ | |
| \ \"session\": session,\n }\n" | |
| code_language: python3 | |
| desc: define an session dict object | |
| outputs: | |
| session: | |
| children: null | |
| type: object | |
| selected: false | |
| title: session | |
| type: code | |
| variables: [] | |
| height: 84 | |
| id: '1721213003983' | |
| position: | |
| x: 334 | |
| y: 396 | |
| positionAbsolute: | |
| x: 334 | |
| y: 396 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| - data: | |
| code: "def main(session: dict) -> dict:\n return {\n \"result\"\ | |
| : session,\n }\n" | |
| code_language: python3 | |
| desc: observe session value | |
| isInIteration: true | |
| isIterationStart: true | |
| iteration_id: '1721200808708' | |
| outputs: | |
| result: | |
| children: null | |
| type: object | |
| selected: false | |
| title: Code:observe_session_store | |
| type: code | |
| variables: | |
| - value_selector: | |
| - '1721213003983' | |
| - session | |
| variable: session | |
| extent: parent | |
| height: 84 | |
| id: '1721213193234' | |
| parentId: '1721200808708' | |
| position: | |
| x: 117 | |
| y: 85 | |
| positionAbsolute: | |
| x: 1059 | |
| y: 481 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| zIndex: 1001 | |
| - data: | |
| code: "\ndef main(llm_text: str, session: dict) -> dict:\n session[\"stop_flag\"\ | |
| ] = llm_text\n return {\n \"session\": session,\n }\n" | |
| code_language: python3 | |
| desc: store LLM text in session | |
| isInIteration: true | |
| iteration_id: '1721200808708' | |
| outputs: | |
| session: | |
| children: null | |
| type: object | |
| selected: false | |
| title: Code:update_session | |
| type: code | |
| variables: | |
| - value_selector: | |
| - '1721213003983' | |
| - session | |
| variable: session | |
| - value_selector: | |
| - '1721215004550' | |
| - text | |
| variable: llm_text | |
| extent: parent | |
| height: 84 | |
| id: '1721214225930' | |
| parentId: '1721200808708' | |
| position: | |
| x: 1225.1428571428573 | |
| y: 116.42857142857144 | |
| positionAbsolute: | |
| x: 2167.1428571428573 | |
| y: 512.4285714285714 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom | |
| width: 244 | |
| zIndex: 1002 | |
| - data: | |
| author: admin | |
| desc: '' | |
| height: 91 | |
| selected: false | |
| showAuthor: true | |
| text: '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"update | |
| the \"session\" dict object","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}' | |
| theme: blue | |
| title: ' (1)' | |
| type: '' | |
| width: 259 | |
| height: 91 | |
| id: '17212177126490' | |
| position: | |
| x: 2165.3386607135726 | |
| y: 651.0737396149178 | |
| positionAbsolute: | |
| x: 2165.3386607135726 | |
| y: 651.0737396149178 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom-note | |
| width: 259 | |
| - data: | |
| author: admin | |
| desc: '' | |
| height: 88 | |
| selected: false | |
| showAuthor: true | |
| text: '' | |
| theme: blue | |
| title: '' | |
| type: '' | |
| width: 240 | |
| height: 88 | |
| id: '1721217775430' | |
| position: | |
| x: 2193.6971319996137 | |
| y: 652.4386034178486 | |
| positionAbsolute: | |
| x: 2193.6971319996137 | |
| y: 652.4386034178486 | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom-note | |
| width: 240 | |
| - data: | |
| author: admin | |
| desc: '' | |
| height: 88 | |
| selected: false | |
| showAuthor: false | |
| text: '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"try | |
| to update the \"session\" dict object","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}' | |
| theme: blue | |
| title: '' | |
| type: '' | |
| width: 260 | |
| height: 88 | |
| id: '1721217790594' | |
| position: | |
| x: 2185.7122085748774 | |
| y: 806.031161643069 | |
| positionAbsolute: | |
| x: 2185.7122085748774 | |
| y: 806.031161643069 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom-note | |
| width: 260 | |
| - data: | |
| author: admin | |
| desc: '' | |
| height: 110 | |
| selected: false | |
| showAuthor: false | |
| text: '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"for | |
| example:","type":"text","version":1},{"type":"linebreak","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":"max_iteration=5","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"stop_flag=2","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}' | |
| theme: blue | |
| title: '' | |
| type: '' | |
| width: 252 | |
| height: 110 | |
| id: '1721217896852' | |
| position: | |
| x: 30 | |
| y: 549.1136162098757 | |
| positionAbsolute: | |
| x: 30 | |
| y: 549.1136162098757 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom-note | |
| width: 252 | |
| - data: | |
| author: admin | |
| desc: '' | |
| height: 101 | |
| selected: false | |
| showAuthor: false | |
| text: '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"skip | |
| if stop_flag == session[\"stop_flag\"](by Code:simulate_llm)","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}' | |
| theme: blue | |
| title: '' | |
| type: '' | |
| width: 549 | |
| height: 101 | |
| id: '1721217990823' | |
| position: | |
| x: 1330.8718945980838 | |
| y: 806.031161643069 | |
| positionAbsolute: | |
| x: 1330.8718945980838 | |
| y: 806.031161643069 | |
| selected: false | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom-note | |
| width: 549 | |
| - data: | |
| author: admin | |
| desc: '' | |
| height: 271 | |
| selected: false | |
| showAuthor: false | |
| text: '{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"actual | |
| output:","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0},{"children":[{"type":"linebreak","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":"index:0, | |
| item:1","type":"text","version":1},{"type":"linebreak","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":"index:1, | |
| item:2","type":"text","version":1},{"type":"linebreak","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":"index:2, | |
| item:3","type":"text","version":1},{"type":"linebreak","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":"index:3, | |
| item:4","type":"text","version":1},{"type":"linebreak","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":"index:4, | |
| item:5","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1,"textFormat":0},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"expected | |
| output:","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0},{"children":[],"direction":null,"format":"","indent":0,"type":"paragraph","version":1,"textFormat":0},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"index:0, | |
| item:1","type":"text","version":1},{"type":"linebreak","version":1},{"detail":0,"format":0,"mode":"normal","style":"","text":"index:1, | |
| item:2","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0}],"direction":"ltr","format":"","indent":0,"type":"root","version":1}}' | |
| theme: blue | |
| title: '' | |
| type: '' | |
| width: 311 | |
| height: 271 | |
| id: '1721218245910' | |
| position: | |
| x: 3104.405041423591 | |
| y: 566.0798820011455 | |
| positionAbsolute: | |
| x: 3104.405041423591 | |
| y: 566.0798820011455 | |
| selected: true | |
| sourcePosition: right | |
| targetPosition: left | |
| type: custom-note | |
| width: 311 | |
| viewport: | |
| x: -1384.9166015084425 | |
| y: 131.53205341486313 | |
| zoom: 0.6261800813907383 |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm attempting to implement the "break" behavior within an iteration node.
We are aware that dictionary objects are mutable in Python. I attempted to use a Code node to pass a "session" dictionary object through the iteration node and then update this "session" dictionary object within the iteration node.
For example:
However, this approach did not succeed.
It appears that the output of the Code node is an "immutable" object(maybe a clone value).
We can observe that in the first iteration, session["stop_flag"] was set to "2", but in the second iteration, session["stop_flag"] remained empty.
Here is my Proof of Concept chatbot YAML:
gist.github.com/rainchen/cc486f9fe2b169cbcf20a10f490b6f1d
I hope someone can find a solution to this issue.