Ë
    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	m
Z
 ddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZ ddlmZ ddlmZ ddlmZ dZee d<   erddl!m"Z# e#ez  Z"neZ"de$e%e&f   de%dz  de$e%e&f   fd„Z' G d„ d«      Z(y)z
Handles Authentication Errors
é    )ÚMapping)ÚTYPE_CHECKINGÚAnyÚFinal)ÚHTTPExceptionÚRequestÚstatusN)Úverbose_proxy_logger)ÚEMPTY_MAPPING)Úseed_request_identity)Úis_expected_client_error)ÚLitellmUserRolesÚProxyErrorTypesÚProxyExceptionÚUserAPIKeyAuth)Ú_get_request_ip_address)ÚPrismaDBExceptionHandler)ÚServiceTypesÚ__db_unavailable_fallback__ÚDB_UNAVAILABLE_FALLBACK_USER_ID)ÚSpanÚrequest_dataÚrequester_ipÚreturnc                 ó®   — |s| S d| v rdnd}| j                  |«      }t        |t        «      r|nt        }|j                  d«      r| S i | ¥|i |¥d|i¥i¥S )z¨Auth gate rejections are raised before `add_litellm_data_to_request` records the
    caller IP, so their failure logs would otherwise carry no IP nor key/user identity.Úlitellm_metadataÚmetadataÚrequester_ip_address)ÚgetÚ
isinstancer   r   )r   r   Úkeyr   Úbases        ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/auth/auth_exception_handler.pyÚ_with_requester_ip_addressr$   '   sp   € ñ ØÐØ'9¸\Ñ'IÑ#Èz€CØ"×&Ñ& sÓ+€HÜ4>¸xÌÔ4Q©ÔWd€DØ‡x�xÐ&Ô'ØÐØPˆlÐP˜CÐ!O DÐ!OÐ*@À,Ñ!OÑPÐPó    c                   óX   — e Zd Ze	 ddededeeef   dede	dz  dede
dz  d	e
fd
„«       Zy)ÚUserAPIKeyAuthExceptionHandlerNÚeÚrequestr   ÚrouteÚparent_otel_spanÚapi_keyÚresolved_identityr   c           
   ƒ   ó´  K  — ddl m}m} t        j                  «       ryt        j
                  | «      rd|j                  j                  t        j                  d| d¬«       t        j                  d«       t        ddt        t        j                  |¬«      S t!        ||j#                  d	«      d
u ¬«      }	t%        | «      r t&        j(                  st        j*                  nt        j,                  }
 |
d| |	d|	i¬«       |�|j/                  «       n	t        «       }||_        ||_        |j4                  xs t        |¬«      j4                  |_        t7        ||j#                  d«      ¬«       t9        | t&        j:                  «      rE| j<                  s9ddlm } |j#                  d«      } |t9        |tB        «      r|nd«      \  }| _        |jE                  tG        ||	«      | |tH        jJ                  |¬«      ƒ d{  –—† }|�|} t9        | t&        j:                  «      r@tM        | jN                  tH        jP                  dtS        | dtT        jV                  «      ¬«      ‚t9        | tX        «      rPtM        tS        | dd| › d�«      tH        jJ                  tS        | dd«      tS        | dtT        jZ                  «      ¬«      ‚t9        | tL        «      r| ‚t        j\                  | «      r+tM        dtH        j^                  dtT        j`                  ¬«      ‚tM        dtC        | «      z   tH        jJ                  tS        | dd«      tT        jZ                  ¬«      ‚7 �ŒW­w)aâ  
        Handles Connection Errors when reading a Virtual Key from LiteLLM DB
        Use this if you don't want failed DB queries to block LLM API reqiests

        Reliability scenarios this covers:
        - DB is down and having an outage
        - Unable to read / recover a key from the DB

        Returns:
            - UserAPIKeyAuth: If general_settings.allow_requests_on_db_unavailable is True

        Raises:
            - Original Exception in all other cases
        r   )Úgeneral_settingsÚproxy_logging_objÚget_key_objectg        )ÚserviceÚ	call_typeÚerrorÚdurationup   Auth: DB unavailable â€” issuing restricted INTERNAL_USER fallback token (allow_requests_on_db_unavailable=True)zfailed-to-connect-to-db)Úkey_nameÚtokenÚuser_idÚ	user_roleÚrequest_routeÚuse_x_forwarded_forT)r)   r;   z^litellm.proxy.proxy_server.user_api_key_auth(): Exception occured - %s
