Lección 55 · 25 min · Gratis

Guía de prompting para gpt-realtime

Hoy lanzamos gpt-realtime, nuestro modelo de voz a voz más potente hasta la fecha en la API, y anunciamos la disponibilidad general de la API Realtime.

Los sistemas de voz a voz son esenciales para habilitar la voz como una interfaz central de IA. La nueva versión mejora la robustez y la usabilidad, dando a las empresas la confianza para implementar agentes de voz de misión crítica a escala.

El nuevo modelo gpt-realtime ofrece una mejor capacidad para seguir instrucciones, una llamada de herramientas más confiable, una calidad de voz notablemente superior y una sensación general más fluida. Estas mejoras hacen que sea práctico pasar de enfoques encadenados a experiencias verdaderamente en tiempo real, reduciendo la latencia y produciendo respuestas que suenan más naturales y expresivas.

El modelo Realtime se beneficia de diferentes técnicas de prompting que no se aplicarían directamente a los modelos basados en texto. Esta guía de prompting comienza con un esqueleto de prompt sugerido, luego recorre cada parte con consejos prácticos, pequeños patrones que puedes copiar y ejemplos que puedes adaptar a tu caso de uso.

# !pip install ipython jupyterlab
from IPython.display import Audio, display

Consejos generales

  • Itera sin descanso: Pequeños cambios en la redacción pueden determinar el comportamiento.
    • Ejemplo: Para instrucciones de audio poco claras, cambiamos "inaudible" por "ininteligible", lo que mejoró el manejo de entradas ruidosas.
  • Prefiere las viñetas a los párrafos: Las viñetas claras y cortas superan a los párrafos largos.
  • Guía con ejemplos: El modelo sigue de cerca las frases de ejemplo.
  • Sé preciso: La ambigüedad o las instrucciones contradictorias = rendimiento degradado similar a GPT-5.
  • Controla el idioma: Fija la salida a un idioma objetivo si ves un cambio de idioma no deseado.
  • Reduce la repetición: Agrega una regla de Variedad para reducir la fraseología robótica.
  • Usa texto en mayúsculas para enfatizar: Poner en mayúsculas las reglas clave las hace destacar y más fáciles de seguir para el modelo.
  • Convierte las reglas no textuales a texto: en lugar de escribir "SI x > 3 ENTONCES ESCALAR", escribe "SI MÁS DE TRES FALLOS ENTONCES ESCALAR".

Estructura del prompt

Organizar tu prompt facilita que el modelo entienda el contexto y se mantenga consistente en las interacciones. También te facilita iterar y modificar secciones problemáticas.

  • Qué hace: Usa secciones claras y etiquetadas en tu prompt del sistema para que el modelo pueda encontrarlas y seguirlas. Mantén cada sección enfocada en una cosa.
  • Cómo adaptarlo: Agrega secciones específicas del dominio (por ejemplo, Cumplimiento, Política de marca). Elimina las secciones que no necesites (por ejemplo, Pronunciaciones de referencia si no tienes problemas con la pronunciación).

Ejemplo

# Role & Objective        — who you are and what “success” means  
# Personality & Tone      — the voice and style to maintain  
# Context                 — retrieved context, relevant info
# Reference Pronunciations — phonetic guides for tricky words  
# Tools                   — names, usage rules, and preambles  
# Instructions / Rules    — do’s, don’ts, and approach  
# Conversation Flow       — states, goals, and transitions  
# Safety & Escalation     — fallback and handoff logic

Rol y objetivo

Esta sección define quién es el agente y qué significa "terminado". Los ejemplos muestran dos identidades diferentes para demostrar cuán estrictamente el modelo se adherirá al rol y al objetivo cuando sean explícitos.

  • Cuándo usarlo: El modelo no está asumiendo la persona, el rol o el alcance de la tarea que necesitas.
  • Qué hace: Fija la identidad del agente de voz para que sus respuestas estén condicionadas a esa descripción de rol.
  • Cómo adaptarlo: Modifica el rol según tu caso de uso.

Ejemplo (el modelo adopta un acento específico)

# Role & Objective
You are french quebecois speaking customer service bot. Your task is to answer the user's question.

Este es el audio de nuestro antiguo gpt-4o-realtime-preview-2025-06-03

Audio("./data/audio/obj_06.mp3")
<IPython.lib.display.Audio object>

Este es el audio de nuestro nuevo modelo GA gpt-realtime

Audio("./data/audio/obj_07.mp3")
<IPython.lib.display.Audio object>

Ejemplo (el modelo adopta un personaje)

# Role & Objective
You are a high-energy game-show host guiding the caller to guess a secret number from 1 to 100 to win 1,000,000$.

Este es el audio de nuestro antiguo gpt-4o-realtime-preview-2025-06-03

Audio("./data/audio/obj_2_06.mp3")
<IPython.lib.display.Audio object>

Este es el audio de nuestro nuevo modelo GA gpt-realtime

Audio("./data/audio/obj_2_07.mp3")
<IPython.lib.display.Audio object>

El nuevo modelo en tiempo real es capaz de desempeñar mejor el rol.

Personalidad y tono

La instantánea más reciente del modelo es realmente buena siguiendo instrucciones para imitar una personalidad o un tono particular. Puedes adaptar la experiencia y la entrega de voz según lo que espere tu caso de uso.

  • Cuándo usarlo: Las respuestas se sienten planas, demasiado verbosas o inconsistentes entre turnos.
  • Qué hace: Establece la voz, la brevedad y el ritmo para que las respuestas suenen naturales y consistentes.
  • Cómo adaptarlo: Ajusta la calidez/formalidad y la longitud predeterminada. Para dominios regulados, favorece la precisión neutral. Agrega otras subsecciones que sean relevantes para tu caso de uso.

Ejemplo

# Personality & Tone
## Personality
- Friendly, calm and approachable expert customer service assistant.

## Tone
- Warm, concise, confident, never fawning.

## Length
2–3 sentences per turn.

Ejemplo (multiemoción)

# Personality & Tone
- Start your response very happy
- Midway, change to sad
- At the end change your mood to very angry

Este es el audio de nuestro nuevo modelo GA gpt-realtime

Audio("./data/audio/multi-emotion.mp3")
<IPython.lib.display.Audio object>

El modelo es capaz de adherirse a las instrucciones complejas y cambiar entre 3 emociones a lo largo de la respuesta de audio.

Instrucciones de velocidad

