o
    i!                     @   sD  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 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 g dZg dZ G dd deZ!dS )    )Any)Optional)Span)INPUT_DOCUMENTS)INPUT_MESSAGES)METADATA)METRICS)
MODEL_NAME)MODEL_PROVIDER)OUTPUT_MESSAGES)OUTPUT_VALUE)	SPAN_KIND)TOOL_DEFINITIONS)BaseLLMIntegration)GOOGLE_GENAI_DEFAULT_MODEL_ROLE)&extract_embedding_metrics_google_genai)'extract_generation_metrics_google_genai)&extract_message_from_part_google_genai)extract_provider_and_model_name)normalize_contents_google_genai	_get_attr)Document)Message)ToolDefinition)temperaturetop_ptop_kcandidate_countmax_output_tokensstop_sequencesresponse_logprobslogprobspresence_penaltyfrequency_penaltyseedresponse_mime_typesafety_settingsautomatic_function_calling)	task_typetitleoutput_dimensionality	mime_typeauto_truncatec                   @   s.  e Zd ZdZ	d%dedee dee deeef ddf
dd	Z			
d&dede
e deeef dee deddfddZdd Zdd Zde
e deeef de
e fddZdede
e fddZde
e fddZdefddZde
e fddZdeeef fdd Zdefd!d"Zde
e fd#d$ZdS )'GoogleGenAIIntegrationgoogle_genaiNspanprovidermodelkwargsreturnc                 K   s0   |d ur
| d| |d ur| d| d S d S )Nzgoogle_genai.request.providerzgoogle_genai.request.model)_set_tag_str)selfr0   r1   r2   r3    r7   ]/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/llmobs/_integrations/google_genai.py_set_base_span_tags:   s
   z*GoogleGenAIIntegration._set_base_span_tags argsresponse	operationc                 C   sx   t |d\}}|d urt|ddp|}|t|t|t|i |dkr,| |||| d S |dkr:| |||| d S d S )N)r3   model_versionr:   	embeddingllm)r   getattr_set_ctx_itemsr   r	   r
   _llmobs_set_tags_from_embedding_llmobs_set_tags_from_llm)r6   r0   r;   r3   r<   r=   provider_name
model_namer7   r7   r8   _llmobs_set_tagsB   s   z'GoogleGenAIIntegration._llmobs_set_tagsc                 C   sb   | d}|t| |tt| |||t| |t	t
|i | |}|r/|t| d S d S Nconfig)getrB   r   _extract_metadataGENERATE_METADATA_PARAMSr   _extract_input_messagesr   _extract_output_messagesr   r   _extract_tools_set_ctx_itemr   )r6   r0   r;   r3   r<   rI   toolsr7   r7   r8   rD   Y   s   


z0GoogleGenAIIntegration._llmobs_set_tags_from_llmc                 C   sD   | d}|t| |tt| |||t| |t	t
|i d S rH   )rJ   rB   r   rK   EMBED_METADATA_PARAMSr   "_extract_embedding_input_documentsr   _extract_embedding_output_valuer   r   )r6   r0   r;   r3   r<   rI   r7   r7   r8   rC   g   s   

z6GoogleGenAIIntegration._llmobs_set_tags_from_embeddingc                 C   sJ   g }t |dd }|d ur|| |d |d}|| |d |S )Nsystem_instructionsystemcontentsuser)r   extend_extract_messages_from_contentsrJ   )r6   r;   r3   rI   messagesrU   rW   r7   r7   r8   rM   r   s   
z.GoogleGenAIIntegration._extract_input_messagesdefault_rolec                 C   sF   g }t |D ]}|dp|}|dg D ]
}|t|| qq|S )Nroleparts)r   rJ   appendr   )r6   rW   r\   r[   contentr]   partr7   r7   r8   rZ   ~   s   z6GoogleGenAIIntegration._extract_messages_from_contentsc           
      C   s|   |s	t dtdgS g }t|dg }|D ](}t|dd }|sqt|dg p%g }t|dt}|D ]}t||}	||	 q.q|S )Nr:   )r`   r]   
candidatesr`   r^   r]   )r   r   r   r   r_   )
r6   r<   r[   rb   	candidater`   r^   r]   ra   messager7   r7   r8   rN      s   
z/GoogleGenAIIntegration._extract_output_messagesc                 C   s2   t |dg }|rt|d j}dt||S dS )N
embeddingsr   z'[{} embedding(s) returned with size {}]r:   )r   lenvaluesformat)r6   r<   re   embedding_dimr7   r7   r8   rT      s
   z6GoogleGenAIIntegration._extract_embedding_output_valuec                 C   s(   | d}| |d}dd |D }|S )NrW   rX   c                 S   s"   g | ]}t t|d ddqS )r`   r:   )text)r   strrJ   ).0rd   r7   r7   r8   
<listcomp>   s   " zMGoogleGenAIIntegration._extract_embedding_input_documents.<locals>.<listcomp>)rJ   rZ   )r6   r;   r3   rI   rW   r[   	documentsr7   r7   r8   rS      s   
z9GoogleGenAIIntegration._extract_embedding_input_documentsc                 C   s*   |si S i }|D ]
}t ||d ||< q|S )Nr   )r6   rI   paramsmetadataparamr7   r7   r8   rK      s   z(GoogleGenAIIntegration._extract_metadatac                 C   sb   t |di pi }t|dr|jdd}ndt|i}ttt |ddp#dtt |ddp,d|d	S )
N
parameters
model_dumpT)exclude_nonevaluenamer:   description)rv   rw   schema)r   hasattrrs   reprr   rk   )r6   function_declarationrx   r7   r7   r8   (_function_declaration_to_tool_definition   s   
z?GoogleGenAIIntegration._function_declaration_to_tool_definitionc           	      C   s   zddl m} W n ty   d }Y nw g }t|dg pg }|D ]8}t|rA|d urAt|drA|j|dd}| |}|| q t|dg pHg }|D ]}| |}|| qKq |S )Nr   )FunctionDeclarationrQ   from_callable_with_api_option
GEMINI_API)callable
api_optionfunction_declarations)	google.genai.typesr}   ImportErrorr   r   ry   r~   r|   r_   )	r6   rI   r}   tool_definitionsrQ   toolr{   tool_definition_infor   r7   r7   r8   rO      s0   

z%GoogleGenAIIntegration._extract_tools)NN)Nr:   )__name__
__module____qualname___integration_namer   r   rk   dictr   r9   listrG   rD   rC   r   rM   rZ   rN   rT   r   rS   rK   r   r|   rO   r7   r7   r7   r8   r.   7   sN    



&r.   N)"typingr   r   ddtrace._trace.spanr   ddtrace.llmobs._constantsr   r   r   r   r	   r
   r   r   r   r   !ddtrace.llmobs._integrations.baser   )ddtrace.llmobs._integrations.google_utilsr   r   r   r   r   r   ddtrace.llmobs._utilsr   ddtrace.llmobs.typesr   r   r   rL   rR   r.   r7   r7   r7   r8   <module>   s6    	