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

@@ -219,6 +219,10 @@ async def harness(monkeypatch: pytest.MonkeyPatch):
class _Cfg:
workflows = config
@staticmethod
def get_model_config(name: str):
return {"name": name} if name == "planner-model" else None
async def _user(_request=None) -> str:
return "user-a"
@@ -325,7 +329,7 @@ async def test_planning_session_selects_an_editable_candidate_then_confirms_one_
created = await harness.client.post(
f"/api/workflows/{definition['id']}/planning-sessions",
json={"query": "分析本周销售下滑并给出改进方案"},
json={"query": "分析本周销售下滑并给出改进方案", "modelName": "planner-model"},
)
assert created.status_code == 200, created.text
session = created.json()
@@ -337,6 +341,10 @@ async def test_planning_session_selects_an_editable_candidate_then_confirms_one_
]
assert session["proposals"][0]["title"] == "多角度调研方案"
assert all(proposal["validation"]["valid"] for proposal in session["proposals"])
for proposal in session["proposals"]:
for node in proposal["graph"]["nodes"]:
if node["type"] == "agent":
assert node["config"]["modelName"] == "planner-model"
parallel_graph = session["proposals"][0]["graph"]
evidence = next(node for node in parallel_graph["nodes"] if node["type"] == "evidence_normalizer")
synthesis = next(node for node in parallel_graph["nodes"] if node["id"] == "writer")
@@ -453,7 +461,7 @@ async def test_dedicated_workflow_controller_has_no_tools_or_thinking(
response = await harness.client.post(
f"/api/workflows/{definition['id']}/planning-sessions",
json={"query": "快速确认这份材料是否有缺口"},
json={"query": "快速确认这份材料是否有缺口", "modelName": "planner-model"},
)
assert response.status_code == 200, response.text
@@ -461,6 +469,7 @@ async def test_dedicated_workflow_controller_has_no_tools_or_thinking(
assert captured["disable_tools"] is True
assert captured["thinking_enabled"] is False
assert captured["force_disable_thinking"] is True
assert captured["model_name"] == "planner-model"
@pytest.mark.asyncio
@@ -505,6 +514,22 @@ async def test_planner_uses_visible_agent_catalog_when_canvas_is_only_start_and_
"collaborative": ["agent-research", "agent-writer"],
"quick_answer": ["agent-research"],
},
"taskContracts": {
"parallel_research": {
"agent-research": {
"mission": "只收集新能源乘用车市场规模与增长证据。",
"deliverable": "带来源和置信度的市场规模证据笔记。",
"scope": "不要撰写最终报告。",
"handoff": "交给策略分析师的 Evidence Pack。",
},
"agent-writer": {
"mission": "比较 Evidence Pack 中的证据并形成判断。",
"deliverable": "冲突、假设和落地建议。",
"scope": "区分事实与推断。",
"handoff": "交给深度研究报告写作节点。",
},
}
},
"titles": {"parallel_research": "双角色调研报告"},
}
@@ -551,6 +576,13 @@ async def test_planner_uses_visible_agent_catalog_when_canvas_is_only_start_and_
"agent-research",
"agent-writer",
]
graph_nodes = {node["id"]: node for node in parallel["graph"]["nodes"]}
research_prompt = graph_nodes["__planner_agent_1__"]["config"]["promptTemplate"]
writer_prompt = graph_nodes["__planner_agent_3__"]["config"]["promptTemplate"]
assert "只收集新能源乘用车市场规模与增长证据。" in research_prompt
assert "不要撰写最终报告。" in research_prompt
assert "比较 Evidence Pack 中的证据并形成判断。" in writer_prompt
assert "这是工作流总控为你分配的固定岗位" in writer_prompt
assert all(proposal["validation"]["valid"] for proposal in session["proposals"])