Przejdź do nawigacji

Zmienne dynamiczne

Przekazuj wartości w czasie działania, aby dopasować zachowanie agenta.

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

Omówienie

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

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

Oto kilka przykładów zastosowania zmiennych dynamicznych:

  • Personalizacja powitań imionami użytkowników
  • Uwzględnianie danych konta w odpowiedziach
  • Przekazywanie danych do wywołań narzędzi
  • Dostosowanie zachowania do poziomu subskrypcji
  • Dostęp do informacji systemowych, takich jak ID rozmowy lub czas jej trwania

Zmienna dynamiczna może zawierać dowolną wartość JSON:

Ciąg znaków
Wartości tekstowe
Liczba
Wartości liczbowe
Wartość logiczna
Wartości prawda/fałsz
Lista
Tablice dowolnych wartości JSON
Obiekt
Zagnieżdżone dane klucz-wartość

Gdy lista lub obiekt zostaną wstawione do promptu, adresu URL lub innego szablonu tekstu, są dodawane jako tekst JSON. Parametr narzędzia powiązany ze zmienną listową otrzymuje samą listę.

Zmienne dynamiczne są zwracane bez zmian w API szczegółów rozmowy oraz w webhookach po rozmowie, w tym zmienne system__ opisane poniżej. Analizuj dynamic_variables jako mapę wartości JSON. Nie odrzucaj nieznanych kluczy ani typów wartości, ponieważ możemy dodać nowe zmienne system__.

Systemowe zmienne dynamiczne

Twój agent ma dostęp do wbudowanych zmiennych system__* w każdej rozmowie bez konfiguracji w czasie działania. Te zmienne mają zastrzeżony prefiks przestrzeni nazw system__ i aktualizują się automatycznie w trakcie rozmowy. Własne zmienne dynamiczne nie mogą używać prefiksu system__ ani nadpisywać zmiennych systemowych.

Zmienne oznaczone † zmieniają się między turami. Umieszczenie ich w tekście promptu może uniemożliwić cachowanie 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 aktualnie aktywnego agenta. Aktualizuje się, gdy rozmowa zostaje 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 analityki. Nie może być zaufanym źródłem uwierzytelniania."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 w przypadku połączeń 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, jeśli nie ustawiono."America/New_York"
system__time †stringBieżąca data i godzina w skonfigurowanej strefie czasowej (%A, %H:%M %d %B %Y). Obliczana ponownie 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. Obliczany ponownie 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 żadna nie jest ustawiona) (%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 żadna nie jest ustawiona). Zmienia się najwyżej raz na godzinę.12
system__time_minute †integerBieżąca minuta (0–59) w skonfigurowanej strefie czasowej (lub UTC, jeśli żadna nie jest ustawiona). Zmienia się raz na minutę.33
system__time_second †integerBieżąca sekunda (0–59) w skonfigurowanej strefie czasowej (lub UTC, jeśli żadna nie jest ustawiona). Zmienia się w każdej turze.45

Telefonia i wiadomości

Te zmienne są uzupeł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 dla każdej tury

ZmiennaTypOpisPrzykład
system__call_duration_secs †integerCzas rozmowy, który upłynął, w sekundach. Obliczany ponownie 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 aktualnego agenta; po przekazaniu do innego agenta jest resetowana do 0.3
system__current_subagent_turns †integerLiczba tur agenta w bieżącym węźle workflow; przy przejściu do innego węzła jest resetowana do 0.2
system__conversation_history †stringTranskrypcja rozmowy zserializowana do JSON do bieżącej tury ({"entries": [{"role": "user", "message": "..."}]}). Zobacz Format historii rozmowy.'{"entries": [...]}'
system__uploaded_file_ids †string[] | nullID każdego pliku dołączonego dotąd przez użytkownika w rozmowie, od najstarszego. null do chwili dołączenia pliku. Zobacz Przesłane pliki.["01a1c47f-1427-71ab-9898-775cce521078"]

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 pól:

  • message: Treść tekstowa tury
  • tool_requests: Tablica wywołań narzędzi wykonanych przez agenta z rozpoznanymi 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, takich jak webhooki lub własne LLM-y, albo do uwzględniania historii rozmowy w promptach podagentów podczas przekazywania rozmowy.

Przesłane pliki

system__uploaded_file_ids zawiera ID plików dołączonych przez użytkownika na czacie, na przykład w widżecie lub WhatsAppie. Aktualizuje się w każdej turze, więc plik dołączony w bieżącej wiadomości jest już na liście, gdy agent wywołuje narzędzie.

Aby przetworzyć załącznik, gdy rozmowa nadal trwa, powiąż listę z parametrem tablicowym narzędzia serwerowego wraz z system__conversation_id. Jeśli agent wywoła narzędzie, zanim użytkownik dołączy plik, parametr otrzyma pustą listę.

"request_body_schema": {
"type": "object",
"required": ["file_ids", "conversation_id"],
"properties": {
"file_ids": {
"type": "array",
"description": "",
"dynamic_variable": "system__uploaded_file_ids",
"items": { "type": "string", "description": "File ID" }
},
"conversation_id": {
"type": "string",
"dynamic_variable": "system__conversation_id"
}
}
}

