o
    ưi]                     @   s  d Z ddlZddlmZmZmZ ddlmZmZmZm	Z	 ddl
mZmZmZ ddlmZ ddlmZ ddlmZ e ZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZdedefddZdededefddZdededeeeeef f fddZdededeeef fd d!Zdedeeeef  fd"d#Z d$ede!eef fd%d&Z"d'ed(eeeeef f d)eeef dee fd*d+Z#d,ed(eeeeef f d)eeef dee fd-d.Z$ej%d/d0geeged1edd2d3edd2d3eefd4e	e d5e	e d6efd7d8Z&ej%d9d0geeged1ededeefd:ed4e	e d5e	e d6efd;d<Z'd=e	ee  d>e	e d4e	e d5e	e deeef f
d?d@Z(dAedBedCe	e de	e fdDdEZ)d\dGedHe*de	e fdIdJZ+dBede	e fdKdLZ,ej%dMd0geeged1edededNdNdOedPdNdQdRedededeefd:e	e d>e	e dSe*dTe*dUe	e d4e	e d5e	e d6efdVdWZ-ej%dXdYgeeged1edd2d3edd2d3eefd4e	e d5e	e d6efdZd[Z.dS )]z
Guardrails and policies usage endpoints for the dashboard.
GET /guardrails/usage/overview, /guardrails/usage/detail/:id, /guardrails/usage/logs
    N)datetime	timedeltatimezone)AnyDictListOptional)	APIRouterDependsQuery)	BaseModel)UserAPIKeyAuth)user_api_key_authc                   @   sf   e Zd ZU eed< eed< eed< eed< eed< eed< ee ed< ee ed< eed	< eed
< dS )UsageOverviewRowidnametypeproviderrequestsEvaluatedfailRateavgScore
avgLatencystatustrendN)__name__
__module____qualname__str__annotations__intfloatr    r!   r!   _/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/guardrails/usage_endpoints.pyr      s   
 r   c                   @   sF   e Zd ZU ee ed< eeeef  ed< e	ed< e	ed< e
ed< dS )UsageOverviewResponserowscharttotalRequeststotalBlockedpassRateN)r   r   r   r   r   r   r   r   r   r   r    r!   r!   r!   r"   r#   #   s   
 r#   c                   @   s   e Zd ZU eed< eed< eed< eed< eed< eed< ee ed< ee ed< eed	< eed
< ee ed< ee	ee
f  ed< dS )UsageDetailResponseguardrail_idguardrail_namer   r   r   r   r   r   r   r   descriptiontime_seriesN)r   r   r   r   r   r   r    r   r   r   r   r!   r!   r!   r"   r)   +   s   
 r)   c                   @   sn   e Zd ZU eed< eed< eed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed	< d
