Skip to navigation

Dynamische variabelen

Geef runtimewaarden door om het gedrag van je agent te personaliseren.

Dynamische variabelen laten je runtimewaarden invoegen in de berichten, system prompts en tools van je agent. Zo kun je elk gesprek personaliseren met gebruikersspecifieke gegevens zonder meerdere agents te maken.

Overzicht

Dynamische variabelen kunnen worden geïntegreerd in meerdere onderdelen van je agent:

  • System prompts om gedrag en context aan te passen
  • Eerste berichten om begroetingen te personaliseren
  • Toolparameters en headers om gebruikersspecifieke gegevens door te geven

Hier zijn enkele voorbeelden waarin dynamische variabelen nuttig zijn:

  • Begroetingen personaliseren met gebruikersnamen
  • Accountgegevens opnemen in antwoorden
  • Gegevens doorgeven aan tool calls
  • Gedrag aanpassen op basis van abonnementsniveaus
  • Systeemgegevens openen zoals de gespreks-ID of gespreksduur

Dynamische variabelen ondersteunen drie waardetypen:

String
Tekstwaarden
Number
Numerieke waarden
Boolean
Waar/onwaar-waarden

Systeemvariabelen

Je agent heeft in elk gesprek zonder runtimeconfiguratie toegang tot ingebouwde system__*-variabelen. Deze variabelen hebben de gereserveerde naamruimte system__ als prefix en worden automatisch bijgewerkt naarmate het gesprek vordert. Aangepaste dynamische variabelen mogen de prefix system__ niet gebruiken of systeemvariabelen overschrijven.

Variabelen met † veranderen tussen beurten. Als je ze in prompttekst plaatst, kan dat promptcaching verhinderen. Zie Best practices voor alternatieven.

Identiteit van agent en gesprek

VariabeleTypeBeschrijvingVoorbeeld
system__agent_idstringUnieke identifier van de agent die het gesprek heeft gestart. Verandert nooit tijdens een gesprek."agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__current_agent_idstringUnieke identifier van de momenteel actieve agent. Wordt bijgewerkt wanneer het gesprek naar een andere agent wordt overgedragen."agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__conversation_idstringUnieke gespreksidentifier van ElevenLabs."conv_1801kp8qtb2begztn7zyf446v4jk"
system__user_idstring | nullDoor de client opgegeven gebruikers-ID voor tracking en analyses. Mag niet worden vertrouwd voor authenticatie."G6yhJW8MktQdhUquvXD1iKpPHql2"
system__initiator_idstring | nullIdentifier die overeenkomt met de authenticatiemethode waarmee het gesprek is gestart."user_1801kp8qtb2begztn7zyf446v4jk"
system__channelstringKanaalbron waarmee het gesprek is gestart."slack_integration"
system__is_text_onlybooleantrue wanneer het gesprek in alleen-tekstmodus (chat) wordt uitgevoerd; false voor spraakoproepen.true
system__environmentstringOmgeving waarin het gesprek wordt uitgevoerd, gebruikt om omgevingsvariabelen op te lossen."production"

Tijd en tijdzone

VariabeleTypeBeschrijvingVoorbeeld
system__timezonestring | nullGeconfigureerde tijdzone (conversation_config.agent.prompt.timezone) of door de beller opgegeven IANA-tijdzone. Standaard UTC als deze niet is ingesteld."America/New_York"
system__time †stringHuidige datum en tijd in de geconfigureerde tijdzone (%A, %H:%M %d %B %Y). Wordt elke beurt opnieuw geëvalueerd (verandert eenmaal per minuut)."Friday, 12:33 12 December 2025"
system__time_utc †stringHuidige UTC-tijdstempel in ISO 8601-indeling. Wordt elke beurt opnieuw geëvalueerd."2025-12-12T12:33:45.123456+00:00"
system__time_datestringHuidige datum in de geconfigureerde tijdzone (of UTC als er geen is ingesteld) (%A, %d %B %Y). Verandert eenmaal per dag."Friday, 12 December 2025"
system__time_hourintegerHuidig uur (0–23) in de geconfigureerde tijdzone (of UTC als er geen is ingesteld). Verandert maximaal eenmaal per uur.12
system__time_minute †integerHuidige minuut (0–59) in de geconfigureerde tijdzone (of UTC als er geen is ingesteld). Verandert eenmaal per minuut.33
system__time_second †integerHuidige seconde (0–59) in de geconfigureerde tijdzone (of UTC als er geen is ingesteld). Verandert elke beurt.45

Telefonie en berichten

Deze variabelen worden ingevuld wanneer dat van toepassing is voor telefonie- en berichtenkanalen:

VariabeleTypeBeschrijvingVoorbeeld
system__caller_idstring | nullTelefoonnummer van de beller (spraak/SMS/WhatsApp/Amazon Connect)."+14155552671"
system__called_numberstring | nullGebeld telefoonnummer van bestemming."+18005551234"
system__call_sidstring | nullTwilio Call SID (alleen Twilio-oproepen)."CA3498076234a8bbf65c8f09fb8ad7ac1b"
system__call_idstring | nullSIP Call-ID (alleen SIP-trunkoproepen)."757f72cf-e80f-44f7-87d6-a961ffbf5b3d"

