o
    i5                     @   s  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 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Zi ddddddddddddddddddddddd dd!dd"dd#dd$d$d%d&Z	d>d'eeeef  d(ed)ee d*eeef fd+d,Zd*eeeef  fd-d.Zd*eeef fd/d0Zd*eeef fd1d2Zd3ed*efd4d5Zd6d7 Zd?d*efd8d9Zd:d; Zd*ee fd<d=Z dS )@    N)Any)Optional)#BILLABLE_CHARACTER_COUNT_METRIC_KEY)"CACHE_READ_INPUT_TOKENS_METRIC_KEY)INPUT_TOKENS_METRIC_KEY)OUTPUT_TOKENS_METRIC_KEY)"REASONING_OUTPUT_TOKENS_METRIC_KEY)TOTAL_TOKENS_METRIC_KEY)	_get_attr)	safe_json)Message)ToolCall)
ToolResult	assistantgeminigoogleimagenveoztext-embeddingjambaai21claude	anthropicllamametamistral	codestraldeepseekolmoai2tulumolmospectercosmooqodomarszcamb.aikwargsinstancemodel_name_attrreturnc                 C   s   d}| dur|  dd}n|dur|durt||d}|r"t|ts$dS d|v r/|dd n|}t D ]}| |rHt| }||f  S q5d|rO|fS dfS )a  
    Function to extract provider and model name from either kwargs or instance attributes.
    Args:
        kwargs: Dictionary containing model information (used for google_genai)
        instance: Model instance with attributes (used for vertexai)
        model_name_attr: Attribute name to extract from instance (e.g., "_model_name", "model_name", used for vertexai)

    Returns:
        tuple of (provider_name, model_name)
     Nmodel)customr+   /r+   )	getr
   
isinstancestrsplitKNOWN_MODEL_PREFIX_TO_PROVIDERkeyslower
startswith)r%   r&   r'   
model_path
model_nameprefixprovider_name r:   ]/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/llmobs/_integrations/google_utils.pyextract_provider_and_model_name/   s   r<   c                    s.   dd  t | tr fdd| D S  | gS )a$  
    contents has a complex union type structure:
    - contents: Union[ContentListUnion, ContentListUnionDict]
    - ContentListUnion = Union[list[ContentUnion], ContentUnion]
    - ContentListUnionDict = Union[list[ContentUnionDict], ContentUnionDict]
    - ContentUnion = Union[Content, list[PartUnion], PartUnion]
    - PartUnion = Union[File, Part, str]

    Can also be used for system_instruction which has type ContentUnion

    This function normalizes all these variants into a list of dicts with format{"role": role, "parts": parts}
    c                 S   sR   t | dd }t | dd }|d u rt| tr| }n| g}nt|ts$|g}||dS )Nroleparts)r=   r>   )r
   r/   list)contentr=   r>   r:   r:   r;   extract_content\   s   


z8normalize_contents_google_genai.<locals>.extract_contentc                    s   g | ]} |qS r:   r:   ).0crA   r:   r;   
<listcomp>m   s    z3normalize_contents_google_genai.<locals>.<listcomp>)r/   r?   )contentsr:   rD   r;   normalize_contents_google_genaiN   s   

rG   c           	      C   s   | si S t | di }|si S i }t |dd}t |dd}t |dd}|dus*|dur3|p-d|p0d }nd}t |dd}t |ddpD|| }|durM||t< |durU||t< |dur]||t< |dure||t< |durm||t< |S )	z
    Extract usage metrics from Google GenAI response or Google ADK Event object.

    Args:
        response: Google GenAI response object or ADK Event object

    Returns:
        Dictionary with token usage metrics
    usage_metadataprompt_token_countNcandidates_token_countthoughts_token_countr   cached_content_token_counttotal_token_count)r
   r   r   r   r	   r   )	responserH   usageinput_tokenscandidates_tokensthought_tokensoutput_tokenscached_tokenstotal_tokensr:   r:   r;   'extract_generation_metrics_google_genaiq   s2   
rV   c                 C   s   | si S i }t | di }t |dd }d}t | dg }|d ur |ng D ]}t |di }|t |dd7 }q"|d ur;||t< |rCt||t< |S )Nmetadatabillable_character_countr   
embeddings
statisticstoken_count)r
   r   intr   )rN   rO   rW   rX   rP   rY   	embeddingrZ   r:   r:   r;   &extract_embedding_metrics_google_genai   s   r^   r=   c                 C   s  |dkrt }t|d}t| tr| |d< |S t| dd}|r"d|d< t| dd	}|r2t||d< |S t| d
