
    jY                     4   d dl Z d dlZd dlmZmZmZmZ ddlmZm	Z	m
Z
mZmZmZ d dlmZ eej                   e	j"                  e
j$                  ej&                  ej(                  ej*                  f   Z e j.                  e      Z G d dej4                        Zy)    N)UnionDictAnyOptional   )openai_chat_completions_usagegoogle_usageanthropic_usageunknown_usagebedrock_usageopenai_responses_usagec                   j   e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   e
ed<   deeef   fdZed	eeef   dd fd
       Zed	eeef   dd fd       Zed	eeef   dd fd       Zed	eeef   dd fd       Zed	eeef   dd fd       Zed	eeef   dd fd       Zed	eeef   dd fd       Zy)	OpikUsageaV  
        A class used to convert different formats of token usage dictionaries
    into format supported by Opik ecosystem.

        `from_PROVIDER_usage_dict methods` methods are used to parse original provider's token
    usage dicts and calculate openai-formatted extra key-value pairs (that can later be used on the FE and BE sides).
    Ncompletion_tokensprompt_tokenstotal_tokensprovider_usagereturnc                     t        j                  | j                  | j                  | j                  dt
              }| j                  j                  d      }i ||S )a@  
        Returns usage dictionary in backend compatible format:
            * flattened, original usage keys have `original_usage.` prefix
            * only integer values
            * if available, adds openai-formatted keys to the result dict
                so that they can be used on the BE and FE sides.
        )r   r   r   )
value_typeoriginal_usage)parent_key_prefix)
dict_utilskeep_only_values_of_typer   r   r   intr   to_backend_compatible_flat_dict)selfshort_openai_like_usager   s      r/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/opik/llm_usage/opik_usage.py%to_backend_compatible_full_usage_dictz/OpikUsage.to_backend_compatible_full_usage_dict)   sq     3=2U2U%)%;%;!%!3!3 $ 1 1
 3
 ??"2 @  	 =)<^<<    usagec                 N   t         j                  j                  |      }	 |j                  d      }|t	        |      nd }	 |j                  d      }|t	        |      nd }d }||||z   } | ||||      S # t
        t        f$ r d }Y Kw xY w# t
        t        f$ r d }Y Aw xY w)Nr   r   r   r   r   r   )r   UnknownUsagefrom_original_usage_dictgetr   
ValueError	TypeError)clsr"   r   rawr   r   r   s          r   from_unknown_usage_dictz!OpikUsage.from_unknown_usage_dictB   s    &33LLUS	!))O,C7:3s8DM	%))/0C;>?s3xPT $):)F(+<<L/'%)	
 	
 I& 	! M	! I& 	% $	%s#    A9  B 9BBB$#B$c                     t         j                  j                  |      } | |j                  |j                  |j
                  |      S Nr$   )r   OpenAICompletionsUsager&   r   r   r   r*   r"   r   s      r   from_openai_completions_dictz&OpikUsage.from_openai_completions_dict]   sH    6MMff
 ,>>(66'44)	
 	
r!   c                 $    | j                  |      S )N)r1   )r*   r"   s     r   from_groq_completions_dictz$OpikUsage.from_groq_completions_dictj   s    //66r!   c                 H   t         j                  j                  |      }|j                  xs d}|j                  |z   }|j
                  |k(  r|}n3|j                  ||j                  z   }nt        j                  d       |} | ||j                  |j
                  |      S )Nr   zFSomething is wrong in Google usage, completion_tokens might be invalidr$   )	r	   GoogleGeminiUsager&   candidates_token_countprompt_token_counttotal_token_countthoughts_token_countLOGGERdebug)r*   r"   r   r6   r8   r   s         r   from_google_dictzOpikUsage.from_google_dictn   s    %77PPQVW
 "0!F!F!K!*==@VV++/@@ 600<&)L)LL  LLX !7/(;;'99)	
 	
r!   c                     t         j                  j                  |      }|j                         \  }} | ||||z   |      S r.   )r
   AnthropicUsager&   get_billable_tokens)r*   r"   r   r   r   s        r   from_anthropic_dictzOpikUsage.from_anthropic_dict   sL    (77PPQVW+9+M+M+O((/'&)::)	
 	
r!   c                     t         j                  j                  |      }|j                  }|j                  }||z   } | ||||      S r.   )r   BedrockUsager&   inputTokensoutputTokens)r*   r"   r   r   r   r   s         r   from_bedrock_dictzOpikUsage.from_bedrock_dict   sS    &33LLUS&22*77$'88/'%)	
 	
r!   c                     t         j                  j                  |      } | |j                  |j                  |j
                  |      S r.   )r   OpenAIResponsesUsager&   output_tokensinput_tokensr   r0   s      r   from_openai_responses_dictz$OpikUsage.from_openai_responses_dict   sK     #77PPQVW 	 ,::(55'44)	
 	
r!   )__name__
__module____qualname____doc__r   r   r   __annotations__r   r   ProviderUsager   strr    classmethodr   r,   r1   r3   r<   r@   rE   rJ    r!   r   r   r      st    (,x}+#'M8C='"&L(3-&!!=tCH~ =2 
DcN 
{ 
 
4 

c3h 

K 

 

 7tCH~ 7+ 7 7 
T#s(^ 
 
 
: 	
S#X 	
; 	
 	
 
d38n 
 
 
 

tCH~ 

+ 

 

r!   r   )loggingpydantictypingr   r   r   r    r   r	   r
   r   r   r   opik.dict_utilsr   r/   r5   r>   rB   rG   r%   rP   	getLoggerrK   r:   	BaseModelr   rS   r!   r   <module>r[      s      - -  %!88""""//  
		8	$Y
"" Y
r!   