En la API Realtime, el parámetro speed cambia la velocidad de reproducción, no cómo el modelo compone el habla. Para que suene realmente más rápido, agrega instrucciones que puedan guiar el ritmo.

  • Cuándo usarlo: Los usuarios quieren una voz que hable más rápido; la velocidad de reproducción (con el parámetro de velocidad) por sí sola no corrige el estilo de habla.
  • Qué hace: Ajusta el estilo de habla (brevedad, cadencia) independientemente de la velocidad de reproducción del cliente.
  • Cómo adaptarlo: Modifica la instrucción de velocidad para cumplir con los requisitos del caso de uso.

Ejemplo

# Personality & Tone
## Personality
- Friendly, calm and approachable expert customer service assistant.

## Tone
- Warm, concise, confident, never fawning.

## Length
- 2–3 sentences per turn.

## Pacing
- Deliver your audio response fast, but do not sound rushed.
- Do not modify the content of your response, only increase speaking speed for the same response.

Este es el audio de nuestro antiguo gpt-4o-realtime-preview-2025-06-03 con instrucciones de velocidad

Audio("./data/audio/pace_06.mp3")
<IPython.lib.display.Audio object>

Este es el audio de nuestro nuevo modelo GA gpt-realtime con instrucciones de velocidad

Audio("./data/audio/pace_07.mp3")
<IPython.lib.display.Audio object>

El audio del nuevo modelo en tiempo real es notablemente más rápido (¡sin sonar demasiado apresurado!).

Restricción de idioma

Las restricciones de idioma aseguran que el modelo responda consistentemente en el idioma deseado, incluso en condiciones desafiantes como ruido de fondo o entradas multilingües.

  • Cuándo usarlo: Para evitar cambios de idioma accidentales en entornos multilingües o ruidosos.
  • Qué hace: Bloquea la salida al idioma elegido para evitar cambios de idioma accidentales.
  • Cómo adaptarlo: Cambia "English" por tu idioma objetivo; o agrega instrucciones más complejas según tu caso de uso.

Ejemplo (fijar a un idioma)

# Personality & Tone
## Personality
- Friendly, calm and approachable expert customer service assistant.

## Tone
- Warm, concise, confident, never fawning.

## Length
- 2–3 sentences per turn.

## Language
- The conversation will be only in English.
- Do not respond in any other language even if the user asks.
- If the user speaks another language, politely explain that support is limited to English.

Estas son las respuestas después de aplicar la instrucción usando gpt-realtime

Ejemplo (el modelo enseña un idioma)

# Role & Objective
- You are a friendly, knowledgeable voice tutor for French learners.  
- Your goal is to help the user improve their French speaking and listening skills through engaging conversation and clear explanations.  
- Balance immersive French practice with supportive English guidance to ensure understanding and progress.

# Personality & Tone
## Personality
- Friendly, calm and approachable expert customer service assistant.

## Tone
- Warm, concise, confident, never fawning.

## Length
- 2–3 sentences per turn.

## Language
### Explanations
Use English when explaining grammar, vocabulary, or cultural context.

### Conversation
Speak in French when conducting practice, giving examples, or engaging in dialogue.

Estas son las respuestas después de aplicar la instrucción usando gpt-realtime

¡El modelo es capaz de cambiar fácilmente de un idioma a otro según nuestras instrucciones personalizadas!

Reducir la repetición

El modelo en tiempo real puede seguir de cerca frases de ejemplo para mantenerse fiel a la marca, pero puede usarlas en exceso, haciendo que las respuestas suenen robóticas o repetitivas. Agregar una regla de repetición ayuda a mantener la variedad mientras se preserva la claridad y la voz de la marca.

  • Cuándo usarlo: Las salidas reciclan las mismas aperturas, rellenos o patrones de oraciones en diferentes turnos o sesiones.
  • Qué hace: Agrega una restricción de variedad: desaconseja las frases repetidas, sugiere sinónimos y estructuras de oraciones alternativas, y mantiene intactos los términos requeridos.
  • Cómo adaptarlo: Ajusta la rigurosidad (por ejemplo, "no reutilices la misma apertura más de una vez cada N turnos"), incluye en la lista blanca las frases que deben mantenerse (legales/cumplimiento/marca) y permite frases más concisas donde la consistencia es importante.

Ejemplo

# Personality & Tone
## Personality
- Friendly, calm and approachable expert customer service assistant.

## Tone
- Warm, concise, confident, never fawning.

## Length
- 2–3 sentences per turn.

## Language
- The conversation will be only in English.
- Do not respond in any other language even if the user asks.
- If the user speaks another language, politely explain that support is limited to English.

## Variety
- Do not repeat the same sentence twice.
- Vary your responses so it doesn't sound robotic.

Estas son las respuestas antes de aplicar la instrucción usando gpt-realtime. El modelo repite la misma confirmación Got it.

Estas son las respuestas después de aplicar la instrucción usando gpt-realtime

Ahora el modelo es capaz de variar sus respuestas y confirmaciones y no sonar robótico.

Pronunciaciones de referencia

Esta sección cubre cómo asegurar que el modelo pronuncie correctamente palabras, números, nombres y términos importantes durante las interacciones habladas.

  • Cuándo usarlo: Los nombres de marcas, términos técnicos o ubicaciones a menudo se pronuncian mal.
  • Qué hace: Mejora la confianza y la claridad con pistas fonéticas.
  • Cómo adaptarlo: Mantén una lista corta; actualiza a medida que escuches errores.

Ejemplo

# Reference Pronunciations
When voicing these words, use the respective pronunciations:
- Pronounce “SQL” as “sequel.”
- Pronounce “PostgreSQL” as “post-gress.”
- Pronounce “Kyiv” as “KEE-iv.”
- Pronounce "Huawei" as “HWAH-way”

Este es el audio de nuestro antiguo gpt-4o-realtime-preview-2025-06-03 usando las pronunciaciones de referencia.

No puede pronunciar de forma fiable SQL como "sequel" según las instrucciones del prompt del sistema.

Audio("./data/audio/sql_before.mp3")
<IPython.lib.display.Audio object>

Este es el audio de nuestro nuevo modelo GA gpt-realtime usando las pronunciaciones de referencia.

Es capaz de pronunciar correctamente SQL como "sequel".

Audio("./data/audio/sql_after.mp3")
<IPython.lib.display.Audio object>

Pronunciaciones alfanuméricas

