Ë
    uPêj_>  ã                   óN  — U d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	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mZmZmZmZmZmZmZmZmZ d	Zeed
<   dZeed<   dZ eed<   dZ!eed<   dZ"eed<   ee#ef   Z$eed<    ee$«      Z%eed<   dedz  de#dz  fd„Z& G d„ d«      Z'y)é    N)ÚMapping)ÚFinalÚ	TypeAlias)Ú	JsonValueÚTypeAdapterÚValidationError)Úverbose_logger)Ú_get_httpx_clienté   )
ÚCHATGPT_API_BASEÚCHATGPT_AUTH_BASEÚCHATGPT_CLIENT_IDÚCHATGPT_DEVICE_CODE_URLÚCHATGPT_DEVICE_TOKEN_URLÚCHATGPT_DEVICE_VERIFY_URLÚCHATGPT_OAUTH_TOKEN_URLÚGetAccessTokenErrorÚGetDeviceCodeErrorÚRefreshAccessTokenErroré<   ÚTOKEN_EXPIRY_SKEW_SECONDSi„  ÚDEVICE_CODE_TIMEOUT_SECONDSi,  ÚDEVICE_CODE_COOLDOWN_SECONDSé   ÚDEVICE_CODE_POLL_SLEEP_SECONDSzhttps://api.openai.com/authÚOPENAI_AUTH_CLAIM_KEYÚ
JsonObjectÚ_JSON_OBJECT_ADAPTERÚvalueÚreturnc                 ó*   — t        | t        «      r| S d S )N)Ú
isinstanceÚstr)r   s    úg/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/chatgpt/authenticator.pyÚ_optional_strr%   '   s   € Ü˜u¤cÔ*ˆ5Ð4°Ð4ó    c                   óš  — e Zd Zd d„Zdefd„Zdefd„Zdedz  fd„Zd d„Zde	dz  fd„Z
d	e	ddfd
„Zde	dedefd„Zdededz  fd„Zdede	fd„Zdedz  dedz  fd„Zdeeef   fd„Zdeeef   fd„Zdeeef   deeef   fd„Zdeeef   deeef   fd„Zdedeeef   fd„Zdeeef   de	fd„Zde	dz  defd„Zd d„Zdededz  fd„Zy)!ÚAuthenticatorr    Nc                 ó  — t        j                  dt         j                  j                  d«      «      | _        t         j                  j                  | j                  t        j                  dd«      «      | _        | j                  «        y )NÚCHATGPT_TOKEN_DIRz~/.config/litellm/chatgptÚCHATGPT_AUTH_FILEz	auth.json)ÚosÚgetenvÚpathÚ
expanduserÚ	token_dirÚjoinÚ	auth_fileÚ_ensure_token_dir©Úselfs    r$   Ú__init__zAuthenticator.__init__,   s]   € ÜŸ™ØÜ�G‰G×ÑÐ:Ó;ó
ˆŒô Ÿ™Ÿ™ d§n¡n´b·i±iÐ@SÐU`Ó6aÓbˆŒØ×ÑÕ r&   c                 ój   — t        j                  d«      xs t        j                  d«      xs t        S )Nr   ÚOPENAI_CHATGPT_API_BASE)r,   r-   r   r4   s    r$   Úget_api_basezAuthenticator.get_api_base4   s'   € Ü�y‰yÐ+Ó,Òh´·	±	Ð:SÓ0TÒhÔXhÐhr&   c                 óÄ  — | j                  «       }|rct        |j                  d«      «      }|r| j                  ||«      s|S t        |j                  d«      «      }|r	 | j	                  |«      }|d   S | j                  |«      }|dkD  r| j                  |«      }|r|S | j                  «       }|d   S # t
        $ r }t        j                  d|«       Y d }~Œdd }~ww xY w)NÚaccess_tokenÚrefresh_tokenz3ChatGPT refresh token failed, re-login required: %sr   )Ú_read_auth_filer%   ÚgetÚ_is_token_expiredÚ_refresh_tokensr   r	   ÚwarningÚ#_get_device_code_cooldown_remainingÚ_wait_for_access_tokenÚ_login_device_code)	r5   Ú	auth_datar;   r<   Ú	refreshedÚexcÚcooldown_remainingÚtokenÚtokenss	            r$   Úget_access_tokenzAuthenticator.get_access_token7   së   € Ø×/Ñ/Ó1ˆ	ÙÜ"/°	·±¸nÓ0MÓ"NˆLÙ D×$:Ñ$:¸9ÀlÔ$SØ#Ð#Ü#0°·±¸Ó1OÓ#PˆMÙðgØ'+×';Ñ';¸MÓ'J�IØ$ ^Ñ4Ð4ð %)×$LÑ$LÈYÓ$WÐØ Ò!Ø×6Ñ6Ð7IÓJˆEÙØ�à×/Ñ/Ó1ˆØ�nÑ%Ð%øô /ò gÜ"×*Ñ*Ð+`Ðbe×fÑfûðgús   Á B6 Â6	CÂ?CÃCc                 ó  — | j                  «       }|sy t        |j                  d«      «      }|r|S |j                  d«      }|j                  d«      }| j                  t        |xs |«      «      }|r| j	                  i |¥d|i¥«       |S )NÚ