Gespreksstatus per beurt

VariabeleTypeBeschrijvingVoorbeeld
system__call_duration_secs †integerVerstreken gesprekstijd in seconden. Wordt elke beurt opnieuw geëvalueerd.142
system__agent_turns †integerTotaal aantal agentbeurten in het gesprek tot nu toe. Wordt bij elke beurt verhoogd.5
system__current_agent_turns †integerAantal agentbeurten voor de huidige agent; wordt na een agentoverdracht teruggezet op 0.3
system__current_subagent_turns †integerAantal agentbeurten in het huidige workflownode; wordt bij een nodeovergang teruggezet op 0.2
system__conversation_history †stringNaar JSON geserialiseerd gesprekstranscript tot en met de huidige beurt ({"entries": [{"role": "user", "message": "..."}]}). Zie Indeling van gesprekshistorie.'{"entries": [...]}'

Indeling van gesprekshistorie

De variabele system__conversation_history bevat een JSON-object met de volgende structuur:

{
"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\"}" }]
}
]
}

Elke invoer bevat een role ("user", "agent" of "tool") en een van de volgende:

  • message: De tekstinhoud van de beurt
  • tool_requests: Een array met tool calls van de agent, met opgeloste parameterwaarden
  • tool_results: Een array met toolantwoorden

Als een toolresultaat of parameter een geneste gesprekshistorie bevat, wordt deze geredigeerd tot een placeholder (zoals [conversation_history (5 turns)]) om onbeperkte recursieve uitbreiding te voorkomen.

Deze variabele is nuttig om gesprekscontext door te geven aan tools (zoals webhooks of aangepaste LLM’s) of om gesprekshistorie op te nemen in subagent-prompts tijdens overdrachten.

Geheime dynamische variabelen

Geheime dynamische variabelen worden op dezelfde manier ingevuld als gewone dynamische variabelen, maar geven aan ElevenAgents aan dat ze alleen in headers voor dynamische variabelen mogen worden gebruikt en nooit als onderdeel van de system prompt of het eerste bericht van een agent naar een LLM-provider mogen worden gestuurd.

Gebruik geheime dynamische variabelen voor authenticatietokens of privé-ID’s die niet naar een LLM mogen worden gestuurd. Voeg de prefix secret__ toe aan de dynamische variabele om een geheime dynamische variabele te maken.

Geheime waarden worden geredigeerd opgeslagen, dus de conversations API retourneert ze als <REDACTED>. Webhooks voor transcriptie na een oproep leveren de oorspronkelijke waarden, dus zorg dat je webhookendpoint deze als geheimen verwerkt. Gebruik de prefix secret__ niet voor waarden die je wilt teruglezen uit de conversations API. Geef deze door als gewone dynamische variabelen, of geef een niet-gevoelige identifier door en zoek de gevoelige waarde op in je eigen systeem.

Dynamische variabelen bijwerken vanuit tools

Tool calls kunnen dynamische variabelen maken of bijwerken als ze een geldig JSON-object retourneren. Stel de objectpaden in met puntnotatie om aan te geven wat moet worden geëxtraheerd. Als het veld of pad niet bestaat, wordt niets bijgewerkt.

Voorbeeld van een responsobject en puntnotatie:

  • Status komt overeen met het pad: response.status
  • Het e-mailadres van de eerste gebruiker in de gebruikersarray komt overeen met het pad: 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"
}
]
}
}

Stel de toewijzing als volgt in om een dynamische variabele bij te werken naar het e-mailadres van de eerste gebruiker.

Queryparameters

Toewijzingen worden geconfigureerd voor elke webhooktool; zie tooltoewijzingen in de API-referentie.

Handleiding

Vereisten:

1

Dynamische variabelen in prompts definiëren

Voeg variabelen met dubbele accolades {{variable_name}} toe aan je:

  • System prompts
  • Eerste berichten
  • Toolparameters

Dynamische variabelen in berichten

Dynamische variabelen in berichten

2

Dynamische variabelen in tools definiëren

Je kunt dynamische variabelen ook in de toolconfiguratie definiëren. Stel het waardetype in op Dynamic variable en klik op de knop + om een nieuwe dynamische variabele te maken.

Placeholders instellen

Placeholders instellen

3

Placeholders instellen

Configureer standaardwaarden om te testen zonder tijdens runtime variabelen door te geven.

Stel in het dashboard van de agent standaardwaarden in voor elke dynamische variabele.

Placeholders instellen

4

Variabelen doorgeven tijdens runtime

Geef de dynamische variabelen in je code op wanneer je een gesprek start:

Zorg dat je de nieuwste SDK hebt geïnstalleerd.

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())

Integratie met openbare praatpagina

De openbare praatpagina ondersteunt dynamische variabelen via URL-parameters, zodat je gesprekken kunt personaliseren wanneer je agentlinks deelt. Dit is vooral nuttig voor het insluiten van gepersonaliseerde agents in websites, e-mails of marketingcampagnes.