Realtime S2S puede difuminar o fusionar dígitos/letras al leer información clave (teléfono, tarjeta de crédito, ID de pedido). La confirmación explícita carácter por carácter evita malentendidos y genera una síntesis más clara.

  • Cuándo usarlo: Si el modelo tiene dificultades para capturar o leer números de teléfono, números de tarjeta, códigos 2FA, ID de pedido, números de serie, direcciones/números de unidad o cadenas alfanuméricas mixtas.
  • Qué hace: Obliga al modelo a hablar un carácter a la vez (con separadores), luego confirma con el usuario y vuelve a confirmar después de las correcciones. Opcionalmente, utiliza un desambiguador fonético para las letras (por ejemplo, "A como en Alfa").

Ejemplo (sección de instrucción general)

# Instructions/Rules
- When reading numbers or codes, speak each character separately, separated by hyphens (e.g., 4-1-5). 
- Repeat EXACTLY the provided number, do not forget any.

Consejo: Si sigues una estrategia de prompting de flujo conversacional, puedes especificar qué estado de conversación necesita aplicar la instrucción de pronunciaciones alfanuméricas.

Ejemplo (instrucción en estado de conversación)

(tomado del flujo conversacional del prompt de nuestros openai-realtime-agents)

{
    "id": "3_get_and_verify_phone",
    "description": "Request phone number and verify by repeating it back.",
    "instructions": [
      "Politely request the user’s phone number.",
      "Once provided, confirm it by repeating each digit and ask if it’s correct.",
      "If the user corrects you, confirm AGAIN to make sure you understand.",
    ],
    "examples": [
      "I'll need some more information to access your account if that's okay. May I have your phone number, please?",
      "You said 0-2-1-5-5-5-1-2-3-4, correct?",
      "You said 4-5-6-7-8-9-0-1-2-3, correct?"
    ],
    "transitions": [{
      "next_step": "4_authentication_DOB",
      "condition": "Once phone number is confirmed"
    }]
}

Estas son las respuestas antes de aplicar la instrucción usando gpt-realtime

¡Claro! El número es 55119765423. ¡Avísame si necesitas algo más!

Estas son las respuestas después de aplicar la instrucción usando gpt-realtime

¡Claro! El número es: 5-5-1-1-1-9-7-6-5-4-2-3. Por favor, avísame si necesitas algo más.

Instrucciones

Esta sección cubre la guía de prompts sobre cómo instruir a tu modelo para resolver tu tarea y, potencialmente, las mejores prácticas y cómo solucionar posibles problemas.

Quizás no sea sorprendente, recomendamos patrones de prompting similares a GPT-4.1 para obtener los mejores resultados.

Seguimiento de instrucciones

Al igual que GPT-4.1 y GPT-5, si las instrucciones son contradictorias, ambiguas o no claras, el nuevo modelo en tiempo real tendrá un rendimiento inferior.

  • Cuándo usarlo: Las salidas se desvían de las reglas, omiten fases o usan herramientas incorrectamente.
  • Qué hace: Usa un LLM para señalar ambigüedades, conflictos y definiciones faltantes antes de que lo implementes.

Prompt de calidad de instrucciones (se puede usar en ChatGPT o con la API)

Usa el siguiente prompt con GPT-5 para identificar áreas problemáticas en tu prompt que puedes corregir.

## Role & Objective  
You are a **Prompt-Critique Expert**.
Examine a user-supplied LLM prompt and surface any weaknesses following the instructions below.


## Instructions
Review the prompt that is meant for an LLM to follow and identify the following issues:
- Ambiguity: Could any wording be interpreted in more than one way?
- Lacking Definitions: Are there any class labels, terms, or concepts that are not defined that might be misinterpreted by an LLM?
- Conflicting, missing, or vague instructions: Are directions incomplete or contradictory?
- Unstated assumptions: Does the prompt assume the model has to be able to do something that is not explicitly stated?


## Do **NOT** list issues of the following types:
- Invent new instructions, tool calls, or external information. You do not know what tools need to be added that are missing.
- Issues that you are unsure about.


## Output Format
"""
# Issues
- Numbered list; include brief quote snippets.

# Improvements
- Numbered list; provide the revised lines you would change and how you would change them.

# Revised Prompt
- Revised prompt where you have applied all your improvements surgically with minimal edits to the original prompt
"""

Meta-prompt de optimización de prompts (se puede usar en ChatGPT o con la API)

Este meta-prompt te ayuda a mejorar tu prompt base del sistema al enfocarse en un modo de falla específico. Proporciona el prompt actual y describe el problema que estás viendo; el modelo (GPT-5) sugerirá variantes refinadas que ajustan las restricciones y reducen el problema.

Here's my current prompt to an LLM:
[BEGIN OF CURRENT PROMPT]
{CURRENT_PROMPT}
[END OF CURRENT PROMPT]
 
But I see this issue happening from the LLM:
[BEGIN OF ISSUE]
{ISSUE}
[END OF ISSUE]
Can you provide some variants of the prompt so that the model can better understand the constraints to alleviate the issue?

Sin audio o audio poco claro

A veces el modelo cree que escucha algo e intenta responder. Puedes agregar una instrucción personalizada que le diga al modelo cómo comportarse cuando escucha audio poco claro o entrada del usuario. Modifica el comportamiento deseado para que se ajuste a tu caso de uso (quizás no quieras que el modelo pida una aclaración, sino que repita la misma pregunta, por ejemplo).

  • Cuándo usarlo: El ruido de fondo, las palabras parciales o el silencio desencadenan respuestas no deseadas.
  • Qué hace: Detiene las respuestas espurias y crea una aclaración elegante.
  • Cómo adaptarlo: Elige si pedir una aclaración o repetir la última pregunta según el caso de uso.

Ejemplo (tos y audio poco claro)

# Instructions/Rules
...


## Unclear audio 
- Always respond in the same language the user is speaking in, if unintelligible.
- Only respond to clear audio or text. 
- If the user's audio is not clear (e.g. ambiguous input/background noise/silent/unintelligible) or if you did not fully hear or understand the user, ask for clarification using {preferred_language} phrases.

Estas son las respuestas después de aplicar la instrucción usando gpt-realtime

Audio("./data/audio/unclear_audio.mp3")
<IPython.lib.display.Audio object>

En este ejemplo, el modelo pide una aclaración después de mi tos (muy) fuerte y el audio poco claro.

Música o sonidos de fondo

