メインコンテンツへスキップ
ツールを使うと、エージェントがアクションを実行したり情報を取得したりできます。SDK は会話フローへの影響が異なる 3 種類のツールパラダイムをサポートしています。

ツールの定義

適切に型注釈された関数はツールとして使用できます。SDK は関数の docstring を説明として、パラメータの型注釈を使用します:
すべてのツールの最初のパラメータは ctx(ツールコンテキスト)である必要があります。これは会話状態へのアクセスを提供し、将来的な互換性のために必須です。ツールのパラメータは ctx の後に続けて定義します。

ツールの種類

tools に渡されるプレーンな関数は、自動的にループバックツールとしてラップされます。明示的な制御には、デコレーター(@loopback_tool@passthrough_tool@handoff_tool)を使用してください。

ループバックツール(@loopback_tool

デフォルトの動作です。ツールの結果は LLM に返され、LLM はそれを使って応答の生成を続行できます。
用途: 情報取得、計算、API クエリ。

パススルーツール(@passthrough_tool

出力イベントは LLM を経由せずに、直接ユーザーに送信されます。決定的なアクションに使用します。
用途: 通話制御(EndCallTransferCallSendDtmf)、決定的な応答。

ハンドオフツール(@handoff_tool

制御を別のハンドラーに移譲します。以降のイベントはすべて、元のエージェントではなくハンドオフ先にルーティングされます。
用途: カスタムのマルチステップフロー、独自のロジックを持つ専用ハンドラー。 ハンドオフツールを使用する場合、event パラメータはタイミングによって異なる値を受け取ります:
  • 最初の呼び出し: eventAgentHandedOff。これを使って遷移メッセージを送信します
  • その後の呼び出し: event は実際の InputEventUserTurnEnded など)
ハンドオフが発生すると、元のエージェントはそれ以降イベントを受け取りません。ハンドオフツール関数が、それ以降のすべての会話ターンを処理します。
別の LlmAgent にハンドオフするには、生の @handoff_tool を書く代わりに agent_as_handoff ヘルパーを使用してください。委譲が自動的に処理されます。

組み込みツール

例:
ドキュメントのアップロードおよびパラメータの完全なリストについては ナレッジベース を参照してください。

end_call

現在の通話を終了し、切断します。エージェントの最終的な発話が完了した後に実際の切断が行われるため、ユーザーは切断前に終了の挨拶を最後まで聞くことができます。
デフォルトでは、end_call は次のいずれかの条件を満たす場合にのみ通話を終了する保守的なポリシーを使用します:
  • ユーザーの目的が完全に達成されている
  • ユーザーが明確にお別れを述べている
  • エージェントが自然なお別れを述べている

カスタムの説明

ユースケースに合わせてカスタマイズした説明を提供することを推奨します。説明はデフォルトを 完全に置き換えます(追記ではありません)。そのため、do/don’t の明示的なガイダンスを含む完全な指示を含めてください。

agent_as_handoff

別の Agent からハンドオフツールを作成します。マルチエージェントワークフローを実装する最も簡単な方法です。
呼び出されると、agent_as_handoff は自動的にハンドオフメッセージを送信し、指定されていれば通話設定を更新し、新しいエージェントの導入をトリガーし、以降のすべてのイベントをそちらにルーティングします。
ループバック、パススルー、ハンドオフツールを組み合わせた完全なマルチエージェント例については 高度なパターン を参照してください。

長時間実行ツール

デフォルトでは、エージェントが中断されるとツール呼び出しは終了します(ただし、すでに生成された推論内容やツール呼び出しのレスポンス値は、次の生成での利用のために保持されます)。 完了までに長時間かかることが想定されるツールには、is_background=True を設定してください。中断に関わらずツールはバックグラウンドで完了するまで実行され、その後 LLM にループバックしてレスポンスを生成します。
組み込みの knowledge_base ツールも is_background を受け付けるため、取得処理が進行中でもエージェントは話し続けることができます:
バックグラウンドツールは次のような場合に有用です:
  • 操作が一般的なユーザーの忍耐時間を超える可能性がある場合(例:複雑な検索、レポート生成)
  • 操作の完了中にユーザーが話せるようにしたい場合
  • ユーザーが別の質問で割り込んだとしても結果を届けたい場合