Przejdź do nawigacji

Zmienne dynamiczne

Przekazuj wartości w czasie działania, by spersonalizować zachowanie agenta.

Zmienne dynamiczne pozwalają wstawiać wartości z czasu działania do wiadomości, promptów systemowych i narzędzi agenta. Dzięki temu możesz personalizować każdą rozmowę danymi użytkownika bez tworzenia wielu agentów.

Omówienie

Zmienne dynamiczne można wykorzystać w wielu elementach agenta:

  • Promptach systemowych, by dostosować zachowanie i kontekst
  • Pierwszych wiadomościach, by personalizować powitania
  • Parametrach i nagłówkach narzędzi, by przekazywać dane użytkownika

Oto kilka przykładów, gdy zmienne dynamiczne są przydatne:

  • Personalizowanie powitań imionami użytkowników
  • Uwzględnianie danych konta w odpowiedziach
  • Przekazywanie danych do wywołań narzędzi
  • Dostosowywanie zachowania zależnie od pakietu subskrypcji
  • Dostęp do informacji systemowych, takich jak ID rozmowy czy czas trwania połączenia

Zmienne dynamiczne obsługują trzy typy wartości:

String
Wartości tekstowe
Number
Wartości liczbowe
Boolean
Wartości prawda/fałsz

Systemowe zmienne dynamiczne

Twój agent ma dostęp do wbudowanych zmiennych system__* w każdej rozmowie bez konfiguracji w czasie działania. Zmienne te mają zarezerwowany prefiks przestrzeni nazw system__ i aktualizują się automatycznie w trakcie rozmowy. Niestandardowe zmienne dynamiczne nie mogą używać prefiksu system__ ani zastępować zmiennych systemowych.

Zmienne oznaczone † zmieniają się między turami. Umieszczenie ich w tekście promptu może uniemożliwić cache’owanie promptu; alternatywy znajdziesz w sekcji Dobre praktyki.

Tożsamość agenta i rozmowy

ZmiennaTypOpisPrzykład
system__agent_idstringUnikalny identyfikator agenta, który rozpoczął rozmowę. Nigdy nie zmienia się w trakcie rozmowy."agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__current_agent_idstringUnikalny identyfikator obecnie aktywnego agenta. Aktualizuje się, gdy rozmowa zostanie przekazana innemu agentowi."agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__conversation_idstringUnikalny identyfikator rozmowy ElevenLabs."conv_1801kp8qtb2begztn7zyf446v4jk"
system__user_idstring | nullID użytkownika podane przez klienta do śledzenia i analiz. Nie należy go uznawać za wiarygodne przy uwierzytelnianiu."G6yhJW8MktQdhUquvXD1iKpPHql2"
system__initiator_idstring | nullIdentyfikator odpowiadający metodzie uwierzytelniania użytej do rozpoczęcia rozmowy."user_1801kp8qtb2begztn7zyf446v4jk"
system__channelstringKanał, przez który rozpoczęto rozmowę."slack_integration"
system__is_text_onlybooleantrue, gdy rozmowa działa w trybie tylko tekstowym (czat); false dla rozmów głosowych.true
system__environmentstringŚrodowisko, w którym działa rozmowa, używane do rozwiązywania zmiennych środowiskowych."production"

Czas i strefa czasowa

ZmiennaTypOpisPrzykład
system__timezonestring | nullSkonfigurowana strefa czasowa (conversation_config.agent.prompt.timezone) lub strefa IANA podana przez rozmówcę. Domyślnie UTC, gdy nie ustawiono."America/New_York"
system__time †stringBieżąca data i godzina w skonfigurowanej strefie czasowej (%A, %H:%M %d %B %Y). Ponownie wyliczana w każdej turze (zmienia się raz na minutę)."Friday, 12:33 12 December 2025"
system__time_utc †stringBieżący znacznik czasu UTC w formacie ISO 8601. Ponownie wyliczany w każdej turze."2025-12-12T12:33:45.123456+00:00"
system__time_datestringBieżąca data w skonfigurowanej strefie czasowej (lub UTC, jeśli nie ustawiono) (%A, %d %B %Y). Zmienia się raz dziennie."Friday, 12 December 2025"
system__time_hourintegerBieżąca godzina (0–23) w skonfigurowanej strefie czasowej (lub UTC, jeśli nie ustawiono). Zmienia się najwyżej raz na godzinę.12
system__time_minute †integerBieżąca minuta (0–59) w skonfigurowanej strefie czasowej (lub UTC, jeśli nie ustawiono). Zmienia się raz na minutę.33
system__time_second †integerBieżąca sekunda (0–59) w skonfigurowanej strefie czasowej (lub UTC, jeśli nie ustawiono). Zmienia się w każdej turze.45

