Contenido del curso

Asistente matemático con Code Interpreter

Resumen

La API de OpenAI Assistants permite construir un asistente capaz de resolver ecuaciones matemáticas con precisión usando Code Interpreter. Aprenderás a crear un hilo de conversación, enviar mensajes y ejecutar un run en Python para obtener respuestas exactas, ideal para desarrolladores que integran IA con cálculos confiables.

La idea es simple: en lugar de pedirle a un modelo que adivine el resultado de un cálculo complejo, dejas que escriba y ejecute código Python por ti. Y aquí viene lo interesante: OpenAI guarda la conversación en un thread, así te ahorras montar tu propia base de datos.

¿Cómo se inicializa el cliente y el hilo del asistente?

Antes de enviar cualquier mensaje, necesitas dos cosas: el cliente de OpenAI ya configurado y el ID del asistente que creaste previamente con la opción Code Interpreter activada.

El flujo arranca creando una carpeta Assistants, dentro un script.py, e inicializando el cliente. Luego declaras el assistant_id como string y creas un thread nuevo, que es el contenedor de la conversación.

python thread = client.beta.threads.create() print(f"Hilo creado con ID: {thread.id}")

Nota el beta en la ruta: la API de Assistants sigue en fase beta, así que su estructura puede cambiar.

¿Qué es un thread en OpenAI Assistants? Es el hilo de conversación que almacena automáticamente los mensajes intercambiados entre el usuario y el asistente. OpenAI lo persiste por ti, así no necesitas una base de datos propia para mantener contexto.

¿Cómo enviar el mensaje del usuario y ejecutar el run?

Una vez tienes el hilo, agregas el mensaje del usuario y luego accionas la respuesta con un run. Son dos pasos separados: añadir el mensaje al hilo no dispara nada por sí solo.

python client.beta.threads.messages.create( thread_id=thread.id, role="user", content="¿Cuánto es [ecuación]? Puedes ejecutar código Python para esto." )

run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id )

El pequeño truco está en pedirle explícitamente que use Python. Eso le da permiso al modelo para invocar Code Interpreter en lugar de improvisar la respuesta.

¿Por qué necesitas un bucle de polling para esperar el run?

Ejecutar un run no es instantáneo. Encender Code Interpreter, generar el código y devolver el resultado puede tomar entre cero y diez segundos, así que debes consultar el estado periódicamente hasta que aparezca como completed.

python import time

while True: run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id ) if run.status == "completed": break time.sleep(1)

El time.sleep(1) evita saturar la API con peticiones cada milisegundo. Un segundo es un buen intervalo para tareas como esta.

¿Cómo recuperar el código Python generado y la respuesta final?

Después del completed viene la parte interesante: revisar los pasos del run para ver qué código ejecutó el asistente y luego listar los mensajes para leer la respuesta.

Los steps representan cada acción del agente, equivalente a sus "mensajes internos". Filtras los que sean de tipo tool_calls y dentro identificas los que usen code_interpreter.

python run_steps = client.beta.threads.runs.steps.list( thread_id=thread.id, run_id=run.id )

for step in run_steps.data: if step.step_details.type == "tool_calls": for tool_call in step.step_details.tool_calls: if tool_call.type == "code_interpreter": print(f"Código Python: {tool_call.code_interpreter.input}")

Luego listas los mensajes en orden descendente, tomas el último con rol assistant y recorres sus bloques de contenido para imprimir el texto:

python messages = client.beta.threads.messages.list( thread_id=thread.id, order="desc", limit=1 )

for message in messages.data: if message.role == "assistant": for content_block in message.content: print(content_block.text.value)

Al correr el script, el asistente devuelve la respuesta correcta, terminada en 4007, mientras que ChatGPT sin Code Interpreter fallaba en el mismo cálculo. Esa es la diferencia entre adivinar y ejecutar.

¿Cuándo conviene usar Code Interpreter en lugar de una función personalizada? Cuando necesitas ejecutar código Python arbitrario sin construir tu propia infraestructura. OpenAI ya provee el entorno aislado, así que te ahorras escribir y mantener una función intérprete.

¿Qué ventajas reales aportan los Assistants frente a chat completions?

La diferencia se siente en tres frentes que valen la pena cuando armas un producto:

  • Persistencia automática de la conversación dentro de los threads, sin base de datos propia.
  • Herramientas integradas como Code Interpreter, function calling y file search listas para activar.
  • Manejo del rol del mensaje conservado por la API, sin necesidad de reconstruirlo manualmente.

Eso sí, la API sigue en beta desde hace varios meses, así que su forma puede cambiar antes de llegar a producción recomendada. Si tu caso de uso encaja, vale la pena experimentar: crea tus propios asistentes, arma threads, ejecuta runs y mira cómo se comportan.

¿Ya probaste Code Interpreter con un caso real? Cuéntame qué tipo de asistente estás construyendo.