エージェントは入力イベントを処理し、出力イベントを yield して会話を制御します。
エージェントとは
エージェントは入出力イベントループを制御します。process メソッドはイベント(ユーザーの発話、通話開始など)を受け取り、レスポンスを yield します。
エージェントには次の 2 つの形式があります:
process メソッドを持つ クラス
- 同じシグネチャ
(env, event) -> AsyncIterable[OutputEvent] を持つ 関数
エージェントの仕組み:
- イベントが到着(ユーザーの発話、通話開始、ボタン押下)
- SDK が
agent.process(env, event) を呼び出す
- エージェントが出力イベント(発話、ツール呼び出し、ハンドオフ)を yield する
- SDK が音声、LLM 呼び出し、状態管理を担当
LlmAgent
LiteLLM を介して 100 以上の LLM プロバイダーをラップする組み込みの LlmAgent を使用します:
プロンプト
system_prompt でエージェントのパーソナリティを定義し、introduction で挨拶を指定します:
サポートされているモデル
| プロバイダー | モデル例 |
|---|
| Anthropic | anthropic/claude-haiku-4-5-20251001、anthropic/claude-sonnet-4-5 |
| OpenAI | gpt-5.4、gpt-5.2 |
| Google | gemini/gemini-2.5-flash-preview-09-2025、gemini/gemini-3.0-preview |
| その他、LiteLLM 経由で 100 以上のプロバイダー | |
LlmConfig オプション
| オプション | 型 | 説明 |
|---|
system_prompt | str | エージェントの動作を定義するシステムプロンプト |
introduction | Optional[str] | 通話開始時に送信されるメッセージ。None または "" の場合はユーザーの発話を待つ |
temperature | Optional[float] | サンプリング温度 |
max_tokens | Optional[int] | レスポンスごとの最大トークン数 |
top_p | Optional[float] | Nucleus サンプリングの閾値 |
stop | Optional[List[str]] | ストップシーケンス |
seed | Optional[int] | 再現性のための乱数シード |
presence_penalty | Optional[float] | トークン生成のプレゼンスペナルティ |
frequency_penalty | Optional[float] | トークン生成の頻度ペナルティ |
num_retries | int | 失敗時のリトライ回数(デフォルト: 2) |
fallbacks | Optional[List[str]] | プライマリが失敗した場合のフォールバックモデル |
timeout | Optional[float] | リクエストタイムアウト(秒) |
reasoning_effort | Optional[str] | none、low、medium、または high。プロバイダーに依存。 |
extra | Dict[str, Any] | LiteLLM に渡されるプロバイダー固有のオプション |
履歴管理
LlmAgent は、LLM が参照する会話履歴を構造化された形で制御するための history 属性を公開しています。
エントリの追加:
履歴セグメントの置換:
ターンごとのオーバーライド
process() はキーワード引数を受け付け、エージェントを変更せずにそのターンだけに適用します:
明示的に設定された LlmConfig のフィールドのみが反映され、未設定のフィールドはエージェントに保存されている設定にフォールスルーします。
ツールを永続的に変更する場合(例:特定時点以降に end_call を有効化)、ターンごとのオーバーライドではなく agent.tools を直接変更してください。
会話ループの制御
イベントフィルター を使用して、エージェントの process メソッドが実行されるタイミング、そしてそれを中断できるイベントを制御します。
デフォルトの動作
つまり、エージェントは通話開始時に挨拶し、ユーザーが発話を終えると応答し、ユーザーから割り込まれることができます。
フィルターのカスタマイズ
デフォルトを上書きするには get_agent からタプルを返します:
よくあるカスタマイズ
応答性を高める(部分的な書き起こしを処理):
これによりエージェントは、ユーザーの発話が終わる前に処理を開始するため、よりレスポンシブな体験を実現できます。
割り込み不可能なターン:
特定のメッセージをユーザーに中断されずに完了させたい場合は、AgentSendText で送信するときに出力を interruptible=False としてマークします。
関数を使ったカスタムロジック:
ガードレール、ルーティング、エージェントラッパーなどの高度なパターンについては 高度なパターン を参照してください。
着信通話の処理
通話が着信すると、発信者情報を確認したり、エージェントが起動する前に応答方法を設定したりできます。
- Web クライアントまたはテレフォニープロバイダーから通話が着信
pre_call_handler が発信者の詳細を含む CallRequest を受け取る
- 構成(ボイス、言語)を返すか、通話を拒否する
get_agent 関数が、強化されたリクエストを使ってエージェントを作成
CallRequest の解析
着信通話に関する情報が含まれます:
| フィールド | 型 | 説明 |
|---|
call_id | str | 通話の一意の識別子 |
from_ | str | 発信者識別子(電話番号またはクライアント ID) |
to | str | 着信番号またはエージェント ID |
agent_call_id | str | ロギング/相関用のエージェント call ID |
metadata | Optional[dict] | クライアントアプリケーションから渡されたカスタムデータ |
agent | AgentConfig | プレイグラウンドまたは API で構成されたプロンプト |
agent フィールドには次の項目を持つ AgentConfig が含まれます:
| フィールド | 型 | 説明 |
|---|
system_prompt | Optional[str] | プレイグラウンドまたは WebSocket API で構成されたシステムプロンプト |
introduction | Optional[str] | プレイグラウンドまたは WebSocket API で構成された導入メッセージ |
PreCallResult を返す
エージェントが起動する前に、pre_call_handler でボイスや言語を設定するか、通話を拒否します:
クライアントアプリケーションは、コールリクエストでメタデータ(ユーザー ID、言語設定、アカウントティアなど)を渡せます。pre_call_handler はこれを読み取り、それに応じて TTS/STT を構成します。
構成オプション
TTS オプション:
| オプション | 型 | 説明 |
|---|
voice_id | string | ボイス識別子(UUID) |
model | string | TTS モデル(sonic-3.5、sonic-3、sonic-turbo) |
language | string | 言語コード(en、es、hi など) |
pronunciation_dict_id | string | カスタム発音辞書 の ID |
STT オプション:
| オプション | 型 | 説明 |
|---|
language | string | 音声認識の言語コード |
通話の拒否
None を返して、403 ステータスで通話を拒否します:
カスタム発音
特定の単語の発音方法を制御するには 発音辞書 を使用します:
エージェントロジックで通話メタデータにアクセスする
CallRequest は get_agent で利用できます:
LlmConfig.from_call_request() は優先順位を自動的に処理します:
CallRequest.agent.system_prompt の値(設定されている場合)
- ユーザーが指定したフォールバック値(指定されている場合)
- SDK のデフォルト
CallRequest を使うと、プレイグラウンドからシステムプロンプトを瞬時にイテレーションでき、コード側では技術的な構成とフォールバックのデフォルトを担当できます。
ユーザーに先に話させる
ユーザーが先に話すのを待つには、introduction を空文字列に設定します:
カスタムエージェント関数
高度なユースケースでは、エージェントを関数としてゼロから構築できます:
カスタムエージェントクラス
または、状態を持つクラスとしても構築できます:
ほとんどの開発者は、カスタムエージェントをゼロから構築するのではなく、LlmAgent をツールと組み合わせて使うのがおすすめです。カスタムエージェントは、LLM の推論なしでイベント処理ロジックを完全に制御したい場合に強力です。