Telefonia i wiadomości

Te zmienne są wypełniane, gdy mają zastosowanie w kanałach telefonicznych i wiadomości:

ZmiennaTypOpisPrzykład
system__caller_idstring | nullNumer telefonu dzwoniącego (głos/SMS/WhatsApp/Amazon Connect)."+14155552671"
system__called_numberstring | nullNumer telefonu, na który wykonano połączenie."+18005551234"
system__call_sidstring | nullSID połączenia Twilio (tylko połączenia Twilio)."CA3498076234a8bbf65c8f09fb8ad7ac1b"
system__call_idstring | nullCall-ID SIP (tylko połączenia przez trunk SIP)."757f72cf-e80f-44f7-87d6-a961ffbf5b3d"

Stan rozmowy na turę

ZmiennaTypOpisPrzykład
system__call_duration_secs †integerCzas rozmowy, który upłynął, w sekundach. Ponownie wyliczany w każdej turze.142
system__agent_turns †integerŁączna liczba tur agenta w rozmowie do tej pory. Zwiększa się w każdej turze.5
system__current_agent_turns †integerLiczba tur bieżącego agenta; resetuje się do 0 po przekazaniu agenta.3
system__current_subagent_turns †integerLiczba tur agenta w bieżącym węźle workflow; resetuje się do 0 przy przejściu do innego węzła.2
system__conversation_history †stringTranskrypcja rozmowy zserializowana w JSON do bieżącej tury ({"entries": [{"role": "user", "message": "..."}]}). Zobacz Format historii rozmowy.'{"entries": [...]}'

Format historii rozmowy

Zmienna system__conversation_history zawiera obiekt JSON o następującej strukturze:

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

Każdy wpis zawiera role ("user", "agent" lub "tool") oraz jedno z poniższych:

  • message: Treść tekstowa tury
  • tool_requests: Tablica wywołań narzędzi wykonanych przez agenta wraz z rozstrzygniętymi wartościami parametrów
  • tool_results: Tablica odpowiedzi narzędzi

Jeśli wynik narzędzia lub parametr zawiera zagnieżdżoną historię rozmowy, zostaje zastąpiony symbolem zastępczym (np. [conversation_history (5 turns)]), aby uniknąć nieograniczonego rekurencyjnego rozwijania.

Ta zmienna przydaje się do przekazywania kontekstu rozmowy do narzędzi (np. webhooków lub niestandardowych LLM-ów) albo do uwzględniania historii rozmowy w promptach podagentów podczas przekazywania rozmowy.

Sekretne zmienne dynamiczne

Sekretne zmienne dynamiczne są wypełniane tak samo jak zwykłe zmienne dynamiczne, ale wskazują ElevenAgents, że powinny być używane wyłącznie w nagłówkach zmiennych dynamicznych i nigdy nie mogą być wysyłane do dostawcy LLM jako część promptu systemowego lub pierwszej wiadomości agenta.

Używaj sekretnych zmiennych dynamicznych do tokenów autoryzacji lub prywatnych ID, których nie należy wysyłać do LLM. Aby utworzyć sekretną zmienną dynamiczną, dodaj przed nią prefiks secret__.

