feat(v2): 完善配置中心与可替换轨迹质检并联动预审依据

This commit is contained in:
2026-10-01 17:13:02 +08:00
parent 1adbe16cb3
commit e604d177cb
42 changed files with 1285 additions and 83 deletions
+10 -9
View File
@@ -33,7 +33,8 @@ PROJECT = "DEMO-B"
BASE = "/api/xingbang/risk-agent/project-assistant"
PRESCREEN = BASE + "/prescreen"
MANAGER = {"X-Xingbang-Demo-Role": "manager"}
REVIEWER = {"X-Xingbang-Demo-Role": "reviewer"}
ADMIN = {"X-Xingbang-Demo-Role": "admin"}
PUBLISHER = {"Authorization": "Bearer fixture-publisher"}
CARD_ID = "skill.history.repayment"
CARD_VERSION = "1.0.0"
@@ -57,7 +58,7 @@ class CardToRunTests(unittest.TestCase):
patch.object(api, "service", lambda: self.service),
patch.object(prescreen_api, "_service", lambda: self.service),
patch.object(catalog, "DB_PATH", self.path / "catalog.sqlite3"),
patch.dict(os.environ, {"XINGBANG_AUTH_USERS": "", "XINGBANG_REQUIRE_AUTH": "0",
patch.dict(os.environ, {"XINGBANG_AUTH_USERS": '[{"id":"config-admin-b","role":"admin","projects":["DEMO-B"],"token":"fixture-publisher"}]', "XINGBANG_REQUIRE_AUTH": "0",
"XINGBANG_LOCAL_MODEL_URL": "", "XINGBANG_DEMO_ROLE_LOGIN": "1"}),
]
for item in self.patches:
@@ -88,7 +89,7 @@ class CardToRunTests(unittest.TestCase):
"test_cases": TEST_CASES,
}, "demo-manager", PROJECT, origin="history_derived", source_event_ids=["event-1"])
def publish(self, path, headers=REVIEWER):
def publish(self, path, headers=PUBLISHER):
evaluated = self.call("POST", path, {"action": "evaluate"}, headers)
self.assertEqual(evaluated.status_code, 200, evaluated.text)
return self.call("POST", path, {"action": "publish"}, headers)
@@ -99,7 +100,7 @@ class CardToRunTests(unittest.TestCase):
"template": "template.ai-pre-review",
"budget": {"timeout_seconds": 180, "max_tool_calls": 18},
"audience": ["manager"], "run_kind": "pre_review",
})
}, headers=ADMIN)
def run_with(self, plan_id):
queued = self.call("POST", f"/projects/{PROJECT}/runs",
@@ -163,10 +164,10 @@ class CardToRunTests(unittest.TestCase):
# 发布时依赖解析拒绝未发布组件
evaluated = self.call("POST", f"/review-plans/{plan.json()['component_id']}/transitions",
{"action": "evaluate"}, REVIEWER)
{"action": "evaluate"}, PUBLISHER)
self.assertEqual(evaluated.status_code, 200, evaluated.text)
published = self.call("POST", f"/review-plans/{plan.json()['component_id']}/transitions",
{"action": "publish"}, REVIEWER)
{"action": "publish"}, PUBLISHER)
self.assertEqual(published.status_code, 409, published.text)
def test_missing_dependency_fails_evaluation_instead_of_being_dropped(self):
@@ -177,12 +178,12 @@ class CardToRunTests(unittest.TestCase):
plan_ref = plan.json()["component_id"]
evaluated = self.call("POST", f"/review-plans/{plan_ref}/transitions",
{"action": "evaluate"}, REVIEWER)
{"action": "evaluate"}, PUBLISHER)
self.assertEqual(evaluated.status_code, 200, evaluated.text)
self.assertFalse(evaluated.json()["passed"], "依赖缺失必须让评测不通过")
published = self.call("POST", f"/review-plans/{plan_ref}/transitions",
{"action": "publish"}, REVIEWER)
{"action": "publish"}, PUBLISHER)
self.assertEqual(published.status_code, 409, published.text)
def test_plan_rejects_tool_configuration_surface(self):
@@ -197,7 +198,7 @@ class CardToRunTests(unittest.TestCase):
def test_transitioning_an_unknown_plan_is_404(self):
"""不存在的方案必须是 404,不是 500(归属查询在 run() 内完成)。"""
response = self.call("POST", "/review-plans/plan.not.exists/transitions",
{"action": "evaluate"}, REVIEWER)
{"action": "evaluate"}, PUBLISHER)
self.assertEqual(response.status_code, 404)
self.assertEqual(response.json()["error"]["code"], "NOT_FOUND")