bcbbd974e3
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>
4.7 KiB
4.7 KiB
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
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.IsMentioncomo mínimo ActionKindReplypara respuestas estáticas,ActionKindLLMpara 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:
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:
<agentpkg>agent "github.com/enmanuel/agents/agents/<agent-id>"
rulesRegistry:
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:
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.idcoincide entre config.yaml, rulesRegistry y el directorio - Siempre compilar con
-tags goolmpara 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: trueen el config - Usar
agents/asistente2/como referencia completa de un agente con tools habilitadas