o
    ia                  
   @  s  U d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	m
Z
 d dlmZmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d	d
lmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d	dl.m/Z/ d	dl0m1Z1m2Z2 d	dl3m4Z4 erd dl5m6Z6 dZ7	 edZ8	 edZ9	 ee2e B Z:de;d< 	 e	e1e gdf e	e1e ged f B e	e1e gee8 f B Z<de;d< 	 eG dd deee9e8e4e/f Z=dS )    )annotationsN)ABCabstractmethod)AsyncIterator	AwaitableCallableMapping)	dataclassfield)TYPE_CHECKINGAnyGenericLiteral	TypeAliasTypeVarcast)uuid4)_utils   )AgentStreamEventBuiltinToolCallEventBuiltinToolCallPartBuiltinToolResultEventBuiltinToolReturnPartFilePartFinalResultEventFunctionToolCallEventFunctionToolResultEventPartDeltaEventPartEndEventPartStartEventTextPartTextPartDeltaThinkingPartThinkingPartDeltaToolCallPartToolCallPartDeltaToolReturnPart)OutputDataT)AgentRunResultAgentRunResultEvent)
AgentDepsTStreamingResponseztext/event-streamEventT	RunInputTr   NativeEventOnCompleteFuncc                   @  s  e Zd ZU dZded< dZded< 	 edd d	Zd
ed< 	 dZded< dZ	ded< dZ
ded< dddZedddZedddZedddZdd!d"Zdd$d%Z	ddd)d*Zdd,d-Zdd/d0Zdd2d3Zdd5d6Zdd8d9Zdd:d;Zdd<d=Zdd@dAZddBdCZddDdEZddFdGZddHdIZdddOdPZ ddSdTZ!dddVdWZ"dddZd[Z#dd]d^Z$	Jddd`daZ%ddcddZ&ddfdgZ'ddhdiZ(ddkdlZ)ddmdnZ*ddpdqZ+ddsdtZ,ddvdwZ-ddydzZ.dd|d}Z/dddZ0dS )UIEventStreamzBase class for UI event stream transformers.

    This class is responsible for transforming Pydantic AI events into protocol-specific events.
    r/   	run_inputNz
str | Noneacceptc                   C  s
   t t S N)strr    r7   r7   b/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pydantic_ai/ui/_event_stream.py<lambda>I   s   
 zUIEventStream.<lambda>)default_factoryr6   
message_id%Literal['request', 'response'] | None_turnz"AgentRunResult[OutputDataT] | None_resultzFinalResultEvent | None_final_result_eventreturnc                 C  s   t t | _| jS )z$Generate and store a new message ID.)r6   r   r;   selfr7   r7   r8   new_message_idQ   s   zUIEventStream.new_message_idMapping[str, str] | Nonec                 C  s   dS )z+Response headers to return to the frontend.Nr7   rA   r7   r7   r8   response_headersV      zUIEventStream.response_headersc                 C  s   t S )ax  Get the content type for the event stream, compatible with the `Accept` header value.

        By default, this returns the Server-Sent Events content type (`text/event-stream`).
        If a subclass supports other types as well, it should consider `self.accept` in [`encode_event()`][pydantic_ai.ui.UIEventStream.encode_event] and return the resulting content type.
        )SSE_CONTENT_TYPErA   r7   r7   r8   content_type[   s   zUIEventStream.content_typeeventr.   c                 C  s   t )z-Encode a protocol-specific event as a string.)NotImplementedErrorrB   rI   r7   r7   r8   encode_eventd   rF   zUIEventStream.encode_eventstreamAsyncIterator[EventT]AsyncIterator[str]c                 C s&   |2 z3 dH W }|  |V  q6 dS )z^Encode a stream of protocol-specific events as strings according to the `Accept` header value.N)rL   )rB   rM   rI   r7   r7   r8   encode_streami   s   zUIEventStream.encode_streamr-   c              
   C  sL   zddl m} W n ty } ztd|d}~ww || || j| jdS )zHGenerate a streaming response from a stream of protocol-specific events.r   r,   u   Please install the `starlette` package to use the `streaming_response()` method, you can use the `ui` optional group — `pip install "pydantic-ai-slim[ui]"`N)headers