Sekretne wartości są przechowywane po redakcji, więc API rozmów zwraca je jako <REDACTED>. Webhooki transkrypcji po połączeniu dostarczają oryginalne wartości, więc upewnij się, że endpoint webhooka obsługuje je jako sekrety. Nie używaj prefiksu secret__ dla wartości, które musisz odczytać z powrotem z API rozmów. Przekaż je jako zwykłe zmienne dynamiczne albo przekaż niewrażliwy identyfikator i odszukaj wrażliwą wartość we własnym systemie.

Aktualizowanie zmiennych dynamicznych z narzędzi

Wywołania narzędzi mogą tworzyć lub aktualizować zmienne dynamiczne, jeśli zwracają prawidłowy obiekt JSON. Aby określić, co należy wyodrębnić, ustaw ścieżki obiektów za pomocą notacji kropkowej. Jeśli pole lub ścieżka nie istnieje, nic nie zostanie zaktualizowane.

Przykład obiektu odpowiedzi i notacji kropkowej:

  • Status odpowiada ścieżce: response.status
  • E-mail pierwszego użytkownika w tablicy users odpowiada ścieżce: 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"
}
]
}
}

Aby zaktualizować zmienną dynamiczną na e-mail pierwszego użytkownika, ustaw przypisanie w ten sposób.

Parametry zapytania

Przypisania konfigurujesz w każdym narzędziu webhooka; zobacz przypisania narzędzi w dokumentacji API.

Przewodnik

Wymagania wstępne:

1

Zdefiniuj zmienne dynamiczne w promptach

Dodaj zmienne, używając podwójnych nawiasów klamrowych {{variable_name}} w:

  • Promptach systemowych
  • Pierwszych wiadomościach
  • Parametrach narzędzi

Zmienne dynamiczne w wiadomościach

Zmienne dynamiczne w wiadomościach

2

Zdefiniuj zmienne dynamiczne w narzędziach

Możesz też zdefiniować zmienne dynamiczne w konfiguracji narzędzia. Aby utworzyć nową zmienną dynamiczną, ustaw typ wartości na Dynamic variable i kliknij przycisk +.

Ustawianie symboli zastępczych

Ustawianie symboli zastępczych

3

Ustaw symbole zastępcze

Skonfiguruj wartości domyślne do testowania bez przekazywania zmiennych w czasie działania.

Ustaw wartości domyślne dla każdej zmiennej dynamicznej w panelu agenta.

Ustawianie symboli zastępczych

4

Przekaż zmienne w czasie działania

Podczas rozpoczynania rozmowy podaj zmienne dynamiczne w swoim kodzie:

Upewnij się, że masz zainstalowane najnowsze 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())

Integracja z publiczną stroną rozmowy

Publiczna strona rozmowy obsługuje zmienne dynamiczne przez parametry URL, dzięki czemu możesz personalizować rozmowy podczas udostępniania linków do agentów. Jest to szczególnie przydatne przy osadzaniu spersonalizowanych agentów na stronach, w e-mailach lub kampaniach marketingowych.

Metody parametrów URL

Istnieją dwie metody przekazywania zmiennych dynamicznych do publicznej strony rozmowy:

Metoda 1: JSON zakodowany w Base64

Przekaż zmienne jako obiekt JSON zakodowany w Base64 za pomocą parametru vars:

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

Parametr vars zawiera JSON zakodowany w Base64:

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

Metoda 2: Pojedyncze parametry zapytania

Przekaż zmienne za pomocą parametrów zapytania z prefiksem var_:

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

Priorytet parametrów

Gdy obie metody są używane jednocześnie, pojedyncze parametry var_ mają pierwszeństwo przed zmiennymi zakodowanymi w Base64, aby uniknąć konfliktów:

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

W tym przykładzie user_name będzie mieć wartość "John" (z var_user_name) zamiast "Jane" (z vars zakodowanego w Base64).

Przykłady implementacji

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

Dobre praktyki

Zmienne w prompcie systemowym, węzłach workflow i procedurach są rozwiązywane w każdej turze. Jeśli wartość zmienia się między turami, prompt nie może być cache’owany, co zwiększa koszt i opóźnienie. {{system__time_utc}} i {{system__time_second}} zmieniają się w każdej turze; {{system__time}} i {{system__time_minute}} zmieniają się co minutę.

