member_context: split daily weekly monthly digest scheduling
This commit is contained in:
@@ -69,7 +69,8 @@ class MemberContextService:
|
||||
|
||||
def build_member_context(self, chatroom_id: str, wxid: str, days: Optional[int] = None,
|
||||
limit: Optional[int] = None, force_digest_rebuild: bool = False,
|
||||
ensure_group_daily: bool = True) -> Dict:
|
||||
ensure_group_daily: bool = True, enable_weekly_digest: bool = True,
|
||||
enable_monthly_digest: bool = True) -> Dict:
|
||||
days = days or self.sample_days
|
||||
limit = limit or self.refresh_limit_per_member
|
||||
|
||||
@@ -83,11 +84,15 @@ class MemberContextService:
|
||||
chatroom_id, force=force_digest_rebuild
|
||||
)
|
||||
digest_snapshot = self.digest_service.ensure_member_digest_pipeline(
|
||||
chatroom_id, wxid, force=force_digest_rebuild
|
||||
chatroom_id, wxid, force=force_digest_rebuild,
|
||||
enable_weekly=enable_weekly_digest, enable_monthly=enable_monthly_digest
|
||||
)
|
||||
daily_digests = digest_snapshot.get("daily_digests", [])
|
||||
weekly_digests = digest_snapshot.get("weekly_digests", [])
|
||||
monthly_digests = digest_snapshot.get("monthly_digests", [])
|
||||
all_daily_digests = digest_snapshot.get("all_daily_digests", daily_digests)
|
||||
all_weekly_digests = digest_snapshot.get("all_weekly_digests", weekly_digests)
|
||||
all_monthly_digests = digest_snapshot.get("all_monthly_digests", monthly_digests)
|
||||
|
||||
recent_messages = self.message_db.get_member_recent_messages(
|
||||
chatroom_id,
|
||||
@@ -100,7 +105,7 @@ class MemberContextService:
|
||||
weekly_structured = [item.get("structured", {}) or {} for item in weekly_digests]
|
||||
daily_structured = [item.get("structured", {}) or {} for item in daily_digests]
|
||||
|
||||
observation_days = self._calc_observation_days(daily_digests)
|
||||
observation_days = self._calc_observation_days(all_daily_digests)
|
||||
activity_level = self._calc_activity_level(len(recent_messages), max(min(days, 7), 1))
|
||||
context = {
|
||||
"chatroom_id": chatroom_id,
|
||||
@@ -121,7 +126,7 @@ class MemberContextService:
|
||||
),
|
||||
"recent_focus": self._extract_scored_items(daily_structured, ["topics"], limit=4),
|
||||
"summary_text": "",
|
||||
"confidence": self._calc_digest_confidence(monthly_digests, weekly_digests, daily_digests),
|
||||
"confidence": self._calc_digest_confidence(all_monthly_digests, all_weekly_digests, all_daily_digests),
|
||||
"source_message_count": len(recent_messages),
|
||||
"source_days": days,
|
||||
"last_profiled_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
@@ -194,10 +199,10 @@ class MemberContextService:
|
||||
"observation_days": observation_days,
|
||||
"stable_ready": observation_days >= self.stable_ready_days,
|
||||
"profile_iterations": int(((existing_context or {}).get("meta", {}) or {}).get("profile_iterations", 0)) + 1,
|
||||
"history_message_count": self._sum_digest_source_count(daily_digests),
|
||||
"digest_daily_count": len(daily_digests),
|
||||
"digest_weekly_count": len(weekly_digests),
|
||||
"digest_monthly_count": len(monthly_digests),
|
||||
"history_message_count": self._sum_digest_source_count(all_daily_digests),
|
||||
"digest_daily_count": len(all_daily_digests),
|
||||
"digest_weekly_count": len(all_weekly_digests),
|
||||
"digest_monthly_count": len(all_monthly_digests),
|
||||
"last_daily_digest_at": daily_digests[0].get("last_generated_at") if daily_digests else "",
|
||||
"last_weekly_digest_at": weekly_digests[0].get("last_generated_at") if weekly_digests else "",
|
||||
"last_monthly_digest_at": monthly_digests[0].get("last_generated_at") if monthly_digests else "",
|
||||
@@ -226,11 +231,15 @@ class MemberContextService:
|
||||
return context
|
||||
|
||||
def refresh_member_context(self, chatroom_id: str, wxid: str, days: Optional[int] = None,
|
||||
limit: Optional[int] = None) -> Dict:
|
||||
limit: Optional[int] = None, enable_weekly_digest: bool = True,
|
||||
enable_monthly_digest: bool = True) -> Dict:
|
||||
if not self.is_group_enabled(chatroom_id):
|
||||
raise ValueError(f"群 {chatroom_id} 未启用成员交互摘要功能")
|
||||
self.LOG.info(f"[成员交互摘要] 开始刷新单个成员: group={chatroom_id}, wxid={wxid}")
|
||||
context = self.build_member_context(chatroom_id, wxid, days=days, limit=limit)
|
||||
context = self.build_member_context(
|
||||
chatroom_id, wxid, days=days, limit=limit,
|
||||
enable_weekly_digest=enable_weekly_digest, enable_monthly_digest=enable_monthly_digest
|
||||
)
|
||||
self.member_context_db.save_member_context(context)
|
||||
self.LOG.info(
|
||||
f"[成员交互摘要] 单个成员刷新完成: group={chatroom_id}, wxid={wxid}, "
|
||||
@@ -244,7 +253,8 @@ class MemberContextService:
|
||||
return context
|
||||
|
||||
def refresh_group_contexts(self, chatroom_id: str, days: Optional[int] = None,
|
||||
limit_per_member: Optional[int] = None) -> Dict:
|
||||
limit_per_member: Optional[int] = None, enable_weekly_digest: bool = True,
|
||||
enable_monthly_digest: bool = True) -> Dict:
|
||||
days = days or self.sample_days
|
||||
limit_per_member = limit_per_member or self.refresh_limit_per_member
|
||||
|
||||
@@ -321,7 +331,8 @@ class MemberContextService:
|
||||
)
|
||||
continue
|
||||
context = self.build_member_context(
|
||||
chatroom_id, wxid, days=days, limit=limit_per_member, ensure_group_daily=False
|
||||
chatroom_id, wxid, days=days, limit=limit_per_member, ensure_group_daily=False,
|
||||
enable_weekly_digest=enable_weekly_digest, enable_monthly_digest=enable_monthly_digest
|
||||
)
|
||||
if context["source_message_count"] <= 0 and context.get("meta", {}).get("digest_daily_count", 0) <= 0:
|
||||
skipped += 1
|
||||
@@ -350,7 +361,8 @@ class MemberContextService:
|
||||
)
|
||||
return {"refreshed": refreshed, "skipped": skipped, "active_candidates": len(active_members)}
|
||||
|
||||
def refresh_all_chatrooms(self, days: Optional[int] = None, limit_per_member: Optional[int] = None) -> Dict:
|
||||
def refresh_all_chatrooms(self, days: Optional[int] = None, limit_per_member: Optional[int] = None,
|
||||
enable_weekly_digest: bool = True, enable_monthly_digest: bool = True) -> Dict:
|
||||
days = days or self.sample_days
|
||||
limit_per_member = limit_per_member or self.refresh_limit_per_member
|
||||
|
||||
@@ -386,7 +398,13 @@ class MemberContextService:
|
||||
self.LOG.info(
|
||||
f"[成员交互摘要] 批量刷新进度: group_index={processed_groups}/{total_groups}, group={chatroom_id}"
|
||||
)
|
||||
result = self.refresh_group_contexts(chatroom_id, days=days, limit_per_member=limit_per_member)
|
||||
result = self.refresh_group_contexts(
|
||||
chatroom_id,
|
||||
days=days,
|
||||
limit_per_member=limit_per_member,
|
||||
enable_weekly_digest=enable_weekly_digest,
|
||||
enable_monthly_digest=enable_monthly_digest,
|
||||
)
|
||||
if result.get("disabled"):
|
||||
disabled += 1
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user