feat: inject reminder context into LLM so bot knows user's agenda
This commit is contained in:
+39
-16
@@ -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}]
|
||||
|
||||
Reference in New Issue
Block a user