Saltar a la navegación

Variables dinámicas

Pasa valores en tiempo de ejecución para personalizar el comportamiento de tu agente.

Las variables dinámicas te permiten insertar valores en tiempo de ejecución en los mensajes, prompts del sistema y herramientas de tu agente. Así puedes personalizar cada conversación con datos específicos de cada usuario sin crear varios agentes.

Descripción general

Las variables dinámicas se pueden integrar en varios aspectos de tu agente:

  • Prompts del sistema para personalizar el comportamiento y el contexto
  • Primeros mensajes para personalizar los saludos
  • Parámetros y encabezados de herramientas para pasar datos específicos del usuario

Estos son algunos ejemplos en los que las variables dinámicas resultan útiles:

  • Personalizar saludos con nombres de usuario
  • Incluir datos de la cuenta en las respuestas
  • Pasar datos a llamadas de herramientas
  • Personalizar el comportamiento según los niveles de suscripción
  • Acceder a información del sistema como el ID de la conversación o la duración de la llamada

Las variables dinámicas admiten tres tipos de valores:

Cadena
Valores de texto
Número
Valores numéricos
Booleano
Valores verdadero/falso

Variables dinámicas del sistema

Tu agente tiene acceso a variables integradas system__* en cada conversación sin necesidad de configuración en tiempo de ejecución. Estas variables llevan el prefijo del espacio de nombres reservado system__ y se actualizan automáticamente a medida que avanza la conversación. Las variables dinámicas personalizadas no pueden usar el prefijo system__ ni sobrescribir variables del sistema.

Las variables marcadas con † cambian entre turnos. Incluirlas en el texto del prompt puede impedir la caché de prompts; consulta las Buenas prácticas para ver alternativas.

Identidad del agente y de la conversación

VariableTipoDescripciónEjemplo
system__agent_idstringIdentificador único del agente que inició la conversación. Nunca cambia durante una conversación."agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__current_agent_idstringIdentificador único del agente activo en ese momento. Se actualiza cuando la conversación se transfiere a otro agente."agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__conversation_idstringIdentificador único de conversación de ElevenLabs."conv_1801kp8qtb2begztn7zyf446v4jk"
system__user_idstring | nullID de usuario proporcionado por el cliente para seguimiento y análisis. No debe considerarse fiable para la autenticación."G6yhJW8MktQdhUquvXD1iKpPHql2"
system__initiator_idstring | nullIdentificador correspondiente al método de autenticación utilizado para iniciar la conversación."user_1801kp8qtb2begztn7zyf446v4jk"
system__channelstringCanal a través del cual se inició la conversación."slack_integration"
system__is_text_onlybooleantrue cuando la conversación se ejecuta en modo de solo texto (chat); false para llamadas de voz.true
system__environmentstringEntorno en el que se ejecuta la conversación, utilizado para resolver variables de entorno."production"

Hora y zona horaria

VariableTipoDescripciónEjemplo
system__timezonestring | nullZona horaria configurada (conversation_config.agent.prompt.timezone) o zona horaria IANA proporcionada por quien llama. UTC de forma predeterminada si no se configura."America/New_York"
system__time †stringFecha y hora actuales en la zona horaria configurada (%A, %H:%M %d %B %Y). Se vuelve a evaluar en cada turno (cambia una vez por minuto)."Friday, 12:33 12 December 2025"
system__time_utc †stringMarca de tiempo UTC actual en formato ISO 8601. Se vuelve a evaluar en cada turno."2025-12-12T12:33:45.123456+00:00"
system__time_datestringFecha actual en la zona horaria configurada (o UTC si no hay ninguna configurada) (%A, %d %B %Y). Cambia una vez al día."Friday, 12 December 2025"
system__time_hourintegerHora actual (0–23) en la zona horaria configurada (o UTC si no hay ninguna configurada). Cambia como máximo una vez por hora.12
system__time_minute †integerMinuto actual (0–59) en la zona horaria configurada (o UTC si no hay ninguna configurada). Cambia una vez por minuto.33
system__time_second †integerSegundo actual (0–59) en la zona horaria configurada (o UTC si no hay ninguna configurada). Cambia en cada turno.45

Telefonía y mensajería

Estas variables se rellenan cuando corresponde en los canales de telefonía y mensajería:

