構造化された手順
エージェントが毎回同じ方法で実行する、型付きステップの固定シーケンス
概要
構造化された手順は、固定された順序のステップを実行する手順です。自由形式の手順は、エージェントが解釈し、状況に合わせて調整する自然言語のガイダンスです。構造化された手順は、手順が適用されるたびにエージェントが順番に実行する、型付きステップの順序付きリストです。
発信者の本人確認、チケットのエスカレーション、支払いの受け付けなど、特定のステップを毎回同じ方法で実行する必要がある場合は、構造化された手順を使用します。平易な言葉による短いステップリストとして作成できます。
他のすべての手順と同様に、構造化された手順には適用されるタイミングを説明するトリガーがあります。会話がトリガーに一致すると、エージェントは手順のステップを順番に実行し、その後、残りの会話に戻ります。

構造化された手順を使う場面
特定のステップを毎回同じ方法で実行する必要がありながら、平易なステップとして素早く作成したい場合は、構造化された手順を使用します。構造化された手順はワークフローより記述しやすい一方、表現力は低くなります。自由形式の手順、ワークフロー、システムプロンプトとの比較については、手順を使う場面を参照してください。
構造化された手順の構成
構造化された手順は、名前、トリガー、順序付きのステップリストの3つで構成されます。
名前
ダッシュボードで手順を識別する短いラベルです。名前がLLMに送信されることはないため、エージェントの動作には影響しません。
トリガー
エージェントがこの手順を実行すべきタイミングを平易な言葉で説明します。たとえば、ユーザーが注文の返金を求めたとき です。エージェントはユーザーの意図を各手順のトリガーと比較し、一致するものを実行します。そのため、トリガーは具体的で明確に区別できるものにしてください。エージェントが参照するのはトリガーのテキストだけで、手順の名前やIDは参照しません。トリガーの仕組みはすべての手順で共通です。詳しくはトリガーの記述を参照してください。
トリガーを空欄にすると、別の手順から呼び出された場合にのみ実行されるサブ手順になります。
ステップ
手順本体は、型付きステップの順序付きリストです。複数のステップタイプを組み合わせて、タスクを記述します。

