
    \j                         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rd dlmZmZmZ d dlmZ 	 d dlZd dlmZ 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZy# e$ r	  ed      w xY w)    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 installedc                 j    |r1t        | dd      }|r!|j                  t        j                  |       yyy)zESet the response model on the agent's invoke_agent span if available._sentry_agent_spanN)getattrset_datar   GEN_AI_RESPONSE_MODEL)agentresponse_model
agent_spans      ^/root/env/lib/python3.12/site-packages/sentry_sdk/integrations/openai_agents/patches/models.py!_set_response_model_on_agent_spanr      s9     U$8$?
 > >O      c                    | j                   j                  d      }|i }|| j                   d<   | j                   j                  d      }|sy t        t        j                         |      rot        j
                         j                  |      D ]G  \  }}t        j                  dj                  |||             |t        k(  rt        ||       C|||<   I y y )Nheaders
server_urlspanzI[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   )hosted_toolr"   r   r%   r#   r$   s         r   !_inject_trace_propagation_headersr/   )   s     %%)))4G-4	*%%)),7Gj335w? ))+JJPTJU	% 
LL[bb5' c 
 ))-gu=$	% @r   c                   	
 t        j                    | |            }t        |d      r|j                  n
t        |      }|_        t        |d      r(|j
                  t              dfd       }||_        |j                  	t        	      d	fd       }||_        t        |d      r(|j                  
t        
      d
f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_responsec                     K    | i | d {   }t        |d      r&|j                  rt        |j                        _        |S 7 8w)Nr1   )hasattrr1   str_sentry_response_model)argskwargsresponser   original_fetch_responses      r   wrapped_fetch_responsez*_get_model.<locals>.wrapped_fetch_response\   sE     4dEfEEHx)hnn/28>>/B,O Fs   A
A9A
c                  ~  K   |j                  d      }g }| |D cg c]  }t        |t              s| }}t        	|      5 }|D ]  }t	        ||         
| i | d {   }t        	dd       }|rt        	d       t        	|       t        |||	       d d d        |S c c}w 7 H# 1 sw Y   S xY ww)Ntoolsr!   r6   )	r'   
isinstancer   r   r/   r   delattrr   r   )r7   r8   	mcp_toolshosted_toolstoolr"   r.   resultr   r   original_get_responses            r   wrapped_get_responsez(_get_model.<locals>.wrapped_get_responseg   s     JJw'	 !*j}.ML  E6* 	Gd+ J1+DIJ 1$A&AAF %U,DdKN78-e^D!$F	G % B		G s>   B=B)B)B= B0%B.&9B0B=.B00B:5B=stream_responsec                 V  K   t        |      }t        |       dkD  r| d   |d<   t        |       dkD  r| d   |d<   g }t        |       dkD  r'| d   }| |D cg c]  }t        |t              s| }}t	        |      5 }|D ]  }t        ||        |j                  t        j                  d       d }d}	t        j                         }
 | i |2 3 d {   }|	sEt        |d	      r9t        j                         |
z
  }|j                  t        j                  |       d}	t        |d
      r|j                  }| nc c}w 7 n6 |rIt        |d      r!|j                  rt        |j                        nd }t!        |       t#        |||       d d d        y # 1 sw Y   y xY ww)Nr   system_instructions   input   r!   TFdeltar9   r1   )dictlenr>   r   r   r/   r   r   GEN_AI_RESPONSE_STREAMINGtimeperf_counterr4   #GEN_AI_RESPONSE_TIME_TO_FIRST_TOKENr9   r1   r5   r   r   )r7   r8   span_kwargsrA   r@   rB   r"   r.   streaming_responsettft_recorded
start_timeeventttftr   r   original_stream_responses                 r   wrapped_stream_responsez+_get_model.<locals>.wrapped_stream_response   s    v,K4y1}59!W124y1}'+AwG$L4y1} G	()2$!%j}6U$L $  {3 $t#/ NK5kMN h@@$G%)" %!..0
#;T#LV#L    %(WUG-D#002Z?$HH$ )- uj1-2^^*K7$ #L & ##5w?.44 .445 "	 # 6e^L)0.%E$ $ $s]   AF)E,E0F)>AFEEEA&FF)EAF	F)F&"F))r7   r   r8   r   returnr   )	copyr4   r1   r5   _sentry_request_modelr2   r   get_responserF   )original_get_modelr   
run_configr1   request_model_namer;   rE   rZ   r:   rD   rY   s    `      @@@r   
_get_modelrb   E   s     II(
;<E )0w(?SZ"4E u'("'"7"7	&	'	 
(	 !7!..
 ! "0 .E u'(#(#8#8 	'	(4	 
)4	l !8Lr   )r   agents.Agentr   zOptional[str]r[   N)r.   r   r"   r   r[   N)r_   zCallable[..., agents.Model]r   rc   r`   zagents.RunConfigr[   zagents.Model) r\   rP   	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/   rb    r   r   <module>rp      s       0 9  & # 2
 !..'6)
PP+:P	P% %(.%	%8z5zz #z 	zU  6
4
556s   
A? ?B