media_type)starlette.responsesr-   ImportErrorrP   rE   rH   )rB   rM   r-   er7   r7   r8   streaming_responsen   s   z UIEventStream.streaming_responseAsyncIterator[NativeEvent]on_completeOnCompleteFunc[EventT] | Nonec           	      C s  |   2 z	3 dH W }|V  q6 z-z|2 z3 dH W }t|tr1| d2 z	3 dH W }|V  q%6 nt|trG| d2 z	3 dH W }|V  q;6 nt|tr| jr| jj }r| jj }r| d2 z	3 dH W }|V  q`6 d| _t	t
||ddd}| |2 z	3 dH W }|V  q}6 ttt |j}|| _| d2 z	3 dH W }|V  q6 |durt|r||2 z	3 dH W }|V  q6 nt|r||I dH  nt||I dH  nt|tr|| _t|ttB rq| |2 z	3 dH W }|V  q6 q6 W n$ ty } z| |2 z
3 dH W }|V  q6 W Y d}~nd}~ww W | d2 z
3 dH W }|V  q!6 |  2 z
3 dH W }|V  q16 dS | d2 z
3 dH W }|V  qD6 |  2 z
3 dH W }|V  qT6 w )a`  Transform a stream of Pydantic AI events into protocol-specific events.

        This method dispatches to specific hooks and `handle_*` methods that subclasses can override:
        - [`before_stream()`][pydantic_ai.ui.UIEventStream.before_stream]
        - [`after_stream()`][pydantic_ai.ui.UIEventStream.after_stream]
        - [`on_error()`][pydantic_ai.ui.UIEventStream.on_error]
        - [`before_request()`][pydantic_ai.ui.UIEventStream.before_request]
        - [`after_request()`][pydantic_ai.ui.UIEventStream.after_request]
        - [`before_response()`][pydantic_ai.ui.UIEventStream.before_response]
        - [`after_response()`][pydantic_ai.ui.UIEventStream.after_response]
        - [`handle_event()`][pydantic_ai.ui.UIEventStream.handle_event]

        Args:
            stream: The stream of Pydantic AI events to transform.
            on_complete: Optional callback function called when the agent run completes successfully.
                The callback receives the completed [`AgentRunResult`][pydantic_ai.agent.AgentRunResult] and can optionally yield additional protocol-specific events.
        NresponserequestzFinal result processed.)tool_call_id	tool_namecontent)result)before_stream
isinstancer    _turn_tor   r*   r?   r\   r]   r   r'   handle_function_tool_resultr   r)   r(   r_   r>   inspectisasyncgenfunctionr   is_async_callablerun_in_executorr   r   r   handle_event	Exceptionon_errorafter_stream)	rB   rM   rX   rU   rI   r\   r]   output_tool_result_eventr_   r7   r7   r8   transform_stream~   s   







3




zUIEventStream.transform_streamto_turnc                 C s   || j krdS | j dkr|  2 z	3 dH W }|V  q6 n| j dkr1|  2 z	3 dH W }|V  q&6 || _ |dkrI|  2 z	3 dH W }|V  q<6 dS |dkr^|  2 z	3 dH W }|V  qQ6 dS dS )z?Fire hooks when turning from request to response or vice versa.Nr[   rZ   )r=   after_requestafter_responsebefore_requestbefore_response)rB   rn   rU   r7   r7   r8   rb      s*   


zUIEventStream._turn_tor0   c                 C st  | t d r  | |2 z	3 dH W }|V  q6 dS   td r5  | |2 z	3 dH W }|V  q(6 dS   td rO  | |2 z	3 dH W }|V  qB6 dS   td ri  | |2 z	3 dH W }|V  q\6 dS   td r  | 	|2 z	3 dH W }|V  qv6 dS   t
d r  | |2 z	3 dH W }|V  q6 dS  td r | |2 z	3 dH W }|V  q6 dS  	 	 dS )aB  Transform a Pydantic AI event into one or more protocol-specific events.

        This method dispatches to specific `handle_*` methods based on event type:

        - [`PartStartEvent`][pydantic_ai.messages.PartStartEvent] -> [`handle_part_start()`][pydantic_ai.ui.UIEventStream.handle_part_start]
        - [`PartDeltaEvent`][pydantic_ai.messages.PartDeltaEvent] -> `handle_part_delta`
        - [`PartEndEvent`][pydantic_ai.messages.PartEndEvent] -> `handle_part_end`
        - [`FinalResultEvent`][pydantic_ai.messages.FinalResultEvent] -> `handle_final_result`
        - [`FunctionToolCallEvent`][pydantic_ai.messages.FunctionToolCallEvent] -> `handle_function_tool_call`
        - [`FunctionToolResultEvent`][pydantic_ai.messages.FunctionToolResultEvent] -> `handle_function_tool_result`
        - [`AgentRunResultEvent`][pydantic_ai.run.AgentRunResultEvent] -> `handle_run_result`

        Subclasses are encouraged to override the individual `handle_*` methods rather than this one.
        If you need specific behavior for all events, make sure you call the super method.
        r7   N)r    handle_part_startr   handle_part_deltar   handle_part_endr   handle_final_resultr   handle_function_tool_callr   rc   r*   handle_run_result)rB   rI   rU   r7   r7   r8   rh      sN   