すべてのステップをどこでも使用できるわけではありません。Ifアーム内では、別のIfまたはRetry以外の任意のステップを使用できます。Toolステップの失敗ハンドラー内では、Ifまたは別のTool以外の任意のステップを使用できます。
APIステップリファレンス
構造化された手順のcontentは、steps配列を含むJSONエンコード済みドキュメントです。各ステップはtypeで識別されるオブジェクトです。トリガーはcontentの一部ではなく、手順の別のトップレベルフィールドです。APIおよびSDKのペイロードでは、手順自体にtype: "deterministic"を使用します。
Ask
Askステップは、エージェントに情報を要求させ、ユーザーが適切な応答を提供するまで待機するよう指示します。
- APIタイプ:
ask instruction:必須の空でない文字列。
Tell
Tellステップは、エージェントに自分の言葉で1つのメッセージを生成するよう指示します。ユーザーの応答を待たずに続行します。
- APIタイプ:
tell instruction:必須の空でない文字列。
Say
Sayステップは、指定されたテキストを記載どおりに正確に発話してから続行します。message_translationsを指定すると、エージェントがサポートする追加言語ごとに、言語コードをキーとして正確なメッセージを設定できます。
- APIタイプ:
say message:必須の空でない文字列。message_translations:言語コードを{ "value": "..." }にマッピングする任意のオブジェクト。
If、else if、else
Ifステップには、順序付きの条件アームを1つ以上含めます。最初に一致したアームが実行されます。任意のfallback配列がElseアームです。
- APIタイプ:
branch branches:必須の、空でない条件アームのリスト。fallback:任意のElseステップのリスト。- 各アームには
conditionと、空でないstepsリストが必要です。
動作はif/else-if/elseと同じです。
- 条件を順番に評価します。
- 最初に一致したアームを実行します。
- 一致する条件がない場合は、
fallbackを実行します。 - アームが終了すると、手順はメインシーケンスに戻ります。
上記の例では、モデルが自然言語で評価するテキスト条件を使用しています。条件には、動的変数に対する式も使用できます。
式条件は、ツールの結果によって入力されるか、会話開始時に設定される動的変数を検査します。ユーザーの直近の返信は読み取れません。ユーザーの発言内容に基づいて分岐するには、テキスト条件を使用してください。
1つのIfステップ内のすべてのアームでは、llmまたはexpressionのいずれか、同じ条件タイプを使用する必要があります。
Tool
Toolステップは特定のツールを呼び出します。
- APIタイプ:
tool_call tool_id:必須の空でないツールID。ツールがエージェントにアタッチされている必要があります。tool_name:ツールと一致する必須のツール名。instruction:ツールの呼び出し方法を説明する任意の指示。schema_overrides:ツールパラメータの任意の固定値。on_failure:任意の失敗ハンドラー。
固定パラメータ値
パラメータが常に特定の値を取る必要がある場合は、schema_overridesを使用します。モデルはオーバーライドされたパラメータを参照したり選択したりしません。キーはツールスキーマ内のパラメータパスで、各値はソースを指定します。
失敗処理
on_failureがない場合、ツール呼び出しに失敗すると会話が終了します。代わりにリカバリーステップを実行するには、on_failureを追加してください。
fallback:ツールが失敗したときに実行する、必須の空でないステップリスト。branches:条件付き失敗処理用に予約されています。空のままにしてください。
失敗ハンドラーには、Ask、Tell、Say、Sub-procedure、System tool、Retryステップを含めることができます。ToolまたはIfステップは含められません。ハンドラーの実行後、手順はToolステップの次のステップから続行します。
Retry
Retryステップは、それを含む失敗ハンドラーをツール呼び出しを含めて再実行します。試行ごとにツールが再度呼び出され、再び失敗した場合はハンドラー内のすべてのステップが再び実行されます。試行回数を使い切ると、会話が終了します。
- APIタイプ:
retry max_retries:1~3の任意の整数。デフォルトは1です。- 値は、元のツール呼び出し後の試行回数を数えます。
- Retryは
on_failure内でのみ有効です。 - 後続のステップには到達できなくなるため、Retryは失敗ハンドラーの最後のステップでなければなりません。
Sub-procedure
Sub-procedureステップは、別の構造化された手順を実行します。その手順のステップが完了すると、Sub-procedureステップの次のステップに実行が戻ります。
- APIタイプ:
sub_procedure procedure_id:必須の空でない手順ID。- 対象は同じエージェント上に存在する必要があります。
- 対象は構造化された手順である必要があります。
- 手順は自分自身を呼び出せません。
System tool
System toolステップは、組み込みのシステムアクションを実行します。
- APIタイプ:
system_tool system_tool_name:必須のシステムツール名。- 現在サポートされているのは
end_callのみです。今後、さらにシステムツールが追加される可能性があります。 end_callは終端処理のため、含まれるシーケンス、アーム、または失敗ハンドラーの最後のステップでなければなりません。
検証ルール
エージェントを公開するとき、またはエージェントの下書きを保存するとき、これらのルールのいずれかに違反する構造化された手順は拒否されます。エラーには、問題のあるステップがそのパスとともに示されます。
- 2つのIfステップを連続して配置することはできません。
- Ifステップをネストすることはできません。
- 式条件を持つIfステップを、Askステップの直後に配置することはできません。
- 1つのIfステップ内のすべての条件は、
llmまたはexpressionのいずれか、同じタイプである必要があります。 - Retryは
on_failure内でのみ使用でき、そこでは最後のステップでなければなりません。 end_callは、それが含まれるリスト内の最後のステップでなければなりません。- 失敗ハンドラーの
fallbackには、少なくとも1つのステップを含める必要があります。 - Sub-procedureは、同じエージェント上に存在する構造化された手順を指す必要があり、自分自身を指すことはできません。
tool_idはエージェント上のツールである必要があり、tool_nameは一致し、schema_overridesはツールのスキーマと一致する必要があります。stepsリスト、すべてのinstruction、すべてのmessageは空であってはなりません。
これらのルールのいずれかに該当する手順の再構成方法については、ベストプラクティスを参照してください。
完全なAPI例
この例では、配送状況に基づく注文キャンセルを処理します。ツールパラメータを固定し、ツール呼び出しの失敗から回復し、別の構造化された手順を呼び出してから、通話を終了します。
構造化された手順の実行方法
構造化された手順のステップをエージェントが実行する形式に変換することをコンパイルと呼びます。プラットフォームでは公開時にすべての構造化された手順をコンパイルするため、自分でコンパイルする必要はありません。現在、コンパイル結果は ワークフロー タブで読み取り専用ノードとして確認できます。
ユーザーのリクエストが手順のトリガーに一致すると、エージェントはその手順に入り、ステップを順番に実行します。構造化された手順内では、エージェントは各ステップを個別に処理します。最後に到達すると、会話の残りの部分に戻ります。
以下のルールは、実行時のステップの動作を説明します。
ユーザーを待つのはAskだけです
Ask以外のすべてのステップはすぐに実行され、同じターン内で次のステップに制御が移ります。
TellまたはSayステップはメッセージを伝え、そのまま続行します。Ask以外に会話を一時停止する
ステップはなく、現在のターンを終了するステップもありません。ユーザーからの入力が必要な場合は、
Askステップを使用してください。会話を終了する場合は、end_callシステムツールを使用してください。
手順の終端に到達してもターンは終了しません
最後のステップが完了すると、手順は終了し、ターンを開いたままエージェントは会話の残りに 戻るため、さらに発話することがあります。サブ手順が完了すると、制御はそれを呼び出した 手順の次のステップに戻ります。
Toolステップは成功と失敗のみを区別します
Toolステップでは、ステータスコードやレスポンス本文に基づいて分岐できません。ツールが成功した場合、 手順は続行します。失敗してステップに失敗ハンドラーがない場合、会話は終了します。 ハンドラーがある場合は、そのステップを実行してから手順の次のステップに進みます。ハンドラー内の Retryはツールを再実行し、再び失敗した場合は、ツールが成功するか試行回数を使い切るまで、ハンドラー内の すべてのステップを再実行します。使い切った場合、会話は終了します。
一致しない場合、Ifステップは次へ進みます
条件を順番に評価し、最初に一致したものを実行します。どれにも一致しない場合はElseアームを実行します。 Elseがなく、どれにも一致しない場合、手順はIfの次のステップに進みます。処理されないケースが エラーになることはありません。
Ifアームの状態は後続に引き継がれません
Ifアーム内で決定された内容は、後続のステップには記憶されません。アーム内で得た情報が後で必要な場合は、 ツール呼び出しまたは動的変数を使って明示的に保持してください。
Ask、Tell、Sayステップにはツールがありません
ツールを呼び出せるのはToolステップだけです。Ask、Tell、Sayステップにツールを呼び出さないよう伝える 必要はありません。呼び出すことはできません。
構造化された手順を管理する
ダッシュボードで作成
CLIで管理
APIで管理
ベストプラクティス
各ステップタイプにはそれぞれ固有の動作がすでに設定されているため、詳細を明示する必要はほとんどありません。各ステップの意図を書けば、あとはステップタイプが処理します。以下では、特に重要なケースのガイダンスを紹介します。
構造化された手順をテストするには、手順の反復改善で説明しているステップに従ってください。
ステップタイプの選択
Askステップごとに質問は1つだけにする
Askステップは1つの回答を待機します。複数の質問を1つの指示にまとめると、 エージェントが一部を飛ばしたり、まとめて処理したりする傾向があります。必要な情報ごとにAskを1つ使用してください。
文にはTell、質問にはAskを使用する
Tellステップはメッセージを伝え、待機せずに次へ進みます。質問形式のTellは 回答を受け取りません。ユーザーからの応答が必要なステップにはAskを使用します。
質問だけでは不十分な場合、Askに明確な終了条件を設定する
Askステップは適切な回答を得ると次へ進みます。何が回答として扱われるかが 質問から明らかでない場合は、指示に明記してください。例:注文IDを尋ねる。有効な IDは8桁。
表現にはTell、完全に固定した文言にはSayを選択する
エージェント自身がメッセージを作成する場合はTellステップを、文言をそのまま使用または翻訳する必要がある場合はSayステップを 使用します。どちらも送信するメッセージは1つだけなので、 ステップに単一メッセージの送信を指示する必要はありません。
ツールを使わないステップにツールを避けるよう指示しない
Ask、Tell、Sayステップではツールを呼び出せません。これらに_do not call any tools_と書いても、 動作は変わらず、指示が冗長になるだけです。
手順の構成
2つのIfステップの間に不要なステップを入れない
2つのIfステップを連続して配置することはできません。このルールを満たすために、無関係なTellやSayを間に挿入すると、 エージェントが不要な発言をしてしまいます。代わりに、2つ目の判断を追加のElse ifアームとして最初のIfに 組み込むか、サブ手順に移してください。
ネストされた判断はサブ手順に入れる
Ifステップはネストできません。ある判断が別の判断に依存する場合は、内側の判断を 専用の構造化された手順に入れ、必要なアームからサブ手順ステップで呼び出してください。
「上記のいずれでもない」が重要な場合はElseを追加する
ElseのないIfステップは、一致する条件がない場合に次のステップへ進みます。一致しない ケースを別の方法で処理する必要がある場合は、そのためのElseアームを追加してください。
後続ステップで必要な情報は保存する
Ifアーム内で行われた判断は、その後は記憶されません。後続のステップが アーム内で得た情報に依存する場合は、アーム内でツール呼び出しまたは動的変数を使って記録してください。
式条件は値を設定するツールの後に配置する
式条件は動的変数をテストします。それらを使用するIfステップは、変数を設定するTool ステップの直後に配置してください。ユーザーの発言に基づいて分岐するには、テキスト条件を使用します。
共通ステップはサブ手順に抽出する
人間の担当者へのエスカレーションなど、複数の構造化された手順で同じシーケンスを共有する場合は、 空のトリガーを持つ1つの構造化された手順にまとめ、それぞれから呼び出してください。コピーしたシーケンスは 時間の経過とともにずれていきます。
ツールの使用
Toolステップは指示ではなくIfで制御する
Toolステップは常にツールを呼び出します。_チケットにすでにタグが付いている場合は これをスキップする_のように指示へ条件を書いても、呼び出しを防ぐことはできません。呼び出しが常に必要とは 限らない場合は、Toolステップの前にIfステップで条件を設定してください。
パラメーター値は説明せず固定する
パラメーターに常に特定の値を設定する必要がある場合は、schema_overridesでconstantオーバーライドを
設定してください。_常にstatusをpendingに設定する_のような指示はモデルに従うよう求めるだけですが、
オーバーライドは強制され、スキップできません。
すべてのToolステップに失敗ハンドラーを設定する
on_failureがない場合、ツールの失敗により会話が終了します。ユーザーに
起きたことを伝え、再試行、エスカレーション、または続行するハンドラーを追加してください。
Toolステップではツール呼び出しだけを行う
Toolステップはツールの実行のみを行います。その間、エージェントは発話や判断を行えません。ユーザーに話しかけたり、 ツールの戻り値に基づいて分岐したりするには、Toolステップの前後に別のステップを 配置してください。
指示の書き方
現在のステップだけを説明する
手順は次に実行する内容を制御し、エージェントは現在のステップを実行中に後続のステップを認識しません。 ステップの順序でシーケンスを制御してください。
文章でターンを終了しようとしない
_this is the last message of this turn_のようにステップ指示へ書かれた文は、
プラットフォームにない境界をエージェントに強制させようとするものです。ユーザーを待つにはAskステップを、会話を終了するには
end_callシステムツールを使用してください。
グローバルルールはシステムプロンプトに記載する
トーン、書式、締めの言葉、拒否ポリシーはシステム プロンプトに記載します。ステップ指示には、そのステップに固有の内容だけを 書いてください。
手順の組み合わせ
手順を組み合わせるための一般的なガイダンスは構造化された手順にも適用されます。詳しくは、自由形式の手順のページにある手順の組み合わせを参照してください。
タイプを組み合わせる場合に特有のパターンとして、自由形式の手順から構造化された手順を参照できます。自由形式の手順ではオープンエンドな対応を行い、本人確認やエスカレーションなど、毎回同じ方法で実行する必要がある部分は構造化された手順に委任してください。
制限事項
- Ifステップはネストできず、2つのIfステップを連続して配置することもできません。
- サポートされているシステムツールは
end_callのみです。 - 構造化された手順からナレッジベースドキュメントを参照することはできません。
- 手順完了時に現在のターンを終了する方法はありません。エージェントはターンを開いたままにし、話し続ける場合があります。
- ダッシュボード内の特定のワークフローノードから構造化された手順を開始することはできません。
- 手順の開始にはレイテンシーが加わります。エージェントは手順に入るためにツール呼び出しを行い、その後生成されたワークフローを進みます。
モデルプロバイダーのサポート
構造化された手順では、サブ手順への移行時と手順完了時に、内部ツール呼び出しが強制されます。主要なOpenAI、Anthropic、Gemini、Grokのモデルファミリーは、強制ツール選択をサポートしています。その他のモデルやカスタムプロバイダーでは保証されない場合があり、サブ手順の移行や手順の完了の信頼性が低下する可能性があります。別のモデルプロバイダーを使用する場合は、強制ツール選択がサポートされていることを確認してください。
コンテンツサイズの上限や構造化された手順と自由形式の手順の違いなど、すべての手順に適用される制限については、手順を参照してください。

