
    Cjb                        % S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
JrJrJrJr   SSKrSSKrSr\\S'   SSKJr  S	S
SSSSSS/S.SSSSSS/ SQS.SSSSSSSS/S.SS S!S"S#S/ SS$S%S&.
S'S(S)S*S+SS,/S-S./S/S0/S1.	S2S3S4SSSS5S6/S7S8./r\\   \S9'   \R0                  " S:5      rS;rS<rS=rS>rS?rS@rSAr SBr!SCr"SDr#SEr$SFr%SG\4SH jr&SI\'SJ\'SG\'4SK jr(SL\'SG\'4SM jr)SL\'SG\'4SN jr*SL\'SG\'4SO jr+SL\'SG\'4SP jr,SL\'SG\'4SQ jr-SL\'SG\'4SR jr.SG\'4SS jr/ST\'SG\'4SU jr0SV\'SG\'4SW jr1SXr2 " SY SZ5      r3S\S[ jr4g! \ a
    SrSrSr GNf = f)]u   
LiteLLM Interactive Setup Wizard

Guides users through selecting LLM providers, entering API keys,
and generating a proxy config file — mirroring the Claude Code onboarding UX.
    N)Path)DictListOptionalSetT_HAS_RAW_TERMINALF)check_valid_keyopenaiOpenAIzGPT-4o, GPT-4o-mini, o3-miniOPENAI_API_KEYzsk-...zgpt-4o-minizgpt-4o)idnamedescriptionenv_keykey_hint
test_modelmodels	anthropic	AnthropiczCClaude Fable 5, Opus 4.8, Opus 4.7, Opus 4.6, Sonnet 4.6, Haiku 4.5ANTHROPIC_API_KEYz
sk-ant-...claude-haiku-4-5-20251001)zclaude-fable-5zclaude-opus-4-8zclaude-opus-4-7zclaude-opus-4-6zclaude-sonnet-4-6r   geminizGoogle Geminiz Gemini 2.0 Flash, Gemini 2.5 ProGEMINI_API_KEYzAIza...zgemini/gemini-2.0-flashzgemini/gemini-2.5-proazurezAzure OpenAIzGPT-4o via AzureAZURE_AI_API_KEYzyour-azure-keyz$https://<resource>.openai.azure.com/z2024-07-01-preview)
r   r   r   r   r   r   r   needs_api_baseapi_base_hintapi_versionbedrockzAWS BedrockzClaude 3.5, Llama 3 via AWSAWS_ACCESS_KEY_IDzAKIA...z0bedrock/anthropic.claude-haiku-4-5-20251001-v1:0AWS_SECRET_ACCESS_KEYAWS_REGION_NAMEzyour-secret-keyz	us-east-1)	r   r   r   r   r   r   r   
extra_keysextra_hintsollamaOllamaz&Local models (llama3.2, mistral, etc.)zollama/llama3.2zollama/mistralzhttp://localhost:11434)r   r   r   r   r   r   r   api_base	PROVIDERSz\033\[[^m]*mz[38;2;215;119;87mz[2mz[1mz[38;2;78;186;101mz[38;2;177;185;249mz[38;2;153;153;153mz[0mu   ✔u   ✘z[?25lz[?25hz[{}Areturnc                      [         R                  R                  5       =(       a!    [        R                  R                  S5      S L $ )NNO_COLOR)sysstdoutisattyosenvironget     f/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/litellm/setup_wizard.py_supports_colorr5      s,    ::E2::>>*#=#EEr3   codetextc                 <    [        5       (       a  U  U [         3$ U$ N)r5   _RESET)r6   r7   s     r4   _cr;      s"    &5&7&7dVD6&"ATAr3   tc                 "    [        [        U 5      $ r9   )r;   _ORANGEr<   s    r4   oranger@      s    gq>r3   c                 "    [        [        U 5      $ r9   )r;   _BOLDr?   s    r4   boldrC          eQ<r3   c                 "    [        [        U 5      $ r9   )r;   _GREENr?   s    r4   greenrG      s    fa=r3   c                 "    [        [        U 5      $ r9   )r;   _BLUEr?   s    r4   bluerJ      rD   r3   c                 "    [        [        U 5      $ r9   )r;   _GREYr?   s    r4   greyrM      rD   r3   c                 "    [        [        U 5      $ r9   )r;   _DIMr?   s    r4   dimrP      s    dA;r3   c                      [        S5      $ )zGReturn a styled divider line (evaluated at call-time, not import-time).u     ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌)rP   r2   r3   r4   _dividerrR      s     !!r3   promptc                     [         R                  R                  5       (       a  [        R	                  S U 5      nO[        R	                  SU 5      n[        U5      R                  5       $ )z
Like input() but wraps ANSI sequences in readline ignore markers
(\001...\002) so readline correctly tracks the cursor column.
In non-TTY contexts, strips ANSI entirely so no escape codes appear.
c                 *    SU R                  5        S3$ )N)group)ms    r4   <lambda>_styled_input.<locals>.<lambda>   s    T!'')D+Ar3    )r,   r-   r.   _ANSI_REsubinputstrip)rS   	rl_prompts     r4   _styled_inputrb      sL     zzLL!A6J	LLV,	!!##r3   valuec                     U R                  SS5      R                  SS5      R                  SS5      R                  SS5      R                  S	S
5      $ )zBEscape a string for safe embedding in a double-quoted YAML scalar.\z\\"z\"
z\nz\r	z\t)replace)rc   s    r4   _yaml_escaperk      sG     	dF#	e		u		u		u	r3   u+  
  ██╗     ██╗████████╗███████╗██╗     ██╗     ███╗   ███╗
  ██║     ██║╚══██╔══╝██╔════╝██║     ██║     ████╗ ████║
  ██║     ██║   ██║   █████╗  ██║     ██║     ██╔████╔██║
  ██║     ██║   ██║   ██╔══╝  ██║     ██║     ██║╚██╔╝██║
  ███████╗██║   ██║   ███████╗███████╗███████╗██║ ╚═╝ ██║
  ╚══════╝╚═╝   ╚═╝   ╚══════╝╚══════╝╚══════╝╚═╝     ╚═╝