account_idÚid_tokenr;   )r=   r%   r>   Ú_extract_account_idÚ_write_auth_file)r5   rE   rM   rN   r;   Úderiveds         r$   Úget_account_idzAuthenticator.get_account_idN   s‹   € Ø×/Ñ/Ó1ˆ	ÙØÜ)¨)¯-©-¸Ó*EÓFˆ
ÙØÐØ#Ÿ-™-¨
Ó3ˆØ'Ÿm™m¨NÓ;ˆØ×1Ñ1´-ÀÒ@XÈLÓ2YÓZˆÙØ×!Ñ!Ð"F YÐ"F°¸gÑ"FÔGØˆr&   c                 óš   — t         j                  j                  | j                  «      s"t        j                  | j                  d¬«       y y )NT)Úexist_ok)r,   r.   Úexistsr0   Úmakedirsr4   s    r$   r3   zAuthenticator._ensure_token_dir\   s-   € Ü�w‰w�~‰~˜dŸn™nÔ-Ü�K‰K˜Ÿ™°Ö6ð .r&   c                 ó8  — 	 t        | j                  d«      5 }t        j                  t	        j
                  |«      «      cd d d «       S # 1 sw Y   y xY w# t        $ r Y y t        j                  t        f$ r }t        j                  d|«       Y d }~y d }~ww xY w)NÚrzInvalid ChatGPT auth file: %s)Úopenr2   r   Úvalidate_pythonÚjsonÚloadÚOSErrorÚJSONDecodeErrorr   r	   rA   )r5   ÚfrG   s      r$   r=   zAuthenticator._read_auth_file`   s   € ð	Ü�d—n‘n cÓ*ð J¨aÜ+×;Ñ;¼D¿I¹IÀa»LÓI÷J÷ Jò Jûäò 	ÙÜ×$Ñ$¤oÐ6ò 	Ü×"Ñ"Ð#BÀCÔHÜûð	ús:   ‚A ˜(A
Á 	A Á
AÁA ÁA Á	BÁ!BÁ9BÂBÚdatac                 óà   — 	 t        | j                  d«      5 }t        j                  ||«       d d d «       y # 1 sw Y   y xY w# t        $ r }t        j                  d|«       Y d }~y d }~ww xY w)NÚwz%Failed to write ChatGPT auth file: %s)rY   r2   r[   Údumpr]   r	   Úerror)r5   r`   r_   rG   s       r$   rP   zAuthenticator._write_auth_filej   s`   € ð	OÜ�d—n‘n cÓ*ð #¨aÜ—	‘	˜$ Ô"÷#÷ #ñ #ûäò 	OÜ× Ñ Ð!HÈ#×NÑNûð	Oús0   ‚A ˜8¯A ¸A½A ÁA Á	A-ÁA(Á(A-rE   r;   c                 óF  — |j                  d«      }t        |t        t        f«      r't	        j                  «       t        |«      t
        z
  k\  S | j                  |«      }|r| j                  i |¥d|i¥«       |€yt	        j                  «       t        |«      t
        z
  k\  S )NÚ
