ナビゲーションにスキップ

動的変数

実行時の値を渡して、エージェントの動作をパーソナライズします。

動的変数 を使用すると、実行時の値をエージェントのメッセージ、システムプロンプト、ツールに挿入できます。複数のエージェントを作成しなくても、ユーザー固有のデータで各会話をパーソナライズできます。

概要

動的変数は、エージェントのさまざまな要素に組み込めます。

  • 動作やコンテキストをカスタマイズする システムプロンプト
  • 挨拶をパーソナライズする 最初のメッセージ
  • ユーザー固有のデータを渡す ツールパラメータとヘッダー

動的変数が役立つ例をいくつか紹介します。

  • ユーザー名を使った 挨拶のパーソナライズ
  • 応答への アカウント詳細の追加
  • ツール呼び出しへの データの受け渡し
  • サブスクリプションプランに応じた 動作のカスタマイズ
  • 会話IDや通話時間などの システム情報へのアクセス

動的変数では、3種類の値をサポートしています。

文字列
テキスト値
数値
数値
ブール値
真偽値

システム動的変数

エージェントは、実行時の設定なしで、すべての会話で組み込みの system__* 変数にアクセスできます。これらの変数には予約済みの system__ 名前空間が付いており、会話の進行に合わせて自動的に更新されます。カスタム動的変数で system__ プレフィックスを使用したり、システム変数を上書きしたりすることはできません。

†が付いた変数はターン間で変化します。プロンプトテキストに配置すると、プロンプトキャッシュが妨げられる場合があります。代替手段については、ベストプラクティスを参照してください。

エージェントと会話の識別情報

変数型説明例
system__agent_idstring会話を開始したエージェントの一意の識別子です。会話中に変わることはありません。"agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__current_agent_idstring現在アクティブなエージェントの一意の識別子です。会話が別のエージェントに転送されると更新されます。"agent_8401kp8bt0jdf14rzzcv5veq94yg"
system__conversation_idstringElevenLabsの一意の会話識別子です。"conv_1801kp8qtb2begztn7zyf446v4jk"
system__user_idstring | nullトラッキングと分析用にクライアントから提供されるユーザーIDです。認証には使用しないでください。"G6yhJW8MktQdhUquvXD1iKpPHql2"
system__initiator_idstring | null会話の開始時に使用した認証方法に対応する識別子です。"user_1801kp8qtb2begztn7zyf446v4jk"
system__channelstring会話を開始したチャネルのソースです。"slack_integration"
system__is_text_onlyboolean会話がテキストのみ(チャット)モードで実行されている場合は true、音声通話の場合は false です。true
system__environmentstring会話が実行されている環境です。環境変数の解決に使用されます。"production"

時刻とタイムゾーン

変数型説明例
system__timezonestring | null設定済みのタイムゾーン(conversation_config.agent.prompt.timezone)または発信者から提供されたIANAタイムゾーンです。未設定の場合はUTCになります。"America/New_York"
system__time †string設定済みタイムゾーンの現在日時(%A, %H:%M %d %B %Y)です。ターンごとに再評価されます(1分ごとに変化)。"Friday, 12:33 12 December 2025"
system__time_utc †stringISO 8601形式の現在のUTCタイムスタンプです。ターンごとに再評価されます。"2025-12-12T12:33:45.123456+00:00"
system__time_datestring設定済みタイムゾーンの現在の日付です(未設定の場合はUTC)(%A, %d %B %Y)。1日に1回変化します。"Friday, 12 December 2025"
system__time_hourinteger設定済みタイムゾーンの現在の時(0~23)です(未設定の場合はUTC)。最大で1時間に1回変化します。12
system__time_minute †integer設定済みタイムゾーンの現在の分(0~59)です(未設定の場合はUTC)。1分ごとに変化します。33
system__time_second †integer設定済みタイムゾーンの現在の秒(0~59)です(未設定の場合はUTC)。ターンごとに変化します。45

テレフォニーとメッセージング

以下の変数は、テレフォニーおよびメッセージングチャネルで該当する場合に設定されます。

変数型説明例
system__caller_idstring | null発信者の電話番号(音声/SMS/WhatsApp/Amazon Connect)。"+14155552671"
system__called_numberstring | null着信先の電話番号です。"+18005551234"
system__call_sidstring | nullTwilio Call SID(Twilio通話のみ)。"CA3498076234a8bbf65c8f09fb8ad7ac1b"
system__call_idstring | nullSIP Call-ID(SIPトランク通話のみ)。"757f72cf-e80f-44f7-87d6-a961ffbf5b3d"

