feat: add direct tracking pool sync 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:28:10 +08:00
parent 5dab485e81
commit 22f6e6e686
3 changed files with 516 additions and 0 deletions

View File

@@ -216,6 +216,35 @@ class MainAgentGovernanceTests(unittest.TestCase):
)
return assistant_id
def _insert_content_source_account(
self,
*,
source_id: str = "source_member_platform",
platform: str = "kuaishou",
title: str = "平台账号",
source_url: str = "https://example.com/account",
) -> str:
self.core.create_content_source(
account_id=self.ctx["member_id"],
project_id=self.ctx["project_id"],
source_kind="creator_account",
platform=platform,
handle=f"{platform}_handle",
source_url=source_url,
title=title,
metadata={"nickname": title, "platform": platform},
)
created = self.core.db.fetch_one(
"""
SELECT * FROM content_sources
WHERE user_id = ? AND project_id = ? AND platform = ? AND source_kind = 'creator_account'
ORDER BY created_at DESC
LIMIT 1
""",
(self.ctx["member_id"], self.ctx["project_id"], platform),
)
return created["id"]
def _seed_approved_member_without_project(self) -> dict[str, Any]:
now = self.db_module.utc_now()
admin_id = "acct_admin"
@@ -767,6 +796,11 @@ class MainAgentGovernanceTests(unittest.TestCase):
self.assertGreater(registry_payload["count"], 0)
default_action = next(item for item in registry_payload["items"] if item["action_key"] == "generate-copy")
self.assertEqual(default_action["source"], "default")
action_keys = {item["action_key"] for item in registry_payload["items"]}
self.assertIn("analyze-account", action_keys)
self.assertIn("track-account", action_keys)
self.assertIn("refresh-tracking", action_keys)
self.assertIn("create-assistant", action_keys)
save_registry = self.client.put(
"/v2/oneliner/action-registry/generate-copy",
@@ -999,6 +1033,116 @@ class MainAgentGovernanceTests(unittest.TestCase):
self.assertEqual(payload["payload"]["job"]["artifacts"]["video_provider"], "seedance2")
self.assertEqual(payload["payload"]["job"]["artifacts"]["video_model"], "seedance-2.0-pro")
def test_direct_oneliner_actions_execute_real_account_and_agent_flows(self) -> None:
source_id = self._insert_content_source_account(
platform="kuaishou",
title="快手测试账号",
source_url="https://www.kuaishou.com/profile/test-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:
captured_model_calls.append(
{
"profile_id": profile["id"],
"system_prompt": system_prompt,
"user_prompt": user_prompt,
"temperature": temperature,
}
)
return (
'{"executive_summary":"账号可继续做增长拆解","borrow_points":["封面结构稳定"],'
'"risks":["更新频率偏低"],"next_actions":["继续同步并补日报"]}'
)
with patch.object(self.core, "call_model", new=AsyncMock(side_effect=fake_call_model)):
analyze_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "analyze-account",
"project_id": self.ctx["project_id"],
"platform": "kuaishou",
"payload": {
"target_account_id": source_id,
"extra_focus": "重点看商业化动作",
"max_videos": 4,
},
},
)
self.assertEqual(analyze_response.status_code, 200, analyze_response.text)
analyze_payload = analyze_response.json()
self.assertEqual(analyze_payload["recommended_action"]["action"], "select-account")
self.assertEqual(analyze_payload["recommended_action"]["screen"], "discovery")
self.assertEqual(analyze_payload["recommended_action"]["account_id"], source_id)
self.assertEqual(analyze_payload["payload"]["platform"], "kuaishou")
self.assertEqual(analyze_payload["payload"]["account_id"], source_id)
self.assertTrue(captured_model_calls)
self.assertIn("重点看商业化动作", captured_model_calls[0]["user_prompt"])
track_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "track-account",
"project_id": self.ctx["project_id"],
"platform": "kuaishou",
"payload": {
"target_account_id": source_id,
"note": "由主 Agent 直接加入跟踪",
"refresh_now": True,
},
},
)
self.assertEqual(track_response.status_code, 200, track_response.text)
track_payload = track_response.json()
self.assertEqual(track_payload["recommended_action"]["action"], "open-job-detail")
self.assertEqual(track_payload["recommended_action"]["screen"], "production")
self.assertTrue(track_payload["recommended_action"]["job_id"])
self.assertEqual(track_payload["payload"]["platform"], "kuaishou")
self.assertEqual(track_payload["payload"]["account_id"], source_id)
self.assertEqual(track_payload["payload"]["refresh"]["tracked_account_id"], source_id)
self.assertTrue(track_payload["payload"]["refresh"]["sync_job_id"])
refresh_tracking_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "refresh-tracking",
"project_id": self.ctx["project_id"],
"platform": "kuaishou",
"payload": {},
},
)
self.assertEqual(refresh_tracking_response.status_code, 200, refresh_tracking_response.text)
refresh_tracking_payload = refresh_tracking_response.json()
self.assertEqual(refresh_tracking_payload["recommended_action"]["action"], "open-job-detail")
self.assertEqual(refresh_tracking_payload["recommended_action"]["screen"], "production")
self.assertTrue(refresh_tracking_payload["recommended_action"]["job_id"])
self.assertEqual(refresh_tracking_payload["payload"]["platform"], "kuaishou")
self.assertGreaterEqual(int(refresh_tracking_payload["payload"]["refresh"]["refreshed"] or 0), 1)
create_response = self.client.post(
"/v2/oneliner/actions/execute",
headers=self.ctx["member_headers"],
json={
"action_key": "create-assistant",
"project_id": self.ctx["project_id"],
"platform": "kuaishou",
"payload": {
"name": "快手增长 Agent",
"description": "负责承接快手平台增长动作",
"generation_goal": "围绕快手账号分析和同步动作持续执行",
},
},
)
self.assertEqual(create_response.status_code, 200, create_response.text)
create_payload = create_response.json()
self.assertEqual(create_payload["recommended_action"]["action"], "open-edit-assistant")
self.assertEqual(create_payload["recommended_action"]["screen"], "playbook")
self.assertTrue(create_payload["recommended_action"]["assistant_id"])
self.assertEqual(create_payload["payload"]["assistant"]["name"], "快手增长 Agent")
def test_platform_agent_routes_are_live(self) -> None:
save_profile = self.client.put(
"/v2/platform-agents/douyin/profile",