user load

This commit is contained in:
Dita Aji Pratama 2026-07-14 05:43:42 +07:00
parent b635b241c4
commit ed23a5ceb2
6 changed files with 16 additions and 13 deletions

View File

@ -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="<nama-karaktermu>", user_id="<user-uuid>")` 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

View File

@ -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 ),

View File

@ -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:

View File

@ -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 = (

View File

@ -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 = (

View File

@ -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."