Skip to content

Commit 54f0cb8

Browse files
committed
Fix COMPOSITE nodes not processed in interaction chaining loops
The two while loops in process_interaction that chain through non-interactive nodes (ACTION, CONDITION, MESSAGE) did not handle COMPOSITE nodes, causing the session to stall when a MESSAGE node chained to a COMPOSITE node (e.g., stale_collection_msg → profile_composite). Add NodeType.COMPOSITE to both while loops and handle dict question results that composite sub-flows return when entering a sub-flow with a question node.
1 parent 533d9b2 commit 54f0cb8

File tree

1 file changed

+83
-1
lines changed

1 file changed

+83
-1
lines changed

app/services/chat_runtime.py

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)