fc644ecd6e
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.
96 lines
2.7 KiB
Markdown
96 lines
2.7 KiB
Markdown
# 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/`)
|
|
|
|
```go
|
|
// 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/`)
|
|
|
|
```go
|
|
// 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)
|