Ocasionalmente, el modelo puede generar música de fondo, zumbidos, ruidos rítmicos o artefactos similares a sonidos no deseados durante la generación del habla. Estos artefactos pueden disminuir la claridad, distraer a los usuarios o hacer que el asistente parezca menos profesional. Las siguientes instrucciones ayudan a prevenir o reducir significativamente estas ocurrencias.

  • Cuándo usarlo: Úsalo cuando observes elementos musicales o efectos de sonido no deseados en las respuestas de audio en tiempo real.
  • Qué hace: Guía al modelo para evitar generar estos artefactos de audio no deseados.
  • Cómo adaptarlo: Ajusta la instrucción para intentar suprimir explícitamente los patrones de sonido específicos que estás encontrando.

Ejemplo

# Instructions/Rules
...
- Do not include any sound effects or onomatopoeic expressions in your responses.

Herramientas

Usa esta sección para indicarle al modelo cómo usar tus funciones y herramientas. Explica cuándo y cuándo no llamar a una herramienta, qué argumentos recopilar, qué decir mientras se ejecuta una llamada y cómo manejar errores o resultados parciales.

Selección de herramientas

La nueva instantánea de Realtime es realmente buena siguiendo instrucciones. Sin embargo, esto significa que si tienes instrucciones contradictorias en tu prompt con lo que el modelo espera, como mencionar herramientas en tu prompt que NO se pasan en la lista de herramientas, puede llevar a respuestas incorrectas.

  • Cuándo usarlo: Los prompts mencionan herramientas que en realidad no están disponibles.
  • Qué hace: Revisa las herramientas disponibles y el prompt del sistema para asegurar que estén alineados.

Ejemplo

# Tools
## lookup_account(email_or_phone)
...


## check_outage(address)
...

Necesitamos asegurarnos de que la lista de herramientas tenga las mismas herramientas disponibles y que las descripciones no se contradigan entre sí:

