Function Calling
Nivel intermedio — el protocolo de comunicación request-response entre el LLM y tus herramientas, incluyendo llamadas paralelas.
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
messages + definiciones de toolsstop_reason: end_turn) o quiere llamar función(es) (stop_reason: tool_use){"type": "tool_use", "name": "fn", "input": {...}}tool_result de vuelta al LLM para que continúeAnatomí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.
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).