member_context: split daily weekly monthly digest scheduling

This commit is contained in:
liuwei
2026-04-14 10:53:46 +08:00
parent 1800ae585a
commit 28e038a25c
7 changed files with 1339 additions and 240 deletions

View File

@@ -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