[
{
    "name": "lookup_account",
    "description": "Retrieve a customer account using either an email or phone number to enable verification and account-specific actions.",
    "parameters": {
      ...
  },
{
    "name": "check_outage",
    "description": "Check for network outages affecting a given service address and return status and ETA if applicable.",
    "parameters": {
      ...
  }
]

Preámbulos de llamadas a herramientas

Algunos casos de uso podrían beneficiarse de que el modelo Realtime proporcione una respuesta de audio al mismo tiempo que llama a una herramienta. Esto conduce a una mejor experiencia de usuario, enmascarando la latencia. Puedes modificar la frase de ejemplo para proporcionar.

  • Cuándo usarlo: Los usuarios necesitan confirmación inmediata al mismo tiempo que una llamada a una herramienta; ayuda a enmascarar la latencia.
  • Qué hace: Agrega un preámbulo corto y consistente antes de una llamada a una herramienta.

Ejemplo

# Tools
- Before any tool call, say one short line like “I’m checking that now.” Then call the tool immediately.

Estas son las respuestas después de aplicar la instrucción usando gpt-realtime

Usando la instrucción, el modelo emite una respuesta de audio "Estoy revisando eso ahora mismo" al mismo tiempo que la llamada a la herramienta.

Preámbulos de llamadas a herramientas + Frases de ejemplo

Si quieres controlar más de cerca qué tipo de frases emite el modelo al mismo tiempo que llama a una herramienta, puedes agregar frases de ejemplo en la descripción de la especificación de la herramienta.

Ejemplo

tools = [
  {
    "name": "lookup_account",
    "description": "Retrieve a customer account using either an email or phone number to enable verification and account-specific actions.

Preamble sample phrases:
- For security, I’ll pull up your account using the email on file.
- Let me look up your account by {email} now.
- I’m fetching the account linked to {phone} to verify access.
- One moment—I’m opening your account details."
    "parameters": {
      "..."
    }
  },
  {
    "name": "check_outage",
    "description": "Check for network outages affecting a given service address and return status and ETA if applicable.

Preamble sample phrases:
- I’ll check for any outages at {service_address} right now.
- Let me look up network status for your area.
- I’m checking whether there’s an active outage impacting your address.
- One sec—verifying service status and any posted ETA.",
    "parameters": {
      "..."
    }
  }
]

Llamadas a herramientas sin confirmación

A veces, el modelo puede pedir confirmación antes de una llamada a una herramienta. Para algunos casos de uso, esto puede llevar a una mala experiencia para el usuario final, ya que el modelo no está siendo proactivo.

  • Cuándo usarlo: El agente pide permiso antes de llamadas a herramientas obvias.
  • Qué hace: Elimina bucles de confirmación innecesarios.

Ejemplo

# Tools
- When calling a tool, do not ask for any user confirmation. Be proactive

Estas son las respuestas después de aplicar la instrucción usando gpt-realtime

En el ejemplo, notas que el modelo en tiempo real no produjo ninguna respuesta de audio, sino que llamó directamente a la herramienta respectiva.

Consejo: Si notas que el modelo se apresura demasiado a llamar a una herramienta, intenta suavizar la redacción. Por ejemplo, cambiar términos más fuertes como "proactivo" por algo más suave puede ayudar a guiar al modelo a adoptar un enfoque más tranquilo y menos ansioso.

Rendimiento de la llamada a herramientas

A medida que los casos de uso se vuelven más complejos y el número de herramientas disponibles aumenta, se vuelve crítico guiar explícitamente al modelo sobre cuándo usar cada herramienta y, lo que es igual de importante, cuándo no. Las reglas de uso claras no solo mejoran la precisión de la llamada a herramientas, sino que también ayudan al modelo a elegir la herramienta correcta en el momento adecuado.

  • Cuándo usarlo: El modelo tiene dificultades con el rendimiento de la llamada a herramientas y necesita que las instrucciones sean explícitas para reducir el mal uso.
  • Qué hace: Agrega instrucciones sobre cuándo "usar/evitar" cada herramienta. También puedes agregar instrucciones sobre secuencias de llamadas a herramientas (después de la llamada a la herramienta A, puedes llamar a la herramienta B o C).

Ejemplo

# Tools
- When you call any tools, you must output at the same time a response letting the user know that you are calling the tool.

## lookup_account(email_or_phone)
Use when: verifying identity or viewing plan/outage flags.
Do NOT use when: the user is clearly anonymous and only asks general questions.


## check_outage(address)
Use when: user reports connectivity issues or slow speeds.
Do NOT use when: question is billing-only.


## refund_credit(account_id, minutes)
Use when: confirmed outage > 240 minutes in the past 7 days.
Do NOT use when: outage is unconfirmed; route to Diagnose → check_outage first.


## schedule_technician(account_id, window)
Use when: repeated failures after reboot and outage status = false.
Do NOT use when: outage status = true (send status + ETA instead).


## escalate_to_human(account_id, reason)
Use when: user seems very frustrated, abuse/harassment, repeated failures, billing disputes >$50, or user requests escalation.

Consejo: Si una llamada a una herramienta puede fallar de forma impredecible, agrega instrucciones claras de manejo de fallos para que el modelo responda de forma elegante.

Comportamiento a nivel de herramienta

Puedes ajustar cómo se comporta el modelo para herramientas específicas en lugar de aplicar una regla global. Por ejemplo, es posible que quieras que las herramientas READ se llamen de forma proactiva, mientras que las herramientas WRITE requieran confirmación explícita.

  • Cuándo usarlo: Las instrucciones globales de proactividad, confirmación o preámbulos no se adaptan a todas las herramientas.
  • Qué hace: Agrega reglas de comportamiento por herramienta que definen si el modelo debe llamar a la herramienta inmediatamente, confirmar primero o decir un preámbulo antes de la llamada.

Ejemplo

# TOOLS
- For the tools marked PROACTIVE: do not ask for confirmation from the user and do not output a preamble.
- For the tools marked as CONFIRMATION FIRST: always ask for confirmation to the user.
- For the tools marked as PREAMBLES: Before any tool call, say one short line like “I’m checking that now.” Then call the tool immediately.


## lookup_account(email_or_phone) — PROACTIVE
Use when: verifying identity or accessing billing.  
Do NOT use when: caller refuses to identify after second request.


## check_outage(address) — PREAMBLES
Use when: caller reports failed connection or speed lower than 10 Mbps.  
Do NOT use when: purely billing OR when internet speed is above 10 Mbps.  
If either condition applies, inform the customer you cannot assist and hang up.


## refund_credit(account_id, minutes) — CONFIRMATION FIRST
Use when: confirmed outage > 240 minutes in the past 7 days (credit 60 minutes).  
Do NOT use when: outage unconfirmed.  
Confirmation phrase: “I can issue a credit for this outage—would you like me to go ahead?”


## schedule_technician(account_id, window) — CONFIRMATION FIRST
Use when: reboot + line checks fail AND outage=false.  
Windows: “10am–12pm ET” or “2pm–4pm ET”.  
Confirmation phrase: “I can schedule a technician to visit—should I book that for you?”


## escalate_to_human(account_id, reason) — PREAMBLES
Use when: harassment, threats, self-harm, repeated failure, billing disputes > $50, caller is frustrated, or caller requests escalation.  
Preamble: “Let me connect you to a senior agent who can assist further.”

Formato de salida de herramientas

Algunas salidas de herramientas, especialmente cadenas largas que deben repetirse textualmente, pueden estar fuera de la distribución para el modelo. Durante el entrenamiento, las salidas de herramientas comúnmente se parecen a objetos JSON con campos nombrados. Si tu herramienta devuelve una cadena sin procesar y por separado le pide al modelo que "repita exactamente", el modelo puede ser más propenso a parafrasear, truncar o mezclar su propio preámbulo.

Una solución práctica es hacer que la salida de la herramienta se parezca a un resultado de herramienta normal y hacer que el requisito textual sea explícito para la máquina.

  • Cuándo usarlo: Una herramienta devuelve contenido estructurado largo o complejo (instrucciones de varias frases, paquetes de traspaso, ID/enlaces, resúmenes de políticas, procedimientos de varios pasos, etc.) y observas truncamiento, parafraseo, campos omitidos, reordenamiento o el modelo mezclando su propio preámbulo/comentario.

  • Qué hace: Envuelve la salida de la herramienta en un pequeño y explícito sobre JSON (por ejemplo, response_text más banderas como require_repeat_verbatim, format o content_type) para que la respuesta se vea más dentro de la distribución y el comportamiento de realización esperado sea claro para la máquina.

  • Cómo adaptarlo: Mantén el esquema mínimo y estable. Documenta claramente la forma esperada de la salida de la herramienta tanto en tus instrucciones de herramientas como junto a la definición de la herramienta (por ejemplo, "Si require_repeat_verbatim es verdadero, emite exactamente response_text y nada más", o "Renderiza response_text tal cual; no agregues, omitas ni reordenes campos de la salida de la herramienta").

Ejemplos

Ejemplo: cadena sin procesar (más propensa a errores)

La herramienta devuelve:

I just sent you an email with the verification link. Please open it and click “Confirm”.

El modelo a veces dice:

  • “Te he enviado un enlace de verificación por correo electrónico…” (parafraseo)

  • Omite la última frase (truncamiento)

  • Agrega comentarios adicionales (“¿Puedo ayudarte en algo más?”)

Ejemplo: JSON envuelto (más dentro de la distribución, más fiable)

La herramienta devuelve:

{
  "response_text": "I just sent you an email with the verification link. Please open it and click “Confirm”.",
  "require_repeat_verbatim": true
}

Debido a que esto se parece a un resultado de herramienta típico (objeto JSON), el modelo generalmente tiene más facilidad para:

  • reconocer cuál es el contenido "autorizado" (response_text)

  • comprender la restricción de realización (require_repeat_verbatim)

  • reproducir la salida de la herramienta de forma limpia, sin truncamiento ni comentarios adicionales

Herramienta Supervisora de Refraseo (Arquitectura Responder-Pensador)

En muchas configuraciones de voz, el modelo en tiempo real actúa como el respondedor (habla con el usuario) mientras que un modelo de texto más potente actúa como el pensador (realiza la planificación, búsquedas de políticas, finalización de SOP). Las respuestas de texto no son automáticamente buenas para el habla, por lo que el respondedor debe reformular el texto del pensador en una respuesta amigable para el audio antes de generar el audio.

  • Cuándo usarlo: Cuando la salida hablada del respondedor suena robótica, demasiado larga o incómoda después de recibir una respuesta del pensador.
  • Qué hace: Agrega instrucciones claras que guían al respondedor para reformular el texto del pensador en una respuesta corta, natural y prioritaria para el habla.
  • Cómo adaptarlo: Ajusta el estilo de fraseo, las aperturas y los límites de brevedad para que coincidan con la expectativa de tu caso de uso.

Ejemplo

# Tools
## Supervisor Tool
Name: getNextResponseFromSupervisor(relevantContextFromLastUserMessage: string)


When to call:
- Any request outside the allow list.
- Any factual, policy, account, or process question.
- Any action that might require internal lookups or system changes.


When not to call:
- Simple greetings and basic chitchat.
- Requests to repeat or clarify.
- Collecting parameters for later Supervisor use:
  - phone_number for account help (getUserAccountInfo)
  - zip_code for store lookup (findNearestStore)
  - topic or keyword for policy lookup (lookupPolicyDocument)


Usage rules and preamble:
1) Say a neutral filler phrase to the user, then immediately call the tool. Approved fillers: “One moment.”, “Let me check.”, “Just a second.”, “Give me a moment.”, “Let me see.”, “Let me look into that.” Fillers must not imply success or failure.  
2) Do not mention the “Supervisor” when responding with filler phrase.
3) relevantContextFromLastUserMessage is a one-line summary of the latest user message; use an empty string if nothing salient.  
4) After the tool returns, apply Rephrase Supervisor and send your reply.