VariableTipoDescripciónEjemplo
system__caller_idstring | nullNúmero de teléfono de quien llama (voz/SMS/WhatsApp/Amazon Connect)."+14155552671"
system__called_numberstring | nullNúmero de teléfono de destino llamado."+18005551234"
system__call_sidstring | nullSID de llamada de Twilio (solo llamadas de Twilio)."CA3498076234a8bbf65c8f09fb8ad7ac1b"
system__call_idstring | nullCall-ID SIP (solo llamadas mediante troncal SIP)."757f72cf-e80f-44f7-87d6-a961ffbf5b3d"

Estado de la conversación por turno

VariableTipoDescripciónEjemplo
system__call_duration_secs †integerTiempo transcurrido de la conversación en segundos. Se vuelve a evaluar en cada turno.142
system__agent_turns †integerNúmero total de turnos del agente en la conversación hasta el momento. Aumenta en cada turno.5
system__current_agent_turns †integerNúmero de turnos del agente actual; se restablece a 0 después de una transferencia de agente.3
system__current_subagent_turns †integerNúmero de turnos del agente en el nodo de workflow actual; se restablece a 0 al cambiar de nodo.2
system__conversation_history †stringTranscripción de la conversación serializada en JSON hasta el turno actual ({"entries": [{"role": "user", "message": "..."}]}). Consulta el formato del historial de conversación.'{"entries": [...]}'

Formato del historial de conversación

La variable system__conversation_history contiene un objeto JSON con la siguiente estructura:

{
"x-elevenlabs-history": true,
"entries": [
{ "role": "user", "message": "Hello" },
{ "role": "agent", "message": "Hi, how can I help?" },
{
"role": "agent",
"tool_requests": [{ "tool_name": "lookup_order", "params_as_json": { "order_id": "123" } }]
},
{
"role": "tool",
"tool_results": [{ "tool_name": "lookup_order", "result_value": "{\"status\": \"shipped\"}" }]
}
]
}

Cada entrada incluye un role ("user", "agent" o "tool") y uno de los siguientes elementos:

  • message: El contenido de texto del turno
  • tool_requests: Una matriz de llamadas a herramientas realizadas por el agente, con valores de parámetros resueltos
  • tool_results: Una matriz de respuestas de herramientas

Si el resultado o parámetro de una herramienta contiene un historial de conversación anidado, se oculta con un marcador de posición (como [conversation_history (5 turns)]) para evitar una expansión recursiva ilimitada.

Esta variable es útil para pasar el contexto de la conversación a herramientas (como webhooks o LLM personalizados) o para incluir el historial de conversación en los prompts de subagentes durante las transferencias.

Variables dinámicas secretas

Las variables dinámicas secretas se rellenan de la misma forma que las variables dinámicas normales, pero indican a ElevenAgents que solo deben utilizarse en encabezados de variables dinámicas y que nunca deben enviarse a un proveedor de LLM como parte del prompt del sistema o el primer mensaje de un agente.

Usa variables dinámicas secretas para tokens de autenticación o ID privados que no deban enviarse a un LLM. Para crear una variable dinámica secreta, añade el prefijo secret__ a la variable dinámica.

Los valores secretos se almacenan ocultos, por lo que la API de conversaciones los devuelve como <REDACTED>. Los webhooks de transcripción posterior a la llamada entregan los valores originales, así que asegúrate de que tu ruta de webhook los gestione como secretos. No uses el prefijo secret__ para valores que necesites recuperar desde la API de conversaciones. Pásalos como variables dinámicas normales o pasa un identificador no sensible y busca el valor sensible en tu propio sistema.

Actualizar variables dinámicas desde herramientas

Las llamadas a herramientas pueden crear o actualizar variables dinámicas si devuelven un objeto JSON válido. Para especificar qué se debe extraer, establece las rutas de objeto mediante notación de puntos. Si el campo o la ruta no existen, no se actualiza nada.

Ejemplo de un objeto de respuesta y notación de puntos:

  • El estado corresponde a la ruta: response.status
  • El correo electrónico del primer usuario de la matriz de usuarios corresponde a la ruta: response.users.0.email
JSON
{
"response": {
"status": 200,
"message": "Successfully found 5 users",
"users": [
"user_1": {
"user_name": "test_user_1",
"email": "test_user_1@email.com"
}
]
}
}

Para actualizar una variable dinámica con el correo electrónico del primer usuario, configura la asignación de este modo.

Parámetros de consulta

Las asignaciones se configuran en cada herramienta webhook; consulta las asignaciones de herramientas en la referencia de la API.

Guía

Requisitos previos:

1

Definir variables dinámicas en prompts