Methoden voor URL-parameters

Er zijn twee methoden om dynamische variabelen door te geven aan de openbare praatpagina:

Methode 1: Base64-gecodeerde JSON

Geef variabelen door als een base64-gecodeerd JSON-object met de parameter vars:

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

De parameter vars bevat base64-gecodeerde JSON:

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

Methode 2: Afzonderlijke queryparameters

Geef variabelen door met queryparameters met de prefix var_:

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

Parameterprioriteit

Wanneer beide methoden tegelijk worden gebruikt, hebben afzonderlijke var_-parameters voorrang op de base64-gecodeerde variabelen om conflicten te voorkomen:

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

In dit voorbeeld is user_name "John" (uit var_user_name) in plaats van "Jane" (uit de base64-gecodeerde vars).

Implementatievoorbeelden

// 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);

Best practices

Variabelen in de system prompt, workflow-nodes en procedures worden elke beurt opgelost. Als een waarde tussen beurten verandert, kan de prompt niet worden gecachet, wat de kosten en latentie verhoogt. {{system__time_utc}} en {{system__time_second}} veranderen elke beurt; {{system__time}} en {{system__time_minute}} veranderen elke minuut.

Stel een tijdzone in met de tijdzoneknop in de System Prompt-editor (conversation_config.agent.prompt.timezone) in plaats van {{system__time}} of {{system__time_utc}} in prompttekst te plaatsen, zodat de agent de huidige datum en tijd krijgt. Wanneer een tijdzone is ingesteld, voegt het platform de huidige datum en tijd buiten de gecachete promptprefix toe, zodat je system prompt tussen beurten gecachet blijft. Zonder tijdzone ontvangt de agent de huidige datum en tijd niet.

Als je prompt de datum of het uur inline nodig heeft, combineer je {{system__time_date}}, {{system__time_hour}} en {{system__timezone}} (bijvoorbeeld Today is {{system__time_date}}, hour {{system__time_hour}} ({{system__timezone}})). Deze veranderen maximaal eenmaal per uur.

Als een tool een waarde met † nodig heeft, koppel je deze aan de toolparameter of header in plaats van deze in de prompt te plaatsen. Toolparameters worden alleen opgelost wanneer de tool wordt aangeroepen, dus ze hebben geen invloed op promptcaching. De LLM ziet het gesprek al, dus {{system__conversation_history}} is zelden nodig in prompts.

Als je prompt beurtentellers zoals {{system__agent_turns}} controleert, overweeg dan deze alternatieven. Gebruik first_message voor statische openingsbegroetingen of mededelingen.

Voor gedrag bij het eerste antwoord kun je de instructie formuleren rond de gesprekshistorie (bijvoorbeeld “On your first reply, when you have not yet greeted the caller…”). Dit is afhankelijk van het opvolgen van de instructie door de LLM, dus test dit met je model en behoud de beurtenteller als de resultaten minder betrouwbaar zijn.

Als de teller alleen bepaalt wanneer je moet vertakken of escaleren, kan een expressievoorwaarde voor een workflowedge of een If-stapexpressie in een gestructureerde procedure (zoals system__agent_turns >= 5) dit buiten de prompt afhandelen. Dit geldt niet voor gevallen waarin de LLM de waarde zelf nodig heeft.

Voeg de prefix secret__ toe aan authenticatietokens en API-sleutels, zodat ze alleen aan toolheaders kunnen worden gekoppeld en nooit naar de LLM worden gestuurd. Omdat secret__-waarden als <REDACTED> worden geredigeerd in de conversations API (webhooks voor transcriptie na een oproep ontvangen nog steeds de oorspronkelijke waarden), geef je waarden die je wilt teruglezen uit de conversations API door als gewone dynamische variabelen, of geef je een niet-gevoelige identifier door en zoek je de gevoelige waarde op in je eigen systeem.

system__user_id wordt door de client geleverd voor tracking en analyses en wordt niet geverifieerd door ElevenAgents. Verifieer de identiteit van de beller via een webhook voor het starten van een gesprek, een ondertekend token in een secret__-headervariabele of een verificatie-tool call voordat je accountgegevens toont.

Stel voor elke aangepaste variabele die je in je prompts, eerste berichten en tools gebruikt standaardwaarden in bij dynamic_variable_placeholders. Previewgesprekken in het dashboard en simulatietests voeren geen webhooks voor het starten van een gesprek uit, dus niet-ingestelde variabelen blijven tijdens het testen als letterlijke placeholders {{variable_name}} staan.

Problemen oplossen

Controleer het volgende:

  • Variabelenamen komen exact overeen (hoofdlettergevoelig)
  • Variabelen gebruiken dubbele accolades: {{variable_name}}
  • Variabelen zijn opgenomen in je object dynamic_variables

Controleer het volgende:

  • Variabelewaarden komen overeen met het verwachte type
  • Waarden zijn alleen strings, getallen of booleans