MÓDULO 3 · ARQUITECTURA DE SISTEMAS CONVERSACIONALES · AGENTES DE IA 4/5 · 35 MIN

Function Calling

Nivel intermedio — el protocolo de comunicación request-response entre el LLM y tus herramientas, incluyendo llamadas paralelas.

Idea central Function calling es el contrato entre el LLM y tu sistema. Entenderlo te permite debuggear problemas de comunicación, optimizar llamadas (paralelas vs. secuenciales), y manejar errores correctamente.

El problema

Diseñaste herramientas bien documentadas. Pero ¿cómo sabe el LLM qué herramienta invocar exactamente? ¿Cómo le devuelves el resultado de forma que lo entienda?

Situación típica: tu agente funciona con Claude, pero tu empresa quiere añadir soporte para GPT-4 como fallback. El código de herramientas es idéntico, pero el formato de function calling es diferente: Claude usa bloques tool_use, OpenAI usa objetos function_call. // sin entender el protocolo, no puedes hacer el código portable

El flujo de 5 pasos

1. REQUESTTu código llama a la API con messages + definiciones de tools
2. LLM DECIDEEl modelo analiza el mensaje: responde directo (stop_reason: end_turn) o quiere llamar función(es) (stop_reason: tool_use)
3. TOOL USE RESPONSELa respuesta incluye un bloque {"type": "tool_use", "name": "fn", "input": {...}}
4. TU EJECUCIÓNParseas el bloque, ejecutas la función localmente, formateas el resultado
5. CONTINUAR CONVERSACIÓNEnvías el tool_result de vuelta al LLM para que continúe

Anatomía del request y response

El request incluye messages, la lista de tools con su schema, y opcionalmente tool_choice para forzar comportamiento: auto (el modelo decide libremente), any (debe usar alguna herramienta), o tool con nombre específico (debe usar esa exacta).

El response trae stop_reason (qué hizo el LLM) y content como una lista de bloques — puede mezclar texto y uno o más bloques tool_use, cada uno con un id único que identifica esa llamada específica.

Enviar el resultado de vuelta

El resultado se envía como un nuevo mensaje con un bloque tool_result, donde el campo tool_use_id debe coincidir exactamente con el id del bloque tool_use que lo originó — es como el correlation id que le dice al modelo a qué llamada corresponde cada resultado.

Llamadas paralelas

Cuando una tarea requiere varias herramientas independientes entre sí, el modelo puede devolver varios bloques tool_use en la misma respuesta — no hace falta un turno por herramienta. Tu código ejecuta todas, empaqueta todos los tool_result juntos, y los envía de vuelta en un solo mensaje.

Entender el protocolo no da portabilidad gratis

Conocer el flujo de 5 pasos no vuelve el código automáticamente portable entre Claude y OpenAI — los shapes concretos (tool_use/tool_use_id vs. function_call/tool_call_id) son distintos en estructura, no solo en nombre. Migrar entre proveedores en producción normalmente exige una capa de adaptación explícita que traduzca entre formatos — el mismo patrón Anti-Corruption Layer de la Lección de DDD, aplicado aquí a proveedores de LLM en vez de sistemas legacy.

Practica: asistente de viajes

Implementa un sistema completo de function calling para un asistente que consulta vuelos, hoteles y clima. Debe manejar múltiples herramientas, llamadas paralelas (ej. "busca vuelos, hoteles para 2 noches, y dime qué clima habrá" — las 3 herramientas deberían ejecutarse en la misma iteración), y distintos valores de tool_choice (auto/any/específica).