d	}|rattt|ddpCdtt|di pLi tt|ddpUdd
d}|g|d< |S t| dd	}|rt|ddppd}ttt|ddpzdt|tr|nt	|tt|ddpddd}	|	g|d< |S t| dd	}
|
rt|
dd}t|
dd}t
t|t|dpd|d< |S t| dd	}|rt|dd}t|dd}t
t|t|dpd|d< |S tdt| |d S )!zpart is a PartUnion = Union[File, Part, PIL_Image, str]

    returns a dict representing a message with format {"role": role, "content": content}
    r*   )r=   r@   thoughtF	reasoningr=   textNfunction_callnamer)   argsidrc   	argumentstool_idtype
tool_callsfunction_responserN   rc   resultrh   ri   tool_resultsexecutable_codelanguageUNKNOWNcode)rp   rr   code_execution_resultoutcomeOUTCOME_UNSPECIFIEDoutput)rt   rv   zUnsupported file type: {})r@   r=   )GOOGLE_GENAI_DEFAULT_MODEL_ROLEr   r/   r0   r
   r   dictr   jsondumpsr   formatri   )partr=   messager_   ra   rb   tool_call_infork   rm   tool_result_inforo   rp   rr   rs   rt   rv   r:   r:   r;   &extract_message_from_part_google_genai   s^   



r   c           	      C   s   i }t |di p	i }t|dr| n|}| di pi }t|dr&| n|}d}|D ]}t||d }t||d }|s>|rD|pA|||< q,|S )N_generation_configto_dictgeneration_config)temperaturemax_output_tokenscandidate_counttop_ptop_k)getattrhasattrr   r.   r
   )	r%   r&   rW   model_configrequest_config
parametersparammodel_config_valuerequest_config_valuer:   r:   r;   llmobs_get_metadata_vertexai   s   r   c                 C   s  t | dd}t | dd }t | dd }tt|d}|r||d< |rH|}t|ts/t||}t|dd|di |d	ddd
}|g|d< |r|}t|tsXt||}|dd}	t|	tsht	
|	}	t|dd|	|d	ddd}
|
g|d< d|d< |S )Nra   r)   rb   rk   )r@   r=   rc   rd   re   rf   rj   rN   rl   rn   user)r
   r   r0   r/   rx   ri   r   r   r.   ry   rz   r   )r|   r=   ra   rb   rk   r}   function_call_dictr~   function_response_dictrm   r   r:   r:   r;   "extract_message_from_part_vertexai   sB   










r   c                 C   s  zddl m} W n ty   d}Y nw zddlm} W n ty'   d}Y nw t| dg }|durJt||rJg }|jD ]}|t	|dd q<|S t|t
rR|gS |durbt||rbt	|ddgS t|tsig S g }|D ]}t|t
rz|| qm|durt||r|t	|dd qm|S )zR
    Extract system instructions from model and convert to []str for tagging.
    r   )ContentN)Part_system_instructionra   r)   )1google.ai.generativelanguage_v1beta.types.contentr   ImportError-vertexai.generative_models._generative_modelsr   r   r/   r>   appendr
   r0   r?   )model_instancer   r   raw_system_instructionssystem_instructionsr|   elemr:   r:   r;    get_system_instructions_vertexai#  s<   



r   c                 C   s~   g }t | ts
| g} | D ]0}t|dd}|sqt|dt}t|dg }t |ts+|g}|D ]}t||}|r;|| q-q|S )z
    Extract messages from Google ADK Event objects.

    Args:
        events: list of ADK Event objects or single Event object

    Returns:
        list of message dictionaries with format {"role": role, "content": content, ...}
    r@   Nr=   r>   )r/   r?   r
   rw   r   r   )eventsmessageseventr@   r=   r>   r|   r}   r:   r:   r;    extract_messages_from_adk_eventsF  s$   




r   )NNN)N)!ry   typingr   r   ddtrace.llmobs._constantsr   r   r   r   r   r	   ddtrace.llmobs._utilsr
   r   ddtrace.llmobs.typesr   r   r   rw   r2   rx   r0   tupler<   r?   rG   rV   r^   r   r   r   r   r   r:   r:   r:   r;   <module>   s    	


#,>$#