Refactor workflow agent and routing components for improved functionality
- Introduce WorkflowAgentStage to manage agent stage configurations and enhance interaction with the workflow engine. - Implement WorkflowEdgeEvaluator for priority-aware edge evaluation, improving routing decisions based on conditions and user turns. - Update WorkflowBrain to handle user turns and routing more effectively, ensuring agents cannot have only one default path. - Enhance CallEndCoordinator to track speech events and manage call termination based on queued speech. - Add new models and output handling for workflow interactions, improving clarity and maintainability. - Update tests to validate the new routing logic and agent behavior under various scenarios.
This commit is contained in:
@@ -73,7 +73,7 @@ NODE_SPECS: list[dict[str, Any]] = [
|
||||
"icon": "Zap",
|
||||
"accent": "peach",
|
||||
"addable": True,
|
||||
"constraints": {"minIncoming": 1, "minOutgoing": 1},
|
||||
"constraints": {"minIncoming": 1, "minOutgoing": 0},
|
||||
"fields": [
|
||||
{"key": "name", "label": "节点名称", "type": "text", "default": "Action"},
|
||||
],
|
||||
@@ -352,18 +352,19 @@ def validate_graph(graph: dict[str, Any]) -> list[str]:
|
||||
if mode == "expression":
|
||||
expression_errors = _validate_expression(data.get("expression"))
|
||||
errors.extend(f"边 {edge_id}:{item}" for item in expression_errors)
|
||||
try:
|
||||
priority = int(data.get("priority", 10))
|
||||
except (TypeError, ValueError):
|
||||
errors.append(f"边 {edge_id} 的优先级必须是整数")
|
||||
priority = 10
|
||||
if priority in priorities[source_id]:
|
||||
errors.append(f"节点 {source_id} 的出边优先级不能重复:{priority}")
|
||||
priorities[source_id].add(priority)
|
||||
if mode == "always":
|
||||
always_counts[source_id] += 1
|
||||
if always_counts[source_id] > 1:
|
||||
errors.append(f"节点 {source_id} 最多只能有一条默认路径")
|
||||
else:
|
||||
try:
|
||||
priority = int(data.get("priority", 10))
|
||||
except (TypeError, ValueError):
|
||||
errors.append(f"边 {edge_id} 的优先级必须是整数")
|
||||
priority = 10
|
||||
if priority in priorities[source_id]:
|
||||
errors.append(f"节点 {source_id} 的条件边优先级不能重复:{priority}")
|
||||
priorities[source_id].add(priority)
|
||||
incoming[target_id] += 1
|
||||
outgoing[source_id] += 1
|
||||
adj[source_id].append(target_id)
|
||||
@@ -387,6 +388,15 @@ def validate_graph(graph: dict[str, Any]) -> list[str]:
|
||||
errors.append(f"节点 {node_id} 的{label}不能少于 {lo}")
|
||||
if hi is not None and actual > hi:
|
||||
errors.append(f"节点 {node_id} 的{label}不能多于 {hi}")
|
||||
if (
|
||||
node.get("type") == "agent"
|
||||
and outgoing[node_id] == 1
|
||||
and always_counts[node_id] == 1
|
||||
):
|
||||
errors.append(
|
||||
f"Agent 节点 {node_id} 不能只有默认路径;"
|
||||
"请改为条件路径,或删除该路径以持续对话"
|
||||
)
|
||||
start_id = next(
|
||||
(node_id for node_id, node in node_by_id.items() if node.get("type") == "start"),
|
||||
None,
|
||||
|
||||
Reference in New Issue
Block a user