Twój serwer pobiera następnie każdy plik za pomocą klucza API:

curl https://api.elevenlabs.io/v1/convai/conversations/$CONVERSATION_ID/files/$FILE_ID \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-o attachment

Odpowiedzią jest oryginalny plik z jego Content-Type (na przykład image/jpeg lub application/pdf). ID pliku, który nie należy do rozmowy, zwraca 404. Ostatnie ID na liście oznacza najnowszy przesłany plik.

Tajne zmienne dynamiczne

Tajne zmienne dynamiczne są uzupełniane tak samo jak zwykłe zmienne dynamiczne, ale informują ElevenAgents, że należy ich używać tylko w nagłówkach zmiennych dynamicznych i nigdy nie wysyłać do dostawcy LLM jako części promptu systemowego ani pierwszej wiadomości agenta.

Używaj tajnych zmiennych dynamicznych dla tokenów uwierzytelniania lub prywatnych ID, których nie należy wysyłać do LLM. Aby utworzyć tajną zmienną dynamiczną, dodaj prefiks secret__.

Tajne wartości są przechowywane po redakcji, dlatego API rozmów zwraca je jako <REDACTED>. Webhooki transkrypcji po rozmowie dostarczają oryginalne wartości, więc upewnij się, że Twój endpoint webhooka traktuje je jak sekrety. Nie używaj prefiksu secret__ dla wartości, które musisz odczytać z API rozmów. Przekaż je jako zwykłe zmienne dynamiczne albo przekaż niewrażliwy identyfikator i wyszukaj 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 zwrócą prawidłowy obiekt JSON. Aby określić, co należy wyodrębnić, ustaw ścieżki obiektów w 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ą tak, by zawierała e-mail pierwszego użytkownika, ustaw przypisanie w ten sposób.

Parametry zapytania

Przypisania konfiguruje się dla każdego narzędzia 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 wartości zastępczych

Ustawianie wartości zastępczych

3

Ustaw wartości 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 wartości zastępczych

4

Przekaż zmienne w czasie działania

Przy rozpoczynaniu rozmowy podaj zmienne dynamiczne w kodzie:

Upewnij się, że masz zainstalowaną najnowszą wersję 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 agenta. Jest to szczególnie przydatne przy osadzaniu spersonalizowanych agentów na stronach internetowych, w e-mailach lub kampaniach marketingowych.

Metody parametrów URL

Są dwa sposoby 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: Osobne 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, osobne 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 zostać zapisany w cache, 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 aktualną 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. Gdy ustawisz strefę czasową, platforma dodaje aktualną datę i godzinę poza zapisaną w cache częścią promptu, więc twój prompt systemowy pozostaje w cache między turami. Bez strefy czasowej agent nie otrzymuje aktualnej daty ani godziny.

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

Jeśli narzędzie potrzebuje wartości oznaczonej †, przypisz ją do parametru narzędzia lub nagłówka zamiast umieszczać ją w prompcie. Parametry narzędzia są rozwiązywane tylko przy wywołaniu narzędzia, więc nie wpływają na cache promptu. LLM już widzi rozmowę, więc {{system__conversation_history}} rzadko jest potrzebne w promptach.

Jeśli twój prompt sprawdza liczniki tur, takie jak {{system__agent_turns}}, rozważ te alternatywy. Użyj first_message do statycznych powitań lub informacji na początku rozmowy.

W przypadku zachowania przy pierwszej odpowiedzi możesz sformułować instrukcję wokół historii rozmowy (na przykład “W pierwszej odpowiedzi, gdy nie powitałeś jeszcze rozmówcy…”). Zależy to od tego, czy LLM zastosuje się do instrukcji, więc przetestuj to ze swoim modelem i zachowaj licznik tur, jeśli wyniki są mniej wiarygodne.

Jeśli licznik decyduje tylko o rozgałęzieniu lub eskalacji, warunek wyrażenia krawędzi workflow albo wyrażenie kroku If w procedurze strukturalnej If step expression (takie jak system__agent_turns >= 5) może obsłużyć to poza promptem. Nie obejmuje to przypadków, w których LLM potrzebuje samej wartości.

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

system__user_id jest przekazywane przez klienta do śledzenia i analityki i nie jest weryfikowane przez ElevenAgents. Zweryfikuj tożsamość rozmówcy przez webhook inicjowania rozmowy, podpisany token w zmiennej nagłówka secret__ lub wywołanie narzędzia weryfikacyjnego przed udostępnieniem danych konta.

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

Rozwiązywanie problemów

Sprawdź, czy:

  • Nazwy zmiennych są identyczne (z uwzględnieniem wielkości liter)
  • Zmienne używają podwójnych nawiasów klamrowych: {{variable_name}}
  • Zmienne są zawarte w obiekcie dynamic_variables

Upewnij się, że:

  • Wartości zmiennych mają oczekiwany typ
  • Wartości są wyłącznie ciągami znaków, liczbami lub wartościami logicznymi