o
    iS$                     @   s4  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d deZ dS )    )Any)Iterable)Optional)ArgumentError)get_argument_value)INPUT_MESSAGES)INPUT_TOKENS_METRIC_KEY)METADATA)METRICS)
MODEL_NAME)MODEL_PROVIDER)OUTPUT_MESSAGES)OUTPUT_TOKENS_METRIC_KEY)"REASONING_OUTPUT_TOKENS_METRIC_KEY)	SPAN_KIND)TOOL_DEFINITIONS)TOTAL_TOKENS_METRIC_KEY)BaseLLMIntegration)"extract_message_from_part_vertexai) get_system_instructions_vertexai)llmobs_get_metadata_vertexai)	_get_attr)Message)Spanc                   @   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e
e fddZde
e fddZede
e fddZdd ZdS )VertexAIIntegrationvertexaiNspanprovidermodelkwargsreturnc                 K   s0   |d ur
| d| |d ur| d| d S d S )Nvertexai.request.providervertexai.request.model)_set_tag_str)selfr   r   r   r    r%   Y/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/llmobs/_integrations/vertexai.py_set_base_span_tags   s
   z'VertexAIIntegration._set_base_span_tags argsresponse	operationc                 C   s  | dd }| dg }| di }t||}	t|}
d }z	t||dd}W n ty6   t||dd}Y nw | |||
}tddg}|d urR| |}| |}| 	|| d	g }|rd|
t| |td
t|dpodt|dpvdt|	t|t|t|i d S )Ninstancehistorymetricsr   contentcontentsr(   r/   toolsllmr"   r!   )getr   r   r   r   _extract_input_messager   _extract_output_message_extract_metrics_from_response_extract_tools_set_ctx_itemr   _set_ctx_itemsr   r   get_tagr   r	   r   r   r
   )r$   r   r)   r   r*   r+   r,   r-   r.   metadatasystem_instructioninput_contentsinput_messagesoutput_messagestool_definitionsr%   r%   r&   _llmobs_set_tags'   s:   


z$VertexAIIntegration._llmobs_set_tagsc                 C   s   t |tr0|D ]'}t|dd}|sqt|dd}t|dd}t|dd}|| }t|dd}qn*| }	|	dd}|s>dS t|dd}t|dd}t|dd}|| }t|dd}i }
|durd||
t< |durl||
t< |durt||
t< |dur|||
t< |
S )z"Extract metrics from the response.usage_metadataNprompt_token_countr   candidates_token_countthoughts_token_counttotal_token_count)	
isinstancelistr   to_dictr4   r   r   r   r   )r$   r*   chunktoken_countsinput_tokenscandidates_tokensthoughts_tokensoutput_tokenstotal_tokensgenerations_dictr.   r%   r%   r&   r7   Q   s<   

z2VertexAIIntegration._extract_metrics_from_responsec           	      C   s  ddl m} g }|r|D ]}|t|pddd q|D ]
}|| | qt|tr6|t|d |S t||rFt|}|| |S t|t	sZ|td
t|d |S |D ]'}t|trl|t|d q\t||r{t|}|| q\|| | q\|S )Nr   )Partr(   systemr/   roler1   [Non-text content object: {}])-vertexai.generative_models._generative_modelsrS   appendr   extend_extract_messages_from_contentrH   strr   rI   formatrepr)	r$   r0   r-   r=   rS   messagesinstructionr/   messager%   r%   r&   r5   u   s6   






z*VertexAIIntegration._extract_input_messagec              	   C   s   g }t |trKd}g }d}|D ],}t|dg D ]#}t|di }| |}	|	D ]}
||
dd7 }||
dg  q&qqt||d}
|rH||
d< |
gS | }|dg D ]}|di }|| | qU|S )Nr(   r   
candidatesr/   
tool_callsrU   )rH   rI   r   r[   r4   rZ   r   rJ   )r$   generationsr@   message_contentrc   rV   rK   	candidater/   r_   ra   rR   r%   r%   r&   r6      s.   

z+VertexAIIntegration._extract_output_messagec                 C   s~   g }t | dd}t | dg }|rt|ts.tdt| d}|r't||d< || |S |D ]}t||}|| q0|S )NrV   r(   partsrW   r1   )	r   rH   r   r   r]   r^   r\   rY   r   )r/   r_   rV   rg   ra   partr%   r%   r&   r[      s   

z2VertexAIIntegration._extract_messages_from_contentc                 C   s   t |dg pg }t|}|| g }|D ].}| }t |dg }|D ]}	t |	ddp,dt |	ddp3dt |	di p:i d}
||
 q#q|S )z
        Extracts tool definitions for a call, tools can be passed into a model instance or a generation call, so we
        handle both cases and remove duplicates.
        _toolsfunction_declarationsnamer(   description
parameters)rk   rl   schema)r   setupdaterJ   rY   )r$   r,   	arg_toolsr2   tool_setrA   tool	tool_dictrj   functiontool_definition_infor%   r%   r&   r8      s   
z"VertexAIIntegration._extract_tools)NN)Nr(   )N)__name__
__module____qualname___integration_namer   r   r\   dictr   r'   rI   rB   r7   r   r5   r6   staticmethodr[   r8   r%   r%   r%   r&   r      sF    



*$r   N)!typingr   r   r   ddtrace.internal.utilsr   r   ddtrace.llmobs._constantsr   r   r	   r
   r   r   r   r   r   r   r   r   !ddtrace.llmobs._integrations.baser   )ddtrace.llmobs._integrations.google_utilsr   r   r   ddtrace.llmobs._utilsr   ddtrace.llmobs.typesr   ddtrace.tracer   r   r%   r%   r%   r&   <module>   s2    