Function calling y herramientas: reglas para que un agente no rompa tu negocio
Como disenar herramientas para agentes con contratos estrictos, permisos, validaciones y respuestas auditables.

Function calling es una de las piezas mas importantes para construir agentes utiles. Tambien es una de las mas mal usadas. Darle herramientas a un modelo no significa dejarlo hacer cualquier cosa. Significa darle acciones pequenas, tipadas y verificables.
Un agente confiable no "decide llamar una API" de forma libre. Llama una herramienta declarada con parametros permitidos y reglas claras.
Herramienta mala
runAction({ instruction: string })

Esta herramienta parece flexible, pero es peligrosa. El modelo puede mandar cualquier instruccion, mezclar acciones y saltarse validaciones.
Herramienta buena
createSupportTicket({
customerId: string,
category: "billing" | "technical" | "complaint",
summary: string,
priority: "low" | "normal" | "urgent"
})

Aqui hay un contrato. El sistema puede validar customerId, limitar categorias, revisar prioridad y auditar que se creo.
Reglas basicas
- Una herramienta debe hacer una cosa.
- Los parametros deben ser estrictos.
- El backend debe validar todo otra vez.
- Las acciones irreversibles requieren confirmacion.
- Las herramientas deben devolver resultados estructurados.
- Los errores deben ser claros para el agente y para logs humanos.
Permisos por contexto
No todas las herramientas deben estar disponibles siempre. Un usuario anonimo no deberia poder consultar ordenes. Un agente en Telegram de comunidad no deberia tener acceso a datos internos. Un agente de soporte puede crear tickets, pero no aprobar reembolsos sin humano.
Define permisos por:
- Usuario.
- Canal.
- Estado de conversacion.
- Riesgo de la accion.
- Nivel de confianza del agente.
Confirmaciones
Antes de una accion sensible, el agente debe resumir lo que va a hacer y pedir confirmacion. Ejemplos:
- Cancelar una reserva.
- Cambiar una direccion.
- Enviar un mensaje masivo.
- Crear una orden.
- Modificar datos personales.
Auditoria
Guarda cada llamada a herramienta con traceId, input validado, output, usuario, canal y version del prompt/modelo. Cuando algo falle, esta informacion vale mas que cualquier "creo que el agente hizo X".
Function calling bien disenado convierte al agente en un operador controlado. Mal disenado lo convierte en texto con acceso a produccion.