Ë
    tPêj$  ã            
       óö  — U d Z ddlmZ ddlmZmZ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mZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZmZmZ  e
«       Zeed<   dZeed<   dZ eed<    G d„ de«      Z! ee"e!df   «      Z#eed<   de"e$e$f   fd„Z%dee!   de"edf   fd„Z&dee!   de"edf   fd„Z'ejQ                  ddge¬«       edd¬«       edd¬«      fd ee ee«      f   d!e$dz  d"e$dz  defd#„«       Z)y)$aÞ  
GATEWAY REQUEST COUNTS (SGR)

GET /gateway/daily/activity - successful/failed gateway requests by date and route

Source of truth is LiteLLM_DailyGatewayRequests, written at the ASGI edge by
BillableRequestMetricsMiddleware. This counts what the proxy answered, so it is
independent of whether a request reached litellm's logging callbacks.

The table carries no key/user/team dimension, so these totals are deployment-wide
and the endpoint is restricted to proxy admin roles.
é    )ÚSequence)ÚdatetimeÚ	timedeltaÚtimezone)Ú	AnnotatedÚFinal)Ú	APIRouterÚDependsÚHTTPExceptionÚQuery)Ú	BaseModelÚTypeAdapter)Úverbose_proxy_logger)ÚCommonProxyErrorsÚLitellmUserRolesÚUserAPIKeyAuth)Úuser_api_key_auth)ÚGatewayRequestActivityResponseÚGatewayRequestBreakdownEntryÚGatewayRequestDailyEntryÚrouteré   Ú_DEFAULT_LOOKBACK_DAYSa#  
    SELECT
        date,
        category,
        route,
        SUM(successful_requests)::bigint AS successful_requests,
        SUM(failed_requests)::bigint AS failed_requests
    FROM "LiteLLM_DailyGatewayRequests"
    WHERE date >= $1 AND date <= $2
    GROUP BY date, category, route
Ú_AGGREGATE_SQLc                   óD   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   y)Ú_AggregateRowzLValidates one query_raw row so the handler works with typed values, not Any.ÚdateÚcategoryÚrouteÚsuccessful_requestsÚfailed_requestsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__Úint© ó    ú�/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/gateway_request_endpoints.pyr   r   /   s    … ÙVà
ƒIØƒMØƒJØÓØÔr*   r   .Ú_ROWS_ADAPTERÚreturnc                  ó²   — t        j                  t        j                  «      } | t	        t
        ¬«      z
  }|j                  d«      | j                  d«      fS )N)Údaysz%Y-%m-%d)r   Únowr   Úutcr   r   Ústrftime)ÚendÚstarts     r+   Ú_default_ranger5   <   sA   € Ü—‘œhŸl™lÓ+€CØœÔ(>Ô?Ñ?€EØ�>‰>˜*Ó% s§|¡|°JÓ'?Ð?Ð?r*   Úrowsc                 ób   ‡ — t        t        d„ ‰ D «       «      «      }t        ˆ fd„|D «       «      S )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­w©N)r   ©Ú.0Úrows     r+   ú	<genexpr>z _fold_by_date.<locals>.<genexpr>C   s   è ø€ Ò#=° C§H¥HÑ#=ùó   ‚c           	   3   ó„   •‡K  — | ]6  Št        ‰t        ˆfd „‰D «       «      t        ˆfd„‰D «       «      ¬«      –— Œ8 y­w)c              3   óV   •K  — | ]   }|j                   ‰k(  sŒ|j                  –— Œ" y ­wr9   )r   r    ©r;   r<   r   s     €r+   r=   z*_fold_by_date.<locals>.<genexpr>.<genexpr>G   s#   øè ø€ Ò#`ÀÈsÏxÉxÐ[_ÓO_ C×$;Õ$;Ñ#`ùó   ƒ)˜)c              3   óV   •K  — | ]   }|j                   ‰k(  sŒ|j                  –— Œ" y ­wr9   )r   r!   rA   s     €r+   r=   z*_fold_by_date.<locals>.<genexpr>.<genexpr>H   s#   øè ø€ ÒX¸ÀsÇxÁxÐSWÓGW × 3Õ 3ÑXùrB   )r   r    r!   N)r   Úsum)r;   r   r6   s    @€r+   r=   z _fold_by_date.<locals>.<genexpr>D   sD   ùè ø€ ò ð ô 	!ØÜ #Ó#`ÀtÔ#`Ó `ÜÓX¸tÔXÓX÷	
ð 	
ñùs   „<A ©ÚsortedÚ	frozensetÚtuple)r6   Údatess   ` r+   Ú_fold_by_daterJ   B   s4   ø€ Üœ)Ñ#=¸Ô#=Ó=Ó>€EÜó ð ôó ð r*   c                 ó’   ‡ — t        t        d„ ‰ D «       «      «      }t        ˆ fd„|D «       «      }t        t        |d„ d¬«      «      S )Nc              3   óL   K  — | ]  }|j                   |j                  f–— Œ y ­wr9   )r   r   r:   s     r+   r=   z!_fold_by_route.<locals>.<genexpr>O   s   è ø€ Ò#NÀ# S§\¡\°3·9±9Ô$=Ñ#Nùs   ‚"$c           
   3   ó’   •‡‡K  — | ]<  \  ŠŠt        ‰‰t        ˆˆfd „‰D «       «      t        ˆˆfd„‰D «       «      ¬«      –— Œ> y­w)c              3   óv   •K  — | ]0  }|j                   ‰k(  sŒ|j                  ‰k(  sŒ#|j                  –— Œ2 y ­wr9   )r   r   r    ©r;   r<   r   r   s     €€r+   r=   z+_fold_by_route.<locals>.<genexpr>.<genexpr>T   s6   øè ø€ ò $Ø,/¸3¿<¹<È8Ó;SÐX[×XaÑXaÐejÓXj�×'Õ'ñ$ùó   ƒ9˜9¨9c              3   óv   •K  — | ]0  }|j                   ‰k(  sŒ|j                  ‰k(  sŒ#|j                  –— Œ2 y ­wr9   )r   r   r!   rO   s     €€r+   r=   z+_fold_by_route.<locals>.<genexpr>.<genexpr>W   s2   øè ø€ Òw¸ÀsÇ|Á|ÐW_ÓG_Ðdg×dmÑdmÐqvÓdv × 3Õ 3ÑwùrP   )r   r   r    r!   N)r   rD   )r;   r   r   r6   s    @@€r+   r=   z!_fold_by_route.<locals>.<genexpr>P   sT   úè ø€ ò 
ñ ˆH�eô 	%ØØÜ #ô $Ø37ô$ó !ô  Ôw¸tÔwÓw÷	
ð 	
ñ
ùs   …AAc                 ó   — | j                   S r9   ©r    )Úentrys    r+   ú<lambda>z _fold_by_route.<locals>.<lambda>[   s   € °5×3LÑ3L€ r*   T)ÚkeyÚreverserE   )r6   ÚpairsÚentriess   `  r+   Ú_fold_by_routerZ   N   sI   ø€ Üœ)Ñ#NÈÔ#NÓNÓO€EÜó 
ð  %ô
ó 
€Gô ”˜Ñ%LÐVZÔ[Ó\Ð\r*   z/gateway/daily/activityzBudget & Spend Tracking)ÚtagsÚresponse_modelNzStart date in YYYY-MM-DD format)ÚdefaultÚdescriptionzEnd date in YYYY-MM-DD formatÚuser_api_key_dictÚ
start_dateÚend_datec              ƒ   óH  K  — ddl m} | j                  t        j                  t        j
                  fvrt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        «       \  }}|j                  j                  t        |xs ||xs |«      ƒ d{  –—† }t        j                  |xs d«      }t!        j"                  d	t%        |«      «       t'        t)        d
