Files
unibots/dev/issues/completed/0002-bot-memory.md
T
agent fc644ecd6e feat: import agents_and_robots platform as unibots (Matrix-out, unibus transport)
Reemplaza el scaffold del echobot por la plataforma completa de bots traida
desde ~/DataProyects/Github/agents_and_robots tras la operacion Matrix-out:
los bots ya no hablan por Matrix sino por el bus unibus (modelo todo-rooms +
E2E via shell/transportunibus sobre github.com/enmanuel/unibus/pkg/client).

- go.mod: replace de unibus -> ../unibus y de fn-registry -> ../../../.. (paths
  relativos reajustados a la nueva ubicacion dentro de fn_registry).
- app.md: bump a 0.2.0, descripcion + arquitectura + comandos + gotchas reales.
- modulo Go conservado como github.com/enmanuel/agents (sin reescribir imports).

agents_and_robots queda archivado como museo de la era Matrix.
2026-06-07 11:50:13 +02: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)