4444 'BaseEventStream' ,
4545]
4646
47+ SSE_CONTENT_TYPE = 'text/event-stream'
48+ """Content type header value for Server-Sent Events (SSE)."""
49+
4750EventT = TypeVar ('EventT' )
4851"""Type variable for protocol-specific event types."""
4952
@@ -65,12 +68,15 @@ class BaseEventStream(ABC, Generic[RunRequestT, EventT, AgentDepsT, OutputDataT]
6568 """TODO (DouwM): Docstring."""
6669
6770 request : RunRequestT
68- result : AgentRunResult [OutputDataT ] | None = None
71+
72+ accept : str | None = None
73+ """TODO (DouweM): Docstring"""
6974
7075 message_id : str = field (default_factory = lambda : str (uuid4 ()))
7176
7277 _turn : Literal ['request' , 'response' ] | None = None
7378
79+ _result : AgentRunResult [OutputDataT ] | None = None
7480 _final_result_event : FinalResultEvent | None = None
7581
7682 def new_message_id (self ) -> str :
@@ -82,25 +88,35 @@ def new_message_id(self) -> str:
8288 self .message_id = str (uuid4 ())
8389 return self .message_id
8490
91+ @property
92+ def content_type (self ) -> str :
93+ """Get the content type for the event stream, compatible with the accept header value.
94+
95+ By default, this returns the SSE content type (`text/event-stream`).
96+ If a subclass supports other types as well, it should consider `self.accept` in `encode_event` and return the resulting content type here.
97+
98+ Args:
99+ accept: The accept header value.
100+ """
101+ return SSE_CONTENT_TYPE
102+
85103 @abstractmethod
86- def encode_event (self , event : EventT , accept : str | None = None ) -> str :
104+ def encode_event (self , event : EventT ) -> str :
87105 """Encode an event as a string.
88106
89107 Args:
90108 event: The event to encode.
91- accept: The accept header value for encoding format.
92109 """
93110 raise NotImplementedError
94111
95- async def encode_stream (self , stream : AsyncIterator [EventT ], accept : str | None = None ) -> AsyncIterator [str ]:
112+ async def encode_stream (self , stream : AsyncIterator [EventT ]) -> AsyncIterator [str ]:
96113 """Encode a stream of events as SSE strings.
97114
98115 Args:
99116 stream: The stream of events to encode.
100- accept: The accept header value for encoding format.
101117 """
102118 async for event in stream :
103- yield self .encode_event (event , accept )
119+ yield self .encode_event (event )
104120
105121 async def handle_stream ( # noqa: C901
106122 self , stream : AsyncIterator [SourceEvent ], on_complete : OnCompleteFunc [EventT ] | None = None
@@ -147,19 +163,20 @@ async def handle_stream( # noqa: C901
147163 async for e in self .handle_function_tool_result (output_tool_result_event ):
148164 yield e
149165
150- self .result = cast (AgentRunResult [OutputDataT ], event .result )
166+ result = cast (AgentRunResult [OutputDataT ], event .result )
167+ self ._result = result
151168
152169 async for e in self ._turn_to (None ):
153170 yield e
154171
155172 if on_complete is not None :
156173 if inspect .isasyncgenfunction (on_complete ):
157- async for e in on_complete (self . result ):
174+ async for e in on_complete (result ):
158175 yield e
159176 elif _utils .is_async_callable (on_complete ):
160- await on_complete (self . result )
177+ await on_complete (result )
161178 else :
162- await _utils .run_in_executor (on_complete , self . result )
179+ await _utils .run_in_executor (on_complete , result )
163180 elif isinstance (event , FinalResultEvent ):
164181 self ._final_result_event = event
165182
0 commit comments