diff --git a/dev/issues/0049-automate-agent-personalization.md b/dev/issues/0049-automate-agent-personalization.md new file mode 100644 index 0000000..85421be --- /dev/null +++ b/dev/issues/0049-automate-agent-personalization.md @@ -0,0 +1,156 @@ +# 0049 — Automatizar personalización al crear agentes + +## Objetivo + +Reducir el trabajo manual del Paso 8 del pipeline de creación (editar agent.go, config.yaml y system.md a mano). Crear un script `personalize.sh` que genere los 3 archivos desde argumentos CLI, auto-detecte el proveedor LLM disponible en `.env`, y se integre en `create-full.sh` con flags opcionales para que Father Bot pueda completar el pipeline de creación con una sola llamada sin pasos manuales intermedios. + +## Contexto + +El pipeline actual de 12 pasos ejecuta los pasos 1-7 con `create-full.sh`, pero el **Paso 8 (Personalizar)** siempre requiere editar manualmente 3 archivos: + +1. `agents//agent.go` — package name, Register ID, reglas +2. `agents//config.yaml` — description, tone, prefix, llm.provider, llm.model, tools +3. `agents//prompts/system.md` — system prompt completo con sección de seguridad + +Actualmente estos 3 archivos se generan con placeholders desde el template y se editan a mano. Esto es el principal cuello de botella: Father Bot (el agente creador) tarda varios pasos de tool calls para leer, editar y verificar cada archivo. + +Adicionalmente, el provider/model LLM siempre defaultea a `openai/gpt-4o` aunque `ANTHROPIC_API_KEY` esté disponible y `OPENAI_API_KEY` no. + +## Arquitectura + +Archivos afectados: + +- `dev-scripts/agent/personalize.sh` — **NEW** — genera los 3 archivos desde argumentos JSON/flags +- `dev-scripts/agent/create-full.sh` — MODIFICAR — aceptar `--description`, `--provider`, `--model`, `--system-prompt-file` para invocar personalize.sh en el mismo pipeline +- `dev-scripts/agent/detect-provider.sh` — **NEW** — detecta el provider LLM disponible desde `.env` +- `.claude/skills/create-agent/SKILL.md` — MODIFICAR — actualizar instrucciones para usar los nuevos flags +- `.claude/skills/create-bot/SKILL.md` — MODIFICAR — ídem para robots +- `.claude/rules/create_agent.md` — MODIFICAR — actualizar pipeline con el nuevo paso 8 automático + +Todo es shell scripting y documentación — no toca `pkg/` ni `shell/` (no hay componentes puros/impuros en Go). + +## Tareas + +### Fase 1: Detección automática de provider + +- **1.1** Crear `dev-scripts/agent/detect-provider.sh` — lee `.env` y devuelve el primer provider disponible: + - Si `OPENAI_API_KEY` está seteado y no vacío → `openai gpt-4o` + - Si `ANTHROPIC_API_KEY` está seteado y no vacío → `anthropic claude-sonnet-4-20250514` + - Fallback: `openai gpt-4o` (con warning) +- **1.2** Verificar que el script funciona en todos los casos (ambas keys, ninguna, solo una) + +### Fase 2: Script personalize.sh + +- **2.1** Crear `dev-scripts/agent/personalize.sh ` con flags: + - `--description ""` — descripción del agente + - `--provider ` — proveedor LLM (default: auto-detect) + - `--model ` — modelo LLM (default: según provider) + - `--tone ` — tono (default: friendly) + - `--prefix ""` — emoji prefix (default: 🤖) + - `--system-prompt ""` — system prompt inline + - `--system-prompt-file ` — system prompt desde archivo + - `--tool-use` — habilitar tool_use en config +- **2.2** El script genera `config.yaml` aplicando los valores sobre el template generado por scaffold + - Usar `yq` o sed para actualizar campos específicos del YAML + - Preservar la estructura completa del config generado por scaffold +- **2.3** El script regenera `agent.go` con el package name correcto (sin guiones) y el Register ID exacto + - El package name se deriva del agent-id: quitar guiones, quitar sufijo `_bot`/`-bot` +- **2.4** El script genera `prompts/system.md` combinando: + - Header con identidad (nombre, rol) + - Descripción del agente + - Sección de capacidades (tools si `--tool-use`) + - Estilo y tono + - Sección de seguridad anti-injection (desde `.claude/templates/security-prompt.md` o hardcodeada) + - Si se pasa `--system-prompt` o `--system-prompt-file`, usar ese contenido + append sección seguridad +- **2.5** Validar que los 3 archivos generados son correctos: `go build -tags goolm ./...` debe pasar + +### Fase 3: Integrar en create-full.sh + +- **3.1** Añadir soporte de flags a `create-full.sh` — pasar flags opcionales al final: + ```bash + ./dev-scripts/agent/create-full.sh "Display Name" [--description "..."] [--provider openai] [--system-prompt "..."] + ``` +- **3.2** Si se pasan los flags de personalización, ejecutar `personalize.sh` como Paso 8 automático dentro de `create-full.sh` — no se necesita edición manual posterior +- **3.3** Si no se pasan flags de personalización, comportamiento actual: scaffold + pasos 1-7 y dejar Paso 8 para edición manual +- **3.4** Añadir output claro indicando si el Paso 8 fue automático o manual pendiente + +### Fase 4: Actualizar skills y reglas + +- **4.1** Actualizar `.claude/skills/create-agent/SKILL.md` — indicar que Father Bot debe usar `--description`, `--provider`, `--system-prompt` siempre que tenga la información del usuario, para evitar el Paso 8 manual +- **4.2** Actualizar `.claude/skills/create-bot/SKILL.md` — ídem para robots (solo --description y --prefix son relevantes) +- **4.3** Actualizar `.claude/rules/create_agent.md` — documentar el nuevo flujo: si se conocen todos los inputs, usar `create-full.sh` con flags; si no, editar manualmente como antes + +### Fase 5: Tests y cleanup + +- **5.1** Test manual: crear un agente con todos los flags y verificar que los 3 archivos son correctos y `go build` pasa +- **5.2** Test: `detect-provider.sh` con todas las combinaciones de keys +- **5.3** Verificar que el flujo sin flags sigue funcionando igual (retrocompatibilidad) + +## Ejemplo de uso + +### Antes (flujo actual) + +```bash +# Paso 1-7 (automático) +./dev-scripts/agent/create-full.sh weather-bot "Weather Bot" + +# Paso 8 (manual — Father Bot edita 3 archivos) +# Edit agents/weather-bot/config.yaml → description, provider, model +# Edit agents/weather-bot/agent.go → package name +# Edit agents/weather-bot/prompts/system.md → system prompt completo + +# Pasos 9-12 +go build -tags goolm ./... +./dev-scripts/server/restart.sh +./dev-scripts/agent/health-check.sh weather-bot +./dev-scripts/agent/notify-developer.sh weather-bot agent "Weather Bot" +``` + +### Después (flujo mejorado) + +```bash +# Pasos 1-8 (automático, un solo comando) +./dev-scripts/agent/create-full.sh weather-bot "Weather Bot" \ + --description "Consulta el tiempo actual y predicciones meteorológicas" \ + --provider anthropic \ + --system-prompt "Eres Weather Bot, especialista en meteorología. Consultas el tiempo actual y das predicciones." + +# Pasos 9-12 (igual que antes) +go build -tags goolm ./... +./dev-scripts/server/restart.sh +./dev-scripts/agent/health-check.sh weather-bot +./dev-scripts/agent/notify-developer.sh weather-bot agent "Weather Bot" +``` + +### Auto-detección de provider + +```bash +# Sin especificar provider → detect-provider.sh elige automáticamente +./dev-scripts/agent/create-full.sh news-bot "News Bot" \ + --description "Agente de noticias" \ + --system-prompt "Eres un agente de noticias..." +# → Detecta ANTHROPIC_API_KEY disponible → usa anthropic/claude-sonnet-4-20250514 +``` + +## Decisiones de diseño + +1. **personalize.sh como script atómico independiente**: puede usarse fuera de create-full.sh para re-personalizar un agente existente. Misma filosofía que los otros scripts atómicos. +2. **Flags opcionales en create-full.sh**: retrocompatibilidad total — sin flags, funciona igual que hoy. Con flags, automatiza el Paso 8. +3. **detect-provider.sh separado**: reutilizable por otros scripts (health-check, etc.) que necesiten saber qué LLM usar. +4. **system-prompt inline vs file**: soporte para ambos — inline para prompts cortos desde CLI/Matrix, file para prompts largos pre-escritos. +5. **Sección de seguridad siempre al final**: `personalize.sh` siempre appenda la sección anti-injection al system prompt generado, sin excepción. +6. **yq preferido sobre sed para YAML**: editar YAML con sed es frágil. Si `yq` no está disponible, usar `sed` con patrones conservadores o reescribir el archivo desde template. + +## Prerequisitos + +- Issue 0044 (pipeline formalizado) — completado ✓ +- Issue 0048 (delete pipeline) — completado ✓ + +## Riesgos + +| Riesgo | Mitigación | +|--------|-----------| +| `yq` no disponible en el entorno | Verificar disponibilidad; fallback a sed con patrones cuidadosos o escribir el YAML completo desde bash | +| System prompt generado automáticamente es genérico | El flag `--system-prompt` permite override completo; la generación automática es solo el caso base | +| Package name derivado incorrectamente | Casos edge: IDs con números, IDs muy cortos. Validar con `go vet` post-generación | +| Retrocompatibilidad rota en create-full.sh | Mantener los primeros 2 argumentos posicionales sin cambio; los nuevos flags son opcionales | diff --git a/dev/issues/README.md b/dev/issues/README.md index d05dea5..d01fd58 100644 --- a/dev/issues/README.md +++ b/dev/issues/README.md @@ -59,3 +59,4 @@ afectados y notas de implementacion. | 46 | Progreso en tiempo real para Father Bot | [0046-father-bot-progress.md](completed/0046-father-bot-progress.md) | completado | | 47 | System prompt no se carga para agentes en _specials/ | [0047-fix-system-prompt-path.md](completed/0047-fix-system-prompt-path.md) | completado | | 48 | Pipeline de eliminacion de agentes y robots | [0048-delete-agent-pipeline.md](completed/0048-delete-agent-pipeline.md) | completado | +| 49 | Automatizar personalización al crear agentes | [0049-automate-agent-personalization.md](0049-automate-agent-personalization.md) | pendiente |