← Blog·Ingeniería

Skill vs Tool: la distinción que hace a MONO diferente

·Equipo MONO·5 min de lectura

Por qué la separación importa

La mayoría de frameworks de agentes (LangChain, AutoGPT, etc.) tratan "tool" y "function" como el átomo base. El agente ve una lista plana de 50 funciones y el LLM decide cuál llamar.

Esto funciona con 5-10 tools. Se rompe con 50. El prompt se infla con descripciones repetitivas, y tools similares (log_expense vs create_transaction vs record_spending) confunden al modelo.

Skills introducen una capa de agrupación semántica. En vez de "aquí hay 83 funciones, elige una", decimos "aquí hay 21 skills; cuál(es) son relevantes?". El Haiku router elige las 1-3 skills. Después, dentro de esa skill, se expone solo el subset de tools que le pertenece.

Anatomía de un skill

Un skill en MONO contiene:

  • Tools: las funciones que ejecuta (create_event, list_events, delete_event para el skill calendar).
  • Manifest: archivo YAML con descripción, ejemplos de activación, condiciones de UI, boundaries.
  • Renderer: función Go que convierte los resultados en Dynamic UI (HTML renderizado).
  • Modos: declaración de qué modos soporta (tool/think/agent — ver post del router).
  • Monitores proactivos (opcional): cron jobs que corren sin input del usuario (ej. morning brief de calendar a las 7am).

Ejemplo: el skill Expenses

Tools (6): log_expense, list_expenses, expense_summary, delete_expense, categorize_expense, analyze_expenses (agent mode).

Manifest ejemplos: "gasté 300 en uber" → log_expense. "cuánto gasté este mes?" → expense_summary. "explícame mis patrones" → analyze_expenses (agent mode).

Renderer: tabla HTML con categorías, proyección mensual, delta vs mes anterior, gráfico de barras para top-5 categorías.

Monitor: cada viernes 6pm, calcula el summary semanal y lo manda proactivamente si el usuario superó su promedio.

El LLM nunca ve los 6 tools individuales hasta que el router eligió "expenses" como skill relevante. Entonces y solo entonces se exponen en el contexto.

Consecuencias arquitectónicas

Composabilidad: agregar una skill nueva = crear un paquete Go + un YAML + un renderer. No hay que modificar el router, ni el executor, ni el sistema de UI.

Testing aislado: las tools se testean independientemente. El manifest se valida contra un schema. El renderer se prueba con fixtures de output.

Billing por skill: podemos cobrar por skills individuales (email $2/mes, calls $7/mes) porque son unidades discretas con boundaries claras.

User-facing vocabulary: los usuarios piensan en skills ("quiero activar el skill de Fitness"), no en tools. Internamente tenemos ~83 tools, pero en la UI hay 21 skills. Esa es la abstracción correcta para el producto.

TL;DR

Tool = función ejecutable. Skill = capacidad de dominio que agrupa tools + manifest + renderer + monitores. La separación permite escalar a 83 tools sin que el LLM se confunda, cobrar por capacidad, y testear cada dominio aislado.