Files
agents_and_robots/dev/issues/completed/0002-bot-memory.md
T
egutierrez 2756557498 chore: renombrar issues a formato 4 dígitos (NNNN)
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>
2026-03-07 18:39:33 +00:00

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 N mensajes 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 hecho
  • recall(subject, key) — recuperar hechos sobre alguien/algo
  • forget(subject, key) — borrar un hecho

Integración con el flujo actual

  1. agents/runtime.go mantiene un map[roomID]memory.Window en RAM
  2. Antes de llamar al LLM, inyectar historial de la ventana al request
  3. Después de la respuesta, hacer Append con el mensaje del bot
  4. Las herramientas remember/recall van al Store SQLite

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 SQLite
  • shell/memory/migrations/001_init.sql — schema
  • agents/runtime.go — inyectar historial antes del LLM call
  • agents/<id>/agent.go — registrar herramientas remember/recall

Notas

  • Schema SQLite: tabla facts(agent_id, subject, key, value, updated_at), tabla messages(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)