zUIEventStream.handle_eventr    c                 C sX  |j }|j}| td r%  | j||dkd2 z	3 dH W }|V  q6 dS   td rC  | j||dkd2 z	3 dH W }|V  q66 dS   td r]  | |2 z	3 dH W }|V  qP6 dS   td rw  | 	|2 z	3 dH W }|V  qj6 dS   t
d r  | |2 z	3 dH W }|V  q6 dS  td r | |2 z	3 dH W }|V  q6 dS  dS )a  Handle a `PartStartEvent`.

        This method dispatches to specific `handle_*` methods based on part type:

        - [`TextPart`][pydantic_ai.messages.TextPart] -> [`handle_text_start()`][pydantic_ai.ui.UIEventStream.handle_text_start]
        - [`ThinkingPart`][pydantic_ai.messages.ThinkingPart] -> [`handle_thinking_start()`][pydantic_ai.ui.UIEventStream.handle_thinking_start]
        - [`ToolCallPart`][pydantic_ai.messages.ToolCallPart] -> [`handle_tool_call_start()`][pydantic_ai.ui.UIEventStream.handle_tool_call_start]
        - [`BuiltinToolCallPart`][pydantic_ai.messages.BuiltinToolCallPart] -> [`handle_builtin_tool_call_start()`][pydantic_ai.ui.UIEventStream.handle_builtin_tool_call_start]
        - [`BuiltinToolReturnPart`][pydantic_ai.messages.BuiltinToolReturnPart] -> [`handle_builtin_tool_return()`][pydantic_ai.ui.UIEventStream.handle_builtin_tool_return]
        - [`FilePart`][pydantic_ai.messages.FilePart] -> [`handle_file()`][pydantic_ai.ui.UIEventStream.handle_file]

        Subclasses are encouraged to override the individual `handle_*` methods rather than this one.
        If you need specific behavior for all part start events, make sure you call the super method.

        Args:
            event: The part start event.
        r7   text)follows_textNthinking)follows_thinking)partprevious_part_kindr!   handle_text_startr#   handle_thinking_startr%   handle_tool_call_startr   handle_builtin_tool_call_startr   handle_builtin_tool_returnr   handle_file)rB   rI   r}   r~   rU   r7   r7   r8   rs     sD   
zUIEventStream.handle_part_startr   c                 C s   |j }| td r  | |2 z	3 dH W }|V  q6 dS   td r8  | |2 z	3 dH W }|V  q+6 dS  td rP | |2 z	3 dH W }|V  qC6 dS  dS )aM  Handle a PartDeltaEvent.

        This method dispatches to specific `handle_*_delta` methods based on part delta type:

        - [`TextPartDelta`][pydantic_ai.messages.TextPartDelta] -> [`handle_text_delta()`][pydantic_ai.ui.UIEventStream.handle_text_delta]
        - [`ThinkingPartDelta`][pydantic_ai.messages.ThinkingPartDelta] -> [`handle_thinking_delta()`][pydantic_ai.ui.UIEventStream.handle_thinking_delta]
        - [`ToolCallPartDelta`][pydantic_ai.messages.ToolCallPartDelta] -> [`handle_tool_call_delta()`][pydantic_ai.ui.UIEventStream.handle_tool_call_delta]

        Subclasses are encouraged to override the individual `handle_*_delta` methods rather than this one.
        If you need specific behavior for all part delta events, make sure you call the super method.

        Args:
            event: The PartDeltaEvent.
        r7   N)deltar"   handle_text_deltar$   handle_thinking_deltar&   handle_tool_call_delta)rB   rI   r   rU   r7   r7   r8   rt   9  s$   
