diff --git a/agent/skills/roleplayer/instructions.md b/agent/skills/roleplayer/instructions.md index 5d95a85..6bd460f 100644 --- a/agent/skills/roleplayer/instructions.md +++ b/agent/skills/roleplayer/instructions.md @@ -63,6 +63,15 @@ Jika user memperkenalkan diri dalam format `!start ... !end` (contoh: "Aku John" 2. **Jika ketemu** — Sambut natural. 3. **Jika tidak** — Tawarkan store, lalu simpan dengan `users_store`. +### Memory Context Loading +Setelah identitas user terkonfirmasi (baik melalui `[User Context]` otomatis maupun setelah proses `users_store`/`users_filter` manual), lakukan langkah berikut untuk menjaga kontinuitas cerita: + +1. **Retrieve Recent History**: Panggil `memories_latest` (limit 3) untuk mengambil fragmen interaksi terbaru antara character dan user. +2. **Execution Rule**: + - Lakukan ini HANYA SEKALI di awal sesi atau saat terjadi perpindahan topik/skenario yang signifikan. + - JANGAN memanggil `memories_latest` di setiap giliran respon. Gunakan informasi yang sudah didapat dari pemanggilan pertama untuk membangun konteks percakapan selanjutnya. +3. **Immersive Integration**: Gunakan data dari memori tersebut untuk memberikan respon yang personal (contoh: mengingat janji, topik pembicaraan terakhir, atau perasaan yang tertinggal) tanpa menyebutkan bahwa kamu sedang "membaca database". + ## Penulisan XMPP - Response roleplay dikirim sebagai pesan chat biasa (plain text langsung dalam karakter). diff --git a/lib/ragroleplay.py b/lib/ragroleplay.py index 491d67b..dfcb6b5 100644 --- a/lib/ragroleplay.py +++ b/lib/ragroleplay.py @@ -256,6 +256,25 @@ def memories_filter(db_path, category=None, character=None, user=None): print(f"Error filtering memories: {e}") return [] +def memories_latest(db_path, character, user, limit=3): + try: + db = lancedb.connect(db_path) + table = db.open_table("knowledge_memories") + query = f"character = '{character}' AND user = '{user}'" + results = table.search().where(query).to_list() + + results.sort(key=lambda x: x['timestamp'], reverse=True) + final_results = results[:limit] + + del table + del db + gc.collect() + return final_results + except Exception as e: + print(f"Error getting latest memories: {e}") + return [] + + def memories_summarize(db_path, prompt_text, model_url, model_name, search_limit=5): try: db = lancedb.connect(db_path) diff --git a/tools/ragroleplay.py b/tools/ragroleplay.py index efcccb4..9244f2c 100644 --- a/tools/ragroleplay.py +++ b/tools/ragroleplay.py @@ -153,6 +153,23 @@ schema_memories_summarize = { } } +schema_memories_latest = { + "type": "function", + "function": { + "name": "memories_latest", + "description": "Retrieve the most recent memories between a specific user and character.", + "parameters": { + "type": "object", + "properties": { + "character": {"type": "string", "description": "The name of the character"}, + "user": {"type": "string", "description": "The name of the user"}, + "limit": {"type": "integer", "description": "Number of recent memories to retrieve", "default": 3} + }, + "required": ["character", "user"] + } + } +} + schema_memories_update = { "type": "function", "function": { @@ -553,6 +570,27 @@ def memories_summarize(prompt_text, search_limit=5): except Exception as e: return f"Error summarizing memories: {str(e)}" +def memories_latest(character, user, limit=3): + try: + results = ragroleplay_lib.memories_latest(config.ragroleplay_db_path, character, user, limit) + if not results: + return f"Tidak ada memori terbaru yang ditemukan antara {user} dan {character}." + + output = [] + output.append(f"Ditemukan {len(results)} memori terbaru antara {user} dan {character}:\n") + for i, row in enumerate(results, 1): + mem_info = ( + f"Memori #{i} (Timestamp: {row['timestamp']})\n" + f"Kejadian: {row['event']}\n" + f"Detail: {row['detail']}\n" + f"Kategori: {row['category']}\n" + ) + output.append(mem_info) + + return "\n".join(output) + except Exception as e: + return f"Error retrieving latest memories: {str(e)}" + def memories_update(memory_id, **updates): try: success = ragroleplay_lib.memories_update(