o
    i,%                     @   s   d dl mZ d dl mZ d dl mZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ dddZG dd deZdS )    )Any)Optional)Sequence)core)get_argument_value)AGENT_MANIFEST)DISPATCH_ON_TOOL_CALL)INPUT_VALUE)METADATA)
MODEL_NAME)MODEL_PROVIDER)NAME)OUTPUT_VALUE)	SPAN_KIND)BaseLLMIntegration)	_get_attr)	safe_json)Spangoogle)z
google-glazgoogle-vertexc                       s  e Zd ZU dZi Zeeee f ed< dZ	dZ
d'dededeeef def fd	d
Zd(dedee ddfddZdee deeef fddZ		d)dedee deeef dee deddfddZdedee deeef dee ddf
ddZ	d(dedee deeef dee ddf
ddZdedeeef deddfddZdedeeeef  fddZded eddfd!d"Zdeddfd#d$Zdeddfd%d&Z  ZS )*PydanticAIIntegrationpydantic_ai_running_agentsNFoperation_idsubmit_to_llmobskwargsreturnc                    sB   t  j||fi |}|dd }|r| || |t| |S )Nkind)supertraceget_register_span_set_ctx_itemr   )selfr   r   r   spanr   	__class__ \/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/llmobs/_integrations/pydantic_ai.pyr   #   s   zPydanticAIIntegration.tracer#   modelc                 K   s:   |r|  |\}}|d| |r|d| d S d S d S )Npydantic_ai.request.modelpydantic_ai.request.provider)_get_model_and_providerset_tag)r"   r#   r(   r   
model_nameproviderr&   r&   r'   _set_base_span_tags+   s   z)PydanticAIIntegration._set_base_span_tagsc                 C   s0   t |dd}t |dd }|rt||}||fS )Nr-    system)getattrPYDANTIC_AI_SYSTEM_TO_PROVIDERr   )r"   r(   r-   r1   r&   r&   r'   r+   2   s
   z-PydanticAIIntegration._get_model_and_providerr0   argsresponse	operationc              
   C   sj   | t}|dkr| |||| n|dkr| |||| |t|t|dp)dt|dp0di d S )Nagenttoolr)   r0   r*   )_get_ctx_itemr   _llmobs_set_tags_agent_llmobs_set_tags_tool_set_ctx_itemsr   get_tagr   )r"   r#   r4   r   r5   r6   	span_kindr&   r&   r'   _llmobs_set_tags9   s   
z&PydanticAIIntegration._llmobs_set_tagsc                 C   s   ddl m} |dd }t|dd }| ||| t||dd}|}	t|	|r4t|	dr4t|	jdd}	n0t|	t	rdt
|	d	krd|	\}
}d}	t|
d
g D ]}t|drX|	|j7 }	qKt|drc|	| 7 }	qK|t|pjdt|t|	i d S )Nr   )AgentRuninstancenameuser_promptresultoutputr0      partscontentargs_as_json_strPydanticAI Agent)pydantic_ai.agentr@   r   r2   _tag_agent_manifestr   
isinstancehasattrrD   tuplelenrH   rI   r<   r   r	   r   )r"   r#   r4   r   r5   r@   agent_instance
agent_namerC   rD   model_response_partr&   r&   r'   r:   P   s.   

z,PydanticAIIntegration._llmobs_set_tags_agentc                 C   s   | dd }t||ddddpt||dddd}d}i }d}	|r4t|d	d}t|d
dp-d}t|dd}	t|dd }
|
rBt|
ddnt|dd}|t|td|it|i |jsft|ddp_|}|	t
| tt|t|tsst|n|d||	f d S )NrA   r   callT)optionalmessagezPydanticAI Toolr0   	tool_namer4   tool_call_idtool_defdescriptionrH   function)r   r   r   r<   r   r
   r	   errorr2   r!   r   r   dispatchr   rM   strr   )r"   r#   r4   r   r5   tool_instance	tool_callrY   
tool_inputtool_idr[   tool_descriptionoutput_contentr&   r&   r'   r;   l   s@   
z+PydanticAIIntegration._llmobs_set_tags_toolr7   c                 C   s   |sd S i }d|d< t |dr|jr|jnd|d< t|dd }|r.| |\}}|r.||d< t |dr8|j|d< t |drB|j|d< t |d	rL|j|d
< | ||d< |t	| d S )N
PydanticAI	frameworkrB   rJ   r(   model_settings_instructionsinstructions_system_promptssystem_promptstools)
rN   rB   r2   r+   ri   rj   rl   _get_agent_toolsr!   r   )r"   r#   r   r7   manifestr(   r-   rT   r&   r&   r'   rL      s$   





z)PydanticAIIntegration._tag_agent_manifestc                 C   sV  i }t |drt|di pi }n3t |dst |drCt|dg p!g }t|dd}|r1t||g n|}|D ]}|t|di p@i  q5|sGg S g }| D ][\}}	i }
||
d< t |	dra|	j|
d< t|	di }t|d	i }d
d |dg D }i }|di  D ]\}}i }d|v r|d |d< ||v rd|d< |||< q||
d< ||
 qM|S )aX  
        Extract tools from the agent and format them to be used in the agent manifest.

        For pydantic-ai < 0.4.4, tools are stored in the agent's _function_tools attribute.
        For pydantic-ai >= 0.4.4, tools are stored in the agent's _function_toolset (tools) and
        _user_toolsets (user-defined toolsets) attributes.
        _function_tools_user_toolsets_function_toolsetNrn   rB   r\   function_schemajson_schemac                 S   s   i | ]}|d qS )Tr&   ).0paramr&   r&   r'   
<dictcomp>   s    z:PydanticAIIntegration._get_agent_tools.<locals>.<dictcomp>required
propertiestypeT
parameters)rN   r2   listupdateitemsr\   r   append)r"   r7   rn   user_toolsetsfunction_toolsetcombined_toolsetstoolsetformatted_toolsrY   ra   	tool_dictrt   ru   required_paramsr|   rw   schema
param_dictr&   r&   r'   ro      s>   



z&PydanticAIIntegration._get_agent_toolsr   c                 C   s0   |dkr|  | d S |dkr| | d S d S )Nr7   r8   )_register_agent_register_tool)r"   r#   r   r&   r&   r'   r       s
   z$PydanticAIIntegration._register_spanc                 C   s   |j | _g | j|j < d S N)span_id_latest_agentr   r"   r#   r&   r&   r'   r      s   z%PydanticAIIntegration._register_agentc                 C   s&   | j d ur| j| j  |j d S d S r   )r   r   r   r   r   r&   r&   r'   r      s   
z$PydanticAIIntegration._register_tool)Fr   )Nr0   )__name__
__module____qualname___integration_namer   dictintr}   __annotations__r   _run_stream_activer`   boolr   r   r   r   r/   rO   r+   r?   r:   r;   rL   ro   r    r   r   __classcell__r&   r&   r$   r'   r      sf   
 (





")*r   N)typingr   r   r   ddtrace.internalr   ddtrace.internal.utilsr   ddtrace.llmobs._constantsr   r   r	   r
   r   r   r   r   r   !ddtrace.llmobs._integrations.baser   ddtrace.llmobs._utilsr   r   ddtrace.tracer   r3   r   r&   r&   r&   r'   <module>   s,    