o
    ٰin                     @   s  d dl Z d dlZd dlmZ d dlmZ ddlmZmZ d dl	Z	d dl
mZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ erRd dlmZmZmZ d dlmZ zd dlZd dlmZ W n eyi   edw 						d#ddZ						d$ddZ								 d%d!d"ZdS )&    N)wraps)DidNotEnable   )ai_client_spanupdate_ai_client_span)SPANDATA)logger)BAGGAGE_HEADER_NAME)should_propagate_traceadd_sentry_baggage_to_headers)TYPE_CHECKING)AnyCallableOptional)Span)HostedMCPToolzOpenAI Agents not installedagentagents.Agentresponse_modelOptional[str]returnc                 C   s.   |rt | dd}|r|tj| dS dS dS )zESet the response model on the agent's invoke_agent span if available._sentry_agent_spanN)getattrset_datar   GEN_AI_RESPONSE_MODEL)r   r   
agent_span r   h/home/ubuntu/.local/lib/python3.10/site-packages/sentry_sdk/integrations/openai_agents/patches/models.py!_set_response_model_on_agent_span   s   r   hosted_toolr   spanr   c                 C   s   | j d}|d u ri }|| j d< | j d}|sd S tt |rHt j|dD ]\}}tdj	|||d |t
krCt|| q*|||< q*d S d S )Nheaders
server_urlr    zI[Tracing] Adding `{key}` header {value} to outgoing request to {mcp_url}.)keyvaluemcp_url)tool_configgetr
   
sentry_sdk
get_clientget_current_scopeiter_trace_propagation_headersr   debugformatr	   r   )r   r    r!   r&   r$   r%   r   r   r   !_inject_trace_propagation_headers)   s,   

r/   original_get_modelCallable[..., agents.Model]
run_configagents.RunConfigagents.Modelc                    s   t  |  |}t|dr|jnt|}| _t|dr.|jtd fdd}||_|jtd fd	d
}||_t|drW|jtd fdd}||_|S )z
    Responsible for
    - creating and managing AI client spans.
    - adding trace propagation headers to tools with type HostedMCPTool.
    - setting the response model on agent invocation spans.
    model_fetch_responseargsr   kwargsr   c                     s6   | i |I d H }t |dr|jrt|j _|S )Nr5   )hasattrr5   str_sentry_response_model)r7   r8   response)r   original_fetch_responser   r   wrapped_fetch_response\   s
   z*_get_model.<locals>.wrapped_fetch_responsec                     s   | d}g }|d urdd |D }t |7}|D ]}t||d q| i |I d H }t dd }|r;t d t | t|||  W d    |S 1 sRw   Y  |S )Ntoolsc                 S      g | ]	}t |tr|qS r   
isinstancer   .0toolr   r   r   
<listcomp>l   
    
z<_get_model.<locals>.wrapped_get_response.<locals>.<listcomp>r#   r;   )r(   r   r/   r   delattrr   r   )r7   r8   	mcp_toolshosted_toolsr    r   resultr   )r   original_get_responser   r   wrapped_get_responseg   s(   



z(_get_model.<locals>.wrapped_get_responsestream_responsec                    sv  t |}t| dkr| d |d< t| dkr| d |d< g }t| dkr4| d }|d ur4dd |D }t |x}|D ]}t||d q<|tjd	 d }d
}t }	| i |2 z'3 d H W }
|swt	|
drwt |	 }|tj
| d	}t	|
dr|
j}|
V  q[6 |rt	|dr|jrt|jnd }t | t|||  W d    d S W d    d S 1 sw   Y  d S )Nr   system_instructions   input   c                 S   r@   r   rA   rC   r   r   r   rF      rG   z?_get_model.<locals>.wrapped_stream_response.<locals>.<listcomp>r#   TFdeltar<   r5   )dictlenr   r/   r   r   GEN_AI_RESPONSE_STREAMINGtimeperf_counterr9   #GEN_AI_RESPONSE_TIME_TO_FIRST_TOKENr<   r5   r:   r   r   )r7   r8   span_kwargsrJ   rI   r    r   streaming_responsettft_recorded
start_timeeventttftr   )r   original_stream_responser   r   wrapped_stream_response   sZ   

"z+_get_model.<locals>.wrapped_stream_responseN)r7   r   r8   r   r   r   )	copyr9   r5   r:   _sentry_request_modelr6   r   get_responserN   )r0   r   r2   r5   request_model_namer>   rM   ra   r   )r   r=   rL   r`   r   
_get_modelE   s$   

8rf   )r   r   r   r   r   N)r   r   r    r   r   N)r0   r1   r   r   r2   r3   r   r4   ) rb   rW   	functoolsr   sentry_sdk.integrationsr   spansr   r   r)   sentry_sdk.constsr   sentry_sdk.utilsr   sentry_sdk.tracingr	   sentry_sdk.tracing_utilsr
   r   typingr   r   r   r   r   agentsagents.toolr   ImportErrorr   r/   rf   r   r   r   r   <module>   sV    


