o
    i/                     @  s  d dl mZmZ d dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dl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# ddl$m%Z%m&Z&m'Z' edZ(zHd dl)m*Z* d dl+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6mZ7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZBmCZC W n eDy ZE zeDdeEdZE[Eww edAdd ZFdddd!d"dddd#ddddd$dBd=d>ZGe
G d?d@ d@e<eHe  ee(e&f ZIdS )C    )annotationsr   N)AsyncIteratorSequence)asynccontextmanager)	dataclass)partial)AnyGenericTypeVar)TypeAdapter)assert_never)AudioUrlBinaryContentDocumentUrlImageUrlModelMessageModelRequestModelRequestPartModelResponseModelResponsePartTextPartThinkingPartToolCallPartUserPromptPartVideoUrl   )AbstractAgent
AgentDepsTOutputDataTWorkerOutputT)FastA2A)BrokerInMemoryBroker)	AgentProviderArtifactDataPartMessagePartSkillTaskIdParamsTaskSendParamsr   )InMemoryStorageStorage)Worker)
Middleware)Route)ExceptionHandlerLifespanu   Please install the `fasta2a` package to use `Agent.to_a2a()` method, you can use the `a2a` optional group — `pip install "pydantic-ai-slim[a2a]"`appr    workerr-   agent&AbstractAgent[AgentDepsT, OutputDataT]returnAsyncIterator[None]c                 C s   | j 4 I dH I |4 I dH , | 4 I dH  dV  W d  I dH  n1 I dH s,w   Y  W d  I dH  n1 I dH sAw   Y  W d  I dH  dS 1 I dH sWw   Y  dS )zCustom lifespan that runs the worker during application startup.

    This ensures the worker is started and ready to process tasks as soon as the application starts.
    N)task_managerrun)r2   r3   r4    r:   V/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pydantic_ai/_a2a.pyworker_lifespan=   s   *Xr<   zhttp://localhost:8000z1.0.0Fstoragebrokernameurlversiondescriptionproviderskillsdebugroutes
middlewareexception_handlerslifespanr>   Storage | Noner?   Broker | Noner@   
str | NonerA   strrB   rC   rD   AgentProvider | NonerE   list[Skill] | NonerF   boolrG   Sequence[Route] | NonerH   Sequence[Middleware] | NonerI   "dict[Any, ExceptionHandler] | NonerJ   Lifespan[FastA2A] | Nonec                C  s\   |pt  }|p	t }t| ||d}|ptt|| d}t|||p!| j||||||	|
|||dS )z&Create a FastA2A server from an agent.)r4   r?   r>   )r3   r4   r=   )r+   r"   AgentWorkerr   r<   r    r@   )r4   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r3   r:   r:   r;   agent_to_a2aJ   s&   

rW   c                   @  sj   e Zd ZU dZded< d&dd	Zd'ddZd(ddZd)ddZd*ddZ	d+ddZ
d,d d!Zd-d#d$Zd%S ).rV   z-A worker that uses an agent to execute tasks.z(AbstractAgent[AgentDepsT, WorkerOutputT]r4   paramsr*   r6   Nonec           	   
     s  | j |d I d H }|d u rtd|d  d|d d dkr3td|d  d|d d  d| j j|d d	d
I d H  | j |d I d H pLg }|| |dg  zF| jj	|dI d H }| j 
|d | I d H  g }| D ]}t|trqx| |j}|r|td|dtt d qx| |j}W n ty   | j j|d dd
I d H   w | j j|d d||dI d H  d S )NidzTask z
 not foundstatusstate	submittedz$ has already been processed (state: )working)r\   
context_idhistory)message_historyr4   message)rolepartskind
message_idfailed	completed)r\   new_artifactsnew_messages)r>   	load_task
ValueErrorupdate_taskload_contextextendbuild_message_historygetr4   r9   update_contextall_messagesrk   
isinstancer   _response_parts_to_a2are   appendr&   rN   uuiduuid4build_artifactsoutput	Exception)	selfrX   taskrb   resulta2a_messagesrc   	a2a_parts	artifactsr:   r:   r;   run_task{   s@   
zAgentWorker.run_taskr)   c                   s   d S )Nr:   )r}   rX   r:   r:   r;   cancel_task   s   zAgentWorker.cancel_taskr   r   list[Artifact]c                 C  s(   t t }| |}t|d|gdgS )a  Build artifacts from agent result.

        All agent outputs become artifacts to mark them as durable task outputs.
        For string results, we use TextPart. For structured data, we use DataPart.
        Metadata is included to preserve type information.
        r   )artifact_idr@   re   )rN   rx   ry   _convert_result_to_partr$   )r}   r   r   partr:   r:   r;   rz      s   
