ガードレール
ガードレールは、エージェントと並行して実行することも、完了するまで実行をブロックすることもでき、ユーザー入力やエージェント出力に対してチェックと検証を行えます。たとえば、コストの高いモデルを呼び出す前に、軽量なモデルをガードレールとして実行できます。ガードレールが悪意ある利用を検出した場合、エラーを発生させ、コストの高いモデルの実行を停止できます。
ガードレールには 2 種類あります:
- 入力ガードレール は、最初のユーザー入力に対して実行されます。
- 出力ガードレール は、最終的なエージェント出力に対して実行されます。
ワークフローの境界
Section titled “ワークフローの境界”ガードレールはエージェントに関連付けられますが、ワークフロー内のすべてのエージェントで必ず実行されるわけではありません:
- 入力ガードレール は、チェーン内の最初のエージェントに対してのみ実行されます。
- 出力ガードレール は、最終出力を生成するエージェントに対してのみ実行されます。
- ツールガードレール は、すべての関数ツール呼び出しで実行されます。入力ガードレールは実行前に、出力ガードレールは実行後に実行されます。
マネージャーやハンドオフを含むワークフローで、カスタム関数ツールの各呼び出しの前後にチェックが必要な場合は、エージェントレベルの入力/出力ガードレールではなく ツールガードレール を使用してください。
入力ガードレール
Section titled “入力ガードレール”入力ガードレールは 3 つのステップで実行されます:
- ガードレールは、エージェントに渡されたものと同じ入力を受け取ります。
- ガードレール関数が実行され、
InputGuardrailResultでラップされたGuardrailFunctionOutputを返します。 tripwireTriggeredがtrueの場合、InputGuardrailTripwireTriggeredエラーがスローされます。
注記 入力ガードレールはユーザー入力を対象としているため、ワークフロー内の 最初の エージェントの場合にのみ実行されます。異なるエージェントでは異なるガードレールが必要になることが多いため、ガードレールはエージェント自体に設定します。
runInParallel: true(デフォルト)は、ガードレールを LLM / ツール呼び出しと並行して開始します。これによりレイテンシは最小化されますが、後でガードレールが発動した場合でも、モデルがすでにトークンを消費していたり、ツールを実行していたりする可能性があります。runInParallel: falseは、モデルを呼び出す 前に ガードレールを実行し、ガードレールがリクエストをブロックした場合のトークン消費とツール実行を防ぎます。レイテンシよりも安全性とコストを優先する場合に使用します。
出力ガードレール
Section titled “出力ガードレール”出力ガードレールは 3 つのステップで実行されます:
- ガードレールは、エージェントが生成した出力を受け取ります。
- ガードレール関数が実行され、
OutputGuardrailResultでラップされたGuardrailFunctionOutputを返します。 tripwireTriggeredがtrueの場合、OutputGuardrailTripwireTriggeredエラーがスローされます。
注記 出力ガードレールは、エージェントがワークフロー内の 最後の エージェントの場合にのみ実行されます。リアルタイム音声インタラクションについては、音声エージェントの構築 を参照してください。
出力ガードレール関数は、基盤となる modelResponse と、そのターンで生成された出力アイテムを含む任意の details オブジェクトも受け取ります。最終出力だけではレスポンスを通すべきか判断するのに十分でない場合に使用します。たとえば、トリップワイヤーを発動させる前に、生成されたアイテム一覧全体やプロバイダーのレスポンスメタデータを検査したい場合などです。
ツールガードレール
Section titled “ツールガードレール”ツールガードレールは 関数ツール をラップし、実行前後にツール呼び出しを検証またはブロックできるようにします。ツール自体に( tool() オプション経由で)設定され、そのツールのすべての呼び出しで実行されます。
実際には、これは tool({...}) で inputGuardrails や outputGuardrails、またはその両方を設定するカスタム関数ツールを指します。
- ツールの入力ガードレール は、ツールの実行前に実行され、メッセージ付きで呼び出しを拒否したり、トリップワイヤーエラーをスローしたりできます。
- ツールの出力ガードレール は、ツールの実行後に実行され、出力を拒否メッセージに置き換えたり、トリップワイヤーエラーをスローしたりできます。
ローカル関数ツールで人間による承認も必要な場合、入力ツールガードレールは通常、承認後かつ実行直前に実行されます。保留中の承認リクエストの前にもこれらの入力ガードレールを実行するには、run() または Runner に toolExecution: { preApprovalInputGuardrails: true } を設定します。それでもガードレールは、承認後、ツール実行前に再度実行されます。
ツールガードレールは behavior を返します:
allow— 次のガードレールまたはツール実行へ続行rejectContent— メッセージでショートサーキット(ツール呼び出しはスキップされるか、出力が置き換えられます)throwException— ただちにトリップワイヤーエラーをスロー
ツールガードレールは、tool() で定義する関数ツールに適用されます。ハンドオフは関数のようなツールとしてモデルに提示されますが、通常の関数ツールパイプラインではなく SDK のハンドオフ経路で実行されるため、ツールガードレールはハンドオフ呼び出し自体には適用されません。組み込みツール(Hosted)と組み込み実行ツール (computerTool, shellTool, applyPatchTool) も、このガードレールパイプラインを使用しません。また、agent.asTool() は現在、ツールガードレールのオプションを直接公開していません。
トリップワイヤー
Section titled “トリップワイヤー”ガードレールが失敗すると、トリップワイヤーを通じてそれを通知します。トリップワイヤーが発動するとすぐに、ランナーは対応するエラーをスローし、実行を停止します。
ガードレールの実装
Section titled “ガードレールの実装”ガードレールとは、単に GuardrailFunctionOutput を返す関数です。以下は、内部で別のエージェントを実行して、ユーザーが数学の宿題の手伝いを求めているかどうかをチェックする最小限の例です。
import { Agent, run, InputGuardrailTripwireTriggered, InputGuardrail,} from '@openai/agents';import { z } from 'zod';
const guardrailAgent = new Agent({ name: 'Guardrail check', instructions: 'Check if the user is asking you to do their math homework.', outputType: z.object({ isMathHomework: z.boolean(), reasoning: z.string(), }),});
const mathGuardrail: InputGuardrail = { name: 'Math Homework Guardrail', // Set runInParallel to false to block the model until the guardrail completes. runInParallel: false, execute: async ({ input, context }) => { const result = await run(guardrailAgent, input, { context }); return { outputInfo: result.finalOutput, tripwireTriggered: result.finalOutput?.isMathHomework === false, }; },};
const agent = new Agent({ name: 'Customer support agent', instructions: 'You are a customer support agent. You help customers with their questions.', inputGuardrails: [mathGuardrail],});
async function main() { try { await run(agent, 'Hello, can you help me solve for x: 2x + 3 = 11?'); console.log("Guardrail didn't trip - this is unexpected"); } catch (e) { if (e instanceof InputGuardrailTripwireTriggered) { console.log('Math homework guardrail tripped'); } }}
main().catch(console.error);出力ガードレールも同じように機能します。
import { Agent, run, OutputGuardrailTripwireTriggered, OutputGuardrail,} from '@openai/agents';import { z } from 'zod';
// The output by the main agentconst MessageOutput = z.object({ response: z.string() });type MessageOutput = z.infer<typeof MessageOutput>;
// The output by the math guardrail agentconst MathOutput = z.object({ reasoning: z.string(), isMath: z.boolean() });
// The guardrail agentconst guardrailAgent = new Agent({ name: 'Guardrail check', instructions: 'Check if the output includes any math.', outputType: MathOutput,});
// An output guardrail using an agent internallyconst mathGuardrail: OutputGuardrail<typeof MessageOutput> = { name: 'Math Guardrail', async execute({ agentOutput, context }) { const result = await run(guardrailAgent, agentOutput.response, { context, }); return { outputInfo: result.finalOutput, tripwireTriggered: result.finalOutput?.isMath ?? false, }; },};
const agent = new Agent({ name: 'Support agent', instructions: 'You are a user support agent. You help users with their questions.', outputGuardrails: [mathGuardrail], outputType: MessageOutput,});
async function main() { try { const input = 'Hello, can you help me solve for x: 2x + 3 = 11?'; await run(agent, input); console.log("Guardrail didn't trip - this is unexpected"); } catch (e) { if (e instanceof OutputGuardrailTripwireTriggered) { console.log('Math output guardrail tripped'); } }}
main().catch(console.error);ツールの入力/出力ガードレールは次のようになります:
import { Agent, ToolGuardrailFunctionOutputFactory, defineToolInputGuardrail, defineToolOutputGuardrail, tool,} from '@openai/agents';import { z } from 'zod';
const blockSecrets = defineToolInputGuardrail({ name: 'block_secrets', run: async ({ toolCall }) => { const args = JSON.parse(toolCall.arguments) as { text?: string }; if (args.text?.includes('sk-')) { return ToolGuardrailFunctionOutputFactory.rejectContent( 'Remove secrets before calling this tool.', ); } return ToolGuardrailFunctionOutputFactory.allow(); },});
const redactOutput = defineToolOutputGuardrail({ name: 'redact_output', run: async ({ output }) => { const text = String(output ?? ''); if (text.includes('sk-')) { return ToolGuardrailFunctionOutputFactory.rejectContent( 'Output contained sensitive data.', ); } return ToolGuardrailFunctionOutputFactory.allow(); },});
const classifyTool = tool({ name: 'classify_text', description: 'Classify text for internal routing.', parameters: z.object({ text: z.string(), }), inputGuardrails: [blockSecrets], outputGuardrails: [redactOutput], execute: ({ text }) => `length:${text.length}`,});
const agent = new Agent({ name: 'Classifier', instructions: 'Classify incoming text.', tools: [classifyTool],});guardrailAgentはガードレール関数内で使用されます。- ガードレール関数はエージェントの入力または出力を受け取り、結果を返します。
- 追加情報はガードレールの結果に含めることができます。
agentは、ガードレールが適用される実際のワークフローを定義します。