zUIEventStream.handle_part_deltar   c                 C s  |j }|j}| td r%  | j||dkd2 z	3 dH W }|V  q6 dS   td rC  | j||dkd2 z	3 dH W }|V  q66 dS   td r]  | |2 z	3 dH W }|V  qP6 dS   td rw  | 	|2 z	3 dH W }|V  qj6 dS   t
d r  dS   td r  dS   dS )a  Handle a `PartEndEvent`.

        This method dispatches to specific `handle_*_end` methods based on part type:

        - [`TextPart`][pydantic_ai.messages.TextPart] -> [`handle_text_end()`][pydantic_ai.ui.UIEventStream.handle_text_end]
        - [`ThinkingPart`][pydantic_ai.messages.ThinkingPart] -> [`handle_thinking_end()`][pydantic_ai.ui.UIEventStream.handle_thinking_end]
        - [`ToolCallPart`][pydantic_ai.messages.ToolCallPart] -> [`handle_tool_call_end()`][pydantic_ai.ui.UIEventStream.handle_tool_call_end]
        - [`BuiltinToolCallPart`][pydantic_ai.messages.BuiltinToolCallPart] -> [`handle_builtin_tool_call_end()`][pydantic_ai.ui.UIEventStream.handle_builtin_tool_call_end]

        Subclasses are encouraged to override the individual `handle_*_end` methods rather than this one.
        If you need specific behavior for all part end events, make sure you call the super method.

        Args:
            event: The part end event.
        r7   ry   )followed_by_textNr{   )followed_by_thinking)r}   next_part_kindr!   handle_text_endr#   handle_thinking_endr%   handle_tool_call_endr   handle_builtin_tool_call_endr   r   )rB   rI   r}   r   rU   r7   r7   r8   ru   T  s:   zUIEventStream.handle_part_endc                 C    dS )zYield events before agent streaming starts.

        This hook is called before any agent events are processed.
        Override this to inject custom events at the start of the stream.
        Nr7   rA   r7   r7   r8   r`   w     zUIEventStream.before_streamc                 C r   )zYield events after agent streaming completes.

        This hook is called after all agent events have been processed.
        Override this to inject custom events at the end of the stream.
        Nr7   rA   r7   r7   r8   rk     r   zUIEventStream.after_streamerrorri   c                 C r   )zHandle errors that occur during streaming.

        Args:
            error: The error that occurred during streaming.
        Nr7   )rB   r   r7   r7   r8   rj     r   zUIEventStream.on_errorc                 C r   )zYield events before a model request is processed.

        Override this to inject custom events at the start of the request.
        Nr7   rA   r7   r7   r8   rq        zUIEventStream.before_requestc                 C r   )zYield events after a model request is processed.

        Override this to inject custom events at the end of the request.
        Nr7   rA   r7   r7   r8   ro     r   zUIEventStream.after_requestc                 C r   )zYield events before a model response is processed.

        Override this to inject custom events at the start of the response.
        Nr7   rA   r7   r7   r8   rr     r   zUIEventStream.before_responsec                 C r   )zYield events after a model response is processed.

        Override this to inject custom events at the end of the response.
        Nr7   rA   r7   r7   r8   rp     r   zUIEventStream.after_responseFr}   r!   rz   boolc                 C r   )a
  Handle the start of a `TextPart`.

        Args:
            part: The text part.
            follows_text: Whether the part is directly preceded by another text part. In this case, you may want to yield a "text-delta" event instead of a "text-start" event.
        Nr7   )rB   r}   rz   r7   r7   r8   r        zUIEventStream.handle_text_startr   r"   c                 C r   )zYHandle a `TextPartDelta`.

        Args:
            delta: The text part delta.
        Nr7   rB   r   r7   r7   r8   r     r   zUIEventStream.handle_text_deltar   c                 C r   )zHandle the end of a `TextPart`.

        Args:
            part: The text part.
            followed_by_text: Whether the part is directly followed by another text part. In this case, you may not want to yield a "text-end" event yet.
        Nr7   )rB   r}   r   r7   r7   r8   r     r   zUIEventStream.handle_text_endr#   r|   c                 C r   )a"  Handle the start of a `ThinkingPart`.

        Args:
            part: The thinking part.
            follows_thinking: Whether the part is directly preceded by another thinking part. In this case, you may want to yield a "thinking-delta" event instead of a "thinking-start" event.
        Nr7   )rB   r}   r|   r7   r7   r8   r     r   z#UIEventStream.handle_thinking_startr$   c                 C r   )zaHandle a `ThinkingPartDelta`.

        Args:
            delta: The thinking part delta.
        Nr7   r   r7   r7   r8   r     r   z#UIEventStream.handle_thinking_deltar   c                 C r   )a  Handle the end of a `ThinkingPart`.

        Args:
            part: The thinking part.
            followed_by_thinking: Whether the part is directly followed by another thinking part. In this case, you may not want to yield a "thinking-end" event yet.
        Nr7   )rB   r}   r   r7   r7   r8   r     s   	z!UIEventStream.handle_thinking_endr%   c                 C r   )zcHandle the start of a `ToolCallPart`.

        Args:
            part: The tool call part.
        Nr7   rB   r}   r7   r7   r8   r     r   z$UIEventStream.handle_tool_call_startr&   c                 C r   )zbHandle a `ToolCallPartDelta`.

        Args:
            delta: The tool call part delta.
        Nr7   r   r7   r7   r8   r     r   z$UIEventStream.handle_tool_call_deltac                 C r   )zaHandle the end of a `ToolCallPart`.

        Args:
            part: The tool call part.
        Nr7   r   r7   r7   r8   r      r   z"UIEventStream.handle_tool_call_endr   c                 C r   )znHandle a `BuiltinToolCallPart` at start.

        Args:
            part: The builtin tool call part.
        Nr7   r   r7   r7   r8   r   	  r   z,UIEventStream.handle_builtin_tool_call_startc                 C r   )zpHandle the end of a `BuiltinToolCallPart`.

        Args:
            part: The builtin tool call part.
        Nr7   r   r7   r7   r8   r     r   z*UIEventStream.handle_builtin_tool_call_endr   c                 C r   )ziHandle a `BuiltinToolReturnPart`.

        Args:
            part: The builtin tool return part.
        Nr7   r   r7   r7   r8   r     r   z(UIEventStream.handle_builtin_tool_returnr   c                 C r   )zMHandle a `FilePart`.

        Args:
            part: The file part.
        Nr7   r   r7   r7   r8   r   $  r   zUIEventStream.handle_filer   c                 C r   )z_Handle a `FinalResultEvent`.

        Args:
            event: The final result event.
        Nr7   rK   r7   r7   r8   rv   -  r   z!UIEventStream.handle_final_resultr   c                 C r   )zjHandle a `FunctionToolCallEvent`.

        Args:
            event: The function tool call event.
        Nr7   rK   r7   r7   r8   rw   6  r   z'UIEventStream.handle_function_tool_callr   c                 C r   )znHandle a `FunctionToolResultEvent`.

        Args:
            event: The function tool result event.
        Nr7   rK   r7   r7   r8   rc   ?  r   z)UIEventStream.handle_function_tool_resultr*   c                 C r   )zgHandle an `AgentRunResultEvent`.

        Args:
            event: The agent run result event.
        Nr7   rK   r7   r7   r8   rx   H  r   zUIEventStream.handle_run_result)r@   r6   )r@   rD   )rI   r.   r@   r6   )rM   rN   r@   rO   )rM   rN   r@   r-   r5   )rM   rW   rX   rY   r@   rN   )rn   r<   r@   rN   )rI   r0   r@   rN   )rI   r    r@   rN   )rI   r   r@   rN   )rI   r   r@   rN   )r@   rN   )r   ri   r@   rN   )F)r}   r!   rz   r   r@   rN   )r   r"   r@   rN   )r}   r!   r   r   r@   rN   )r}   r#   r|   r   r@   rN   )r   r$   r@   rN   )r}   r#   r   r   r@   rN   )r}   r%   r@   rN   )r   r&   r@   rN   )r}   r   r@   rN   )r}   r   r@   rN   )r}   r   r@   rN   )rI   r   r@   rN   )rI   r   r@   rN   )rI   r   r@   rN   )rI   r*   r@   rN   )1__name__
__module____qualname____doc____annotations__r4   r
   r;   r=   r>   r?   rC   propertyrE   rH   r   rL   rP   rV   rm   rb   rh   rs   rt   ru   r`   rk   rj   rq   ro   rr   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   rv   rw   rc   rx   r7   r7   r7   r8   r2   =   sf   
 



U

)
(

#
	
	
	




	





	
	
	
	
	
	
	
	
		r2   )>
__future__r   rd   abcr   r   collections.abcr   r   r   r   dataclassesr	   r
   typingr   r   r   r   r   r   r   uuidr   pydantic_air   messagesr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   outputr(   runr)   r*   toolsr+   rS   r-   rG   r.   r/   r0   r   r1   r2   r7   r7   r7   r8   <module>   s>    $T
$