@@ -245,7 +245,7 @@ async def run(
245
245
result_type : None = None ,
246
246
message_history : list [_messages .ModelMessage ] | None = None ,
247
247
model : models .Model | models .KnownModelName | None = None ,
248
- deps : AgentDepsT = None ,
248
+ deps : AgentDepsT | None = None ,
249
249
model_settings : ModelSettings | None = None ,
250
250
usage_limits : _usage .UsageLimits | None = None ,
251
251
usage : _usage .Usage | None = None ,
@@ -260,7 +260,7 @@ async def run(
260
260
result_type : type [RunResultDataT ],
261
261
message_history : list [_messages .ModelMessage ] | None = None ,
262
262
model : models .Model | models .KnownModelName | None = None ,
263
- deps : AgentDepsT = None ,
263
+ deps : AgentDepsT | None = None ,
264
264
model_settings : ModelSettings | None = None ,
265
265
usage_limits : _usage .UsageLimits | None = None ,
266
266
usage : _usage .Usage | None = None ,
@@ -274,7 +274,7 @@ async def run(
274
274
result_type : type [RunResultDataT ] | None = None ,
275
275
message_history : list [_messages .ModelMessage ] | None = None ,
276
276
model : models .Model | models .KnownModelName | None = None ,
277
- deps : AgentDepsT = None ,
277
+ deps : AgentDepsT | None = None ,
278
278
model_settings : ModelSettings | None = None ,
279
279
usage_limits : _usage .UsageLimits | None = None ,
280
280
usage : _usage .Usage | None = None ,
@@ -338,7 +338,7 @@ async def iter(
338
338
result_type : type [RunResultDataT ] | None = None ,
339
339
message_history : list [_messages .ModelMessage ] | None = None ,
340
340
model : models .Model | models .KnownModelName | None = None ,
341
- deps : AgentDepsT = None ,
341
+ deps : AgentDepsT | None = None ,
342
342
model_settings : ModelSettings | None = None ,
343
343
usage_limits : _usage .UsageLimits | None = None ,
344
344
usage : _usage .Usage | None = None ,
@@ -499,7 +499,7 @@ def run_sync(
499
499
* ,
500
500
message_history : list [_messages .ModelMessage ] | None = None ,
501
501
model : models .Model | models .KnownModelName | None = None ,
502
- deps : AgentDepsT = None ,
502
+ deps : AgentDepsT | None = None ,
503
503
model_settings : ModelSettings | None = None ,
504
504
usage_limits : _usage .UsageLimits | None = None ,
505
505
usage : _usage .Usage | None = None ,
@@ -514,7 +514,7 @@ def run_sync(
514
514
result_type : type [RunResultDataT ] | None ,
515
515
message_history : list [_messages .ModelMessage ] | None = None ,
516
516
model : models .Model | models .KnownModelName | None = None ,
517
- deps : AgentDepsT = None ,
517
+ deps : AgentDepsT | None = None ,
518
518
model_settings : ModelSettings | None = None ,
519
519
usage_limits : _usage .UsageLimits | None = None ,
520
520
usage : _usage .Usage | None = None ,
@@ -528,7 +528,7 @@ def run_sync(
528
528
result_type : type [RunResultDataT ] | None = None ,
529
529
message_history : list [_messages .ModelMessage ] | None = None ,
530
530
model : models .Model | models .KnownModelName | None = None ,
531
- deps : AgentDepsT = None ,
531
+ deps : AgentDepsT | None = None ,
532
532
model_settings : ModelSettings | None = None ,
533
533
usage_limits : _usage .UsageLimits | None = None ,
534
534
usage : _usage .Usage | None = None ,
@@ -589,7 +589,7 @@ def run_stream(
589
589
result_type : None = None ,
590
590
message_history : list [_messages .ModelMessage ] | None = None ,
591
591
model : models .Model | models .KnownModelName | None = None ,
592
- deps : AgentDepsT = None ,
592
+ deps : AgentDepsT | None = None ,
593
593
model_settings : ModelSettings | None = None ,
594
594
usage_limits : _usage .UsageLimits | None = None ,
595
595
usage : _usage .Usage | None = None ,
@@ -604,7 +604,7 @@ def run_stream(
604
604
result_type : type [RunResultDataT ],
605
605
message_history : list [_messages .ModelMessage ] | None = None ,
606
606
model : models .Model | models .KnownModelName | None = None ,
607
- deps : AgentDepsT = None ,
607
+ deps : AgentDepsT | None = None ,
608
608
model_settings : ModelSettings | None = None ,
609
609
usage_limits : _usage .UsageLimits | None = None ,
610
610
usage : _usage .Usage | None = None ,
@@ -619,7 +619,7 @@ async def run_stream( # noqa C901
619
619
result_type : type [RunResultDataT ] | None = None ,
620
620
message_history : list [_messages .ModelMessage ] | None = None ,
621
621
model : models .Model | models .KnownModelName | None = None ,
622
- deps : AgentDepsT = None ,
622
+ deps : AgentDepsT | None = None ,
623
623
model_settings : ModelSettings | None = None ,
624
624
usage_limits : _usage .UsageLimits | None = None ,
625
625
usage : _usage .Usage | None = None ,
@@ -685,12 +685,29 @@ async def stream_to_final(
685
685
s : models .StreamedResponse ,
686
686
) -> FinalResult [models .StreamedResponse ] | None :
687
687
result_schema = graph_ctx .deps .result_schema
688
+ parts_seen : list [_messages .ModelResponsePart ] = []
688
689
async for maybe_part_event in streamed_response :
689
690
if isinstance (maybe_part_event , _messages .PartStartEvent ):
690
691
new_part = maybe_part_event .part
692
+ parts_seen .append (new_part )
691
693
if isinstance (new_part , _messages .TextPart ):
692
- if _agent_graph .allow_text_result (result_schema ):
693
- return FinalResult (s , None , None )
694
+ # Only treat empty text as final if:
695
+ # 1. It's the only part we've seen AND
696
+ # 2. We've consumed all events (no more parts coming)
697
+ # Otherwise, require non-empty content
698
+ if new_part .has_content ():
699
+ if _agent_graph .allow_text_result (result_schema ):
700
+ return FinalResult (s , None , None )
701
+ elif len (parts_seen ) == 1 :
702
+ # For empty text, peek ahead to see if there are more parts
703
+ more_parts = False
704
+ async for next_event in streamed_response :
705
+ if isinstance (next_event , _messages .PartStartEvent ):
706
+ parts_seen .append (next_event .part )
707
+ more_parts = True
708
+ break
709
+ if not more_parts and _agent_graph .allow_text_result (result_schema ):
710
+ return FinalResult (s , None , None )
694
711
elif isinstance (new_part , _messages .ToolCallPart ) and result_schema :
695
712
for call , _ in result_schema .find_tool ([new_part ]):
696
713
return FinalResult (s , call .tool_name , call .tool_call_id )
@@ -1192,7 +1209,7 @@ def _get_model(self, model: models.Model | models.KnownModelName | None) -> mode
1192
1209
1193
1210
return model_
1194
1211
1195
- def _get_deps (self : Agent [T , ResultDataT ], deps : T ) -> T :
1212
+ def _get_deps (self : Agent [T , ResultDataT ], deps : T | None ) -> T :
1196
1213
"""Get deps for a run.
1197
1214
1198
1215
If we've overridden deps via `_override_deps`, use that, otherwise use the deps passed to the call.
@@ -1202,7 +1219,9 @@ def _get_deps(self: Agent[T, ResultDataT], deps: T) -> T:
1202
1219
if some_deps := self ._override_deps :
1203
1220
return some_deps .value
1204
1221
else :
1205
- return deps
1222
+ if deps is None and self ._deps_type is not NoneType :
1223
+ raise ValueError ("deps cannot be None when _override_deps is not set and deps_type is not NoneType" )
1224
+ return deps # type: ignore
1206
1225
1207
1226
def _infer_name (self , function_frame : FrameType | None ) -> None :
1208
1227
"""Infer the agent name from the call frame.
0 commit comments