
    ^h              
           S SK r S SKrS SKJr  S SKJrJr  S SKJr  S SK	r	S SK
Jr  S SKJrJr  S SKJrJr  S\S	\\   S
\4S jrS\\   S
\4S jrS\S\S\S\S\4
S jrg)    N)datetime)Optionalcast)	BaseModel)verbose_proxy_logger)SpendLogsMetadataSpendLogsPayload)PrismaClient
hash_tokenapi_key_master_keyreturnc                     Uc  g[         R                  " X5      nU(       a  g[         R                  " U [        U5      5      nU(       a  gg)NFT)secretscompare_digestr   )r   r   is_master_keys      k/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/spend_tracking/spend_tracking_utils.py_is_master_keyr      sE     **7@M **7J{4KLM    end_user_idc                 
   SSK JnJn  [        R                  " SU  S35        U c  0 n Ub*  [        U[        5      (       d  [        U[        5      (       d  0 nU R                  S0 5      nUR                  S0 5      =(       d    0 nU R                  SU5      n	U R                  S5      n
U R                  S	S
5      n[        [        U5      R                  SS 5      =(       d    0 n[        U[        R                  5      (       a  [        U5      n[        [        U5      R                  S5      =(       d    U R                  S5      nUR                  SS5      nUbZ  [        U[        5      (       aE  UR                  S5      (       a  [        U5      n[        XS9(       a  UR                  S5      SL a  SnUR                  S0 5      R                  SS5      nUR                  SS5      n[        UR                  S/ 5      [         5      (       a&  ["        R$                  " UR                  S/ 5      5      OSn['        S S S S S S S S S9n[        U[        5      (       a}  [        R                  " S[        [!        UR)                  5       5      5      -   5        ['        S70 [&        R*                  R)                  5        Vs0 s H  nUU;   d  M  UUU   _M     snD6n/ SQn0 nUR-                  5        HF  u  nnUU;  d  M  [        U[        5      (       a  UR/                  5       nUR1                  UU05        MH     UUS'   [        R2                  b!  [        R2                  R4                  " S70 U D6nOSnUSL a  SS KnU SUR7                  5        3n [9        S70 S[        U5      _SU
=(       d    S_S [        U5      _S	[        U5      _S!U_S"U_S#U	_S$U R                  S$S5      =(       d    S_S%U R                  S0 5      R                  S0 5      R                  S&S5      =(       d    S_S'U R                  S0 5      R                  S0 5      R                  S(S5      =(       d    S_S["        R$                  " U5      _S)U_S*U R                  S+S5      _S,UR                  S,S5      _S-UR                  S-S5      _S.UR                  S.S5      _S/U_S0U=(       d    S_S1UR                  S1S5      _SU_S2U_S3UR                  S3S 5      _S4U R                  S4S5      _6n[        R                  " S5U5        U$ s  snf ! [:         a5  n[        R<                  " S6R?                  [        U5      5      5        UeS nAff = f)8Nr   )general_settings
master_keyz*SpendTable: get_logging_payload - kwargs: z

litellm_paramsmetadatacompletion_start_time	call_type	cache_hitFusageidlitellm_call_iduser_api_key zsk-)r   r   $disable_adding_master_key_hash_to_dbTlitellm_proxy_master_key
model_infomodel_grouptagsz[])r"   user_api_key_aliasuser_api_key_team_iduser_api_key_user_iduser_api_key_team_aliasspend_logs_metadatarequester_ip_addressadditional_usage_valuesz;getting payload for SpendLogs, available keys in metadata: )completion_tokensprompt_tokenstotal_tokensr/   z	Cache OFF
_cache_hit
request_idr   	startTimeendTimecompletionStartTimemodeluserr+   team_idr*   	cache_keyspendresponse_costr2   r1   r0   request_tagsend_userapi_basemodel_idr.   custom_llm_providerz+SpendTable: created payload - payload: %s

z$Error creating spendlogs object - {} ) litellm.proxy.proxy_serverr   r   r   debug
isinstancer   dictgetr   litellmUsagestr
startswithr   r   listjsondumpsr   keys__annotations__items
model_dumpupdatecacheget_cache_keytimer	   	Exception	exceptionformat)kwargsresponse_obj
start_timeend_timer   r   r   r   r   r   r   r   r   r    r   	_model_id_model_groupr>   clean_metadatakeyspecial_usage_fieldsr/   kvr;   rW   payloades                               r   get_logging_payloadrh      s^    H
4VHDA ~|Y//
<QU8V8VZZ 0"5N:r*0b  #JJ'>I

;'I

;.I|$(($7=2E%''U	dL	!	%	%d	+	Lvzz:K/LBll>2.Gz'377e$$ )G7C $$%KLPTT0G\2.224<I<<r2L hll62.55 	

8<<+,  '!! $ ! $	N (D!!""I$x}}'()	
 + 
 -<<AACCC(? #Xc]"C
 R 1((!Y''LLN#**Aq62	 
 1HN,-}} MM//9&9		Dt:diik]+*$4 %
2w%
o2%
 L%
 )n	%

 !%
 %
 !6%
 **Wb)/R%
 ,b1SR S', %
 JJ/4SR S', !%
" ZZ/#%
$  %%
& **_a0'%
( >15)%
*  ))OQ7+%
, $ii(;Q?-%
. &/%
0 !&B1%
2 $''
B73%
4 %5%
6 7%
8 "0!3!34JD!Q9%
: !'

+@" E;%
@ 	"";W	
 }~  &&299#a&A	
 	s%   8
T0
T0F"T5 5
U4?0U//U4
start_dateend_dater:   customer_idprisma_clientc                 j   #    SnUR                   R                  XPXU5      I S h  vN nUc  / $ U$  N7f)Na  
    WITH SpendByModelApiKey AS (
        SELECT
            date_trunc('day', sl."startTime") AS group_by_day,
            COALESCE(tt.team_alias, 'Unassigned Team') AS team_name,
            sl.end_user AS customer,
            sl.model,
            sl.api_key,
            SUM(sl.spend) AS model_api_spend,
            SUM(sl.total_tokens) AS model_api_tokens
        FROM 
            "LiteLLM_SpendLogs" sl
        LEFT JOIN 
            "LiteLLM_TeamTable" tt 
        ON 
            sl.team_id = tt.team_id
        WHERE
            sl."startTime" BETWEEN $1::date AND $2::date
            AND sl.team_id = $3
            AND sl.end_user = $4
        GROUP BY
            date_trunc('day', sl."startTime"),
            tt.team_alias,
            sl.end_user,
            sl.model,
            sl.api_key
    )
        SELECT
            group_by_day,
            jsonb_agg(jsonb_build_object(
                'team_name', team_name,
                'customer', customer,
                'total_spend', total_spend,
                'metadata', metadata
            )) AS teams_customers
        FROM (
            SELECT
                group_by_day,
                team_name,
                customer,
                SUM(model_api_spend) AS total_spend,
                jsonb_agg(jsonb_build_object(
                    'model', model,
                    'api_key', api_key,
                    'spend', model_api_spend,
                    'total_tokens', model_api_tokens
                )) AS metadata
            FROM 
                SpendByModelApiKey
            GROUP BY
                group_by_day,
                team_name,
                customer
        ) AS aggregated
        GROUP BY
            group_by_day
        ORDER BY
            group_by_day;
    )db	query_raw)ri   rj   r:   rk   rl   	sql_querydb_responses          r   get_spend_by_team_and_customerrr      sI     :Ix &((22x+ K 	s   #313)rN   r   r   dttypingr   r   pydanticr   rI   litellm._loggingr   litellm.proxy._typesr   r	   litellm.proxy.utilsr
   r   rK   boolr   rh   rr   rC   r   r   <module>rz      s      # !   1 D 8C hsm  "F=Ec]FFRIII I 	I
  Ir   