コンテンツにスキップ

ガードレール

ガードレールはエージェントと並行して実行することも、完了まで実行をブロックすることもでき、ユーザー入力やエージェント出力に対するチェックや検証を行えます。たとえば、高コストなモデルを呼び出す前に、軽量モデルをガードレールとして実行できます。ガードレールが悪意ある利用を検知した場合は、エラーを発生させて高コストなモデルの実行を停止できます。

ガードレールには 2 種類あります:

  1. 入力ガードレール は最初のユーザー入力に対して実行されます
  2. 出力ガードレール は最終的なエージェント出力に対して実行されます

ガードレールはエージェントに紐づきますが、ワークフロー内のすべてのエージェントで常に実行されるわけではありません:

  • 入力ガードレール はチェーン内の最初のエージェントでのみ実行されます
  • 出力ガードレール は最終出力を生成するエージェントでのみ実行されます
  • ツールガードレール はすべての関数ツール呼び出しで実行され、入力ガードレールは実行前、出力ガードレールは実行後に動作します

マネージャーやハンドオフを含むワークフローで、各カスタム関数ツール呼び出しごとにチェックが必要な場合は、エージェントレベルの入力/出力ガードレールではなく ツールガードレール を使用してください。

入力ガードレールは 3 つのステップで実行されます:

  1. ガードレールは、エージェントに渡されるものと同じ入力を受け取ります
  2. ガードレール関数が実行され、InputGuardrailResult にラップされた GuardrailFunctionOutput を返します
  3. tripwireTriggeredtrue の場合、InputGuardrailTripwireTriggered エラーがスローされます

Note 入力ガードレールはユーザー入力向けのため、エージェントがワークフローの 最初 のエージェントである場合にのみ実行されます。ガードレールはエージェント自体に設定されます。エージェントごとに必要なガードレールが異なることが多いためです。

  • runInParallel: true (デフォルト) は、LLM/ツール呼び出しと並行してガードレールを開始します。これによりレイテンシーは最小化されますが、後でガードレールがトリガーされた場合でも、モデルがすでにトークンを消費したりツールを実行したりしている可能性があります
  • runInParallel: false はモデル呼び出し にガードレールを実行し、ガードレールがリクエストをブロックしたときのトークン消費とツール実行を防ぎます。レイテンシーより安全性とコストを優先する場合に使用してください

出力ガードレールは 3 つのステップで実行されます:

  1. ガードレールは、エージェントが生成した出力を受け取ります
  2. ガードレール関数が実行され、OutputGuardrailResult にラップされた GuardrailFunctionOutput を返します
  3. tripwireTriggeredtrue の場合、OutputGuardrailTripwireTriggered エラーがスローされます

Note 出力ガードレールは、エージェントがワークフローの 最後 のエージェントである場合にのみ実行されます。リアルタイム音声インタラクションについては音声エージェントの構築を参照してください。

出力ガードレール関数は、オプションの details オブジェクトも受け取ります。ここには基になる modelResponse と、そのターンで生成された出力アイテムが含まれます。最終出力だけでは応答を通過させるべきか判断できない場合に利用してください。たとえば、ガードレールをトリガーする前に、生成されたアイテム一覧全体やプロバイダーのレスポンスメタデータを確認したい場合です。

ツールガードレールは 関数ツール をラップし、実行前後でツール呼び出しを検証またはブロックできます。ツール自体 (tool() オプション経由) に設定され、そのツールの呼び出しごとに実行されます。

実際には、tool({...})inputGuardrails および/または outputGuardrails を設定したカスタム関数ツールを指します。

  • 入力ツールガードレール はツール実行前に動作し、メッセージで呼び出しを拒否するか tripwire をスローできます
  • 出力ツールガードレール はツール実行後に動作し、出力を拒否メッセージに置き換えるか tripwire をスローできます

ツールガードレールは behavior を返します:

  • allow — 次のガードレールまたはツール実行に進みます
  • rejectContent — メッセージで短絡終了します (ツール呼び出しはスキップされるか、出力が置き換えられます)
  • throwException — ただちに tripwire エラーをスローします

ツールガードレールは、tool() で定義した関数ツールに適用されます。ハンドオフはモデルには関数ライクなツールとして提示されますが、通常の関数ツールパイプラインではなく SDK のハンドオフ経路で実行されるため、ツールガードレールはハンドオフ呼び出し自体には適用されません。組み込みツール(Hosted)や組み込み実行ツール (computerTool, shellTool, applyPatchTool) もこのガードレールパイプラインを使用せず、agent.asTool() も現時点ではツールガードレールオプションを直接公開していません。

ガードレールが失敗すると、tripwire によってそれを通知します。tripwire がトリガーされるとすぐに、runner は対応するエラーをスローし、実行を停止します。

ガードレールは、GuardrailFunctionOutput を返す関数です。以下は、内部で別のエージェントを実行して、ユーザーが数学の宿題支援を求めているかを確認する最小例です。

Input guardrail example
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);

出力ガードレールも同様に動作します。

Output guardrail example
import {
Agent,
run,
OutputGuardrailTripwireTriggered,
OutputGuardrail,
} from '@openai/agents';
import { z } from 'zod';
// The output by the main agent
const MessageOutput = z.object({ response: z.string() });
type MessageOutput = z.infer<typeof MessageOutput>;
// The output by the math guardrail agent
const MathOutput = z.object({ reasoning: z.string(), isMath: z.boolean() });
// The guardrail agent
const guardrailAgent = new Agent({
name: 'Guardrail check',
instructions: 'Check if the output includes any math.',
outputType: MathOutput,
});
// An output guardrail using an agent internally
const 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);

ツール入力/出力ガードレールは次のようになります:

Tool guardrails
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],
});
  1. guardrailAgent はガードレール関数内で使用されます
  2. ガードレール関数はエージェントの入力または出力を受け取り、結果を返します
  3. 追加情報をガードレール結果に含められます
  4. agent はガードレールが適用される実際のワークフローを定義します