feat(backend): 完善 Workflow 与 DeepResearch 的运行链路与持久化能力
功能说明:\n- 重构并增强工作流网关执行链路,支持更完整的 proposal 与 run 调度参数透传\n- 增加 DeepResearch/workflow 运行事件持久化能力并补齐建表 SQL 与查询/保存接口适配\n- 优化 lead agent 与 deep research runner 的中间态处理,增强线程收集与执行链并发控制\n- 调整工作流执行器与任务路由,提升兼容性并完善错误与回放行为\n- 补充回归测试:deep_research 持久化、workflow 并发、定义加载、引擎执行、run 流程等覆盖
This commit is contained in:
1 parent
f5bf7897b9
commit
6d326a21cd
28 files changed
+836
-135
No files matched your search
@@ -663,6 +663,60 @@ async def test_agent_node_streams_deltas_and_parses_json() -> None:
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_agent_clarification_pauses_and_resume_is_routed_to_the_same_node() -> None:
|
||||
seen_resume_payloads: list[dict[str, Any] | None] = []
|
||||
|
||||
async def run_agent(**kwargs: Any) -> dict[str, Any]:
|
||||
resume_payload = kwargs.get("resume_payload")
|
||||
seen_resume_payloads.append(resume_payload)
|
||||
if resume_payload is None:
|
||||
return {
|
||||
"awaiting_input": {
|
||||
"toolCallId": "clarify-1",
|
||||
"prompt": "请确认分析的地域范围。",
|
||||
"actions": ["submit"],
|
||||
}
|
||||
}
|
||||
assert resume_payload["values"] == {"answer": "中国市场"}
|
||||
return {"text": "已按中国市场范围完成分析。"}
|
||||
|
||||
graph = _graph(
|
||||
[
|
||||
{"id": "start", "type": "start"},
|
||||
{
|
||||
"id": "research",
|
||||
"type": "agent",
|
||||
"config": {"agentId": "researcher", "promptTemplate": "分析 {{ inputs.topic }}"},
|
||||
},
|
||||
{"id": "end", "type": "output", "config": {"mapping": {"text": "{{ nodes.research.data.text }}"}}},
|
||||
],
|
||||
[
|
||||
{"id": "e1", "source": "start", "target": "research"},
|
||||
{"id": "e2", "source": "research", "target": "end"},
|
||||
],
|
||||
)
|
||||
deps = WorkflowRuntimeDeps(run_agent=run_agent)
|
||||
|
||||
with pytest.raises(WorkflowPaused) as paused:
|
||||
await _run(graph, {"topic": "新能源车"}, deps=deps)
|
||||
assert paused.value.node_id == "research"
|
||||
assert paused.value.pending_input["toolCallId"] == "clarify-1"
|
||||
|
||||
result, _events = await _run(
|
||||
graph,
|
||||
{"topic": "新能源车"},
|
||||
deps=deps,
|
||||
resume_payload={
|
||||
"nodeId": "research",
|
||||
"values": {"answer": "中国市场"},
|
||||
"message": "只分析中国市场",
|
||||
},
|
||||
)
|
||||
assert result.output == {"text": "已按中国市场范围完成分析。"}
|
||||
assert seen_resume_payloads == [None, {"nodeId": "research", "values": {"answer": "中国市场"}, "message": "只分析中国市场"}]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_agent_node_includes_rendered_workflow_input_bindings() -> None:
|
||||
seen: dict[str, Any] = {}
|
||||
|
||||
Reference in new issue
Block a user