ターンごとの会話状態

変数型説明例
system__call_duration_secs †integer経過した会話時間(秒)です。ターンごとに再評価されます。142
system__agent_turns †integer現在までの会話におけるエージェントのターン数の合計です。ターンごとに増加します。5
system__current_agent_turns †integer現在のエージェントのターン数です。エージェント転送後に 0 にリセットされます。3
system__current_subagent_turns †integer現在のワークフローノードにおけるエージェントのターン数です。ノード遷移時に 0 にリセットされます。2
system__conversation_history †string現在のターンまでの会話トランスクリプトをJSONでシリアル化したものです({"entries": [{"role": "user", "message": "..."}]})。会話履歴の形式を参照してください。'{"entries": [...]}'

会話履歴の形式

system__conversation_history 変数には、次の構造を持つJSONオブジェクトが含まれます。

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

各エントリには role("user"、"agent"、または "tool")と、次のいずれかが含まれます。

  • message:ターンのテキストコンテンツ
  • tool_requests:エージェントが実行したツール呼び出しの配列。解決済みのパラメータ値を含みます
  • tool_results:ツール応答の配列

ツール結果またはパラメータにネストされた会話履歴が含まれる場合、無制限の再帰的な展開を避けるため、プレースホルダー([conversation_history (5 turns)] など)に置き換えられます。

この変数は、会話コンテキストをツール(WebhookやカスタムLLMなど)に渡す場合や、ハンドオフ時にサブエージェントプロンプトへ会話履歴を含める場合に便利です。

シークレット動的変数

シークレット動的変数は通常の動的変数と同じ方法で設定されますが、動的変数ヘッダーでのみ使用し、エージェントのシステムプロンプトや最初のメッセージの一部としてLLMプロバイダーに送信しないことをElevenAgentsに示します。

LLMに送信すべきでない認証トークンや非公開IDには、シークレット動的変数を使用します。シークレット動的変数を作成するには、動的変数に secret__ をプレフィックスとして付けます。

シークレット値はマスキングされて保存されるため、conversations APIでは <REDACTED> として返されます。 通話後の文字起こしWebhookでは元の値が配信されるため、Webhookエンドポイントで シークレットとして処理してください。conversations APIから読み戻す必要がある値には、secret__ プレフィックスを使用しないでください。 そのような値は通常の動的変数として渡すか、機密性のない識別子を渡して、 自身のシステムで機密値を検索してください。

ツールから動的変数を更新する

ツール呼び出しは、有効なJSONオブジェクトを返す場合、動的変数を作成または更新できます。抽出する内容を指定するには、ドット記法でオブジェクトパスを設定します。フィールドまたはパスが存在しない場合は、何も更新されません。

応答オブジェクトとドット記法の例:

  • ステータスは次のパスに対応します:response.status
  • users配列内の最初のユーザーのメールアドレスは、次のパスに対応します: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"
}
]
}
}

動的変数を最初のユーザーのメールアドレスに更新するには、次のように割り当てを設定します。

クエリパラメータ

割り当てはWebhookツールごとに設定します。APIリファレンスのツールの割り当てを参照してください。

ガイド

前提条件:

1

プロンプトで動的変数を定義する

次の項目で、二重中括弧 {{variable_name}} を使用して変数を追加します。

  • システムプロンプト
  • 最初のメッセージ
  • ツールパラメータ

メッセージ内の動的変数

メッセージ内の動的変数

2

ツールで動的変数を定義する

ツール設定でも動的変数を定義できます。 新しい動的変数を作成するには、値の型を「Dynamic variable」に設定し、+ ボタンをクリックします。

プレースホルダーの設定

プレースホルダーの設定

3

プレースホルダーを設定する

実行時に変数を渡さずにテストできるよう、デフォルト値を設定します。

エージェントのダッシュボードで、各動的変数のデフォルト値を設定します。

プレースホルダーの設定

4

実行時に変数を渡す

会話を開始するときに、コード内で動的変数を指定します。

最新の 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())

公開通話ページのインテグレーション

公開通話ページでは、URLパラメータを通じて動的変数をサポートしています。エージェントリンクを共有する際に会話をパーソナライズできます。これは、パーソナライズされたエージェントをウェブサイト、メール、マーケティングキャンペーンに埋め込む場合に特に便利です。

URLパラメータの方法