expires_atT)r>   r"   ÚintÚfloatÚtimer   Ú_get_expires_atrP   )r5   rE   r;   Ústored_expires_atÚderived_expires_ats        r$   r?   zAuthenticator._is_token_expiredq   s“   € Ø#,§=¡=°Ó#>ÐÜÐ'¬#¬u¨Ô6Ü—9‘9“;¤%Ð(9Ó":Ô=VÑ"VÑVÐVØ$(×$8Ñ$8¸Ó$FÐÙØ×!Ñ!Ð"Q YÐ"Q°Ð>PÑ"QÔRØÐ%ØÜ�y‰y‹{œeÐ$6Ó7Ô:SÑSÑSÐSr&   rI   c                 óŠ   — | j                  |«      }|j                  d«      }t        |t        t        f«      rt        |«      S y )NÚexp)Ú_decode_jwt_claimsr>   r"   rg   rh   )r5   rI   Úclaimsrn   s       r$   rj   zAuthenticator._get_expires_at|   s:   € Ø×/Ñ/°Ó6ˆØ—Z‘Z Ó&ˆÜ�cœC¤˜<Ô(Ü�s“8ˆOØr&   c                 ó6  — 	 |j                  d«      }t        |«      dk  ri S |d   dt        |d   «       dz  z  z   }t        j                  |«      }t        j                  t        j                  |j                  d«      «      «      S # t        $ r i cY S w xY w)Nú.é   r   ú=é   zutf-8)
ÚsplitÚlenÚbase64Úurlsafe_b64decoder   rZ   r[   ÚloadsÚdecodeÚ	Exception)r5   rI   ÚpartsÚpayload_b64Úpayload_bytess        r$   ro   z Authenticator._decode_jwt_claimsƒ   s‘   € ð	Ø Ÿ;™; sÓ+ˆEÜ�5‹z˜AŠ~Ø�	Ø!& q¡¨C´C¸¸a¹³M°>ÀAÑ3EÑ,FÑ!FˆKÜ#)×#;Ñ#;¸KÓ#HˆMÜ'×7Ñ7¼¿
¹
À=×CWÑCWÐX_ÓC`Ó8aÓbÐbøÜò 	ØŠIð	ús   ‚ B
 £A&B
 Â
BÂBc                 óÀ   — |sy | j                  |«      }|j                  t        «      }t        |t        «      r%|j                  d«      }t        |t
        «      r|r|S y )NÚchatgpt_account_id)ro   r>   r   r"   Údictr#   )r5   rI   rp   Úauth_claimsrM   s        r$   rO   z!Authenticator._extract_account_idŽ   sU   € ÙØØ×/Ñ/°Ó6ˆØ#ŸZ™ZÔ(=Ó>ˆÜ�k¤4Ô(Ø +§¡Ð0DÓ EˆJÜ˜*¤cÔ*©zØ!Ð!Ør&   c                 óz  — | j                  | j                  «       «      }|dkD  r| j                  |«      }|rd|iS | j                  «       }| j	                  «        t        dt        › d|d   › d�d¬«       | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«       |S )	Nr   r;   z1Sign in with ChatGPT using device code:
1) Visit z
2) Enter code: Ú	user_codezB
Device codes are a common phishing target. Never share this code.T)Úflush)rB   r=   rC   Ú_request_device_codeÚ_record_device_code_requestÚprintr   Ú_poll_for_authorization_codeÚ_exchange_code_for_tokensÚ_build_auth_recordrP   )r5   rH   rI   Údevice_codeÚ	auth_coderJ   rE   s          r$   rD   z Authenticator._login_device_code™   sÖ   € Ø$(×$LÑ$LÈT×MaÑMaÓMcÓ$dÐØ Ò!Ø×6Ñ6Ð7IÓJˆEÙØ&¨Ð.Ð.à!×6Ñ6Ó8ˆØ×(Ñ(Ô*ÜðÜ1Ð2ð 3Ø)¨+Ñ6Ð7ð 8PðPð õ	
ð  ×<Ñ<¸[ÓIˆ	Ø×6Ñ6°yÓAˆØ×2Ñ2°6Ó:ˆ	Ø×Ñ˜iÔ(Øˆr&   c                 ól  — 	 t        «       }|j                  t        dt        i¬«      }|j	                  «        t
        j                  |j                  «       «      }t        |j                  d«      «      }t        |j                  d«      xs |j                  d«      «      }|j                  d	«      }|r|st        d
|› �d¬«      ‚||t!        |xs d«      dœS # t        j                  $ r)}t        d|› �|j                  j                  ¬«      ‚d }~wt        $ r}t        d|› �d¬«      ‚d }~ww xY w)NÚ	client_id©r[   zFailed to request device code: ©ÚmessageÚstatus_codeé�  Údevice_auth_idr…   ÚusercodeÚintervalz%Device code response missing fields: Ú5)r–   r…   r˜   )r
   Úpostr   r   Úraise_for_statusr   rZ   r[   ÚhttpxÚHTTPStatusErrorr   Úresponser”   r|   r%   r>   r#   )r5   ÚclientÚrespr`   rG   r–   r…   r˜   s           r$   r‡   z"Authenticator._request_device_code¯   s5  € ð	Ü-Ó/ˆFØ Ÿ+™+Ü'Ø!Ô#4Ð5ð &ó ˆDð ×!Ñ!Ô#Ü.×>Ñ>¸t¿y¹y»{ÓKˆDô !.¨d¯h©hÐ7GÓ.HÓ IˆÜ(¨¯©°+Ó)>Ò)VÀ$Ç(Á(È:ÓBVÓWˆ	ØŸ(™( :Ó.ˆÙ¡YÜ$Ø?À¸vÐFØôð ð
 -Ø"Ü˜HšO¨Ó,ñ
