feat: add direct tracking pool sync actions
This commit is contained in:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user