„ |D «       «      t)        d„ |D «       «      t+        |«      t-        |«      ¬«      S 7 Œ}­w)z·
    Successful and failed gateway requests, counted at the ASGI edge.

    Deployment-wide: the underlying table has no per-key or per-user dimension,
    so this is admin-only.
    r   )Úprisma_clienti“  zLOnly proxy admin roles can view gateway request counts across the deployment)Ústatus_codeÚdetailNiô  r)   z,/gateway/daily/activity - aggregated %d rowsc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr9   rS   r:   s     r+   r=   z-get_gateway_daily_activity.<locals>.<genexpr>‡   s   è ø€ Ò%NÀ# c×&=Õ&=Ñ%Nùr>   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr9   )r!   r:   s     r+   r=   z-get_gateway_daily_activity.<locals>.<genexpr>ˆ   s   è ø€ Ò!F¸# #×"5Õ"5Ñ!Fùr>   )Útotal_successful_requestsÚtotal_failed_requestsÚby_dateÚby_route)Úlitellm.proxy.proxy_serverrc   Ú	user_roler   ÚPROXY_ADMINÚPROXY_ADMIN_VIEW_ONLYr   r   Údb_not_connected_errorÚvaluer5   ÚdbÚ	query_rawr   r,   Úvalidate_pythonr   ÚdebugÚlenr   rD   rJ   rZ   )r_   r`   ra   rc   Údefault_startÚdefault_endÚraw_rowsr6   s           r+   Úget_gateway_daily_activityrz   ^   s  è ø€ õ  9à×"Ñ"Ü×$Ñ$Ü×.Ñ.ð+ñ ô ØØaô
ð 	
ð
 ÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcä!/Ó!1Ñ€M�;Ø)×,Ñ,×6Ñ6ÜØÒ#�mØÒ�Kó÷ €Hô  ×/Ñ/°²¸BÓ?€DÜ×ÑÐMÌsÐSWËyÔYä)Ü"%Ñ%NÈÔ%NÓ"NÜ!Ñ!FÀÔ!FÓFÜ˜dÓ#Ü Ó%ô	ð ðús   ‚B D"Â"D Â#A>D")*r%   Úcollections.abcr   r   r   r   Útypingr   r   Úfastapir	   r
   r   r   Úpydanticr   r   Úlitellm._loggingr   Úlitellm.proxy._typesr   r   r   Ú$litellm.proxy.auth.user_api_key_authr   Ú$litellm.types.proxy.gateway_requestsr   r   r   r   r'   r   r   r   rH   r,   r&   r5   rJ   rZ   Úgetrz   r)   r*   r+   ú<module>r„      sh  ðòõ %ß 2Ñ 2ß #ç <Ó <ß +å 1ß TÑ TÝ B÷ñ ñ “€ˆÓ à "Ð ˜Ó "ð
€�ó 
ô�Iô ñ # 5¨¸Ð);Ñ#<Ó=€ˆuÓ =ð@˜˜c 3˜h™ó @ð	˜ Ñ/ð 	°EÐ:RÐTWÐ:WÑ4Xó 	ð]˜ -Ñ0ð ]°UÐ;WÐY\Ð;\Ñ5]ó ]ð  ‡�ØØ
#Ð	$Ø1ð ó ñ #¨4Ð=^Ô_Ù ¨Ð;ZÔ[ñ(Ø  ±Ð9JÓ1KÐ!KÑLð(à�d‘
ð(ð �D‰jð(ð $ò	(óñ
(r*   