Añade variables usando dobles llaves {{variable_name}} en tus:

  • Prompts del sistema
  • Primeros mensajes
  • Parámetros de herramientas

Variables dinámicas en mensajes

Variables dinámicas en mensajes

2

Definir variables dinámicas en herramientas

También puedes definir variables dinámicas en la configuración de herramientas. Para crear una nueva variable dinámica, establece el tipo de valor en Variable dinámica y haz clic en el botón +.

Configurar marcadores de posición

Configurar marcadores de posición

3

Configurar marcadores de posición

Configura valores predeterminados para hacer pruebas sin pasar variables en tiempo de ejecución.

Configura valores predeterminados para cada variable dinámica en el panel del agente.

Configurar marcadores de posición

4

Pasar variables en tiempo de ejecución

Al iniciar una conversación, proporciona las variables dinámicas en tu código:

Asegúrate de tener instalada la versión más reciente del SDK.

import os
import signal
from elevenlabs.client import ElevenLabs
from elevenlabs.conversational_ai.conversation import Conversation, ConversationInitiationData
from elevenlabs.conversational_ai.default_audio_interface import DefaultAudioInterface
agent_id = os.getenv("AGENT_ID")
api_key = os.getenv("ELEVENLABS_API_KEY")
elevenlabs = ElevenLabs(api_key=api_key)
dynamic_vars = {
"user_name": "Angelo",
}
config = ConversationInitiationData(
dynamic_variables=dynamic_vars
)
conversation = Conversation(
elevenlabs,
agent_id,
config=config,
# Assume auth is required when API_KEY is set.
requires_auth=bool(api_key),
# Use the default audio interface.
audio_interface=DefaultAudioInterface(),
# Callbacks that print the conversation to the console.
callback_agent_response=lambda response: print(f"Agent: {response}"),
callback_agent_response_correction=lambda original, corrected: print(f"Agent: {original} -> {corrected}"),
callback_user_transcript=lambda transcript: print(f"User: {transcript}"),
# Uncomment the below if you want to see latency measurements.
# callback_latency_measurement=lambda latency: print(f"Latency: {latency}ms"),
)
conversation.start_session()
signal.signal(signal.SIGINT, lambda sig, frame: conversation.end_session())

Integración de la página pública para hablar con el agente

La página pública para hablar con el agente admite variables dinámicas mediante parámetros de URL, lo que te permite personalizar conversaciones al compartir enlaces de agentes. Resulta especialmente útil para integrar agentes personalizados en sitios web, correos electrónicos o campañas de marketing.

Métodos de parámetros de URL

Hay dos métodos para pasar variables dinámicas a la página pública para hablar con el agente:

Método 1: JSON codificado en Base64

Pasa variables como un objeto JSON codificado en base64 mediante el parámetro vars:

https://elevenlabs.io/app/talk-to?agent_id=agent_7101k5zvyjhmfg983brhmhkd98n6&vars=eyJ1c2VyX25hbWUiOiJKb2huIiwiYWNjb3VudF90eXBlIjoicHJlbWl1bSJ9

El parámetro vars contiene JSON codificado en base64:

{ "user_name": "John", "account_type": "premium" }

Método 2: Parámetros de consulta individuales

Pasa variables mediante parámetros de consulta con el prefijo var_:

https://elevenlabs.io/app/talk-to?agent_id=agent_7101k5zvyjhmfg983brhmhkd98n6&var_user_name=John&var_account_type=premium

Precedencia de parámetros

Cuando se utilizan ambos métodos al mismo tiempo, los parámetros individuales var_ tienen prioridad sobre las variables codificadas en base64 para evitar conflictos:

https://elevenlabs.io/app/talk-to?agent_id=agent_7101k5zvyjhmfg983brhmhkd98n6&vars=eyJ1c2VyX25hbWUiOiJKYW5lIn0=&var_user_name=John

En este ejemplo, user_name será "John" (de var_user_name) en lugar de "Jane" (de vars codificado en base64).

Ejemplos de implementación

