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:
董宏凯 committed 2026-09-02 12:52:37 +08:00
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] = {}