zAgentWorker.build_artifactsr'   c                 C  sV   t |trtd|dS t|}t|}|j|dd}|jdd}tdd|id|id	S )
zConvert agent result to a Part (TextPart or DataPart).

        For string results, returns a TextPart.
        For structured data, returns a DataPart with properly serialized data.
        textrf   r   json)modeserializationdatar   json_schema)rf   r   metadata)ru   rN   A2ATextParttyper   dump_pythonr   r%   )r}   r   output_typetype_adapterr   r   r:   r:   r;   r      s   
z#AgentWorker._convert_result_to_partra   list[Message]list[ModelMessage]c                 C  sT   g }|D ]#}|d dkr| t| |d d q| t| |d d q|S )Nrd   userre   )re   )rw   r   _request_parts_from_a2ar   _response_parts_from_a2a)r}   ra   model_messagesrc   r:   r:   r;   rq      s   z!AgentWorker.build_message_historyre   
list[Part]list[ModelRequestPart]c           
   
   C  s  g }|D ]}|d dkr| t|d d q|d dkru|d }d|v rB|d d}|dd}t||d	}| t|gd q|d
 }ttttfD ]}	|	|d}z|j	 W n	 t
ya   Y qLw  nt
d| | t|gd q|d dkrtdt| q|S )a  Convert A2A Part objects to pydantic-ai ModelRequestPart objects.

        This handles the conversion from A2A protocol parts (text, file, data) to
        pydantic-ai's internal request parts (UserPromptPart with various content types).

        Args:
            parts: List of A2A Part objects from incoming messages

        Returns:
            List of ModelRequestPart objects for the pydantic-ai agent
        rf   r   contentfilebyteszutf-8	mime_typezapplication/octet-stream)r   
media_typeuri)rA   zUnsupported file type: r   !Data parts are not supported yet.)rw   r   encoderr   r   r   r   r   r   r   rm   NotImplementedErrorr   )
r}   re   model_partsr   file_contentr   r   r   rA   url_clsr:   r:   r;   r      s4   


z#AgentWorker._request_parts_from_a2alist[ModelResponsePart]c                 C  sd   g }|D ]+}|d dkr| t|d d q|d dkr!td|d dkr+tdt| q|S )a  Convert A2A Part objects to pydantic-ai ModelResponsePart objects.

        This handles the conversion from A2A protocol parts (text, file, data) to
        pydantic-ai's internal response parts. Currently only supports text parts
        as agent responses in A2A are expected to be text-based.

        Args:
            parts: List of A2A Part objects from stored agent messages

        Returns:
            List of ModelResponsePart objects for message history
        rf   r   r   r   z!File parts are not supported yet.r   r   )rw   r   r   r   )r}   re   r   r   r:   r:   r;   r      s   
z$AgentWorker._response_parts_from_a2aSequence[ModelResponsePart]c              
   C  sl   g }|D ]/}t |tr|td|jd qt |tr-|td|jd|j|jdd qt |tr3	 q|S )af  Convert pydantic-ai ModelResponsePart objects to A2A Part objects.

        This handles the conversion from pydantic-ai's internal response parts to
        A2A protocol parts. Different part types are handled as follows:
        - TextPart: Converted directly to A2A TextPart
        - ThinkingPart: Converted to TextPart with metadata indicating it's thinking
        - ToolCallPart: Skipped (internal to agent execution)

        Args:
            parts: List of ModelResponsePart objects from agent response

        Returns:
            List of A2A Part objects suitable for sending via A2A protocol
        r   r   thinking)r   thinking_id	signature)rf   r   r   )	ru   r   rw   r   r   r   rZ   r   r   )r}   re   r   r   r:   r:   r;   rv     s    


z"AgentWorker._response_parts_to_a2aN)rX   r*   r6   rY   )rX   r)   r6   rY   )r   r   r6   r   )r   r   r6   r'   )ra   r   r6   r   )re   r   r6   r   )re   r   r6   r   )re   r   r6   r   )__name__
__module____qualname____doc____annotations__r   r   rz   r   rq   r   r   rv   r:   r:   r:   r;   rV   u   s   
 

/



	
*rV   )r2   r    r3   r-   r4   r5   r6   r7   )r4   r5   r>   rK   r?   rL   r@   rM   rA   rN   rB   rN   rC   rM   rD   rO   rE   rP   rF   rQ   rG   rR   rH   rS   rI   rT   rJ   rU   r6   r    )J
__future__r   _annotationsrx   collections.abcr   r   
contextlibr   dataclassesr   	functoolsr   typingr   r	   r
   pydanticr   typing_extensionsr   pydantic_air   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r   r   r   r   fasta2a.applicationsr    fasta2a.brokerr!   r"   fasta2a.schemar#   r$   r%   r&   r'   r(   r)   r*   r   fasta2a.storager+   r,   fasta2a.workerr-   starlette.middlewarer.   starlette.routingr/   starlette.typesr0   r1   ImportError_import_errorr<   rW   listrV   r:   r:   r:   r;   <module>   s^    @,+(