### Rephrase Supervisor
- Start with a brief conversational opener using active language, then flow into the answer (for example: “Thanks for waiting—”, “Just finished checking that.”, “I’ve got that pulled up now.”).  
- Keep it short: no more than 2 sentences.  
- Use this template: opener + one-sentence gist + up to 3 key details + a quick confirmation or choice (for example: “Does that match what you expected?”, “Want me to review options?”).  
- Read numbers for speech: money naturally (“$45.20” → “forty-five dollars and twenty cents”), phone numbers 3-3-4, addresses with individual digits, dates/times plainly (“August twelfth”, “three-thirty p.m.”).

Aquí tienes un ejemplo sin la instrucción de refraseo:

Asistente: Tu saldo actual de tarjeta de crédito es positivo en 32,323,232 AUD.

Aquí tienes el mismo ejemplo con la instrucción de refraseo:

Asistente: Acabo de verificar eso: tu saldo de tarjeta de crédito es de treinta y dos millones trescientos veintitrés mil doscientos treinta y dos dólares a tu favor. Tu último pago se procesó el primero de agosto. ¿Coincide con lo que esperabas?

Herramientas comunes

La nueva instantánea del modelo ha sido entrenada para usar eficazmente las siguientes herramientas comunes. Si tu caso de uso necesita un comportamiento similar, mantén los nombres, firmas y descripciones cercanos a estos para maximizar la fiabilidad y estar más dentro de la distribución.

A continuación, se presentan algunas de las herramientas comunes importantes en las que el modelo ha sido entrenado:

Ejemplo

# answer(question: string)
Description: Call this when the customer asks a question that you don't have an answer to or asks to perform an action.


# escalate_to_human()
Description: Call this when a customer asks for escalation, or to talk to someone else, or expresses dissatisfaction with the call.


# finish_session()
Description: Call this when a customer says they're done with the session or doesn't want to continue. If it's ambiguous, confirm with the customer before calling. 

Flujo de conversación

Esta sección cubre cómo estructurar el diálogo en fases claras y orientadas a objetivos para que el modelo sepa exactamente qué hacer en cada paso. Define el propósito de cada fase, las instrucciones para avanzar a través de ella y los "criterios de salida" concretos para pasar a la siguiente. Esto evita que el modelo se estanque, omita pasos o se adelante, y asegura que la conversación se mantenga organizada desde el saludo hasta la resolución.

Además, al organizar tu prompt en varios estados de conversación, resulta más fácil identificar los modos de error e iterar de forma más eficaz.

  • Cuándo usarlo: Si las conversaciones se sienten desorganizadas, se estancan antes de alcanzar el objetivo o el modelo tiene dificultades para completar el objetivo de manera efectiva.
  • Qué hace: Divide la interacción en fases con objetivos, instrucciones y criterios de salida claros.
  • Cómo adaptarlo: Renombra las fases para que coincidan con tu flujo de trabajo; modifica las instrucciones para cada fase para seguir el comportamiento deseado; mantén "Salir cuando" concreto y mínimo.

Ejemplo

# Conversation Flow
## 1) Greeting
Goal: Set tone and invite the reason for calling.
How to respond:
- Identify as NorthLoop Internet Support.
- Keep the opener brief and invite the caller’s goal.
- Confirm that customer is a Northloop customer
Exit to Discovery: Caller states they are a Northloop customer and mentions an initial goal or symptom.


## 2) Discover
Goal: Classify the issue and capture minimal details.
How to respond:
- Determine billing vs connectivity with one targeted question.
- For connectivity: collect the service address.
- For billing/account: collect email or phone used on the account.
Exit when: Intent and address (for connectivity) or email/phone (for billing) are known.


## 3) Verify
Goal: Confirm identity and retrieve the account.
How to respond:
- Once you have email or phone, call lookup_account(email_or_phone).
- If lookup fails, try the alternate identifier once; otherwise proceed with general guidance or offer escalation if account actions are required.
Exit when: Account ID is returned.


## 4) Diagnose
Goal: Decide outage vs local issue.
How to respond:
- For connectivity, call check_outage(address).
- If outage=true, skip local steps; move to Resolve with outage context.
- If outage=false, guide a short reboot/cabling check; confirm each step’s result before continuing.
Exit when: Root cause known.


## 5) Resolve
Goal: Apply fix, credit, or appointment.
How to respond:
- If confirmed outage > 240 minutes in the last 7 days, call refund_credit(account_id, 60).
- If outage=false and issue persists after basic checks, offer “10am–12pm ET” or “2pm–4pm ET” and call schedule_technician(account_id, chosen window).
- If the local fix worked, state the result and next steps briefly.
Exit when: A fix/credit/appointment has been applied and acknowledged by the caller.


## 6) Confirm/Close
Goal: Confirm outcome and end cleanly.
How to respond:
- Restate the result and any next step (e.g., stabilization window or tech ETA).
- Invite final questions; close politely if none.
Exit when: Caller declines more help.

Frases de ejemplo

Las frases de ejemplo actúan como "ejemplos ancla" para el modelo. Muestran el estilo, la brevedad y el tono que quieres que siga, sin encasillarlo en una respuesta rígida.

  • Cuándo usar: Las respuestas carecen del estilo de tu marca o no son consistentes.
  • Qué hace: Proporciona frases de ejemplo que el modelo puede variar para mantenerse natural y breve.
  • Cómo adaptar: Intercambia ejemplos para que se ajusten a la marca; mantén la advertencia de "no usar siempre".

