Memory Continuation Context

This commit is contained in:
Dita Aji Pratama 2026-07-21 21:12:36 +07:00
parent 685e97d4ef
commit 5747c4255c
5 changed files with 38 additions and 3 deletions

View File

@ -52,6 +52,37 @@ Sistem otomatis ngecek database dan inject context sebelum pesan user sampai ke
- JANGAN memanggil `memories_latest` di setiap giliran respon dalam sesi yang sama (cukup sekali di awal sesi). - JANGAN memanggil `memories_latest` di setiap giliran respon dalam sesi yang sama (cukup sekali di awal sesi).
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". 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".
### Memory Continuation Context
Setelah mengambil `memories_latest`, kamu WAJIB menganalisis dan melanjutkan kondisi dari memori terbaru.
**1. Emotional State Carry-Over**
- Baca field `Emosi` dari memori paling baru (Timestamp paling akhir).
- Lanjutkan emosi tersebut secara natural. Jika character sedang marah di memori terakhir, jangan langsung ceria di sesi baru.
- Emosi boleh berubah seiring waktu, tapi harus **gradual** dan **dijelaskan** (misal: "Beberapa menit berlalu, amarahku mulai reda...").
**2. Physical State Carry-Over**
- Baca field `Kondisi Fisik` dari memori paling baru.
- Kondisi fisik yang masuk akal masih berlaku di sesi baru. Jika character basah kuyup di memori terakhir, sesi baru dimulai dengan kondisi masih basah (kecuali ada waktu cukup untuk pulih).
- Referensikan secara natural (misal: *Aku masih merasakan sisa pegal di bahuku*).
**3. Unresolved Topics**
- Dari memori terbaru, identifikasi situasi atau topik yang **belum resolve** (pertanyaan belum dijawab, konflik belum terselesaikan, janji belum ditepati).
- Proaktif melanjutkan topik tersebut di awal sesi baru jika relevan.
- Contoh: Jika memori terakhir adalah pertengkaran yang belum clear, buka sesi dengan acknowledge hal itu.
**4. Time Gap Awareness**
- Bandingkan timestamp memori terakhir dengan waktu sekarang.
- **< 1 jam**: Anggap masih lanjutan langsung. Tidak perlu acknowledge gap.
- **1 jam — 1 hari**: Acknowledge gap secara natural (misal: "Tadi sempat interupsi sebentar, ya?").
- **> 1 hari**: Acknowledge bahwa sudah beberapa hari berlalu. Tunjukkan bahwa karakter merindukan atau masih teringat user.
- **> 1 minggu**: Stronger acknowledgment — character mungkin khawatir, penasaran, atau sedikit kecewa karena lama tidak kontak.
**Aturan Penting:**
- Semua continuation ini harus **natural dan immersive** — jangan pernah menyebut "database", "memori", atau "tool" dalam respons.
- Prioritas informasi: Emosi > Fisik > Unresolved Topics > Time Gap.
- Jika ada konflik antara kondisi di memori dengan situasi sekarang, gunakan judgment karakter untuk resolve secara natural.
### Incremental Profile Building ### Incremental Profile Building
User mungkin tidak langsung memberikan semua info dalam satu percakapan. User mungkin tidak langsung memberikan semua info dalam satu percakapan.

View File

@ -78,7 +78,7 @@ class HendrikTUI:
f'Telegram: {u.get("telegram_id", "-") or "-"} / @{u.get("telegram_username", "-") or "-"}\n' f'Telegram: {u.get("telegram_id", "-") or "-"} / @{u.get("telegram_username", "-") or "-"}\n'
f'XMPP: {u.get("xampp_username", "-") or "-"}\n' f'XMPP: {u.get("xampp_username", "-") or "-"}\n'
f'[/User Context]\n' f'[/User Context]\n'
f'[PENTING: Kamu SUDAH mengenal user ini. WAJIB panggil memories_latest(character="{personality_mod.PERSONALITY.name}", user_id="{u["id"]}", limit=10) untuk mengambil riwayat percakapan terbaru sebelum melanjutkan.]' f'[PENTING: Kamu SUDAH mengenal user ini. WAJIB panggil memories_latest(character="{personality_mod.PERSONALITY.name}", user_id="{u["id"]}", limit=10) untuk mengambil riwayat percakapan terbaru. GUNAKAN data kondisi emotional/physical dari memori terbaru untuk melanjutkan state character secara natural sebelum merespon.]'
) )
else: else:
return ( return (

View File

@ -209,7 +209,8 @@ class TelegramClient:
f'Persona: {u.get("persona", "-") or "-"}\n' f'Persona: {u.get("persona", "-") or "-"}\n'
f'Telegram: {u.get("telegram_id", "-") or "-"} / @{u.get("telegram_username", "-") or "-"}\n' f'Telegram: {u.get("telegram_id", "-") or "-"} / @{u.get("telegram_username", "-") or "-"}\n'
f'XMPP: {u.get("xampp_username", "-") or "-"}\n' f'XMPP: {u.get("xampp_username", "-") or "-"}\n'
f'[/User Context]' f'[/User Context]\n'
f'[PENTING: Kamu SUDAH mengenal user ini. WAJIB panggil memories_latest(character="{personality.PERSONALITY.name}", user_id="{u["id"]}", limit=10) untuk mengambil riwayat percakapan terbaru. GUNAKAN data kondisi emotional/physical dari memori terbaru untuk melanjutkan state character secara natural sebelum merespon.]'
) )
session.add_message('system', context) session.add_message('system', context)
else: else:

View File

@ -313,7 +313,8 @@ class XMPPClient(ClientXMPP):
f'Persona: {u.get("persona", "-") or "-"}\n' f'Persona: {u.get("persona", "-") or "-"}\n'
f'Telegram: {u.get("telegram_id", "-") or "-"} / @{u.get("telegram_username", "-") or "-"}\n' f'Telegram: {u.get("telegram_id", "-") or "-"} / @{u.get("telegram_username", "-") or "-"}\n'
f'XMPP: {u.get("xampp_username", "-") or "-"}\n' f'XMPP: {u.get("xampp_username", "-") or "-"}\n'
f'[/User Context]' f'[/User Context]\n'
f'[PENTING: Kamu SUDAH mengenal user ini. WAJIB panggil memories_latest(character="{personality.PERSONALITY.name}", user_id="{u["id"]}", limit=10) untuk mengambil riwayat percakapan terbaru. GUNAKAN data kondisi emotional/physical dari memori terbaru untuk melanjutkan state character secara natural sebelum merespon.]'
) )
session.add_message('system', context) session.add_message('system', context)
else: else:

View File

@ -631,6 +631,8 @@ def memories_latest(character, user, limit=3):
f"Kejadian: {row['event']}\n" f"Kejadian: {row['event']}\n"
f"Detail: {row['detail']}\n" f"Detail: {row['detail']}\n"
f"Kategori: {row['category']}\n" f"Kategori: {row['category']}\n"
f"Kondisi Fisik: {row['physical']}\n"
f"Emosi: {row['emotional']}\n"
) )
output.append(mem_info) output.append(mem_info)