o
    S۷i                     @   s  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r5d dlmZmZ ed	g d
Zded< d.dddeddfddZd/ddZd0ddZdefddZdefddZd1ddZd2d"d#Z			$		%			d3d&d'Zd1d(d)Zd.d*dd+eddfd,d-ZdS )4    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                 C   s*   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   stack r   _/home/ubuntu/vllm_env/lib/python3.10/site-packages/sentry_sdk/integrations/pydantic_ai/utils.py
push_agent   s   r   c                  C   s&   t   } | r|   t |  dS )z$Pop an agent context from the stack.N)r   r   r   popr   r   r   r   r   	pop_agent   s   r   c                  C   s   t  } | r| d d S dS )z0Get the current agent from the contextvar stack.r   Nr   r   r   r   r   r   get_current_agent$   s   r   c                  C   s    t  } | r| d ddS dS )z1Get the streaming flag from the contextvar stack.r   r   Fr   r   r   r   r   get_is_streaming,   s   r   c                  C   s<   t  sdS ddlm}  t | }|du r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!   integrationr   r   r   _should_send_prompts4   s   r)   spansentry_sdk.tracing.Spanc                 C   sB   |}|st  }|rt|dr|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   hasattrr,   set_datar   GEN_AI_AGENT_NAME)r*   r   	agent_objr   r   r   _set_agent_dataH   s   r1   	model_objOptional[str]c                 C   s^   | sdS t | dr| jS t | dr$z|  W S  ty#   t|  Y S 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_namer,   )r-   r4   r,   	Exceptionstr
isinstance)r2   r   r   r   _get_model_nameY   s   	



r8   modelmodel_settingsc                 C   s  t  }|}|s|rt|dr|j}|r-t|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 ]\}}	||}
|
durf| |	|
 qSdS | D ]\}}	t||rt||}
|
dur| |	|
 qmd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)
    r9   systemr:   )
max_tokenstemperaturetop_pfrequency_penaltypresence_penaltyN)r   r-   r9   r.   r   GEN_AI_SYSTEMr;   r8   GEN_AI_REQUEST_MODELr:   GEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_P GEN_AI_REQUEST_FREQUENCY_PENALTYGEN_AI_REQUEST_PRESENCE_PENALTYr7   dictitemsr   r'   )r*   r9   r:   r0   r2   r4   settingssettings_mapsetting_namespandata_keyvaluer   r   r   _set_model_datar   sF   

	


rO   c                 C   s   |rt |ds	dS zKg }t |jdrD|jj D ]+\}}d|i}t |dr>|j}t|ddr3|j|d< t|ddr>|j|d< || q|rR| 	t
jt| W dS W dS  ty^   Y dS 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toolsr,   function_schemadescriptionjson_schema
parameters)r-   rP   rQ   rI   rR   r'   rS   rT   r   r.   r   GEN_AI_REQUEST_AVAILABLE_TOOLSr   r5   )r*   r   rQ   	tool_nametool	tool_infoschemar   r   r   _set_available_tools   s,   




r[   exchandledc                 C   s6   t   t| t jd|dd\}}tj||d d S )Npydantic_ai)typer]   )client_options	mechanism)hint)r   r   r$   r%   optionscapture_event)r\   r]   eventrb   r   r   r   _capture_exception   s   
rf   )F)r   N)r   r	   )r*   r+   r   r	   r   N)r2   r	   r   r3   )r*   r+   r9   r	   r:   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)   r1   r8   rO   r[   rf   r   r   r   r   <module>   s<   
 





9&