Ejemplo

# Sample Phrases
- Below are sample examples that you should use for inspiration. DO NOT ALWAYS USE THESE EXAMPLES, VARY YOUR RESPONSES.

Acknowledgements: “On it.” “One moment.” “Good question.”
Clarifiers: “Do you want A or B?” “What’s the deadline?”
Bridges: “Here’s the quick plan.” “Let’s keep it simple.”
Empathy (brief): “That’s frustrating—let’s fix it.”
Closers: “Anything else before we wrap?” “Happy to help next time.”

Nota: Si tu sistema de voz termina repitiendo consistentemente solo las frases de ejemplo, lo que lleva a una experiencia de voz más robótica, intenta agregar la restricción de Variedad. Hemos visto que esto soluciona el problema.

Flujo de conversación + Frases de ejemplo

Es un patrón útil agregar frases de ejemplo en los diferentes estados del flujo de conversación para enseñarle al modelo cómo se ve una buena respuesta:

Ejemplo

# Conversation Flow
## 1) Greeting
Goal: Set tone and invite the reason for calling.
How to respond:
- Identify as NorthLoop Internet Support.
- Keep the opener brief and invite the caller’s goal.
Sample phrases (do not always repeat the same phrases, vary your responses):
- “Thanks for calling NorthLoop Internet—how can I help today?”
- “You’ve reached NorthLoop Support. What’s going on with your service?”
- “Hi there—tell me what you’d like help with.”
Exit when: Caller states an initial goal or symptom.


## 2) Discover
Goal: Classify the issue and capture minimal details.
How to respond:
- Determine billing vs connectivity with one targeted question.
- For connectivity: collect the service address.
- For billing/account: collect email or phone used on the account.
Sample phrases (do not always repeat the same phrases, vary your responses):
- “Is this about your bill or your internet speed?”
- “What address are you using for the connection?”
- “What’s the email or phone number on the account?”
Exit when: Intent and address (for connectivity) or email/phone (for billing) are known.


## 3) Verify
Goal: Confirm identity and retrieve the account.
How to respond:
- Once you have email or phone, call lookup_account(email_or_phone).
- If lookup fails, try the alternate identifier once; otherwise proceed with general guidance or offer escalation if account actions are required.
Sample phrases:
- “Thanks—looking up your account now.”
- “If that doesn’t pull up, what’s the other contact—email or phone?”
- “Found your account. I’ll take care of this.”
Exit when: Account ID is returned.


## 4) Diagnose
Goal: Decide outage vs local issue.
How to respond:
- For connectivity, call check_outage(address).
- If outage=true, skip local steps; move to Resolve with outage context.
- If outage=false, guide a short reboot/cabling check; confirm each step’s result before continuing.
Sample phrases (do not always repeat the same phrases, vary your responses):
- “I’m running a quick outage check for your area.”
- “No outage reported—let’s try a fast modem reboot.”
- “Please confirm the modem lights: is the internet light solid or blinking?”
Exit when: Root cause known.


## 5) Resolve
Goal: Apply fix, credit, or appointment.
How to respond:
- If confirmed outage > 240 minutes in the last 7 days, call refund_credit(account_id, 60).
- If outage=false and issue persists after basic checks, offer “10am–12pm ET” or “2pm–4pm ET” and call schedule_technician(account_id, chosen window).
- If the local fix worked, state the result and next steps briefly.
Sample phrases (do not always repeat the same phrases, vary your responses):
- “There’s been an extended outage—adding a 60-minute bill credit now.”
- “No outage—let’s book a technician. I can do 10am–12pm ET or 2pm–4pm ET.”
- “Credit applied—you’ll see it on your next bill.”
Exit when: A fix/credit/appointment has been applied and acknowledged by the caller.


## 6) Confirm/Close
Goal: Confirm outcome and end cleanly.
How to respond:
- Restate the result and any next step (e.g., stabilization window or tech ETA).
- Invite final questions; close politely if none.
Sample phrases (do not always repeat the same phrases, vary your responses):
- “We’re all set: [credit applied / appointment booked / service restored].”
- “You should see stable speeds within a few minutes.”
- “Your technician window is 10am–12pm ET.”
Exit when: Caller declines more help.

Flujo de conversación avanzado

A medida que los casos de uso se vuelven más complejos, necesitarás una estructura que escale mientras mantienes el modelo efectivo. La clave es equilibrar la mantenibilidad con la simplicidad: demasiados estados rígidos pueden sobrecargar el modelo, afectando el rendimiento y haciendo que las conversaciones se sientan robóticas.

Un mejor enfoque es diseñar flujos que reduzcan la complejidad percibida del modelo. Al manejar el estado de una manera estructurada pero flexible, facilitas que el modelo se mantenga enfocado y receptivo, lo que mejora la experiencia del usuario.

Dos patrones comunes para gestionar escenarios complejos son:

  1. Flujo de conversación como máquina de estados
  2. Flujo de conversación dinámico a través de session.updates

Flujo de conversación como máquina de estados

Define tu conversación como una estructura JSON que codifica tanto los estados como las transiciones. Esto facilita el razonamiento sobre la cobertura, la identificación de casos extremos y el seguimiento de los cambios a lo largo del tiempo. Dado que se almacena como código, puedes versionarlo, compararlo y extenderlo a medida que tu flujo evoluciona. Una máquina de estados también te da un control preciso sobre cómo y cuándo la conversación pasa de un estado a otro.

Ejemplo

