@@ -1355,8 +1355,9 @@ async def process_interaction(
13551355 elif chained_next_node .node_type in (
13561356 NodeType .ACTION ,
13571357 NodeType .CONDITION ,
1358+ NodeType .COMPOSITE ,
13581359 ):
1359- # Process action/condition automatically
1360+ # Process action/condition/composite automatically
13601361 auto_result = await self .process_node (
13611362 db , chained_next_node , session
13621363 )
@@ -1366,11 +1367,51 @@ async def process_interaction(
13661367 result ["messages" ].extend (
13671368 auto_result .get ("messages" , [])
13681369 )
1370+
1371+ # Check if result is a question (e.g., composite entered sub-flow)
1372+ if auto_result and auto_result .get ("type" ) == "question" :
1373+ awaiting_input = True
1374+ session_position = auto_result .get (
1375+ "node_id" , chained_next_node .node_id
1376+ )
1377+ sub_flow_id = _to_uuid (auto_result .get ("sub_flow_id" ))
1378+ if sub_flow_id :
1379+ session_flow_id = sub_flow_id
1380+ result ["input_request" ] = self ._build_input_request (
1381+ auto_result
1382+ )
1383+ chained_next_node = None
1384+ break
1385+
13691386 # Update position and continue
13701387 session_position = chained_next_node .node_id
13711388 session_flow_id = chained_next_node .flow_id
13721389 chained_next_node = auto_result .get ("next_node" )
13731390
1391+ # Handle dict question results from composite sub-flows
1392+ if (
1393+ isinstance (chained_next_node , dict )
1394+ and chained_next_node .get ("type" ) == "question"
1395+ ):
1396+ awaiting_input = True
1397+ session_position = chained_next_node .get (
1398+ "node_id" , session_position
1399+ )
1400+ sub_flow_id = _to_uuid (
1401+ chained_next_node .get ("sub_flow_id" )
1402+ or (
1403+ auto_result .get ("sub_flow_id" )
1404+ if auto_result
1405+ else None
1406+ )
1407+ )
1408+ if sub_flow_id :
1409+ session_flow_id = sub_flow_id
1410+ result ["input_request" ] = self ._build_input_request (
1411+ chained_next_node
1412+ )
1413+ chained_next_node = None
1414+
13741415 # Update session position
13751416 session = await chat_repo .update_session_state (
13761417 db ,
@@ -1517,6 +1558,7 @@ async def process_interaction(
15171558 elif chained_next .node_type in (
15181559 NodeType .ACTION ,
15191560 NodeType .CONDITION ,
1561+ NodeType .COMPOSITE ,
15201562 ):
15211563 auto_result = await self .process_node (
15221564 db , chained_next , session
@@ -1526,10 +1568,50 @@ async def process_interaction(
15261568 result ["messages" ].extend (
15271569 auto_result .get ("messages" , [])
15281570 )
1571+
1572+ # Check if result is a question (e.g., composite entered sub-flow)
1573+ if auto_result and auto_result .get ("type" ) == "question" :
1574+ awaiting_input = True
1575+ session_position = auto_result .get (
1576+ "node_id" , chained_next .node_id
1577+ )
1578+ sub_flow_id = _to_uuid (auto_result .get ("sub_flow_id" ))
1579+ if sub_flow_id :
1580+ session_flow_id = sub_flow_id
1581+ result ["input_request" ] = self ._build_input_request (
1582+ auto_result
1583+ )
1584+ chained_next = None
1585+ break
1586+
15291587 session_position = chained_next .node_id
15301588 session_flow_id = chained_next .flow_id
15311589 chained_next = auto_result .get ("next_node" )
15321590
1591+ # Handle dict question results from composite sub-flows
1592+ if (
1593+ isinstance (chained_next , dict )
1594+ and chained_next .get ("type" ) == "question"
1595+ ):
1596+ awaiting_input = True
1597+ session_position = chained_next .get (
1598+ "node_id" , session_position
1599+ )
1600+ sub_flow_id = _to_uuid (
1601+ chained_next .get ("sub_flow_id" )
1602+ or (
1603+ auto_result .get ("sub_flow_id" )
1604+ if auto_result
1605+ else None
1606+ )
1607+ )
1608+ if sub_flow_id :
1609+ session_flow_id = sub_flow_id
1610+ result ["input_request" ] = self ._build_input_request (
1611+ chained_next
1612+ )
1613+ chained_next = None
1614+
15331615 session = await chat_repo .update_session_state (
15341616 db ,
15351617 session_id = session .id ,
0 commit comments