ð 	
øô' ×$Ñ$ò 	Ü$Ø9¸#¸Ð?ØŸL™L×4Ñ4ôð ûô ò 	Ü$Ø9¸#¸Ð?Øôð ûð	ús$   ‚AC ÃD3Ã.$DÄD3ÄD.Ä.D3r�   c                 óˆ  — t        «       }t        |j                  dd«      «      }t        j                  «       }t        j                  «       |z
  t        k  �r2	 |j                  t        |d   |d   dœ¬«      }|j                  dk(  r}t        j                  |j                  «       «      }t        |j                  d«      «      }t        |j                  d	«      «      }t        |j                  d
«      «      }	|r
|r|	r|||	dœS |j                  dv r$t        j                  t        |t        «      «       Œþ|j                  «        t        j                  t        |t        «      «       t        j                  «       |z
  t        k  r�Œ2t'        dd¬«      ‚# t         j"                  $ rz}
|
j$                  r|
j$                  j                  nd }|dv r)t        j                  t        |t        «      «       Y d }
~
�ŒÂt'        d|
› �|
j$                  j                  ¬«      ‚d }
~
wt(        $ r}
t'        d|
› �d¬«      ‚d }
~
ww xY w)Nr˜   r™   r–   r…   )r–   r…   r‘   éÈ   Úauthorization_codeÚcode_challengeÚcode_verifier)r£   r¤   r¥   )i“  i”  zPolling failed: r’   r•   z*Timed out waiting for device authorizationi˜  )r
   rg   r>   ri   r   rš   r   r”   r   rZ   r[   r%   ÚsleepÚmaxr   r›   rœ   r�   rž   r   r|   )r5   r�   rŸ   r˜   Ú
start_timer    r`   r£   r¤   r¥   rG   r”   s               r$   rŠ   z*Authenticator._poll_for_authorization_codeÑ   sø  € Ü)Ó+ˆÜ˜kŸo™o¨j¸#Ó>Ó?ˆÜ ŸI™I›Kˆ
Ü�i‰i‹k˜JÑ&Ô)DÓDð$Ø—{‘{Ü,à*5Ð6FÑ*GØ%0°Ñ%=ñð #ó �ð ×#Ñ# sÒ*Ü/×?Ñ?ÀÇ	Á	ÃÓL�DÜ)6°t·x±xÐ@TÓ7UÓ)VÐ&Ü%2°4·8±8Ð<LÓ3MÓ%N�NÜ$1°$·(±(¸?Ó2KÓ$L�MÙ)©nÁà2DØ.<Ø-:ñ ð ð
 ×#Ñ# zÑ1Ü—J‘Jœs 8Ô-KÓLÔMØØ×%Ñ%Ô'ô �J‰J”s˜8Ô%CÓDÔEôM �i‰i‹k˜JÑ&Ô)DÔDôP "Ø@Øô
ð 	
øô! ×(Ñ(ò Ø:=¿,º,˜cŸl™l×6Ò6ÈD�Ø *Ñ,Ü—J‘Jœs 8Ô-KÓLÔMÝÜ)Ø.¨s¨eÐ4Ø #§¡× 8Ñ 8ôð ûô ò Ü)Ø.¨s¨eÐ4Ø #ôð ûðús8   ÁB+F Ä1F Ä8F ÆIÆ+AH Ç<$H È IÈ,H<È<IÚ	code_datac           	      ó~  — 	 t        «       }t        › d�}d|d   › d|› dt        › d|d   › �}|j                  t        dd	i|¬
«      }|j                  «        t        j                  |j                  «       «      }t        |j!                  d«      «      }t        |j!                  d«      «      }	t        |j!                  d«      «      }
|r|	r|
st        d|› �d¬«      ‚||	|
dœS # t        j                  $ r)}t        d|› �|j                  j                  ¬«      ‚d }~wt        $ r}t        d|› �d¬«      ‚d }~ww xY w)Nz/deviceauth/callbackz#grant_type=authorization_code&code=r£   z&redirect_uri=z&client_id=z&code_verifier=r¥   zContent-Typez!application/x-www-form-urlencoded)ÚheadersÚcontentzToken exchange failed: r’   r•   r;   r<   rN   z(Token exchange response missing fields: ©r;   r<   rN   )r
   r   r   rš   r   r›   r   rZ   r[   rœ   r�   r   rž   r”   r|   r%   r>   )r5   r©   rŸ   Úredirect_uriÚbodyr    r`   rG   r;   r<   rN   s              r$   r‹   z'Authenticator._exchange_code_for_tokens  so  € ð	Ü-Ó/ˆFÜ%6Ð$7Ð7KÐ"LˆLðØ"Ð#7Ñ8Ð9Ø   ØÔ/Ð0Ø! )¨OÑ"<Ð!=ð	?ð ð !Ÿ+™+Ü'Ø'Ð)LÐMØð &ó ˆDð
 ×!Ñ!Ô#Ü.×>Ñ>¸t¿y¹y»{ÓKˆDô ,¨D¯H©H°^Ó,DÓEˆÜ,¨T¯X©X°oÓ-FÓGˆÜ'¨¯©°Ó(<Ó=ˆÙ¡=¹Ü%ØBÀ4À&ÐIØôð ð
 )Ø*Ø ñ