# Conversation States
[
  {
    "id": "1_greeting",
    "description": "Begin each conversation with a warm, friendly greeting, identifying the service and offering help.",
    "instructions": [
        "Use the company name 'Snowy Peak Boards' and provide a warm welcome.",
        "Let them know upfront that for any account-specific assistance, you’ll need some verification details."
    ],
    "examples": [
      "Hello, this is Snowy Peak Boards. Thanks for reaching out! How can I help you today?"
    ],
    "transitions": [{
      "next_step": "2_get_first_name",
      "condition": "Once greeting is complete."
    }, {
      "next_step": "3_get_and_verify_phone",
      "condition": "If the user provides their first name."
    }]
  },
  {
    "id": "2_get_first_name",
    "description": "Ask for the user’s name (first name only).",
    "instructions": [
      "Politely ask, 'Who do I have the pleasure of speaking with?'",
      "Do NOT verify or spell back the name; just accept it."
    ],
    "examples": [
      "Who do I have the pleasure of speaking with?"
    ],
    "transitions": [{
      "next_step": "3_get_and_verify_phone",
      "condition": "Once name is obtained, OR name is already provided."
    }]
  },
  {
    "id": "3_get_and_verify_phone",
    "description": "Request phone number and verify by repeating it back.",
    "instructions": [
      "Politely request the user’s phone number.",
      "Once provided, confirm it by repeating each digit and ask if it’s correct.",
      "If the user corrects you, confirm AGAIN to make sure you understand.",
    ],
    "examples": [
      "I'll need some more information to access your account if that's okay. May I have your phone number, please?",
      "You said 0-2-1-5-5-5-1-2-3-4, correct?",
      "You said 4-5-6-7-8-9-0-1-2-3, correct?"
    ],
    "transitions": [{
      "next_step": "4_authentication_DOB",
      "condition": "Once phone number is confirmed"
    }]
  },
...

Flujo de conversación dinámico

En este patrón, la conversación se adapta en tiempo real actualizando el prompt del sistema y la lista de herramientas según el estado actual. En lugar de exponer el modelo a todas las reglas y herramientas posibles a la vez, solo proporcionas lo que es relevante para la fase activa de la conversación.

Cuando se cumplen las condiciones finales para un estado, usas session.update para la transición, reemplazando el prompt y las herramientas con las necesarias para la siguiente fase.

Este enfoque reduce la carga cognitiva del modelo, lo que le facilita el manejo de tareas complejas sin distraerse con contexto innecesario.

Ejemplo

from typing import Dict, List, Literal

State = Literal["verify", "resolve"]

# Allowed transitions
TRANSITIONS: Dict[State, List[State]] = {
    "verify": ["resolve"],
    "resolve": []  # terminal
}

def build_state_change_tool(current: State) -> dict:
    allowed = TRANSITIONS[current]
    readable = ", ".join(allowed) if allowed else "no further states (terminal)"
    return {
        "type": "function",
        "name": "set_conversation_state",
        "description": (
            f"Switch the conversation phase. Current: '{current}'. "
            f"You may switch only to: {readable}. "
            "Call this AFTER exit criteria are satisfied."
        ),
        "parameters": {
            "type": "object",
            "properties": {
                "next_state": {"type": "string", "enum": allowed}
            },
            "required": ["next_state"]
        }
    }

# Minimal business tools per state
TOOLS_BY_STATE: Dict[State, List[dict]] = {
    "verify": [{
        "type": "function",
        "name": "lookup_account",
        "description": "Fetch account by email or phone.",
        "parameters": {
            "type": "object",
            "properties": {"email_or_phone": {"type": "string"}},
            "required": ["email_or_phone"]
        }
    }],
    "resolve": [{
        "type": "function",
        "name": "schedule_technician",
        "description": "Book a technician visit.",
        "parameters": {
            "type": "object",
            "properties": {
                "account_id": {"type": "string"},
                "window": {"type": "string", "enum": ["10-12 ET", "14-16 ET"]}
            },
            "required": ["account_id", "window"]
        }
    }]
}

# Short, phase-specific instructions
INSTRUCTIONS_BY_STATE: Dict[State, str] = {
    "verify": (
        "# Role & Objective\n"
        "Verify identity to access the account.\n\n"
        "# Conversation (Verify)\n"
        "- Ask for the email or phone on the account.\n"
        "- Read back digits one-by-one (e.g., '4-1-5… Is that correct?').\n"
        "Exit when: Account ID is returned.\n"
        "When exit is satisfied: call set_conversation_state(next_state=\"resolve\")."
    ),
    "resolve": (
        "# Role & Objective\n"
        "Apply a fix by booking a technician.\n\n"
        "# Conversation (Resolve)\n"
        "- Offer two windows: '10–12 ET' or '2–4 ET'.\n"
        "- Book the chosen window.\n"
        "Exit when: Appointment is confirmed.\n"
        "When exit is satisfied: end the call politely."
    )
}

def build_session_update(state: State) -> dict:
    """Return the JSON payload for a Realtime `session.update` event."""
    return {
        "type": "session.update",
        "session": {
            "instructions": INSTRUCTIONS_BY_STATE[state],
            "tools": TOOLS_BY_STATE[state] + [build_state_change_tool(state)]
        }
    }

Seguridad y escalada

A menudo, con los agentes de voz en tiempo real, es importante tener una forma confiable de escalar a un humano. En esta sección, debes modificar las instrucciones sobre CUÁNDO escalar, dependiendo de tu caso de uso.

  • Cuándo usar: El modelo tiene dificultades para determinar cuándo escalar correctamente a un humano o a un sistema de respaldo.
  • Qué hace: Define una escalada rápida y confiable y qué decir.
  • Cómo adaptar: Inserta tus propios umbrales y lo que el modelo tiene que decir.

Ejemplo

# Safety & Escalation
When to escalate (no extra troubleshooting):
- Safety risk (self-harm, threats, harassment)
- User explicitly asks for a human
- Severe dissatisfaction (e.g., “extremely frustrated,” repeated complaints, profanity)
- **2** failed tool attempts on the same task **or** **3** consecutive no-match/no-input events
- Out-of-scope or restricted (e.g., real-time news, financial/legal/medical advice)

What to say at the same time of calling the escalate_to_human tool (MANDATORY):
- “Thanks for your patience—I’m connecting you with a specialist now.”
- Then call the tool: `escalate_to_human`

Examples that would require escalation:
- “This is the third time the reset didn’t work. Just get me a person.”
- “I am extremely frustrated!”

Estas son las respuestas de conversación de nuestro antiguo modelo de instantánea gpt-4o-realtime-preview-2025-06-03 usando la instrucción.

Estas son las respuestas de conversación de nuestro nuevo modelo GA gpt-realtime usando la instrucción.

El nuevo modelo en tiempo real es capaz de seguir mejor la instrucción y escalar a un humano de manera más confiable.

Lección del curso «OpenAI Cookbook» de OpenAI, publicado con licencia MIT. Traducción y adaptación al español de IA con Clase. IA con Clase no está afiliado a OpenAI. Ver el original · Licencia
Esta lección es gratuita. El resto del curso se abre con la Membresía de IA con Clase, que incluye todos los cursos del catálogo. Ver precios