公開通話ページに動的変数を渡す方法は2つあります。

方法1:Base64エンコードされたJSON

vars パラメータを使用して、Base64エンコードされたJSONオブジェクトとして変数を渡します。

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

vars パラメータには、Base64エンコードされたJSONが含まれます。

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

方法2:個別のクエリパラメータ

var_ プレフィックス付きのクエリパラメータを使用して変数を渡します。

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

パラメータの優先順位

両方の方法を同時に使用すると、競合を防ぐため、個別の var_ パラメータがBase64エンコードされた変数より優先されます。

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

この例では、user_name は "Jane"(Base64エンコードされた vars から)ではなく、"John"(var_user_name から)になります。

実装例

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

ベストプラクティス

システムプロンプト、ワークフローノード、プロシージャ内の変数は、ターンごとに解決されます。ターン間で値が変化すると、プロンプトをキャッシュできず、コストとレイテンシーが増加します。{{system__time_utc}} と {{system__time_second}} はターンごとに変化し、{{system__time}} と {{system__time_minute}} は毎分変化します。

エージェントに現在の日付と時刻を伝えるには、プロンプトテキストに {{system__time}} または {{system__time_utc}} を入れる代わりに、システムプロンプトエディターのタイムゾーンボタン(conversation_config.agent.prompt.timezone)でタイムゾーンを設定してください。タイムゾーンを設定すると、プラットフォームはキャッシュされたプロンプトプレフィックスの外側に現在の日付と時刻を追加するため、システムプロンプトはターンをまたいでキャッシュされ続けます。タイムゾーンを設定しない場合、エージェントは現在の日付と時刻を受け取りません。

プロンプト内に日付または時を含める必要がある場合は、{{system__time_date}}、{{system__time_hour}}、{{system__timezone}} を組み合わせてください(例:Today is {{system__time_date}}, hour {{system__time_hour}} ({{system__timezone}}))。これらは最大で1時間に1回しか変化しません。

ツールで†が付いた値が必要な場合は、プロンプトに入れるのではなく、ツールパラメータまたはヘッダーにバインドしてください。ツールパラメータはツールが呼び出されたときにのみ解決されるため、プロンプトキャッシュには影響しません。LLMはすでに会話を認識しているため、{{system__conversation_history}} がプロンプトで必要になることはほとんどありません。

プロンプトで {{system__agent_turns}} などのターンカウンターを確認している場合は、以下の代替手段を検討してください。固定の開始時の挨拶や開示には first_message を使用します。

最初の応答時の動作には、会話履歴を軸に指示を記述できます(例:“On your first reply, when you have not yet greeted the caller…”)。これはLLMが指示に従うことに依存するため、使用するモデルでテストし、結果の信頼性が低い場合はターンカウンターを維持してください。

カウンターが分岐またはエスカレーションのタイミングを決めるだけの場合は、ワークフローエッジの式条件または構造化プロシージャのIfステップ式(system__agent_turns >= 5 など)で、プロンプトの外部で処理できます。LLM自体が値を必要とするケースには対応しません。

認証トークンとAPIキーには secret__ をプレフィックスとして付け、ツールヘッダーにのみバインドでき、LLMには送信されないようにします。secret__ の値はconversations APIで <REDACTED> としてマスキングされるため(通話後の文字起こしWebhookは元の値を引き続き受け取ります)、conversations APIから読み戻す必要がある値は通常の動的変数として渡すか、機密性のない識別子を渡して自身のシステムで機密値を検索してください。

system__user_id はトラッキングと分析のためにクライアントから提供されるものであり、ElevenAgentsによって検証されません。アカウントデータを公開する前に、会話開始Webhook、secret__ ヘッダー変数内の署名付きトークン、または検証ツール呼び出しを通じて発信者のIDを検証してください。

プロンプト、最初のメッセージ、ツールで使用するすべてのカスタム変数について、dynamic_variable_placeholders にデフォルト値を設定してください。ダッシュボードでの会話プレビューとシミュレーションテストでは会話開始Webhookは実行されないため、未設定の変数はテスト中にリテラルの {{variable_name}} プレースホルダーとして残ります。

トラブルシューティング

次の点を確認してください:

  • 変数名が完全に一致している(大文字と小文字を区別)
  • 変数で二重波かっこを使用している:{{variable_name}}
  • 変数が dynamic_variables オブジェクトに含まれている

次の点を確認してください:

  • 変数値が想定される型と一致している
  • 値が文字列、数値、またはブール値のみである