2756557498
Se estandariza la numeración de todos los issues de 3 dígitos a 4 dígitos (e.g. 005 → 0005, 010 → 0010) para mantener consistencia con la convención definida en create_issue.md. Se actualiza el README con los nuevos nombres y links. No hay cambios de contenido en los issues, solo renombrado. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
Plan: Memoria para los bots
Objetivo
Que cada bot recuerde conversaciones anteriores, hechos importantes sobre usuarios y contexto de salas. Memoria a corto plazo (ventana de conversación) y largo plazo (SQLite persistente).
Estado: completado ✓
Tipos de memoria
1. Memoria de conversación (corto plazo)
- Ventana deslizante de
Nmensajes por room - Se pasa como historial al LLM en cada llamada
- Vive en RAM; se pierde al reiniciar (aceptable)
2. Memoria episódica (largo plazo)
- Hechos extraídos de conversaciones: nombre del usuario, preferencias, eventos
- Guardados en SQLite (
agents/<id>/data/memory.db) - El LLM puede leer y escribir hechos mediante herramientas (
remember,recall)
Diseño capa pura (pkg/memory/)
// Tipos puros — sin I/O
type Message struct {
Role string // "user" | "assistant"
Content string
At time.Time
}
type Fact struct {
Subject string
Key string
Value string
At time.Time
}
// Ventana de conversación
type Window struct {
RoomID string
Messages []Message
MaxSize int
}
func (w Window) Append(m Message) Window { ... } // pura
func (w Window) ToLLMMessages() []llm.Message { ... } // pura
Diseño capa shell (shell/memory/)
// Acceso a SQLite — impuro
type Store interface {
SaveFact(ctx, agentID, fact) error
GetFacts(ctx, agentID, subject) ([]Fact, error)
GetHistory(ctx, agentID, roomID, limit) ([]Message, error)
AppendMessage(ctx, agentID, roomID, msg) error
}
Herramientas LLM para memoria
remember(subject, key, value)— guardar un hechorecall(subject, key)— recuperar hechos sobre alguien/algoforget(subject, key)— borrar un hecho
Integración con el flujo actual
agents/runtime.gomantiene unmap[roomID]memory.Windowen RAM- Antes de llamar al LLM, inyectar historial de la ventana al request
- Después de la respuesta, hacer
Appendcon el mensaje del bot - Las herramientas
remember/recallvan alStoreSQLite
Archivos a crear/modificar
pkg/memory/types.go— Message, Fact, Window (puros)pkg/memory/window.go— operaciones sobre Window (puras)shell/memory/sqlite_store.go— Store SQLiteshell/memory/migrations/001_init.sql— schemaagents/runtime.go— inyectar historial antes del LLM callagents/<id>/agent.go— registrar herramientas remember/recall
Notas
- Schema SQLite: tabla
facts(agent_id, subject, key, value, updated_at), tablamessages(agent_id, room_id, role, content, created_at) - El tamaño de la ventana se configura en
storage.max_context_messages(añadir al schema de config)