
    g              
           d dl Z d dlZd dlmZ d dlmZmZ d dlmZ d dl	Z	d dl
mZ d dlmZmZ d dlmZmZ ded	ee   d
efdZdee   d
efdZdededededef
dZy)    N)datetime)Optionalcast)	BaseModel)verbose_proxy_logger)SpendLogsMetadataSpendLogsPayload)PrismaClient
hash_tokenapi_key_master_keyreturnc                     |yt        j                  | |      }|ryt        j                  | t        |            }|ryy)NFT)secretscompare_digestr   )r   r   is_master_keys      f/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/spend_tracking/spend_tracking_utils.py_is_master_keyr      sG     **7K@M **7J{4KLM    end_user_idc           
      
   ddl m}m} t        j                  d|  d       | i } | t        |t              st        |t              si }| j                  di       }|j                  di       xs i }| j                  d|      }	| j                  d      }
| j                  d	d
      }t        t        |      j                  dd       xs i }t        |t        j                        rt        |      }t        t        |      j                  d      xs | j                  d      }|j                  dd      }|Nt        |t              r>|j                  d      rt        |      }t        ||      r|j                  d      du rd}|j                  di       j                  dd      }|j                  dd      }t        |j                  dg       t               r%t#        j$                  |j                  dg             nd}t'        d d d d d d d d       }t        |t              rut        j                  dt        t!        |j)                                     z          t'        d7i t&        j*                  j)                         D ci c]  }||v r|||    c}}g d}i }|j-                         D ]=  \  }}||vst        |t              r|j/                         }|j1                  ||i       ? ||d<   t        j2                   t        j2                  j4                  d7i | }nd}|du rdd l}| d|j7                          }	 t9        d7i dt        |      d|
xs dd t        |      d	t        |      d!|d"|d#|	d$| j                  d$d      xs dd%| j                  di       j                  di       j                  d&d      xs dd'| j                  di       j                  di       j                  d(d      xs ddt#        j$                  |      d)|d*| j                  d+d      d,|j                  d,d      d-|j                  d-d      d.|j                  d.d      d/|d0|xs dd1|j                  d1d      d|d2|d3|j                  d3d       d4| j                  d4d      }t        j                  d5|       |S c c}w # t:        $ r4}t        j<                  d6j?                  t        |                   |d }~ww xY w)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      sF    H
4VHDA ~|Y/
<QU8VZZ 0"5N:r*0b  #JJ'>I

;'I

;.I|$(($7=2E%'U	dL	!	%	%d	+	Lvzz:K/LBll>2.Gz'37e$ )G7
C $$%KLPTT0G\2.224<I<<r2L hll62.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   S
FS 	T/TT
start_dateend_dater:   customer_idprisma_clientc                 l   K   d}|j                   j                  || |||       d {   }|g S |S 7 
w)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      sN     :Ix &((22:x+ K 	s   %424)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   