c            	          \ rS rSrSr\SS j5       r\SS j5       r\SS j5       r\S\	\
   4S j5       r\S\4S	 j5       r\S
\S\\   S\S\4S j5       r\S\	\
   4S j5       r\S\	\
   4S j5       r\S\	\
   S\
\\4   4S j5       r\S\
S\4S j5       r\S\
S\S\4S j5       r\S S j5       r\S\	\
   S\
\\4   S\S\4S j5       r\S\S\S\SS4S j5       r\S\S\S\SS4S j5       rSrg)!SetupWizard   u   
Interactive onboarding wizard: provider selection → API keys → config file.

All methods are static — the class is purely a namespace with clear
single-responsibility sections. Entry point: SetupWizard.run().
r)   Nc                       [         R                  5         g ! [        [        4 a    [	        S[        S5       S35         g f = f)Nz

  zSetup cancelled.rg   )rm   _wizardKeyboardInterruptEOFErrorprintrM   r2   r3   r4   runSetupWizard.run   s?    	9!!8, 	9F4 234B78	9s    (AAc                  X   [         R                  5         [        S[        S5       35        [        5         [         R	                  5       n [         R                  U 5      n[         R                  5       u  p#[        [        R                  " 5       5      S-  n UR                  [         R                  XU5      5        [         R                  XBU5        [         R                  XBU5        g ! [         a6  n[        S[        [        S-   5       SU 35        [        S5         S nAg S nAff = f)N  zLets get started.zlitellm_config.yaml
  z Could not write config: z9  Try running from a directory you have write access to.
)rm   _print_welcomers   rC   _select_providers_collect_keys_proxy_settingsr   r/   getcwd
write_text_build_configOSError_CROSS_print_success_offer_start)	providersenv_varsport
master_keyconfig_pathexcs         r4   rp   SetupWizard._wizard   s    ""$4+,-./113	,,Y7&668299;'*??	"")))zJ 	"";jA  J?  	Df'AABC1SEJKNO	s   %C) )
D)3,D$$D)c                  |    [         R                  R                  S5      n [	        5         [	        [        [        R                  S5      5      5        [	        S[        S5       S[        S5       S[        S	U -   5       35        [	        5         [	        [        5       5        [	        5         g ! [         a    Sn  Nf = f)
Nlitellmunknownrg   rw   Welcomez to LiteLLMry   v)	importlibmetadataversion	Exceptionrs   r@   LITELLM_ASCIIrstriprC   rM   rR   )r   s    r4   rz   SetupWizard._print_welcome  s    	 ((00;G 	f]))$/016)$%T$y/):!Dw<O;PQRhj  	 G	 s   B, ,B;:B;c                      [         (       d  [        R                  5       $  [        R                  5       $ ! [         a    [        R                  5       s $ f = f)zKArrow-key multi-select. Falls back to number input if /dev/tty unavailable.)r   rm   _select_fallback_select_interactiver   r2   r3   r4   r{   SetupWizard._select_providers  sK     ! //11	22244 	2//11	2s   5 AAc                  2   [         b  [        c   e[        SS5       n U R                  5       n[         R                  " U5      n [        R
                  " U5        U R                  S5      nUS:X  a  U R                  S5      nUS:X  aS  U R                  S5      nSUR                  SS	S
9-   [         R                  " U[         R                  U5        sSSS5        $ SUR                  SS	S
9-   [         R                  " U[         R                  U5        sSSS5        $ UR                  SS	S
9[         R                  " U[         R                  U5        sSSS5        $ ! [         R                  " U[         R                  U5        f = f! , (       d  f       g= f)z,Read one keypress from /dev/tty in raw mode.Nz/dev/ttyrb         [z[zutf-8rj   )errors)
termiosttyopenfileno	tcgetattrsetrawreaddecode	tcsetattr	TCSADRAIN)tty_fhfdoldchch2ch3s         r4   	_read_keySetupWizard._read_key  sI    CO	
3*d#vB##B'C>

2[[^= ++a.Cd{$kk!n&GI)NN !!"g&7&7= $# "CJJwyJ$II !!"g&7&7= $# yyy;!!"g&7&7= $# !!"g&7&7= $#s<   'FA'E,&FE.&FE-&F(FF
Fcursorselectedfirst_renderc                    S[        S5       S3[        S5      S-   S/n[        [        5       Ht  u  pEX@:X  a  [	        S5      OSnXA;   a  [        S5      O
[        S5      nX@:X  a  [        US	   5      OUS	   nUR                  S
U SU SU S
[        US   5       S3	5        Mv     UR                  S5        SR                  U5      n	U(       dP  [        5       (       aA  [        R                  R                  [        R                  U	R                  S5      5      5        [        R                  R                  U	5        [        R                  R                  5         U	R                  S5      $ )zFDraw or redraw the provider list. Returns the number of lines printed.rx   Add your first modelrg   u;     ↑↓ to navigate · Space to select · Enter to confirm   ❯ry   u   ◉u   ○r   rw   r   r\   )rC   rM   	enumerater(   rJ   rG   appendjoinr5   r,   r-   write_MOVE_UPformatcountflush)
r   r   r   linesiparrowbulletname_strcontents
             r4   _render_selectorSetupWizard._render_selector1  s*    4./03NORVV

 i(DA#$;DKCE%&]U5\UF*++tAfI1V9HLL2eWAfXQxj4-@P;Q:RRTUV	 )
 	T''%. 1 1JJX__W]]4-@AB

!

}}T""r3   c                     Sn [        5       n[        5       (       aA  [        R                  R	                  [
        5        [        R                  R                  5          [        R                  XSS9   [        R                  5       nSnUS:X  a  U S-
  [        [        5      -  n SnOdUS:X  a  U S-   [        [        5      -  n SnOFUS:X  a  UR                  U 15        SnO+US	;   a  U(       d  UR                  U 5        O)US
;   a  [        eU(       a  [        R                  XSS9  M  [        5       (       aA  [        R                  R	                  [        5        [        R                  R                  5         [!        U5       Vs/ s H  n[        U   PM     sn$ ! [        5       (       aB  [        R                  R	                  [        5        [        R                  R                  5         f f = fs  snf )Nr   T)r   Fz[Ar   z[Bry   )rh   rg   ))setr5   r,   r-   r   _CURSOR_HIDEr   rm   r   r   lenr(   symmetric_difference_updateaddrq   _CURSOR_SHOWsorted)r   r   keydirtyr   s        r4   r   SetupWizard._select_interactiveG  s    UJJ\*JJ	#(((M!++-(?$qjC	N:F EH_$qjC	N:F ECZ88&B EL(# V,,,++00PU0V' *   

  .

  "&,X&67&6	!&677	   

  .

  " ! 8s   C
F G1AG.c                     [        5         [        S[        S5       35        [        [        S5      5        [        5         [        [        S5       HF  u  p[        S[        [        U 5      S-   5       S[        US   5       S[        US   5       35        MH     [        5          [        S[        S	5       S
35      nU(       d  [        [        S5      5        M6   UR                  SS5      R                  S5       Vs/ s H3  nUR                  5       (       d  M  [        UR                  5       5      PM5     nn[        U Vs1 s H%  nSUs=::  a  [        [        5      ::  d  M  O  M#  UiM'     sn5      nU(       d(  [        [        S[        [        5       S35      5        GM  U V s/ s H  n [        U S-
     PM     sn $ s  snf s  snf s  sn f ! [         a    [        [        S5      5         Of = fGMS  )z=Number-based fallback when raw terminal input is unavailable.rw   r   zG  Enter numbers separated by commas (e.g. 1,2). Press Enter to confirm.r   .ry   r   r   r   z Provider(s): z&  Please select at least one provider.,z  Enter numbers between 1 and z-  Enter numbers separated by commas, e.g. 1,3)rs   rC   rM   r   r(   strrb   rJ   rj   splitr`   intr   r   
ValueError)r   r   rawxnumsnvalids          r4   r   SetupWizard._select_fallbackl  s    	4./012Y	

 	i+DABtCFSL)*!D6O+<BtAmDT?U>VWX ,"T%[M @ACdCDEM ![[c288==wwy #C	N=  
 4L4a13KS^3K3K4LM$!?I?OqQRS278%Q	!a%(%88
  M 9 MdJKLM! sT   #G >GG8G G%G)G/3G %G )G?G G G21G2r   c                    0 n[        5         [        [        5       5        [        5         [        S[        S5       35        [        [        S5      5        [        [        S5      5        [        5         U  GH  nUS   c(  [        S[	        US   5       S[        S5       35        M2  [
        R                  U5      nU(       d  MP  [        UR                  S	/ 5      UR                  S
/ 5      5       H9  u  pE[        S[        S5       SU S[        U5       S35      nU(       d  M5  XaU'   M;     UR                  S5      (       a  [        S[        S5       S[        UR                  SS5      5       S35      nU(       a  XqSUS   R                  5        3'   [        S[        S5       S[        S5       S35      nU(       a  UUSUS   R                  5        3'   [
        R                  X#5      XS   '   GM     U$ )Nrw   zEnter your API keysz4  Keys are stored only in the generated config file.zI  Tip: add litellm_config.yaml to .gitignore to avoid committing secrets.r   r   : z!no key needed (uses local Ollama)r#   r$   r   ry   r   z Azure endpoint URL r   r\   _LITELLM_AZURE_AI_API_BASE_r   z Azure deployment name z(e.g. my-gpt4o)_LITELLM_AZURE_DEPLOYMENT_)rs   rR   rC   rM   rG   rm   _prompt_keyzipr1   rb   rJ   upper_validate_and_report)	r   r   r   r   	extra_key
extra_hintvalr'   
deployments	            r4   r|   SetupWizard._collect_keys  s   #%hj4-./01dIJK[	

 	A|#qy)*"T2U-V,WX ))!,C),lB'}b)A*%	 $beQyk4
CSBTTV$WX3*-Y'* uu%&&(e%9$quu_VX?Y:Z9[[]^ PX:1T7==?:KLM*e%<TBS=T<UUWX
 " 9!D'--/9JKL
 &1%E%Ea%MHy\"C F r3   providerc           	         [        U R                  SS5      5      n [        S[        S5       S[	        U S   5       SU S35      nU(       a  U$ [        [        S	5      5        [        [        S
5      5      R                  5       S:X  a  gMp  )zIPrompt for a provider's API key, with skip option. Returns the key or ''.r   r\   rw   r   ry   r   	 API key r   z5  Key is required. Leave blank to skip this provider.z  Skip? (y/N): y)rM   r1   rb   rJ   rC   rs   lower)r   hintr   s      r4   r   SetupWizard._prompt_key  s     HLLR01T%[M4(8#9":)D6LC 
$NOPT"345;;=D r3   api_keyc           
      `   U R                  S5      nU(       d  U$  [        S[        SU S   -   S-   5       3SS9  [        X!S9nU(       a-  [        S[	        [
        5       S	[        U S   5       S
35        U$ [        S[         S	[        U S   5       S	[        S5       35        [        S[        S5       S[        S5       S35      R                  5       S:w  a  U$ [        U R                  SS5      5      n[        S[        S5       S	[        U S   5       SU S35      nU(       d  U$ UnGM  )z
Validate credentials using litellm.utils.check_valid_key and print result.
Offers a re-entry loop on failure. Returns the final (possibly re-entered) key.
r   Trw   zTesting connection to r   z...)r   )modelr   ry   z connected successfullyu   — invalid API keyr   z Re-enter key? z(y/N)r   r   r   r\   r   )r1   rs   rM   r	   rG   _CHECKrC   r   rb   rJ   r   )r   r   r   r   r   new_keys         r4   r    SetupWizard._validate_and_report  sF    %-LL$>
NT2Xf5EEMNOP $*FEvqhv.>)?(@@WX BvhaXf%5 67q>S9T8UVW4;-tG}oRPQWWY Z45D#T%[M4(8#9":)D6LG G3 r3   c                  "   [        5         [        [        5       5        [        5         [        S[        S5       35        [        5         Sn  [        S[	        S5       S[        S5       S35      nU(       d  OPUR                  5       (       a%  S[        U5      s=::  a  S	::  a  O  O[        U5      n O[        [        S
5      5        M|  [        S[	        S5       S[        S5       S35      nU(       a  UOS[        R                  " S5       3nX4$ )Nrw   zProxy settingsi  r   z Port z[4000]r   r   i  u(     Enter a valid port number (1–65535).z Master key z[auto-generate]zsk-    )
rs   rR   rC   rb   rJ   rM   isdigitr   secretstoken_urlsafe)r   port_rawkey_rawr   s       r4   r}   SetupWizard._proxy_settings  s    hj4()*+,$r$u+fT(^<LB%OPH!!a3x=&AE&A8}$ABC   "T%[MdCT>U=VVX YZ 'Ws73H3H3L2M-N
r3   r   r   c                    [        U5      nS/nU  GH  nUS   S L =(       d    US   U;   nU(       d  M#  US   S:X  a6  UR                  SUS   R                  5        3S5      nU(       d  M[  SU 3/nOUS   nU GH7  n	S	U	;   a  U	R                  S	5      S
   OU	n
US   S:X  a  SU
 3OU
nUSU 3SSU	 3/-  nUS   (       a   US   U;   a  UR	                  SUS    35        UR                  S5      (       a+  UR	                  S[        [        US   5      5       S35        O^UR                  S5      (       aH  SUS   R                  5        3nX;   a-  UR	                  S[        UR                  U5      5       S35        UR                  S5      (       d  GM   UR	                  SUS    35        GM:     GM     USSS[        U5       S3S/-  nUR                  5        VVs0 s H  u  pUR                  S5      (       a  M  X_M!     nnnU(       a\  UR	                  S5        UR                  5        H&  u  pUR	                  SU S[        U5       S35        M(     UR	                  S5        SR                  U5      $ s  snnf )Nzmodel_list:r   r   r   r   r\   zazure/r   /zazure-z  - model_name: z    litellm_params:z      model: z      api_key: os.environ/r'   z      api_base: "rf   r   r   r   z      api_version: zgeneral_settings:z  master_key: "	_LITELLM_zenvironment_variables:rw   z: "rg   )dictpopr   r   r   r1   rk   r   items
startswithr   )r   r   r   env_copyr   r   	has_credsr   r   r   raw_displaydisplayazure_base_keykr   	real_varss                   r4   r   SetupWizard._build_config  s    >A),H)0HIw'!%\\040ABB
 "":,/0869Ulekk#.r245dGw4FF;-0K&wi0)#E7+ 
 Y<AiLH$<LL#=a	l^!LM55$$LL+LQz]9K,L+MQO UU+,,'B1T7==?BS%TN%1/X\\.=Y0Z/[[\] 55''LL#6q7G6H!IJ-  ! P 	l:67q9	
 	
 '/nn&6X&6daall;>WTQT&6	XLL12!)r!CQ'8:; *LLyy Ys   $JJr   r   c           
      $   [        5         [        [        5       5        [        5         [        S[        [        S-   5       S[	        [        U 5      5       35        [        5         [        S[	        S5       35        [        5         [        S[        S5       SU  SU 35        [        5         [        S[	        S	5       35        [        5         [        S
U 35        [        SU 35        [        5         [        [        5       5        [        5         g )Nrw   z Config savedu    → zTo start your proxy:z    $z litellm --config  --port zThen set your client:,    export OPENAI_BASE_URL=http://localhost:    export OPENAI_API_KEY=)rs   rR   rG   r   rC   r   rM   )r   r   r   s      r4   r   SetupWizard._print_successQ  s    hj5/1235c+>N9O8PQR4./012T#YK1+htfMN4/0123<TFCD*:,78hjr3   c           
      2   [        S[        S5       S[        S5       S35      R                  5       nUS;  aR  [	        5         [	        S[        SU  35       S	35        [	        5         [	        [        S
U S35      5        [	        5         g [	        5         [	        [        5       5        [	        5         [	        S[        S5       SU 35        [	        5         [	        [        S5      5        [	        5         [	        SU 35        [	        SU 35        [	        5         [	        [        S5      5        [	        5         [	        SU S35        [	        5         [	        [        S5      5        [	        5         [	        SU S[        S5       35        [	        5         [	        [        5       5        [	        5         [	        S[        [        5       S[        S5       35        [	        5         [        R                  " S5      n[        R                  R                  U=(       d    SS5      n [        R                  " UUS[        U 5      S[        U5      5        g ! [          a=  n[	        S[        ["        S-   5       S U 35        [	        S!U  S"U S#35         S nAg S nAff = f)$Nrw   r   z Start the proxy now? z(Y/n)r   )r\   r   yesz  Run zlitellm --config z whenever you're ready.z2  Quick test once running:  curl http://localhost:z/healthzProxy is starting onz http://localhost:z>  Your proxy is OpenAI-compatible. Point any OpenAI SDK at it:r  r  z#  Quick test (in another terminal):z    curl http://localhost:z  Dashboard:z    http://localhost:z/ui  z(login with your master key)u    Starting…  z(Ctrl+C to stop)scriptsr\   r   z--configz--portrx   z Could not start proxy:ry   z"  Run manually:  litellm --config r  rg   )rb   rJ   rM   r   rs   rC   rR   rG   r   	sysconfigget_pathr/   pathr   execlpr   r   r   )r   r   r   startscripts_dirlitellm_binr   s          r4   r   SetupWizard._offer_startd  s6   e3DM?"E

%' 	 ((G 1+?@AAXY GI$wWX Ghj4./00B4&IJdSTU<TFCD*:,78d89:*4&89d>"#%dV56T1U0VWXhj5=/5G0H/IJK((3ggll;#4"i@	VIIK D	  	VDf'@@AB!C5IJ6{m8D6QSTUU	Vs   !-I 
J3JJr2   r)   N)r)   ztuple[int, str])__name__
__module____qualname____firstlineno____doc__staticmethodrt   rp   rz   r   r   r{   r   r   r   r   boolr   r   r   r|   r   r   r}   r   r   r   r   __static_attributes__r2   r3   r4   rm   rm      s1    9 9 @ @0 
 
 2tDz 2 2 >s > >* # #C # #QT # #* "8d "8 "8H Md4j M MF 1d 1S#X 1 1f d s   "t "c "c " "L    * = := sCx.=  =  
	=  = B D     $ 4V$ 4Vc 4Vs 4Vt 4V 4Vr3   rm   c                  ,    [         R                  5         g)z>Run the interactive setup wizard. Called by `litellm --setup`.N)rm   rt   r2   r3   r4   run_setup_wizardr4    s    OOr3   r*  )5r/  importlib.metadatar   r/   rer  r,   r"  pathlibr   typingr   r   r   r   r   r   r   r1  __annotations__ImportErrorlitellm.utilsr	   r(   compiler]   r>   rO   rB   rF   rI   rL   r:   r   r   r   r   r   r5   r   r;   r@   rC   rG   rJ   rM   rP   rR   rb   rk   r   rm   r4  r2   r3   r4   <module>r=     s    	 	  
   , ,"t" * 5##]+ \& 1
" 9#/,.EF )%$?+ 4&EF.0AB);7
 ?$&67,	uD	4: DV ::o&
!	   			F FBS B B Bc c C C S S C C C C 3 3 "# "

$# 
$# 
$  CV CVVQ  G
Cs   D4 4EE