feat: improve llm settings ui and douyu daily fallback

This commit is contained in:
liuwei
2026-04-08 14:09:21 +08:00
parent 1ab0f61e2f
commit 3d671c0da0
3 changed files with 421 additions and 64 deletions

View File

@@ -1027,7 +1027,60 @@ class DouyuPlugin(MessagePluginInterface):
sessions.sort(
key=lambda item: str(((item.get("segments") or [{}])[0]).get("start_time", "")),
)
return sessions[:self._daily_report_max_sessions]
if sessions:
return sessions[:self._daily_report_max_sessions]
inferred_sessions = self._infer_sessions_for_anchor_day(room_id, anchor_day)
if inferred_sessions:
logger.info(
f"斗鱼每日报告使用弹幕文件回推 session: room={room_id}, day={anchor_day}, "
f"count={len(inferred_sessions)}"
)
return inferred_sessions[:self._daily_report_max_sessions]
return []
def _infer_sessions_for_anchor_day(self, room_id: str, anchor_day: str) -> List[Dict[str, Any]]:
date_key = anchor_day.replace("-", "")
day_messages = DouyuDanmuSummaryHelper.load_day_messages(room_id, date_key)
if not day_messages:
return []
inferred_sessions = DouyuDanmuSummaryHelper.infer_sessions_from_messages(
room_id,
day_messages,
session_cutoff_hour=self._session_cutoff_hour,
merge_gap_hours=self._merge_gap_hours,
min_session_messages=min(50, self._daily_report_min_messages),
)
inferred_sessions = [
item for item in inferred_sessions
if str(item.get("anchor_day") or "") == anchor_day
]
if inferred_sessions:
return inferred_sessions
if len(day_messages) < self._daily_report_min_messages:
return []
ordered = sorted(day_messages, key=lambda item: item.get("timestamp") or datetime.min)
start_dt = ordered[0].get("timestamp")
end_dt = ordered[-1].get("timestamp")
if not isinstance(start_dt, datetime) or not isinstance(end_dt, datetime):
return []
return [{
"session_id": f"{room_id}_{date_key}_fallback",
"room_id": room_id,
"anchor_day": anchor_day,
"nickname": "",
"room_name": "",
"segments": [{
"start_time": start_dt.strftime("%Y-%m-%d %H:%M:%S"),
"end_time": end_dt.strftime("%Y-%m-%d %H:%M:%S"),
}],
"is_live": False,
"source": "fallback_full_day",
}]
def _build_daily_report_payload(self, room_id: str, anchor_day: str, sessions: List[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
if not sessions:
@@ -1516,17 +1569,29 @@ class DouyuPlugin(MessagePluginInterface):
if target_group_id
else self.redis_manager.all_subscribed_rooms()
)
if not rooms:
logger.info(
f"斗鱼每日报告无可处理房间: day={anchor_day}, target_group={target_group_id or 'ALL'}"
)
return False
delivered_any = False
for room_id in rooms:
if not force and self.redis_manager.get_text_value(self._daily_report_room_key(room_id, anchor_day)):
logger.info(f"斗鱼每日报告已发送过,跳过: room={room_id}, day={anchor_day}")
continue
sessions = self._load_sessions_for_anchor_day(room_id, anchor_day)
if not sessions:
logger.info(f"斗鱼每日报告无 session: room={room_id}, day={anchor_day}")
continue
if any(bool(session.get("is_live")) for session in sessions):
logger.info(f"斗鱼每日报告存在直播中场次,跳过: room={room_id}, day={anchor_day}")
continue
payload = self._build_daily_report_payload(room_id, anchor_day, sessions)
if not payload:
logger.info(
f"斗鱼每日报告 payload 为空: room={room_id}, day={anchor_day}, "
f"sessions={len(sessions)}, min_messages={self._daily_report_min_messages}"
)
continue
report_result = await self._get_or_create_daily_report_result(room_id, anchor_day, payload)
report_text = str(report_result.get("report_text") or "").strip()