o
    ưii                     @   s   d Z ddlZddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ de
e d	efd
dZdeeef d	e	eeef  fddZded	efddZdede	eeef  d	dfddZdS )z
Track guardrail and policy usage for the dashboard: upsert daily metrics and
insert into SpendLogGuardrailIndex when spend logs are written.
    N)defaultdict)datetimetimezone)AnyDictListOptional)verbose_proxy_logger)PrismaClientstatusreturnc                 C   s@   | sdS | pd  }d|v sd|v rdS d|v sd|v rdS dS )	z?Map StandardLogging guardrail_status to blocked/passed/flagged.passed Z
intervenedblockblockedZfailerrorZflagged)lower)r   s r   ^/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/guardrails/usage_tracking.py_guardrail_status_to_action   s   r   payloadc              	   C   s|   |  d}|s	g S t|tr$zt|}W n tjtfy#   g  Y S w t|ts+g S | dp4| d}t|ts<g S |S )z>Extract guardrail_information from spend log payload metadata.metadataZguardrail_informationZ&standard_logging_guardrail_information)	get
isinstancestrjsonloadsJSONDecodeError	TypeErrordictlist)r   metainfor   r   r   "_parse_guardrail_info_from_payload   s"   



r$   dtc                 C   s*   | j du r| jtjd} | tjdS )zYYYY-MM-DD in UTC.N)tzinfoz%Y-%m-%d)r&   replacer   utc
astimezonestrftime)r%   r   r   r   	_date_str/   s   
r+   prisma_clientlogs_to_processc                    s  |sdS t dd }g }|D ]}|d}|d}|r|s qt|tr<zt|dd}W n ttfy;   Y qw t	|}t
|D ]]}|dpQ|d	pQd
}	|	sUqD|	|f}
||
 d  d7  < t|d}|dkry||
 d  d7  < n|dkr||
 d  d7  < n
||
 d  d7  < |d}|||	||d qDq|s|sdS z|rg }|D ]3}|d }t|trzt|dd}W n ttfy   Y qw ||d |d |d|d qz| jjj|ddI dH  W n ty } ztd| W Y d}~nd}~ww | D ]T\\}	}}t|d }|dkr$q| jjjd|	|di|	||t|d t|d t|d dd|idt|d idt|d idt|d iddd I dH  qW dS  ty } ztd!| W Y d}~dS d}~ww )"z
    After spend logs are written: update DailyGuardrailMetrics and insert
    SpendLogGuardrailIndex rows from guardrail_information in each payload.
    Nc                   S   s   dddddS )Nr   requests_evaluatedpassed_countblocked_countflagged_countr   r   r   r   r   <lambda>B   s
   z4process_spend_logs_guardrail_usage.<locals>.<lambda>
request_idZ	startTimeZz+00:00guardrail_idZguardrail_namer   r/      Zguardrail_statusr   r0   r   r1   r2   	policy_id)r4   r6   r8   
start_timer9   T)dataZskip_duplicatesz7Guardrail usage tracking: index create_many skipped: %sr   Zguardrail_id_date)r6   date)r6   r;   r/   r0   r1   r2   	incrementr.   )createupdate)wherer:   z/Guardrail usage tracking failed (non-fatal): %s)r   r   r   r   r   fromisoformatr'   
ValueErrorr   r+   r$   r   appenddbZlitellm_spendlogguardrailindexZcreate_many	Exceptionr	   debugitemsintZlitellm_dailyguardrailmetricsZupsertwarning)r,   r-   Zdaily_guardrailZ
index_rowsr   r4   r9   Zdate_keyentryr6   keyactionr8   Z
index_datarsteZaggnr   r   r   "process_spend_logs_guardrail_usage6   s   










	rP   )__doc__r   collectionsr   r   r   typingr   r   r   r   Zlitellm._loggingr	   Zlitellm.proxy.utilsr
   r   r   r$   r+   rP   r   r   r   r   <module>   s"    &