ð 	
øô' ×$Ñ$ò 	Ü%Ø1°#°Ð7ØŸL™L×4Ñ4ôð ûô ò 	Ü%Ø1°#°Ð7Øôð ûð	ús$   ‚A8C$ Ã$D<Ã7$DÄD<Ä'D7Ä7D<r<   c                 ó�  — 	 t        «       }|j                  t        t        d|ddœ¬«      }|j	                  «        t
        j                  |j                  «       «      }t        |j                  d«      «      }t        |j                  d	«      «      }|r|st        d
|› �d¬«      ‚|t        |j                  d«      «      xs ||dœ}| j!                  |«      }	| j#                  |	«       |S # t        j                  $ r)}t        d|› �|j                  j                  ¬«      ‚d }~wt        $ r}t        d|› �d¬«      ‚d }~ww xY w)Nr<   zopenid profile email)r�   Ú
grant_typer<   Úscoper‘   zRefresh token failed: r’   r•   r;   rN   z!Refresh response missing fields: r­   )r
   rš   r   r   r›   r   rZ   r[   rœ   r�   r   rž   r”   r|   r%   r>   rŒ   rP   )
r5   r<   rŸ   r    r`   rG   r;   rN   rF   rE   s
             r$   r@   zAuthenticator._refresh_tokens-  sM  € ð	Ü-Ó/ˆFØ Ÿ+™+Ü'ä!2Ø"1Ø%2Ø3ñ	ð &ó ˆDð ×!Ñ!Ô#Ü.×>Ñ>¸t¿y¹y»{ÓKˆDô ,¨D¯H©H°^Ó,DÓEˆÜ'¨¯©°Ó(<Ó=ˆÙ¡8Ü)Ø;¸D¸6ÐBØôð ð )Ü*¨4¯8©8°OÓ+DÓEÒVÈØ ñ
ˆ	ð
  ×2Ñ2°9Ó=ˆ	Ø×Ñ˜iÔ(ØÐøô5 ×$Ñ$ò 	Ü)Ø0°°Ð6ØŸL™L×4Ñ4ôð ûô ò 	Ü)Ø0°°Ð6Øôð ûð	ús$   ‚AC- Ã-EÄ $D$Ä$EÄ0E Å ErJ   c                 óÈ   — |j                  d«      }|j                  d«      }|r| j                  |«      nd }| j                  |xs |«      }||j                  d«      |||dœS )Nr;   rN   r<   )r;   r<   rN   rf   rM   )r>   rj   rO   )r5   rJ   r;   rN   rf   rM   s         r$   rŒ   z Authenticator._build_auth_recordW  sj   € Ø$Ÿj™j¨Ó8ˆØ Ÿ*™* ZÓ0ˆÙBN˜D×0Ñ0°Ô>ÐTXˆ
Ø ×4Ñ4°XÒ5MÀÓNˆ
à(Ø#ŸZ™Z¨Ó8Ø Ø$Ø$ñ
ð 	
r&   c                 óü   — |sy|j                  d«      }t        |t        t        t        f«      sy	 t        |«      }t        j                  «       |z
  }t        |z
  }t        d|«      S # t
        t        f$ r Y yw xY w)Nç        Údevice_code_requested_at)
r>   r"   rg   rh   r#   Ú	TypeErrorÚ
ValueErrorri   r   r§   )r5   rE   Úrequested_atÚrequested_secondsÚelapsedÚ	remainings         r$   rB   z1Authenticator._get_device_code_cooldown_remainingd  s~   € ÙØØ'Ÿm™mÐ,FÓGˆÜ˜,¬¬e´SÐ(9Ô:Øð	Ü',¨\Ó':Ðô Ÿ™›Ð'8Ñ8ˆÜ7¸'ÑAˆ	Ü�3˜	Ó"Ð"øô	 œ:Ð&ò 	Ùð	ús   ²A) Á)A;Á:A;c                 ó~   — | j                  «       xs i }| j                  i |¥dt        j                  «       i¥«       y )Nr¶   )r=   rP   ri   )r5   rE   s     r$   rˆ   z)Authenticator._record_device_code_requestr  s7   € Ø×/Ñ/Ó1Ò7°Rˆ	Ø×ÑÐT ÐTÐ,FÌÏ	É	ËÑTÕUr&   Útimeout_secondsc           	      óª  — t        j                   «       |z   }t        j                   «       |k  r¥| j                  «       }|r0t        |j                  d«      «      }|r| j	                  ||«      s|S t        t        t        d|t        j                   «       z
  «      «      }|dk  r	 y t        j                  |«       t        j                   «       |k  rŒ¥y )Nr;   rµ   r   )	ri   r=   r%   r>   r?   Úminr   r§   r¦   )r5   r¾   ÚdeadlinerE   r;   Ú	sleep_fors         r$   rC   z$Authenticator._wait_for_access_tokenv  s¯   € ÜŸ)™)›+¨Ñ7ˆÜ�i‰i‹k˜HÒ$Ø×,Ñ,Ó.ˆIÙÜ,¨Y¯]©]¸>Ó-JÓK�Ù¨×(>Ñ(>¸yÈ,Ô(WØ'Ð'ÜÔ:¼CÀÀXÔPT×PYÑPYÓP[ÑE[Ó<\Ó]ˆIØ˜AŠ~Øàô �J‰J�yÔ!ô �i‰i‹k˜HÓ$ð r&   )r    N)Ú__name__Ú
__module__Ú__qualname__r6   r#   r9   rK   rR   r3   r   r=   rP   Úboolr?   rg   rj   ro   rO   r‚   rD   r‡   rŠ   r‹   r@   rŒ   rh   rB   rˆ   rC   © r&   r$   r(   r(   +   s¢  „ ó!ði˜có ið& #ó &ð.  d¡
ó ó7ð ¨dÑ!2ó ðO Zð O°Dó Oð	T¨:ð 	TÀSð 	TÈTó 	Tð Sð ¨S°4©Zó ð	¨ð 	°
ó 	ð	¨¨t©ð 	¸¸d¹
ó 	ð D¨¨c¨¡Nó ð, 
 d¨3°¨8¡nó  
ðD/
¸¸SÀ#¸X¹ð /
È4ÐPSÐUXÐPXÉ>ó /
ðb)
°4¸¸S¸±>ð )
ÀdÈ3ÐPSÈ8Ánó )
ðV(¨Sð (°T¸#¸s¸(±^ó (ðT
¨¨c°3¨h©ð 
¸Jó 
ð#¸ZÈ$Ñ=Nð #ÐSXó #óVð°eð ÀÀdÁ
ô r&   r(   )(rx   r[   r,   ri   Úcollections.abcr   Útypingr   r   rœ   Úpydanticr   r   r   Úlitellm._loggingr	   Ú&litellm.llms.custom_httpx.http_handlerr
   Úcommon_utilsr   r   r   r   r   r   r   r   r   r   r   Ú__annotations__r   r   r   r   r#   r   r   r%   r(   rÇ   r&   r$   ú<module>rÏ      s¹   ðÜ Û Û 	Û Ý #ß #ã ß <Ñ <å +Ý D÷÷ ÷ ð $&Ð ˜5Ó %Ø%,Ð ˜UÓ ,Ø&,Ð ˜eÓ ,Ø()Ð  Ó )à<Ð �uÓ <à  Y Ñ/€
ˆIÓ /á)¨*Ó5Ð �eÓ 5ð5˜ TÑ)ð 5¨c°D©jó 5÷Wò Wr&   