Contenido del curso
Interfaces de la API y streaming
Function calling y salidas estructuradas
Reducción de costos con caching y batch
Ingeniería de producción y control de calidad
Proyecto final de consultas sobre documentos
Function calling con reglas de marca
Resumen
Cuando construyes una app real con IA, el prompt no basta: necesitas que el modelo consulte datos internos como reglas de marca, canales permitidos o palabras a evitar. Aquí aprenderás a crear una tool en OpenAI que consulte la voz de marca antes de generar contenido, ideal para quienes desarrollan aplicaciones con la API de responses.
Esta es una clase más conceptual que práctica: la idea es entender cómo funcionan las herramientas dentro de OpenAI y probar el resultado directamente en la terminal antes de integrarlo a una interfaz.
Qué son las tools en OpenAI y por qué usarlas
Las tools son herramientas que el modelo puede llamar durante una respuesta. La documentación de OpenAI las clasifica como remotas o MCP remotas, y sirven para múltiples propósitos [00:20].
La clave está en el llamado a tu endpoint. Sigues usando client.responses.create, pero ahora le pasas un parámetro adicional llamado tools, que va justo al lado del modelo y del input [00:41].
¿Dónde se declara una tool en la API de OpenAI? Dentro del llamado a
client.responses.create, como un parámetrotoolsque acepta un array. Ahí puedes incluir una o varias herramientas, nativas o creadas por ti.
Puedes pasar una sola tool o varias a la vez, y pueden ser nativas de OpenAI o creadas por ti. Esa flexibilidad es lo interesante: el modelo decide cuándo necesita llamarlas.
Cómo se define una función y su estructura de tool
Hay tres partes importantes para trabajar con herramientas. Todo empieza por una función real en tu código.
En el archivo del cliente de OpenAI se define la función getBrandVoice, que devuelve un diccionario con tres datos concretos [01:38]:
- El tono de la marca: cercano, claro y educativo.
- Lo que debe evitar: ser hiperexagerado o hacer promesas irreales.
- Los canales preferidos: LinkedIn, newsletter y un reel de Instagram.
Luego viene la estructura que OpenAI exige para reconocer esa función como tool. Se crea una variable, por ejemplo BrandVoiceTool, con estos campos [02:32]:
type: se declara comofunction.name: debe sergetBrandVoice, exactamente igual al nombre de la función definida antes.description: una explicación breve, como "obtiene reglas de voz y tono de marca".parameters: de tipo objeto, con propiedades vacías yadditionalPropertiesen falso.
Ese detalle de que el nombre debe coincidir es fácil de pasar por alto, pero sin esa correspondencia el modelo no sabe qué ejecutar.
Por qué el primer llamado no devuelve el texto que esperas
Aquí viene lo interesante. Cuando importas el cliente y el BrandVoiceTool en tu archivo main, creas un response con el modelo, un input como "genera un post de LinkedIn para una campaña de inteligencia artificial" y el array de tools [04:02].
Al ejecutar main.py buscando el output_text, no obtienes nada. La razón es que esa respuesta no tiene un output_text [05:03].
¿Por qué mi tool no devuelve texto en la primera respuesta? Porque el modelo solo emite un function call: te avisa que quiere llamar a la función, con su ID, nombre y estado completado. Todavía no ejecuta la función ni genera el contenido final.
Al cambiar a response.output ves un array distinto. Te indica que hay un llamado de tipo function call, con un identificador único, el nombre getBrandVoice y el status en completado [05:24]. El modelo dice "me está pidiendo llamar a esta función y la función existe", pero aún no te da la respuesta que buscas.
Cómo hacer el segundo llamado para obtener la respuesta final
Para cerrar el ciclo necesitas ejecutar la función tú mismo y devolverle el resultado al modelo. El proceso queda así [06:35]:
- Define una variable
tool_outputscomo un array vacío. - Itera sobre cada ítem del
response.outputy detecta si es de tipo function call con el nombregetBrandVoice. - Si coincide, ejecuta la función
getBrandVoicedesde tu cliente y guarda el resultado. - Agrega a
tool_outputsun objeto con el tipofunction_call_output, uncall_idy eloutputen formato JSON (recuerda importarjson).
Con esos resultados listos, haces un llamado final a responses.create pasando el tool_outputs como input [08:00].
El parámetro previous_response_id es superimportante: viene del response.id del primer llamado e indica cuál era el contenido en ese momento. Sin él, el modelo pierde el hilo de la conversación.
¿Para qué sirve previous_response_id en OpenAI? Conecta el segundo llamado con el primero usando el ID de la respuesta inicial. Así el modelo recuerda el contexto del function call y genera la respuesta final coherente.
En este último llamado sí imprimes final.output_text, y aquí sí obtienes un texto de verdad.
Qué resultado entrega la tool en la práctica
Al ejecutar de nuevo main.py, ahora con el doble llamado al endpoint, obtienes el post que buscabas [08:52].
La respuesta llega con un tono cercano, claro y educativo, sacado directamente de la tool y no del prompt. Incluye emojis típicos de LinkedIn, un listado de checks y hashtags. Al final el modelo incluso ofrece hacer una versión más comercial, más inspiradora o más adaptada a una industria específica.
Y ese cierre revela algo útil: como tu tool solo define tono, cosas a evitar y canales preferidos, podrías enriquecerla con muchas más reglas para que las respuestas se ajusten aún mejor a lo que buscas.
Esto fue crear tu primera herramienta desde cero, con la función y todo el llamado. Pero no siempre tendrás que hacerlo paso a paso: OpenAI ofrece tools nativas como Web Search que puedes llamar directamente. ¿Ya se te ocurren qué reglas de marca agregarías a tu propia tool? Cuéntalo en los comentarios.