44 defineOutputGuardrail ,
55 InputGuardrail ,
66 InputGuardrailDefinition ,
7+ InputGuardrailResult ,
78 OutputGuardrail ,
89 OutputGuardrailDefinition ,
910 OutputGuardrailFunctionArgs ,
@@ -603,6 +604,34 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
603604 AgentOutputType < unknown >
604605 > [ ] ;
605606
607+ #getInputGuardrailDefinitions<
608+ TContext ,
609+ TAgent extends Agent < TContext , AgentOutputType > ,
610+ > ( state : RunState < TContext , TAgent > ) : InputGuardrailDefinition [ ] {
611+ return this . inputGuardrailDefs . concat (
612+ state . _currentAgent . inputGuardrails . map ( defineInputGuardrail ) ,
613+ ) ;
614+ }
615+
616+ #splitInputGuardrails<
617+ TContext ,
618+ TAgent extends Agent < TContext , AgentOutputType > ,
619+ > ( state : RunState < TContext , TAgent > ) {
620+ const guardrails = this . #getInputGuardrailDefinitions( state ) ;
621+ const blocking : InputGuardrailDefinition [ ] = [ ] ;
622+ const parallel : InputGuardrailDefinition [ ] = [ ] ;
623+
624+ for ( const guardrail of guardrails ) {
625+ if ( guardrail . runInParallel === false ) {
626+ blocking . push ( guardrail ) ;
627+ } else {
628+ parallel . push ( guardrail ) ;
629+ }
630+ }
631+
632+ return { blocking, parallel } ;
633+ }
634+
606635 /**
607636 * @internal
608637 * Resolves the effective model once so both run loops obey the same precedence rules.
@@ -738,8 +767,21 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
738767 `Running agent ${ state . _currentAgent . name } (turn ${ state . _currentTurn } )` ,
739768 ) ;
740769
770+ let parallelGuardrailPromise :
771+ | Promise < InputGuardrailResult [ ] >
772+ | undefined ;
741773 if ( state . _currentTurn === 1 ) {
742- await this . #runInputGuardrails( state ) ;
774+ const guardrails = this . #splitInputGuardrails( state ) ;
775+ if ( guardrails . blocking . length > 0 ) {
776+ await this . #runInputGuardrails( state , guardrails . blocking ) ;
777+ }
778+ if ( guardrails . parallel . length > 0 ) {
779+ parallelGuardrailPromise = this . #runInputGuardrails(
780+ state ,
781+ guardrails . parallel ,
782+ ) ;
783+ parallelGuardrailPromise . catch ( ( ) => { } ) ;
784+ }
743785 }
744786
745787 const turnInput = serverConversationTracker
@@ -829,6 +871,10 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
829871 state . _currentTurnPersistedItemCount = 0 ;
830872 }
831873 state . _currentStep = turnResult . nextStep ;
874+
875+ if ( parallelGuardrailPromise ) {
876+ await parallelGuardrailPromise ;
877+ }
832878 }
833879
834880 if (
@@ -1007,8 +1053,25 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
10071053 `Running agent ${ currentAgent . name } (turn ${ result . state . _currentTurn } )` ,
10081054 ) ;
10091055
1056+ let guardrailError : unknown ;
1057+ let parallelGuardrailPromise :
1058+ | Promise < InputGuardrailResult [ ] >
1059+ | undefined ;
10101060 if ( result . state . _currentTurn === 1 ) {
1011- await this . #runInputGuardrails( result . state ) ;
1061+ const guardrails = this . #splitInputGuardrails( result . state ) ;
1062+ if ( guardrails . blocking . length > 0 ) {
1063+ await this . #runInputGuardrails( result . state , guardrails . blocking ) ;
1064+ }
1065+ if ( guardrails . parallel . length > 0 ) {
1066+ const promise = this . #runInputGuardrails(
1067+ result . state ,
1068+ guardrails . parallel ,
1069+ ) ;
1070+ parallelGuardrailPromise = promise . catch ( ( err ) => {
1071+ guardrailError = err ;
1072+ return [ ] ;
1073+ } ) ;
1074+ }
10121075 }
10131076
10141077 const turnInput = serverConversationTracker
@@ -1038,6 +1101,10 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
10381101 sessionInputUpdate ,
10391102 ) ;
10401103
1104+ if ( guardrailError ) {
1105+ throw guardrailError ;
1106+ }
1107+
10411108 handedInputToModel = true ;
10421109 await persistStreamInputIfNeeded ( ) ;
10431110
@@ -1064,6 +1131,9 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
10641131 ) ,
10651132 signal : options . signal ,
10661133 } ) ) {
1134+ if ( guardrailError ) {
1135+ throw guardrailError ;
1136+ }
10671137 if ( event . type === 'response_done' ) {
10681138 const parsed = StreamEventResponseCompleted . parse ( event ) ;
10691139 finalResponse = {
@@ -1080,6 +1150,13 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
10801150 result . _addItem ( new RunRawModelStreamEvent ( event ) ) ;
10811151 }
10821152
1153+ if ( parallelGuardrailPromise ) {
1154+ await parallelGuardrailPromise ;
1155+ if ( guardrailError ) {
1156+ throw guardrailError ;
1157+ }
1158+ }
1159+
10831160 result . state . _noActiveAgentRun = false ;
10841161
10851162 if ( ! finalResponse ) {
@@ -1276,10 +1353,12 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
12761353 async #runInputGuardrails<
12771354 TContext ,
12781355 TAgent extends Agent < TContext , AgentOutputType > ,
1279- > ( state : RunState < TContext , TAgent > ) {
1280- const guardrails = this . inputGuardrailDefs . concat (
1281- state . _currentAgent . inputGuardrails . map ( defineInputGuardrail ) ,
1282- ) ;
1356+ > (
1357+ state : RunState < TContext , TAgent > ,
1358+ guardrailsOverride ?: InputGuardrailDefinition [ ] ,
1359+ ) : Promise < InputGuardrailResult [ ] > {
1360+ const guardrails =
1361+ guardrailsOverride ?? this . #getInputGuardrailDefinitions( state ) ;
12831362 if ( guardrails . length > 0 ) {
12841363 const guardrailArgs = {
12851364 agent : state . _currentAgent ,
@@ -1300,6 +1379,7 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
13001379 ) ;
13011380 } ) ,
13021381 ) ;
1382+ state . _inputGuardrailResults . push ( ...results ) ;
13031383 for ( const result of results ) {
13041384 if ( result . output . tripwireTriggered ) {
13051385 if ( state . _currentAgentSpan ) {
@@ -1315,6 +1395,7 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
13151395 ) ;
13161396 }
13171397 }
1398+ return results ;
13181399 } catch ( e ) {
13191400 if ( e instanceof InputGuardrailTripwireTriggered ) {
13201401 throw e ;
@@ -1328,6 +1409,7 @@ export class Runner extends RunHooks<any, AgentOutputType<unknown>> {
13281409 ) ;
13291410 }
13301411 }
1412+ return [ ] ;
13311413 }
13321414
13331415 async #runOutputGuardrails<
0 commit comments