Requester IP Address:%sr   )ÚextraN)r,   Úmodel)r=   )Ú#resolve_llm_provider_for_rate_limit)r   Úoriginal_exceptionÚuser_api_key_dictÚ
error_typer*   Ústatus_code)ÚmessageÚtypeÚparamÚcodeÚdetailzAuthentication Error(ú)rE   ÚNonezbService Unavailable, the authentication database is temporarily unreachable. Please retry shortly.zAuthentication Error, )1Úlitellm.proxy.proxy_serverr/   r0   r   Ú&should_allow_request_on_db_unavailableÚis_database_connection_errorÚservice_logging_objÚservice_failure_hookr   ÚDBr
   Úwarningr   r   r   ÚINTERNAL_USERr   r   r   ÚlitellmÚlog_client_error_tracebacksr4   Ú	exceptionÚ
model_copyr+   r:   r,   r   r    ÚBudgetExceededErrorÚllm_providerÚ&litellm.proxy.hooks.rate_limiter_utilsr>   ÚstrÚpost_call_failure_hookr$   r   Ú
auth_errorr   rC   Úbudget_exceededÚgetattrr	   ÚHTTP_429_TOO_MANY_REQUESTSr   ÚHTTP_401_UNAUTHORIZEDÚ%is_database_service_unavailable_errorÚno_db_connectionÚHTTP_503_SERVICE_UNAVAILABLE)r(   r)   r   r*   r+   r,   r-   r/   r0   r   Úlog_fnr@   r>   Úbudget_modelÚ_Útransformed_exceptions                   r#   Ú_handle_authentication_errorz;UserAPIKeyAuthExceptionHandler._handle_authentication_error5   s  è ø€ ÷0	
ô %×KÑKÔMÜ(×EÑEÀaÔHð ×1Ñ1×FÑFÜ$Ÿ™Ø*ØØð	 Gô ô !×(Ñ(ðIôô "Ø2Ø/Ü7Ü*×8Ñ8Ø#ôð ô #:ØØ$4×$8Ñ$8Ð9NÓ$OÐSWÐ$Wô#ˆLô ,¨AÔ.´w×7ZÒ7Zô %×*Ò*ä)×3Ñ3ð ñ
 ØqØØØ% |Ð4õ	ð CTÐB_Ð 1× <Ñ <Ô >ÔesÓeuÐØ1AÐÔ.Ø.3ÐÔ+Ø(9×(AÑ(AÒ(lÄ^Ð\cÔEd×ElÑElÐÔ%ô
 "Ø!Ø"×&Ñ& wÓ/õô ˜!œW×8Ñ8Ô9À!Ç.Â.õð '3×&6Ñ&6°wÓ&?�Ù$GÜ$.¨|¼SÔ$A‘LÀtó%Ñ!��1”>ð
 2C×1YÑ1YÜ7¸ÀlÓSØ#$Ø"3Ü*×5Ñ5Øð 2Zó 2÷ ,Ð!ð %Ð0Ø)�ä˜!œW×8Ñ8Ô9Ü$ØŸI™IÜ(×8Ñ8ØÜ   M´6×3TÑ3TÓUô	ð ô ˜!œ]Ô+Ü$Ü# A xÐ3HÈÈÈ1Ð1MÓNÜ(×3Ñ3Ü! ! W¨fÓ5Ü   M´6×3OÑ3OÓPô	ð ô ˜Aœ~Ô.Ø�Ü'×MÑMÈaÔPÜ$ðIô )×9Ñ9Ø Ü×<Ñ<ôð ô !Ø0´3°q³6Ñ9Ü$×/Ñ/Ü˜a ¨&Ó1Ü×1Ñ1ô	ð ðK,ûs   ‚G<MÇ>MÇ?EM)N)Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodÚ	Exceptionr   ÚdictrY   Úobjectr   r   rg   © r%   r#   r'   r'   4   s�   „ Øð 48ñSØðSàðSð ˜3 ˜;Ñ'ðSð ð	Sð
  ™+ðSð ðSð *¨DÑ0ðSð 
òSó ñSr%   r'   ))Ú__doc__Úcollections.abcr   Útypingr   r   r   Úfastapir   r   r	   rR   Úlitellm._loggingr
   Úlitellm.constantsr   Ú!litellm.integrations.otel.runtimer   Ú'litellm.litellm_core_utils.core_helpersr   Úlitellm.proxy._typesr   r   r   r   Úlitellm.proxy.auth.auth_utilsr   Ú"litellm.proxy.db.exception_handlerr   Úlitellm.types.servicesr   r   Ú__annotations__Úopentelemetry.tracer   Ú_Spanrm   rY   rn   r$   r'   ro   r%   r#   ú<module>r      s§   ðòõ $ß ,Ñ ,ç 2Ñ 2ã Ý 1Ý +Ý CÝ L÷ó õ BÝ GÝ /ð *GÐ  Ó FáÝ1à�3‰;�Dà€Dð
Q¨T°#°v°+Ñ->ð 
QÈcÐTXÉjð 
QÐ]aÐbeÐgmÐbmÑ]nó 
Q÷Uò Ur%   