feat: deepen direct benchmark and analysis actions
This commit is contained in:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user