
    tni                        U d dl 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
mZ d dlmZ erd dlmZmZ  ed	g 
          Zded<   d$dddeddfdZd%dZd&dZdefdZdefdZd'dZd(dZ	 	 	 	 	 	 	 	 d)dZd'd Zd$d!dd"eddfd#ZdS )*    N)
ContextVar)SPANDATA)should_send_default_pii)set_span_errored)event_from_exceptionsafe_serialize)TYPE_CHECKING)AnyOptionalpydantic_ai_agent_context_stack)defaultz ContextVar[list[dict[str, Any]]]_agent_context_stackFagentr
   is_streamingreturnc                     t                                                                           }|                    | |d           t                               |           dS )zCPush an agent context onto the stack along with its streaming flag.)r   r   N)r   getcopyappendset)r   r   stacks      f/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/sentry_sdk/integrations/pydantic_ai/utils.py
push_agentr      sS     $$&&++--E	LL5,??@@@U#####    c                      t                                                                           } | r|                                  t                               |            dS )z$Pop an agent context from the stack.N)r   r   r   popr   r   s    r   	pop_agentr      sN     $$&&++--E 		U#####r   c                  X    t                                           } | r| d         d         S dS )z0Get the current agent from the contextvar stack.r   Nr   r   r   s    r   get_current_agentr"   $   s/     $$&&E "Ry!!4r   c                  t    t                                           } | r| d                             dd          S dS )z1Get the streaming flag from the contextvar stack.r    r   Fr!   r   s    r   get_is_streamingr$   ,   s8     $$&&E 4Ry}}^U3335r   c                      t                      sdS ddlm}  t          j                                        |           }|dS t          |dd          S )z
    Check if prompts should be sent to Sentry.

    This checks both send_default_pii and the include_prompts integration setting.
    F   )PydanticAIIntegrationNinclude_prompts)r    r'   
sentry_sdk
get_clientget_integrationgetattr)r'   integrations     r   _should_send_promptsr/   4   sf     #$$ u'''''' '))99:OPPKu; 15999r   spansentry_sdk.tracing.Spanc                     |}|st                      }|r>t          |d          r0|j        r+|                     t          j        |j                   dS dS dS dS )zSet agent-related data on a span.

    Args:
        span: The span to set data on
        agent: Agent object (can be None, will try to get from contextvar if not provided)
    nameN)r"   hasattrr3   set_datar   GEN_AI_AGENT_NAME)r0   r   	agent_objs      r   _set_agent_datar8   H   s     I (%''	 BWY// BIN Bh0).AAAAAB B B B B Br   	model_objOptional[str]c                    | sdS t          | d          r| j        S t          | d          r4	 |                                 S # t          $ r t	          |           cY S w xY wt          | t                    r| S t	          |           S )zExtract model name from a model object.

    Args:
        model_obj: Model object to extract name from

    Returns:
        Model name string or None if not found
    N
model_namer3   )r4   r<   r3   	Exceptionstr
isinstance)r9   s    r   _get_model_namer@   Y   s      ty,'' 
##	F	#	# 	">>### 	" 	" 	"y>>!!!	"	Is	#	# 9~~s   A AAmodelmodel_settingsc                 B   t                      }|}|s|rt          |d          r|j        }|rft          |d          r%|                     t          j        |j                   t          |          }|r |                     t          j        |           |}|s|rt          |d          r|j	        }|rt          j
        t          j        t          j        t          j        t          j        d}t          |t                     rI|                                D ]2\  }}	|                    |          }
|
|                     |	|
           3dS |                                D ]?\  }}	t          ||          r(t'          ||          }
|
|                     |	|
           >dS dS )a  Set model-related data on a span.

    Args:
        span: The span to set data on
        model: Model object (can be None, will try to get from agent if not provided)
        model_settings: Model settings (can be None, will try to get from agent if not provided)
    rA   systemrB   )
max_tokenstemperaturetop_pfrequency_penaltypresence_penaltyN)r"   r4   rA   r5   r   GEN_AI_SYSTEMrD   r@   GEN_AI_REQUEST_MODELrB   GEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_P GEN_AI_REQUEST_FREQUENCY_PENALTYGEN_AI_REQUEST_PRESENCE_PENALTYr?   dictitemsr   r-   )r0   rA   rB   r7   r9   r<   settingssettings_mapsetting_namespandata_keyvalues              r   _set_model_datarX   r   s    "##I I $ $wy''B'B $O	 E9h'' 	DMM(0)2BCCC %Y//
 	EMM(7DDD H ,	 ,gi9I&J&J ,+ ;"<#>2!)!J ( H
 
 h%% 	;.:.@.@.B.B 7 7*l \22$MM,6667 7 /;.@.@.B.B ; ;*l8\22 ;#Hl;;E(lE:::+; ;"; ;r   c                    |rt          |d          sdS 	 g }t          |j        d          r|j        j                                        D ]k\  }}d|i}t          |d          r=|j        }t          |dd          r
|j        |d<   t          |dd          r
|j        |d<   |                    |           l|r/| 	                    t          j        t          |                     dS dS # t          $ r Y dS w xY w)	zSet available tools data on a span from an agent's function toolset.

    Args:
        span: The span to set data on
        agent: Agent object with _function_toolset attribute
    _function_toolsetNtoolsr3   function_schemadescriptionjson_schema
parameters)r4   rZ   r[   rR   r\   r-   r]   r^   r   r5   r   GEN_AI_REQUEST_AVAILABLE_TOOLSr   r=   )r0   r   r[   	tool_nametool	tool_infoschemas          r   _set_available_toolsre      sP     ':;; 5*G44 	(#(#:#@#F#F#H#H ( (	4#Y/	 4!233 E!1Fv}d;; F393E	-0 v}d;; E282D	,/Y'''' 	MM79N9N    	 	    s   CC* *
C87C8exchandledc                     t                       t          | t          j                    j        d|d          \  }}t          j        ||           d S )Npydantic_ai)typerg   )client_options	mechanism)hint)r   r   r*   r+   optionscapture_event)rf   rg   eventrm   s       r   _capture_exceptionrq      sa    &!,..6(W==  KE4
 U......r   )F)r   N)r   r
   )r0   r1   r   r
   r   N)r9   r
   r   r:   )r0   r1   rA   r
   rB   r
   r   N)r*   contextvarsr   sentry_sdk.constsr   sentry_sdk.scoper   sentry_sdk.tracing_utilsr   sentry_sdk.utilsr   r   typingr	   r
   r   r   __annotations__boolr   r   r"   r$   r/   r8   r@   rX   re   rq    r   r   <module>r{      s        " " " " " " & & & & & & 4 4 4 4 4 4 5 5 5 5 5 5 A A A A A A A A             %$$$$$$$$
 <F:%r< < < 8   
$ $e $4 $D $ $ $ $$ $ $ $   $    :d : : : :(B B B B"   26;
#6;,16;CH6;	6; 6; 6; 6;r# # # #L/ /E /D /T / / / / / /r   