feat: inject reminder context into LLM so bot knows user's agenda

This commit is contained in:
Power BI Dev
2026-06-04 14:22:47 +07:00
parent 91b7a2eeaf
commit 19f5053859
+39 -16
View File
@@ -16,6 +16,39 @@ _pending_confirmations: dict = {}
REMINDER_KEYWORDS = ["ingatkan", "pengingat", "remind", "jadwalkan", "tolong ingat"]
REMINDER_BYPASS_KEYWORDS = ["ingatkan", "pengingat", "remind", "diingatkan", "jadwalkan", "kapan diingat"]
def _build_context(user_db_id: int, rag_results: list) -> str:
parts = []
# Waktu sekarang
now = datetime.now(ZoneInfo(BOT_TIMEZONE))
parts.append(f"Waktu sekarang: {now.strftime('%A, %d %B %Y %H:%M WIB')}")
# Reminder aktif
reminders = db.get_user_reminders(user_db_id)
if reminders:
lines = ["Agenda/Pengingat aktif pengguna:"]
for r in reminders:
if r["is_recurring"]:
lines.append(f"- [Setiap hari {r['remind_at'][:5]} WIB] {r['message']}")
else:
try:
dt = datetime.fromisoformat(r["remind_at"]).replace(tzinfo=ZoneInfo(BOT_TIMEZONE))
lines.append(f"- [{dt.strftime('%a, %d %b %Y %H:%M')} WIB] {r['message']}")
except Exception:
lines.append(f"- {r['message']}")
parts.append("\n".join(lines))
# RAG context
if rag_results:
rag_lines = ["Konteks dari Second Brain pengguna:"] + [
f"[{'Global' if r['scope'] == 'global' else 'Pribadi'}] {r['content']}"
for r in rag_results
]
parts.append("\n".join(rag_lines))
return "\n\n".join(parts)
_client = AsyncOpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL)
ACADEMIC_SYSTEM_PROMPT = (
@@ -145,18 +178,13 @@ async def ask(update: Update, context: ContextTypes.DEFAULT_TYPE):
return
relevant = await rag.search(user_data["id"], question, n_results=5)
context_text = ""
if relevant:
context_text = "\n\nKonteks dari Second Brain pengguna:\n" + "\n".join(
f"[{'Global' if r['scope'] == 'global' else 'Pribadi'}] {r['content']}"
for r in relevant
)
extra_context = _build_context(user_data["id"], relevant)
history = db.get_conversation_history(user_data["id"])
system_prompt = (
f"{ACADEMIC_SYSTEM_PROMPT}\n\n"
f"Nama dosen: {user_data['full_name']}"
f"{context_text}"
f"Nama dosen: {user_data['full_name']}\n\n"
f"{extra_context}"
)
messages = [{"role": "system", "content": system_prompt}]
@@ -335,18 +363,13 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
return
relevant = await rag.search(user_data["id"], question, n_results=5)
context_text = ""
if relevant:
context_text = "\n\nKonteks dari Second Brain pengguna:\n" + "\n".join(
f"[{'Global' if r['scope'] == 'global' else 'Pribadi'}] {r['content']}"
for r in relevant
)
extra_context = _build_context(user_data["id"], relevant)
history = db.get_conversation_history(user_data["id"])
system_prompt = (
f"{ACADEMIC_SYSTEM_PROMPT}\n\n"
f"Nama dosen: {user_data['full_name']}"
f"{context_text}"
f"Nama dosen: {user_data['full_name']}\n\n"
f"{extra_context}"
)
messages = [{"role": "system", "content": system_prompt}]