docs: add agent creation guide and LLM policies index

Documentación y políticas para la creación de agentes:

- docs/creating-agents.md: guía completa paso a paso para humanos
  (scaffold, config, registro Matrix, avatar, verificación E2EE, arranque,
  troubleshooting)
- .claude/policies/create_agent.md: policy para LLMs con estructura de
  archivos, convenciones y reglas a seguir al crear agentes
- .claude/policies/index.md: índice de todas las policies disponibles
- .claude/policies/create_tool.md: movido desde .claude/rules/ (misma policy)
- CLAUDE.md: añadida sección de políticas, actualizada tabla de agentes
  con asistente-2, y actualizado el flujo de "Cómo añadir un nuevo bot"
  con pasos de avatar y verificación E2EE

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-04 21:39:11 +00:00
parent 6ad8a6e04e
commit bcbbd974e3
6 changed files with 513 additions and 7 deletions
+22 -6
View File
@@ -58,11 +58,24 @@ cmd/register/main.go → registra bots en Synapse via admin API
dev-scripts/ → scripts bash para operaciones del día a día
```
## Políticas para LLMs
Las políticas guían cómo ejecutar tareas específicas respetando la arquitectura del proyecto.
Ver índice completo en `.claude/policies/index.md`.
| Política | Cuándo aplicarla |
|----------|------------------|
| `.claude/policies/create_agent.md` | Al crear un nuevo bot/agente Matrix |
| `.claude/policies/create_tool.md` | Al añadir una nueva tool para function calling |
Documentación detallada para humanos en `docs/creating-agents.md`.
## Agentes existentes
| ID | Estado | LLM | Descripción |
|----------------|-----------|---------|------------------------------------------|
| assistant-bot | activo | GPT-4o | Asistente general, responde DMs |
| asistente-2 | activo | GPT-4o | Asistente con tools (current_time) |
| devops-bot | pendiente | Claude | SSH, deployments, healthchecks |
## Dependencias clave
@@ -90,12 +103,15 @@ Secciones principales del config: `agent`, `personality`, `llm`, `tools`, `matri
## Cómo añadir un nuevo bot
1. Generar scaffold: `./dev-scripts/new-agent.sh <id> "Display Name"`
2. Registrarlo en Matrix: `./dev-scripts/register.sh <id> "Display Name"`
3. Añadir el token al `.env`
4. Añadir una línea en `cmd/launcher/main.go``rulesRegistry`
5. Editar `agents/<id>/agent.go` con las reglas reales
6. Arrancar: `./dev-scripts/start.sh <id>`
Guía rápida (detalle completo en `docs/creating-agents.md`, policy en `.claude/policies/create_agent.md`):
1. Crear scaffold: `./dev-scripts/new-agent.sh <id> "Display Name"` o manual en `agents/<id>/`
2. Crear `agent.go` (reglas puras), `config.yaml`, `prompts/system.md`
3. Registrar en `cmd/launcher/main.go` → import + `rulesRegistry`
4. Registrar en Matrix: `./dev-scripts/register.sh <id> "Display Name"`
5. Avatar y nombre: `./dev-scripts/avatar.sh <id> static/<imagen>.jpg`
6. Verificación E2EE: `go run -tags goolm ./cmd/verify --homeserver ... --username <id> --password ... --token ...`
7. Arrancar: `./dev-scripts/start.sh <id>`
## Dev-scripts disponibles
+144
View File
@@ -0,0 +1,144 @@
# Cómo crear un nuevo agente
Guía para LLMs que asisten en la creación de agentes en este proyecto.
## Estructura requerida
Cada agente vive en `agents/<agent-id>/` con esta estructura:
```
agents/<agent-id>/
├── agent.go # Package propio, exporta Rules() []decision.Rule
├── config.yaml # Configuración completa (ver schema en internal/config/schema.go)
└── prompts/
└── system.md # System prompt del LLM
```
## Archivos a crear
### 1. `agents/<agent-id>/agent.go` — Reglas puras
```go
package <agentpkg>
import "github.com/enmanuel/agents/pkg/decision"
func Rules() []decision.Rule {
return []decision.Rule{
// Regla help explícita
{
Name: "help",
Match: decision.MatchCommand("help"),
Actions: []decision.Action{{
Kind: decision.ActionKindReply,
Reply: &decision.ReplyAction{Content: "Descripción de capacidades del bot."},
}},
},
// Catch-all → LLM
{
Name: "llm-all",
Match: func(ctx decision.MessageContext) bool {
return ctx.IsDirectMsg || ctx.IsMention
},
Actions: []decision.Action{{
Kind: decision.ActionKindLLM,
LLM: &decision.LLMAction{},
}},
},
}
}
```
**Reglas del archivo de reglas:**
- **PURO**: sin imports de I/O, sin side effects, solo `pkg/decision`
- El package name debe ser Go-valid (sin guiones): `agents/mi-bot/``package mibot`
- Las reglas se evalúan en orden — poner las específicas antes del catch-all
- El catch-all debe cubrir `ctx.IsDirectMsg || ctx.IsMention` como mínimo
- `ActionKindReply` para respuestas estáticas, `ActionKindLLM` para respuestas dinámicas
### 2. `agents/<agent-id>/config.yaml` — Configuración
Usar como plantilla `agents/assistant/config.yaml` o `agents/asistente2/config.yaml`.
**Campos que SIEMPRE hay que personalizar:**
```yaml
agent:
id: <agent-id> # DEBE coincidir con el directorio y rulesRegistry
name: "Display Name"
description: "Qué hace este agente"
llm:
primary:
provider: openai # o anthropic
model: gpt-4o # o claude-sonnet-4-20250514
api_key_env: OPENAI_API_KEY # o ANTHROPIC_API_KEY
tool_use:
enabled: true/false # true si el agente usa herramientas
matrix:
user_id: "@<agent-id>:matrix-af2f3d.organic-machine.com"
access_token_env: MATRIX_TOKEN_<AGENT_UPPER>
device_id: "<se actualiza después del registro>"
```
**Convención de nombres de env vars:**
- Token: `MATRIX_TOKEN_<ID_UPPER>` donde ID se convierte a mayúsculas y guiones a underscores
- Ejemplo: `asistente-2``MATRIX_TOKEN_ASISTENTE2`
- Password: `MATRIX_PASSWORD_<ID_UPPER>` con la misma convención
### 3. `agents/<agent-id>/prompts/system.md` — System prompt
Debe incluir:
- Identidad del bot (quién es, qué hace)
- Capacidades y limitaciones
- Herramientas disponibles (si `tool_use.enabled: true`)
- Estilo de respuesta (idioma, tono, formato)
- Instrucciones de uso de herramientas (cuándo y cómo usarlas)
## Archivos a modificar
### 4. `cmd/launcher/main.go` — Registro en el launcher
Dos cambios:
**Import:**
```go
<agentpkg>agent "github.com/enmanuel/agents/agents/<agent-id>"
```
**rulesRegistry:**
```go
var rulesRegistry = map[string]func() []decision.Rule{
// ... agentes existentes ...
"<agent-id>": <agentpkg>agent.Rules, // ← nuevo
}
```
**El ID en rulesRegistry DEBE coincidir exactamente con `agent.id` del config.yaml.**
### 5. `agents/runtime.go` — Registro de herramientas (solo si hay tools nuevas)
Si el agente necesita una herramienta nueva (no existente), ver la policy `create_tool.md`.
Las herramientas "siempre disponibles" (`current_time`, `matrix_send`) ya están registradas para todos los agentes.
## Después de crear los archivos
Verificar compilación:
```bash
go build -tags goolm ./...
```
Luego seguir con registro, avatar, verificación y arranque (ver `docs/creating-agents.md`).
## Reglas generales
- **Nunca** poner side effects en `agent.go` — es código puro
- **Siempre** verificar que `agent.id` coincide entre config.yaml, rulesRegistry y el directorio
- **Siempre** compilar con `-tags goolm` para soporte E2EE
- **Idioma**: español en configs, prompts y descripciones de dominio; inglés en código Go
- **No** crear archivos `data/` — se generan automáticamente al arrancar
- **No** commitear tokens ni passwords — solo van en `.env`
- Si el agente usa tool_use, asegurarse de que `llm.tool_use.enabled: true` en el config
- Usar `agents/asistente2/` como referencia completa de un agente con tools habilitadas
+23
View File
@@ -0,0 +1,23 @@
# Políticas del proyecto
Guías operativas para LLMs que trabajan en este codebase. Cada política describe cómo ejecutar una tarea específica respetando la arquitectura y convenciones del proyecto.
## Políticas disponibles
| Política | Archivo | Cuándo aplicarla |
|----------|---------|------------------|
| **Crear agente** | [create_agent.md](create_agent.md) | Al crear un nuevo bot/agente Matrix completo |
| **Crear herramienta** | [create_tool.md](create_tool.md) | Al añadir una nueva tool para LLM function calling |
## Cuándo consultar las políticas
- **Crear agente**: cuando el usuario pida crear un nuevo bot, agente, o asistente. Incluye la estructura de archivos, reglas puras, config YAML, system prompt y registro en el launcher.
- **Crear herramienta**: cuando el usuario pida añadir una nueva herramienta/tool al sistema. Incluye el patrón Def (puro) + Exec (impuro), registro en runtime.go y habilitación en config.
## Principio general
Todas las políticas respetan el patrón **pure core / impure shell**:
- `pkg/` es puro — nunca añadir side effects
- `shell/` es impuro — todo I/O va aquí
- `agents/` compone ambos — reglas puras + ensamblado con shell
- `tools/` sigue el mismo patrón: `Def` (datos puros) + `Exec` (función impura)