feat: deepen direct benchmark and analysis actions
Some checks failed
StoryForge CI / Baseline checks (push) Has been cancelled
StoryForge CI / Backend tests (push) Has been cancelled
StoryForge CI / Web tests (push) Has been cancelled

This commit is contained in:
kris
2026-04-05 06:55:13 +08:00
parent 88ccc62c71
commit 905c3adabe
3 changed files with 527 additions and 21 deletions

View File

@@ -156,16 +156,7 @@ class MainAgentGovernanceTests(unittest.TestCase):
result_json: str = '{"summary":"done"}',
) -> str:
now = self.db_module.utc_now()
knowledge_base_id = "kb_member_default"
existing_kb = self.core.db.fetch_one("SELECT id FROM knowledge_bases WHERE id = ?", (knowledge_base_id,))
if not existing_kb:
self.core.db.execute(
"""
INSERT INTO knowledge_bases (id, user_id, project_id, name, description, sync_status, created_at, updated_at)
VALUES (?, ?, ?, 'Default KB', '', 'ready', ?, ?)
""",
(knowledge_base_id, self.ctx["member_id"], self.ctx["project_id"], now, now),
)
knowledge_base_id = self._ensure_default_knowledge_base(now)
self.core.db.execute(
"""
INSERT INTO jobs (
@@ -191,6 +182,42 @@ class MainAgentGovernanceTests(unittest.TestCase):
)
return job_id
def _ensure_default_knowledge_base(self, now: str | None = None) -> str:
knowledge_base_id = "kb_member_default"
existing_kb = self.core.db.fetch_one("SELECT id FROM knowledge_bases WHERE id = ?", (knowledge_base_id,))
if existing_kb:
return knowledge_base_id
ts = now or self.db_module.utc_now()
self.core.db.execute(
"""
INSERT INTO knowledge_bases (id, user_id, project_id, name, description, sync_status, created_at, updated_at)
VALUES (?, ?, ?, 'Default KB', '', 'ready', ?, ?)
""",
(knowledge_base_id, self.ctx["member_id"], self.ctx["project_id"], ts, ts),
)
return knowledge_base_id
def _insert_douyin_account(
self,
*,
account_id: str,
profile_url: str,
nickname: str,
) -> str:
now = self.db_module.utc_now()
self.core.db.execute(
"""
INSERT INTO douyin_accounts (
id, user_id, profile_url, canonical_profile_url, sec_uid, douyin_uid, douyin_id,
nickname, signature, avatar_url, tags_json, profile_stats_json, raw_profile_json,
source_mode, sync_status, last_public_sync_at, last_creator_sync_at, last_analysis_at,
created_at, updated_at
) VALUES (?, ?, ?, ?, '', '', '', ?, '', '', '[]', '{}', '{}', 'public', 'ready', NULL, NULL, NULL, ?, ?)
""",
(account_id, self.ctx["member_id"], profile_url, profile_url, nickname, now, now),
)
return account_id
def _insert_assistant(
self,
*,
@@ -802,6 +829,8 @@ class MainAgentGovernanceTests(unittest.TestCase):
self.assertIn("refresh-tracking", action_keys)
self.assertIn("mark-tracking-read", action_keys)
self.assertIn("create-assistant", action_keys)
self.assertIn("search-similar-accounts", action_keys)
self.assertIn("save-benchmark-link", action_keys)
save_registry = self.client.put(
"/v2/oneliner/action-registry/generate-copy",
@@ -974,6 +1003,91 @@ class MainAgentGovernanceTests(unittest.TestCase):
self.assertEqual(copy_payload["recommended_action"]["screen"], "playbook")
self.assertEqual(copy_payload["recommended_action"]["platform"], "douyin")
with patch.object(
self.core,
"create_content_source_sync_job",
new=AsyncMock(return_value={"id": "job_sync_import", "title": "Import Sync Job"}),
):
import_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "import-homepage",
"project_id": self.ctx["project_id"],
"platform": "douyin",
"payload": {"source_url": "https://www.douyin.com/user/test-homepage"},
},
)
self.assertEqual(import_response.status_code, 200, import_response.text)
import_payload = import_response.json()
self.assertEqual(import_payload["recommended_action"]["action"], "open-job-detail")
self.assertEqual(import_payload["recommended_action"]["screen"], "production")
self.assertEqual(import_payload["recommended_action"]["job_id"], "job_sync_import")
source_id = self._insert_content_source_account(
platform="kuaishou",
title="高分拆解账号",
source_url="https://www.kuaishou.com/profile/top-video-account",
)
video_source = self.core.create_content_source(
account_id=self.ctx["member_id"],
project_id=self.ctx["project_id"],
source_kind="video_link",
platform="kuaishou",
source_url="https://www.kuaishou.com/video/top-video-1",
title="高分作品 1",
metadata={
"origin_content_source_id": source_id,
"source_account_url": "https://www.kuaishou.com/profile/top-video-account",
},
)
now = self.db_module.utc_now()
knowledge_base_id = self._ensure_default_knowledge_base(now)
self.core.db.execute(
"""
INSERT INTO jobs (
id, user_id, project_id, parent_job_id, assistant_id, knowledge_base_id, content_source_id,
source_type, line_type, workflow_key, orchestrator, provider_name, provider_task_id,
source_url, title, language, status, transcript_text, style_summary, upload_status,
error, artifacts_json, result_json, analysis_model_profile_id, created_at, updated_at
) VALUES (?, ?, ?, '', NULL, ?, ?, ?, ?, ?, 'n8n', 'collector', '', '', ?, 'auto', 'completed', '', '', 'completed', '', '{}', ?, '', ?, ?)
""",
(
"job_video_1",
self.ctx["member_id"],
self.ctx["project_id"],
knowledge_base_id,
video_source["id"],
"video_link",
"analysis",
"analysis_pipeline",
"高分作品 1",
'{"performance_score":91,"summary":"高分作品摘要"}',
now,
now,
),
)
with patch.object(self.core, "call_model", new=AsyncMock(return_value='{"summary":"保留开头 3 秒抓人结构"}')):
analyze_top_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "analyze-top-videos",
"project_id": self.ctx["project_id"],
"platform": "kuaishou",
"payload": {
"target_account_id": source_id,
"top_video_count": 1,
"min_score": 0,
},
},
)
self.assertEqual(analyze_top_response.status_code, 200, analyze_top_response.text)
analyze_top_payload = analyze_top_response.json()
self.assertEqual(analyze_top_payload["recommended_action"]["action"], "select-account")
self.assertEqual(analyze_top_payload["recommended_action"]["screen"], "discovery")
self.assertEqual(analyze_top_payload["recommended_action"]["account_id"], source_id)
def test_create_ai_video_action_passes_provider_and_model_through_oneliner(self) -> None:
self._insert_completed_job(job_id="job_ai_video_source", title="AI Video Source Job")
self._insert_assistant()
@@ -1040,6 +1154,11 @@ class MainAgentGovernanceTests(unittest.TestCase):
title="快手测试账号",
source_url="https://www.kuaishou.com/profile/test-account",
)
candidate_id = self._insert_content_source_account(
platform="kuaishou",
title="快手候选账号",
source_url="https://www.kuaishou.com/profile/candidate-account",
)
captured_model_calls: list[dict[str, Any]] = []
async def fake_call_model(profile: dict[str, Any], *, system_prompt: str, user_prompt: str, temperature: float = 0.3, **_: Any) -> str:
@@ -1161,6 +1280,108 @@ class MainAgentGovernanceTests(unittest.TestCase):
self.assertTrue(create_payload["recommended_action"]["assistant_id"])
self.assertEqual(create_payload["payload"]["assistant"]["name"], "快手增长 Agent")
similar_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "search-similar-accounts",
"project_id": self.ctx["project_id"],
"platform": "kuaishou",
"payload": {
"target_account_id": source_id,
"max_candidates": 3,
"extra_requirements": "优先找商业化和知识付费方向相近的账号",
},
},
)
self.assertEqual(similar_response.status_code, 200, similar_response.text)
similar_payload = similar_response.json()
self.assertEqual(similar_payload["recommended_action"]["action"], "select-account")
self.assertEqual(similar_payload["recommended_action"]["screen"], "discovery")
self.assertTrue(similar_payload["recommended_action"]["account_id"])
self.assertNotEqual(similar_payload["recommended_action"]["account_id"], source_id)
self.assertEqual(similar_payload["payload"]["platform"], "kuaishou")
self.assertEqual(similar_payload["payload"]["source_account_id"], source_id)
self.assertGreaterEqual(int(similar_payload["payload"]["search"]["candidate_count"] or 0), 1)
save_benchmark_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "save-benchmark-link",
"project_id": self.ctx["project_id"],
"platform": "kuaishou",
"payload": {
"source_account_id": source_id,
"note": "由主 Agent 直接加入对标库",
},
},
)
self.assertEqual(save_benchmark_response.status_code, 200, save_benchmark_response.text)
save_benchmark_payload = save_benchmark_response.json()
self.assertEqual(save_benchmark_payload["recommended_action"]["action"], "select-account")
self.assertEqual(save_benchmark_payload["recommended_action"]["screen"], "discovery")
self.assertTrue(save_benchmark_payload["recommended_action"]["account_id"])
self.assertNotEqual(save_benchmark_payload["recommended_action"]["account_id"], source_id)
self.assertEqual(save_benchmark_payload["payload"]["platform"], "kuaishou")
self.assertEqual(save_benchmark_payload["payload"]["source_account_id"], source_id)
self.assertTrue(save_benchmark_payload["payload"]["link"]["id"])
def test_direct_oneliner_similarity_and_benchmark_actions_execute_real_douyin_flows(self) -> None:
source_id = self._insert_douyin_account(
account_id="dyacct_source",
profile_url="https://www.douyin.com/user/source-account",
nickname="源账号",
)
candidate_id = self._insert_douyin_account(
account_id="dyacct_candidate",
profile_url="https://www.douyin.com/user/candidate-account",
nickname="候选账号",
)
similar_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "search-similar-accounts",
"project_id": self.ctx["project_id"],
"platform": "douyin",
"payload": {
"target_account_id": source_id,
"max_candidates": 3,
},
},
)
self.assertEqual(similar_response.status_code, 200, similar_response.text)
similar_payload = similar_response.json()
self.assertEqual(similar_payload["recommended_action"]["action"], "select-account")
self.assertEqual(similar_payload["recommended_action"]["screen"], "discovery")
self.assertEqual(similar_payload["payload"]["platform"], "douyin")
self.assertEqual(similar_payload["payload"]["source_account_id"], source_id)
self.assertEqual(similar_payload["payload"]["search"]["top_candidate_account_id"], candidate_id)
save_benchmark_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "save-benchmark-link",
"project_id": self.ctx["project_id"],
"platform": "douyin",
"payload": {
"source_account_id": source_id,
"note": "由主 Agent 直接加入对标库",
},
},
)
self.assertEqual(save_benchmark_response.status_code, 200, save_benchmark_response.text)
save_benchmark_payload = save_benchmark_response.json()
self.assertEqual(save_benchmark_payload["recommended_action"]["action"], "select-account")
self.assertEqual(save_benchmark_payload["recommended_action"]["screen"], "discovery")
self.assertEqual(save_benchmark_payload["payload"]["platform"], "douyin")
self.assertEqual(save_benchmark_payload["payload"]["source_account_id"], source_id)
self.assertEqual(save_benchmark_payload["payload"]["target_account_id"], candidate_id)
self.assertTrue(save_benchmark_payload["payload"]["link"]["relation_id"])
def test_platform_agent_routes_are_live(self) -> None:
save_profile = self.client.put(
"/v2/platform-agents/douyin/profile",