import logging from datetime import datetime, timezone from sqlalchemy.orm import Session from app.character.service import CharacterService from app.chat.notice_inbox import post_character_comment_to_latest_chat, post_notice_to_latest_chat from app.db.models import Reminder from app.llm.client import LLMClient from app.reminders.service import RECURRENCE_NONE, _advance_due, _format_local logger = logging.getLogger(__name__) def format_reminder_notice(row: Reminder) -> str: local_when = _format_local(row.due_at, row.timezone, all_day=row.all_day) notice = f"πŸ“… **НапоминаниС** Β· {row.title}\n\n_{local_when}_" if row.notes: notice += f"\n{row.notes}" return notice class ReminderCompletionHandler: def __init__(self, db: Session, user_id: int): self.db = db self.user_id = user_id self.llm = LLMClient() self.character = CharacterService(db, user_id) async def _generate_llm_comment(self, row: Reminder, local_when: str) -> str: notes_part = f"\nΠ—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ: {row.notes}" if row.notes else "" rec_part = "" if row.recurrence and row.recurrence != RECURRENCE_NONE: rec_part = f"\nΠŸΠΎΠ²Ρ‚ΠΎΡ€: {row.recurrence}" system = self.character.get_system_prompt() user_prompt = f"""Π‘Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ: {row.title} ВрСмя: {local_when}{notes_part}{rec_part} Напиши ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ сообщСниС (2-4 прСдлоТСния) Π½Π° русском: Π½Π°ΠΏΠΎΠΌΠ½ΠΈ ΠΎ Π΄Π΅Π»Π΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈ дСйствиС. Π‘Π΅Π· markdown ΠΈ Π±Π΅Π· эмодзи.""" result = await self.llm.complete( [ {"role": "system", "content": system}, {"role": "user", "content": user_prompt}, ], temperature=0.8, visible_reply=True, ) return (result.get("content") or "").strip() or f"НапоминаниС: {row.title}" def _mark_fired(self, row: Reminder, now: datetime) -> None: row.last_fired_at = now if row.recurrence == RECURRENCE_NONE: row.completed_at = now row.enabled = False else: row.due_at = _advance_due(row.due_at, row.recurrence) row.last_fired_at = None row.updated_at = now async def process(self, row: Reminder) -> None: local_when = _format_local(row.due_at, row.timezone, all_day=row.all_day) post_notice_to_latest_chat(format_reminder_notice(row), self.user_id) try: comment = await self._generate_llm_comment(row, local_when) if comment: post_character_comment_to_latest_chat(comment, self.user_id) except Exception: logger.exception("Reminder LLM comment failed (id=%s)", row.id) self._mark_fired(row, datetime.now(timezone.utc))