Aby podać agentowi bieżącą datę i godzinę, ustaw strefę czasową przyciskiem strefy czasowej w edytorze System Prompt (conversation_config.agent.prompt.timezone) zamiast umieszczać {{system__time}} lub {{system__time_utc}} w tekście promptu. Po ustawieniu strefy czasowej platforma dodaje bieżącą datę i godzinę poza cache’owanym prefiksem promptu, więc prompt systemowy pozostaje cache’owany między turami. Bez strefy czasowej agent nie otrzyma bieżącej daty i godziny.

Jeśli prompt wymaga daty lub godziny w tekście, połącz {{system__time_date}}, {{system__time_hour}} i {{system__timezone}} (na przykład Today is {{system__time_date}}, hour {{system__time_hour}} ({{system__timezone}})). Zmieniają się one najwyżej raz na godzinę.

Jeśli narzędzie potrzebuje wartości oznaczonej †, powiąż ją z parametrem lub nagłówkiem narzędzia zamiast umieszczać ją w prompcie. Parametry narzędzia są rozwiązywane tylko podczas wywołania narzędzia, więc nie wpływają na cache’owanie promptu. LLM widzi już rozmowę, dlatego {{system__conversation_history}} rzadko jest potrzebne w promptach.

Jeśli prompt sprawdza liczniki tur, takie jak {{system__agent_turns}}, rozważ poniższe alternatywy. Używaj first_message do statycznych powitań lub informacji na początku.

W przypadku zachowania przy pierwszej odpowiedzi możesz sformułować instrukcję wokół historii rozmowy (na przykład “On your first reply, when you have not yet greeted the caller…”). Polega to na tym, że LLM wykona instrukcję, więc przetestuj to z wybranym modelem i zachowaj licznik tur, jeśli wyniki są mniej niezawodne.

Jeśli licznik decyduje tylko o tym, kiedy rozgałęzić lub eskalować, warunek wyrażenia krawędzi workflow albo krok wyrażenia If w procedurze strukturalnej (np. system__agent_turns >= 5) może obsłużyć to poza promptem. Nie dotyczy to przypadków, w których LLM potrzebuje samej wartości.

Dodaj prefiks secret__ do tokenów autoryzacji i kluczy API, aby można było powiązać je tylko z nagłówkami narzędzi i nigdy nie były wysyłane do LLM. Ponieważ wartości secret__ są redagowane jako <REDACTED> w API rozmów (webhooki transkrypcji po połączeniu nadal otrzymują oryginalne wartości), przekazuj wartości, które musisz odczytać z API rozmów, jako zwykłe zmienne dynamiczne albo przekaż niewrażliwy identyfikator i odszukaj wrażliwą wartość we własnym systemie.

system__user_id jest przekazywane przez klienta do śledzenia i analiz oraz nie jest weryfikowane przez ElevenAgents. Zweryfikuj tożsamość rozmówcy przez webhook rozpoczęcia rozmowy, podpisany token w zmiennej nagłówka secret__ albo wywołanie narzędzia weryfikacyjnego, zanim ujawnisz dane konta.

Ustaw wartości domyślne w dynamic_variable_placeholders dla każdej niestandardowej zmiennej użytej w promptach, pierwszych wiadomościach i narzędziach. Podglądy rozmów w panelu i testy symulacyjne nie uruchamiają webhooków rozpoczęcia rozmowy, więc nieustawione zmienne podczas testów pozostają dosłownymi symbolami zastępczymi {{variable_name}}.

Rozwiązywanie problemów

Sprawdź, czy:

  • Nazwy zmiennych są identyczne (wielkość liter ma znaczenie)
  • Zmienne używają podwójnych nawiasów klamrowych: {{variable_name}}
  • Zmienne są uwzględnione w obiekcie dynamic_variables

Upewnij się, że:

  • Wartości zmiennych mają oczekiwany typ
  • Wartości to wyłącznie ciągi znaków, liczby lub wartości logiczne