// Method 1: Base64-encoded JSON
function generateTalkToURL(agentId, variables) {
const baseURL = 'https://elevenlabs.io/app/talk-to';
const encodedVars = btoa(JSON.stringify(variables));
return `${baseURL}?agent_id=${agentId}&vars=${encodedVars}`;
}
// Method 2: Individual parameters
function generateTalkToURLWithParams(agentId, variables) {
const baseURL = 'https://elevenlabs.io/app/talk-to';
const params = new URLSearchParams({ agent_id: agentId });
Object.entries(variables).forEach(([key, value]) => {
params.append(`var_${key}`, encodeURIComponent(value));
});
return `${baseURL}?${params.toString()}`;
}
// Usage
const variables = {
user_name: "John Doe",
account_type: "premium",
session_id: "sess_123"
};
const urlMethod1 = generateTalkToURL("agent_7101k5zvyjhmfg983brhmhkd98n6", variables);
const urlMethod2 = generateTalkToURLWithParams("agent_7101k5zvyjhmfg983brhmhkd98n6", variables);

Buenas prácticas

Las variables del prompt del sistema, los nodos de workflow y los procedimientos se resuelven en cada turno. Si un valor cambia entre turnos, el prompt no se puede almacenar en caché, lo que aumenta el coste y la latencia. {{system__time_utc}} y {{system__time_second}} cambian en cada turno; {{system__time}} y {{system__time_minute}} cambian cada minuto.

Para proporcionar al agente la fecha y hora actuales, configura una zona horaria con el botón de zona horaria en el editor de prompts del sistema (conversation_config.agent.prompt.timezone) en lugar de incluir {{system__time}} o {{system__time_utc}} en el texto del prompt. Cuando se configura una zona horaria, la plataforma añade la fecha y hora actuales fuera del prefijo de prompt almacenado en caché, de modo que tu prompt del sistema permanece en caché entre turnos. Sin una zona horaria, el agente no recibe la fecha y hora actuales.

Si tu prompt necesita la fecha o la hora en línea, combina {{system__time_date}}, {{system__time_hour}} y {{system__timezone}} (por ejemplo, Today is {{system__time_date}}, hour {{system__time_hour}} ({{system__timezone}})). Estas variables cambian como máximo una vez por hora.

Si una herramienta necesita un valor marcado con †, vincúlalo al parámetro o encabezado de la herramienta en lugar de incluirlo en el prompt. Los parámetros de herramientas se resuelven solo cuando se llama a la herramienta, por lo que no afectan a la caché de prompts. El LLM ya ve la conversación, así que rara vez se necesita {{system__conversation_history}} en los prompts.

Si tu prompt comprueba contadores de turnos como {{system__agent_turns}}, considera estas alternativas. Usa first_message para saludos o avisos iniciales estáticos.

Para el comportamiento de la primera respuesta, puedes formular la instrucción en torno al historial de la conversación (por ejemplo, “En tu primera respuesta, cuando aún no hayas saludado a quien llama…”). Esto depende de que el LLM siga la instrucción, así que pruébalo con tu modelo y mantén el contador de turnos si los resultados son menos fiables.

Si el contador solo decide cuándo ramificar o escalar, una condición de expresión de arista de workflow o una expresión de paso If de procedimiento estructurado (como system__agent_turns >= 5) puede gestionarlo fuera del prompt. Esto no cubre los casos en los que el LLM necesita el propio valor.

Añade el prefijo secret__ a los tokens de autenticación y las claves de API para que solo se puedan vincular a encabezados de herramientas y nunca se envíen al LLM. Como los valores secret__ se ocultan como <REDACTED> en la API de conversaciones (los webhooks de transcripción posterior a la llamada siguen recibiendo los valores originales), pasa como variables dinámicas normales los valores que necesites recuperar desde la API de conversaciones, o pasa un identificador no sensible y busca el valor sensible en tu propio sistema.

system__user_id lo proporciona el cliente para seguimiento y análisis, y ElevenAgents no lo verifica. Verifica la identidad de quien llama mediante un webhook de inicio de conversación, un token firmado en una variable de encabezado secret__ o una llamada a una herramienta de verificación antes de exponer datos de la cuenta.

Configura valores predeterminados en dynamic_variable_placeholders para cada variable personalizada usada en tus prompts, primeros mensajes y herramientas. Las conversaciones de vista previa en el panel y las pruebas de simulación no ejecutan webhooks de inicio de conversación, por lo que las variables sin configurar permanecen como marcadores de posición literales {{variable_name}} durante las pruebas.

Solución de problemas

Comprueba que:

  • Los nombres de las variables coincidan exactamente (distinguen mayúsculas y minúsculas)
  • Las variables usen llaves dobles: {{variable_name}}
  • Las variables estén incluidas en tu objeto dynamic_variables

Asegúrate de que:

  • Los valores de las variables coincidan con el tipo esperado
  • Los valores sean solo cadenas, números o valores booleanos