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
@@ -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"])
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user