feat(server): add workbench API, DSH planner worker and RAG pipeline
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
"""全局总监 Agent 单元测试。"""
|
||||
import json
|
||||
from unittest.mock import patch
|
||||
|
||||
from sqlmodel import Session, SQLModel, create_engine
|
||||
|
||||
from app.agents.supervisor import supervisor_check
|
||||
from app.models import Agent, Campaign, Canvas, Segment
|
||||
|
||||
|
||||
def _session_with_campaign(round_: int = 1, status: str = "approved"):
|
||||
import tempfile, pathlib
|
||||
engine = create_engine("sqlite://", connect_args={"check_same_thread": False})
|
||||
SQLModel.metadata.create_all(engine)
|
||||
session = Session(engine)
|
||||
supervisor = Agent(id=99, name="总监", role="qc", status="active", rules="r")
|
||||
campaign = Campaign(id=1, name="测试任务", objective="目标", success_criteria="标准",
|
||||
canvas_snapshot={"supervisor_agent_id": 99, "supervisor_mode": "always"},
|
||||
status="running")
|
||||
artifact = pathlib.Path(tempfile.mkdtemp()) / "seg_10.md"
|
||||
artifact.write_text("这是生成的正文内容", encoding="utf-8")
|
||||
seg = Segment(id=10, campaign_id=1, title="开场", artifact_path=str(artifact),
|
||||
round=round_, status=status)
|
||||
session.add(supervisor); session.add(campaign); session.add(seg)
|
||||
session.commit()
|
||||
return session, campaign, seg
|
||||
|
||||
|
||||
def test_supervisor_disabled_when_no_snapshot():
|
||||
engine = create_engine("sqlite://", connect_args={"check_same_thread": False})
|
||||
SQLModel.metadata.create_all(engine)
|
||||
with Session(engine) as s:
|
||||
campaign = Campaign(id=2, name="无画布", status="running", canvas_snapshot={})
|
||||
seg = Segment(id=20, campaign_id=2, title="段", status="approved")
|
||||
s.add(campaign); s.add(seg); s.commit()
|
||||
assert supervisor_check(s, seg, campaign) == {"checked": False}
|
||||
|
||||
|
||||
def test_supervisor_on_drift_skips_clean_first_round():
|
||||
session, campaign, seg = _session_with_campaign(round_=1, status="approved")
|
||||
# on_drift 模式下首段且无异常 → 不审(省点数)
|
||||
campaign.canvas_snapshot = {"supervisor_agent_id": 99, "supervisor_mode": "on_drift"}
|
||||
session.add(campaign); session.commit()
|
||||
assert supervisor_check(session, seg, campaign) == {"checked": False}
|
||||
session.close()
|
||||
|
||||
|
||||
def test_supervisor_always_reviews_and_redo():
|
||||
session, campaign, seg = _session_with_campaign()
|
||||
with patch("app.llm.chat_json") as mock:
|
||||
mock.return_value = {"status": "ok", "text": json.dumps({
|
||||
"on_track": False, "reason": "跑到了别的话题",
|
||||
"guidance": "回到开场主题"})}
|
||||
verdict = supervisor_check(session, seg, campaign)
|
||||
assert verdict["checked"] and not verdict["on_track"]
|
||||
assert verdict["reason"] == "跑到了别的话题"
|
||||
assert verdict["guidance"] == "回到开场主题"
|
||||
session.close()
|
||||
|
||||
|
||||
def test_supervisor_off_mode():
|
||||
session, campaign, seg = _session_with_campaign()
|
||||
campaign.canvas_snapshot = {"supervisor_agent_id": 99, "supervisor_mode": "off"}
|
||||
session.add(campaign); session.commit()
|
||||
assert supervisor_check(session, seg, campaign) == {"checked": False}
|
||||
session.close()
|
||||
|
||||
|
||||
def test_supervisor_llm_failure_not_blocking():
|
||||
session, campaign, seg = _session_with_campaign()
|
||||
with patch("app.llm.chat_json", side_effect=Exception("限流")):
|
||||
assert supervisor_check(session, seg, campaign) == {"checked": False}
|
||||
session.close()
|
||||
Reference in New Issue
Block a user