S )UsageLogEntryr   	timestampactionscore
latency_msmodelinput_snippetoutput_snippetreasonN)r   r   r   r   r   r   r    r!   r!   r!   r"   r.   :   s   
 r.   c                   @   s2   e Zd ZU ee ed< eed< eed< eed< dS )UsageLogsResponselogstotalpage	page_sizeN)r   r   r   r   r.   r   r   r!   r!   r!   r"   r7   F   s
   
 r7   	fail_ratereturnc                 C   s   | dkrdS | dkrdS dS )N   critical   warningZhealthyr!   )r<   r!   r!   r"   _status_from_fail_rateM   s
   rB   current_failprevious_failc                 C   s0   |dkrdS | | }|dkrdS |dk rdS dS )Nr   Zstableg      ?upg      Zdownr!   )rC   rD   diffr!   r!   r"   _trend_from_comparisonU   s   rG   metricsid_attrc                 C   s   i }| D ]P}t ||}||vrddddd||< || d  t|jp#d7  < || d  t|jp2d7  < || d  t|jpAd7  < || d  t|jpPd7  < q|S )Nr   requestspassedblockedflaggedrK   rL   rM   rN   )getattrr   requests_evaluatedpassed_countblocked_countZflagged_count)rH   rI   aggmgidr!   r!   r"   _aggregate_daily_metrics`   s   
 rV   metrics_prevc                 C   s   i }| D ]5}t ||}t|jpdt|jpd}}||vr%ddd||< || d  |7  < || d  |7  < qdd | D S )Nr   )reqrM   rX   rM   c                 S   s2   i | ]\}}||d  rd|d  |d   ndqS )rX         Y@rM           r!   ).0rU   vr!   r!   r"   
<dictcomp>v   s     z$_prev_fail_rates.<locals>.<dictcomp>)rO   r   rP   rR   items)rW   rI   Zprev_agg_rawrT   rU   rbr!   r!   r"   _prev_fail_ratesm   s   
ra   c                 C   s|   i }| D ].}|j }||vrddd||< || d  t|jpd7  < || d  t|jp.d7  < qdd t| D S )Nr   rL   rM   rL   rM   c                 S   s$   g | ]\}}||d  |d dqS )rL   rM   )daterL   rM   r!   r[   dr\   r!   r!   r"   
<listcomp>   s    z'_chart_from_metrics.<locals>.<listcomp>)rc   r   rQ   rR   sortedr^   )rH   Zchart_by_daterT   re   r!   r!   r"   _chart_from_metrics|   s    
rh   gc                 C   sX   t | ddpt| tr| dnd}t | ddp#t| tr"| dnd}||p*|p*dfS )zOGet (guardrail_id, display_name) from guardrail - handles Prisma model or dict.r*   Nr+    )rO   
isinstancedictget)ri   rU   r   r!   r!   r"   _get_guardrail_attrs   s   rn   
guardrailsrS   prev_aggc                 C   s  g }t  }| D ]}t|\}}dd ||fD }|| ddddd}	|D ]}
|
|v r2||
 }	 nq&|	d |	d }}|rDd| | nd}t|jtrQ|jpPi ni }t|d	d
}t|jtrf|jpei ni }t|dd}d}|D ]}
|
|v rt	||
dpd} nqtt
||}|t||pt||||t|dd d t||d
 q| D ]G\}}	||v s|	d dkrq|	d |	d }}|rd| | nd}t	||dpd}t
||}|t||dd|t|dd d t||d
 q|S )Nc                 S      g | ]}|r|qS r!   r!   )r[   kr!   r!   r"   rf          z,_guardrail_overview_rows.<locals>.<listcomp>r   rJ   rK   rM   rY   rZ   	guardrailUnknownr   	Guardrail   
r   r   r   r   r   r   r   r   r   r   ZCustom)setrn   updaterk   litellm_paramsrl   r   rm   guardrail_infor    rG   appendr   roundrB   r^   )ro   rS   rp   r$   Zcovered_keysri   rU   Zdisplay_nameZlookup_keysarr   rX   rM   r<   r{   r   r|   gtype	prev_failr   Zagg_keyr!   r!   r"   _guardrail_overview_rows   s   
  


r   policiesc                 C   s   g }| D ]E}|j }||ddddd}|d |d }}|r%d| | nd}	t|	||d}
|t||jp8|dd|t|	d	d d t|	|
d

 q|S )Nr   rJ   rK   rM   rY   rZ   PolicyZLiteLLMrw   rx   )	policy_idrm   rG   r}   r   Zpolicy_namer~   rB   )r   rS   rp   r$   ppidr   rX   rM   r<   r   r!   r!   r"   _policy_overview_rows   s,   r   z/guardrails/usage/overviewZ
Guardrails)tagsdependenciesZresponse_modelz
YYYY-MM-DD)r,   
start_dateend_dateuser_api_key_dictc              
      s|  ddl m} |du rtg g ddddS ttj}|p |d}| p,|tdd d}zz|j	j
 I dH }|j	jjd	||d
idI dH }t|dtdd d}	|j	jjd	|	|didI dH }
t|d}t|
d}t|}tdd | D }tdd | D }|rd||  | nd}t|||}t||||t|ddW S  ty } z
ddlm} ||d}~ww )z8Return guardrail performance overview for the dashboard.r   prisma_clientNrY   r$   r%   r&   r'   r(   %Y-%m-%d   daysrc   gteltewherer   ltr*   c                 s       | ]}|d  V  qdS rK   Nr!   r[   r   r!   r!   r"   	<genexpr>%      z,guardrails_usage_overview.<locals>.<genexpr>c                 s   r   rM   Nr!   r   r!   r!   r"   r   &  r   rw   handle_exception_on_proxy)litellm.proxy.proxy_serverr   r#   r   nowr   utcstrftimer   dblitellm_guardrailstable	find_manylitellm_dailyguardrailmetricsstrptimerV   ra   rh   sumvaluesr   r~   	Exceptionlitellm.proxy.utilsr   )r   r   r   r   r   endstartro   rH   Z
start_prevrW   rS   rp   r%   total_requeststotal_blocked	pass_rater$   er   r!   r!   r"   guardrails_usage_overview   sT   


r   z'/guardrails/usage/detail/{guardrail_id}r*   c                    s  ddl m} |du rddlm} |dddttj}|p#|d}|p/|t	d	d
 d}|j
jjd| idI dH }	|	sKddlm} |dddt|	ddp\t|	tr[|	dnd}
dd |
| fD }|j
jjd|i||dddI dH }|j
jjd|id|iddI dH }tdd |D }tdd |D }|rd| | nd}tdd |D }tdd |D }|rd| | nd}t||}i }|D ].}|j}||vrddd||< || d  t|jpd7  < || d  t|jpd7  < qd d t| D }t|	d!dpt|	tr|	d!nd}t|tr"|ni }t|	d"dp7t|	tr6|	d"nd}t|tr@|ni }t|	ddpUt|	trT|	dnd}t| |p\| t|d#d$t|d%d&|t|d'ddt|||d(|d)S )*z6Return single guardrail usage metrics and time series.r   r   N)HTTPException  zPrisma client not initialized)status_codedetailr   r   r   r*   r   i  zGuardrail not foundr+   c                 S   rq   r!   r!   )r[   ir!   r!   r"   rf   ^  rs   z+guardrails_usage_detail.<locals>.<listcomp>inr   )r*   rc   r   c                 s       | ]
}t |jp	d V  qdS r   Nr   rP   r[   rT   r!   r!   r"   r   m      z*guardrails_usage_detail.<locals>.<genexpr>c                 s   r   r   r   rR   r   r!   r!   r"   r   n  r   rY   rZ   c                 s   r   r   r   r   r!   r!   r"   r   q  r   c                 s   r   r   r   r   r!   r!   r"   r   r  r   rb   rL   rM   c                 S   s&   g | ]\}}||d  |d ddqS )rL   rM   N)rc   rL   rM   r1   r!   rd   r!   r!   r"   rf   ~  s    r{   r|   r   rv   rt   ru   rw   r,   )r*   r+   r   r   r   r   r   r   r   r   r,   r-   )r   r   fastapir   r   r   r   r   r   r   r   r   find_uniquerO   rk   rl   rm   r   r   r   rG   rc   r   rQ   rR   rg   r^   r)   r   r~   rB   )r*   r   r   r   r   r   r   r   r   rt   Z
logical_idZ
metric_idsrH   rW   rK   rM   r<   Zprev_blockedZprev_reqr   r   Z
ts_by_daterT   re   r-   Z_litellm_paramsr{   Z_guardrail_infor|   Z_guardrail_namer!   r!   r"   guardrails_usage_detail:  s   
 
r   guardrail_idsr   c                 C   s   i }| rt | dkrd| in| d |d< |r||d< |s|rVi }|r9|dd }d|vr2|d	7 }t||d
< |rR|dd }d|vrK|d7 }t||d< ||d< |S )Nrw   r   r   r*   r   Zz+00:00TzT00:00:00+00:00r   zT23:59:59+00:00r   
start_time)lenreplacestripr   fromisoformat)r   r   r   r   r   Z	st_filtersdZedr!   r!   r"   _build_usage_logs_where  s(   r   r_   slaction_filterc                 C   s  |j }t|trzt|}W n ty   i }Y nw |pi dp#g }d }|D ]}|dp3|d| jkr;|} nq(d}d }d }	d }
|r|dpLd }d|v sWd|v rZd	}n
d
|v sbd|v rdd}|d}|d urvt	t
|d d}	|dp|d}|d urt	t
|d}|d}t|tr|d d }
nt|trt|d d }
|r||krd S t|jdr|j nt|j}t| j||||	|jt|t|j|
d	S )NZguardrail_informationr*   r+   rL   Zguardrail_statusrj   Z
intervenedblockrM   ZfailerrorrN   durationi  r   Zconfidence_scoreZ
risk_score   Zguardrail_responser   	isoformat)	r   r/   r0   r1   r2   r3   r4   r5   r6   )metadatark   r   jsonloadsr   rm   r*   lowerr~   r    rl   hasattrZ	startTimer   r.   
request_idr3   _input_snippet_for_log_snippetresponse)r_   r   r   metaZguardrail_info_listZentry_for_guardrailgiZ
action_valZ	score_valZlatency_valZ
reason_valstr   resptsr!   r!   r"   _usage_log_entry_from_row  sp   





r      textmax_lenc                 C   s   | d u rd S t | tr| }n9t | trCg }| D ]%}t |tr5d|v r5|d }|t |tr/|nt| q|t| qd|}nt| }t||krU|d | d n|}|dkr]d S |S )Ncontent z...z{})rk   r   listrl   r}   joinr   )r   r   spartsitemcresultr!   r!   r"   r     s"   

 r   c                 C   s   t | j}|r	|S t| dd}|sdS t|tr-zt|}W n ty,   t | Y S w t|trV|	d}|du rJt|	dtrJ|d 	d}t |}|rR|S t |S t |S )z_Snippet for request input: prefer messages, fall back to proxy_server_request (same as drawer).Zproxy_server_requestNmessagesbody)
r   r   rO   rk   r   r   r   r   rl   rm   )r   outZpsrZmsgsr!   r!   r"   r     s*   



r   z/guardrails/usage/logsrw   )ge2   d   )r   ler:   r;   r0   c              
      s  ddl m} |du rtg d||dS | s|stg d||dS z| r%| gng }	| rI|jjjd| idI dH }
|
rIt|
dd}|rI||	vrI|	| t|	pMd|||}|jj	j
|dd	i|d
 | |d
 dI dH }|jj	j|dI dH }dd |d| D }|stg |||dW S |jjj
dd|iidI dH }dd |D }g }|d| D ]}||j}|sqt|||}|dur|| qt||||dW S  ty } z
ddlm} ||d}~ww )zOReturn paginated run logs for a guardrail (or policy) from SpendLogs via index.r   r   N)r8   r9   r:   r;   r*   r   r+   r   Zdescrw   )r   orderskipZtakec                 S   s   g | ]}|j qS r!   r   )r[   r_   r!   r!   r"   rf   [  s    z)guardrails_usage_logs.<locals>.<listcomp>r   r   c                 S   s   i | ]}|j |qS r!   r   )r[   r   r!   r!   r"   r]   c  rs   z)guardrails_usage_logs.<locals>.<dictcomp>r   )r   r   r7   r   r   r   rO   r}   r   Zlitellm_spendlogguardrailindexr   countZlitellm_spendlogsrm   r   r   r   r   r   )r*   r   r:   r;   r0   r   r   r   r   Zeffective_guardrail_idsrt   Zlogical_namer   Z
index_rowsr9   Zrequest_idsZ
spend_logsZ	log_by_idZlogs_outr_   r   entryr   r   r!   r!   r"   guardrails_usage_logs+  sh   



r   z/policies/usage/overviewZPoliciesc              
      sx  ddl m} |du rtg g ddddS ttj}|p |d}| p,|tdd d}zx|j	j
 I dH }|j	jjd	||d
idI dH }|j	jjd	t|dtdd d|didI dH }	t|d}
t|	d}t|}tdd |
 D }tdd |
 D }|rd||  | nd}t||
|}t||||t|ddW S  ty } z
ddlm} ||d}~ww )z5Return policy performance overview for the dashboard.r   r   NrY   r   r   r   r   rc   r   r   r   r   c                 s   r   r   r!   r   r!   r!   r"   r     r   z*policies_usage_overview.<locals>.<genexpr>c                 s   r   r   r!   r   r!   r!   r"   r     r   rw   r   )r   r   r#   r   r   r   r   r   r   r   Zlitellm_policytabler   Zlitellm_dailypolicymetricsr   rV   ra   rh   r   r   r   r~   r   r   r   )r   r   r   r   r   r   r   r   rH   rW   rS   rp   r%   r   r   r   r$   r   r   r!   r!   r"   policies_usage_overviewx  sX   



r   )r   )/__doc__r   r   r   r   typingr   r   r   r   r   r	   r
   r   Zpydanticr   Zlitellm.proxy._typesr   Z$litellm.proxy.auth.user_api_key_authr   Zrouterr   r#   r)   r.   r7   r    r   rB   rG   rV   ra   rh   tuplern   r   r   rm   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s   &

H



:f



:
G

