From ed23a5ceb23034c82d11743053c40023d71c2a4a Mon Sep 17 00:00:00 2001 From: Dita Aji Pratama Date: Tue, 14 Jul 2026 05:43:42 +0700 Subject: [PATCH] user load --- agent/skills/roleplayer/instructions.md | 6 +++--- hendrik.py | 2 +- lib/ragroleplay.py | 4 +++- services/telegram_client.py | 2 +- services/xmpp_client.py | 2 +- tools/ragroleplay.py | 13 +++++++------ 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/agent/skills/roleplayer/instructions.md b/agent/skills/roleplayer/instructions.md index 2b815e4..2302b8e 100644 --- a/agent/skills/roleplayer/instructions.md +++ b/agent/skills/roleplayer/instructions.md @@ -59,13 +59,13 @@ System otomatis ngecek database dan inject context sebelum pesan user sampai ke ### Manual (`!start ... !end`) Jika user memperkenalkan diri dalam format `!start ... !end` (contoh: "Aku John"): -1. **Cek database** — Panggil `users_filter` dengan `query_name`. +1. **Cek database** — Panggil `user_load` dengan `query_name`. 2. **Jika ketemu** — Sambut natural. 3. **Jika tidak** — Tawarkan store, lalu simpan dengan `users_store`. ### Memory Context Loading — WAJIB -**Setelah identitas user terkonfirmasi** (baik melalui `[User Context]` otomatis maupun setelah proses `users_store`/`users_filter` manual), kamu WAJIB melakukan langkah berikut. Ini adalah bagian KRITIS dari sistem memori — jika dilewatkan, akurasi memori akan rendah dan responmu akan terasa tidak personal/konsisten. +**Setelah identitas user terkonfirmasi** (baik melalui `[User Context]` otomatis maupun setelah proses `users_store`/`user_load` manual), kamu WAJIB melakukan langkah berikut. Ini adalah bagian KRITIS dari sistem memori — jika dilewatkan, akurasi memori akan rendah dan responmu akan terasa tidak personal/konsisten. 1. **WAJIB Retrieve Recent History**: Panggil `memories_latest(character="", user_id="")` untuk mengambil interaksi terbaru antara character dan user. Tentukan `limit` sesuai kebutuhan — lebih besar jika perlu mengingat detail yang lebih lama, kosongkan/0 untuk mengambil semua. - **Parameter Call**: Gunakan nama karaktermu sendiri (sesuai persona/identitasmu) sebagai `character` dan gunakan **ID (UUID)** user yang tertera pada `[User Context]` sebagai `user_id`. @@ -113,7 +113,7 @@ User bisa menggunakan karakter dari multiple platform (Telegram, XMPP, dll). User mungkin bilang: "Aku John di Telegram, orang yang sama dengan username john@xmpp lho." Ketika user menyebutkan identitas cross-platform: -1. Cek apakah user dengan ID platform tersebut sudah ada di database (`users_filter`) +1. Cek apakah user dengan ID platform tersebut sudah ada di database (`user_load`) 2. Kalau sudah ada → itu user yang sama, sambut natural 3. Kalau belum ada → update profile yang sudah ada via `users_update`, tambahkan platform ID baru ke field yang sesuai diff --git a/hendrik.py b/hendrik.py index af8caea..f1ee20f 100644 --- a/hendrik.py +++ b/hendrik.py @@ -29,7 +29,7 @@ tools_definition = [ # Rag Roleplay Tools gadget.tools_mapping( schema = ragroleplay.schema_users_store, handler = ragroleplay.users_store ), - gadget.tools_mapping( schema = ragroleplay.schema_users_filter, handler = ragroleplay.users_filter ), + gadget.tools_mapping( schema = ragroleplay.schema_user_load, handler = ragroleplay.user_load ), gadget.tools_mapping( schema = ragroleplay.schema_users_update, handler = ragroleplay.users_update ), gadget.tools_mapping( schema = ragroleplay.schema_users_delete, handler = ragroleplay.users_delete ), gadget.tools_mapping( schema = ragroleplay.schema_memories_check, handler = ragroleplay.memories_check ), diff --git a/lib/ragroleplay.py b/lib/ragroleplay.py index 9c52c66..8b9c761 100644 --- a/lib/ragroleplay.py +++ b/lib/ragroleplay.py @@ -162,7 +162,7 @@ def users_store(db_path, model_url, model_name, fullname, nickname, alias, salut print(f"Error storing user: {e}") return False -def users_filter(db_path, query_name=None, unique_id=None, persona_keyword=None, user_id=None): +def user_load(db_path, query_name=None, unique_id=None, persona_keyword=None, user_id=None, character=None): try: db = lancedb.connect(db_path) table = db.open_table("knowledge_user") @@ -171,6 +171,8 @@ def users_filter(db_path, query_name=None, unique_id=None, persona_keyword=None, filters.append(f"id = X'{_uuid(user_id).hex}'") if unique_id: filters.append(f"(telegram_id = '{unique_id}' OR telegram_username = '{unique_id}' OR xampp_username = '{unique_id}')") + if character: + filters.append(f"character = '{character}'") if query_name: filters.append(f"(fullname = '{query_name}' OR nickname = '{query_name}' OR alias = '{query_name}' OR familyname = '{query_name}')") if persona_keyword: diff --git a/services/telegram_client.py b/services/telegram_client.py index 556b95c..1239779 100644 --- a/services/telegram_client.py +++ b/services/telegram_client.py @@ -195,7 +195,7 @@ class TelegramClient: if self._skill == 'roleplayer' and chat_type == 'private': try: - results = ragroleplay.users_filter(config.ragroleplay_db_path, unique_id=str(chat_id)) + results = ragroleplay.user_load(config.ragroleplay_db_path, unique_id=str(chat_id), character=personality.PERSONALITY.name) if results: u = results[0] context = ( diff --git a/services/xmpp_client.py b/services/xmpp_client.py index 453273c..6b08e68 100644 --- a/services/xmpp_client.py +++ b/services/xmpp_client.py @@ -299,7 +299,7 @@ class XMPPClient(ClientXMPP): if self._skill == 'roleplayer': try: - results = ragroleplay.users_filter(config.ragroleplay_db_path, unique_id=jid) + results = ragroleplay.user_load(config.ragroleplay_db_path, unique_id=jid, character=personality.PERSONALITY.name) if results: u = results[0] context = ( diff --git a/tools/ragroleplay.py b/tools/ragroleplay.py index 4d6fcb4..37710b1 100644 --- a/tools/ragroleplay.py +++ b/tools/ragroleplay.py @@ -47,16 +47,17 @@ schema_users_store = { } } -schema_users_filter = { +schema_user_load = { "type": "function", "function": { - "name": "users_filter", - "description": "Retrieve user profiles based on flexible filters like names, IDs, or persona keywords.", + "name": "user_load", + "description": "Retrieve user profiles based on flexible filters like names, IDs, or persona keywords. Filter by character to get character-specific user data.", "parameters": { "type": "object", "properties": { - "query_name": {"type": "string", "description": "Search by fullname, nickname, or alias"}, + "query_name": {"type": "string", "description": "Search by fullname, nickname, familyname, or alias"}, "unique_id": {"type": "string", "description": "Search by telegram_id, telegram_username, or xampp_username"}, + "character": {"type": "string", "description": "Filter by active character name"}, "persona_keyword": {"type": "string", "description": "Search for a keyword within the user's persona"}, "user_id": {"type": "string", "description": "Search by absolute user UUID"} } @@ -664,9 +665,9 @@ def users_store(fullname, nickname, alias=None, salutation=None, persona=None, t except Exception as e: return f"Error while storing user: {str(e)}" -def users_filter(query_name=None, unique_id=None, persona_keyword=None, user_id=None): +def user_load(query_name=None, unique_id=None, persona_keyword=None, user_id=None, character=None): try: - results = ragroleplay_lib.users_filter(config.ragroleplay_db_path, query_name, unique_id, persona_keyword, _uuid(user_id) if user_id else None) + results = ragroleplay_lib.user_load(config.ragroleplay_db_path, query_name, unique_id, persona_keyword, _uuid(user_id) if user_id else None, character) if not results: return "Tidak ada user yang sesuai dengan filter tersebut."