Ë
    uPêjÑ_  ã                   óú  — U d Z ddlZddlZddlZddlZddlZddlZddlm	Z	 	 ddl
Z
ddlZdZeed<   ddlmZ ddlmZ d	d
ddddddgdœddddddg d¢dœddddddddgdœdd d!d"d#dg dd$d%d&œ
d'd(d)d*d+dd,gd-d.gd/d0gd1œ	d2d3d4dddd5d6gd7d8œgZeee      ed9<    ej.                  d:«      Zeed;<   d<Zeed=<   d>Zeed?<   d@ZeedA<   dBZeedC<   dDZeedE<   dFZeedG<   dHZeedI<   dJZ eedK<   dLZ!eedM<   dNZ"eedO<   dPZ#eedQ<   dRZ$eedS<   dTefdU„Z%dVe&dWe&dTe&fdX„Z'dYe&dTe&fdZ„Z(dYe&dTe&fd[„Z)dYe&dTe&fd\„Z*dYe&dTe&fd]„Z+dYe&dTe&fd^„Z,dYe&dTe&fd_„Z-dTe&fd`„Z.dae&dTe&fdb„Z/dce&dTe&fdd„Z0deZ1eedf<    G dg„ dh«      Z2djdi„Z3y# e$ r
 dZ
dZdZY �ŒGw xY w)ku´   
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)ÚPathTÚ_HAS_RAW_TERMINALF)ÚFinal)Ú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Ú	AnthropiczUClaude Fable 5, Opus 5, Opus 4.8, Opus 4.7, Opus 4.6, Sonnet 5, Sonnet 4.6, Haiku 4.5ÚANTHROPIC_API_KEYz
sk-ant-...úclaude-haiku-4-5-20251001)zclaude-fable-5zclaude-opus-5zclaude-sonnet-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]*mÚ_ANSI_REz[38;2;215;119;87mÚ_ORANGEz[2mÚ_DIMz[1mÚ_BOLDz[38;2;78;186;101mÚ_GREENz[38;2;177;185;249mÚ_BLUEz[38;2;153;153;153mÚ_GREYz[0mÚ_RESETu   âœ”Ú_CHECKu   âœ˜Ú_CROSSz[?25lÚ_CURSOR_HIDEz[?25hÚ_CURSOR_SHOWz[{}AÚ_MOVE_UPÚreturnc                  ó„   — t         j                  j                  «       xr! t        j                  j                  d«      d u S )NÚNO_COLOR)ÚsysÚstdoutÚisattyÚosÚenvironÚget© ó    úY/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/setup_wizard.pyÚ_supports_colorr?   ‰   s,   € Ü�:‰:×ÑÓÒE¤2§:¡:§>¡>°*Ó#=ÀÐ#EÐEr=   ÚcodeÚtextc                 ó2   — t        «       r| › |› t        › �S |S ©N)r?   r-   )r@   rA   s     r>   Ú_crD   �   s   € Ü&5Ô&7ˆdˆV�D�6œ&˜Ð"ÐA¸TÐAr=   Útc                 ó"   — t        t        | «      S rC   )rD   r'   ©rE   s    r>   ÚorangerH   ‘   s   € ÜŒg�q‹>Ðr=   c                 ó"   — t        t        | «      S rC   )rD   r)   rG   s    r>   ÚboldrJ   •   ó   € ÜŒe�Q‹<Ðr=   c                 ó"   — t        t        | «      S rC   )rD   r*   rG   s    r>   ÚgreenrM   ™   s   € ÜŒf�a‹=Ðr=   c                 ó"   — t        t        | «      S rC   )rD   r+   rG   s    r>   ÚbluerO   �   rK   r=   c                 ó"   — t        t        | «      S rC   )rD   r,   rG   s    r>   ÚgreyrQ   ¡   rK   r=   c                 ó"   — t        t        | «      S rC   )rD   r(   rG   s    r>   ÚdimrS   ¥   s   € ÜŒd�A‹;Ðr=   c                  ó   — t        d«      S )zGReturn a styled divider line (evaluated at call-time, not import-time).uà     â•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œâ•Œ)rS   r<   r=   r>   Ú_dividerrU   ©   s   € äÐ Ó!Ð!r=   Úpromptc                 óÌ   — t         j                  j                  «       rt        j	                  d„ | «      }nt        j	                  d| «      }t        |«      j                  «       S )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                 ó*   — d| j                  «       › d�S )Núú)Úgroup)Úms    r>   ú<lambda>z_styled_input.<locals>.<lambda>µ   s   € ¨T°!·'±'³)°¸DÐ+A€ r=   Ú )r6   r7   r8   r&   ÚsubÚinputÚstrip)rV   Ú	rl_prompts     r>   Ú_styled_inputrc   ®   sI   € ô ‡z�z×ÑÔÜ—L‘LÑ!AÀ6ÓJ‰	ä—L‘L  VÓ,ˆ	Ü�Ó×!Ñ!Ó#Ð#r=   Úvaluec                 ó¦   — | j                  dd«      j                  dd«      j                  dd«      j                  dd«      j                  d	d
«      S )zBEscape a string for safe embedding in a double-quoted YAML scalar.ú\z\\ú"z\"ú
z\núz\rú	z\t)Úreplace)rd   s    r>   Ú_yaml_escaperl   »   sO   € ð 	�‰�d˜FÓ#×+Ñ+¨C°Ó7×?Ñ?ÀÀeÓL×TÑTÐUYÐ[`Óa×iÑiÐjnÐpuÓvðr=   u+  
  â–ˆâ–ˆâ•—     â–ˆâ–ˆâ•—â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ•—â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ•—â–ˆâ–ˆâ•—     â–ˆâ–ˆâ•—     â–ˆâ–ˆâ–ˆâ•—   â–ˆâ–ˆâ–ˆâ•—
  â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•‘â•šâ•�â•�â–ˆâ–ˆâ•”â•�â•�â•�â–ˆâ–ˆâ•”â•�â•�â•�â•�â•�â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ–ˆâ–ˆâ•— â–ˆâ–ˆâ–ˆâ–ˆâ•‘
  â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•‘   â–ˆâ–ˆâ•‘   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ•—  â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•”â–ˆâ–ˆâ–ˆâ–ˆâ•”â–ˆâ–ˆâ•‘
  â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•‘   â–ˆâ–ˆâ•‘   â–ˆâ–ˆâ•”â•�â•�â•�  â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•‘     â–ˆâ–ˆâ•‘â•šâ–ˆâ–ˆâ•”â•�â–ˆâ–ˆâ•‘
  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ•—â–ˆâ–ˆâ•‘   â–ˆâ–ˆâ•‘   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ•—â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ•—â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ•—â–ˆâ–ˆâ•‘ â•šâ•�â•� â–ˆâ–ˆâ•‘
  â•šâ•�â•�â•�â•�â•�â•�â•�â•šâ•�â•�   â•šâ•�â•�   â•šâ•�â•�â•�â•�â•�â•�â•�â•šâ•�â•�â•�â•�â•�â•�â•�â•šâ•�â•�â•�â•�â•�â•�â•�â•šâ•�â•�     â•šâ•�â•�
ÚLITELLM_ASCIIc            	       óÂ  — e Zd ZdZedd„«       Zedd„«       Zedd„«       Zedee	   fd„«       Z
edefd„«       Zed	ed
ee   dedefd„«       Zedee	   fd„«       Zedee	   fd„«       Zedee	   de	eef   fd„«       Zede	defd„«       Zede	dedefd„«       Zedd„«       Zedee	   de	eef   dedefd„«       Zededededdfd„«       Zededededdfd„«       Zy)ÚSetupWizarduè   
    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().
    r3   Nc                  óˆ   — 	 t         j                  «        y # t        t        f$ r t	        dt        d«      › d�«       Y y w xY w)Nz

  zSetup cancelled.rh   )ro   Ú_wizardÚKeyboardInterruptÚEOFErrorÚprintrQ   r<   r=   r>   ÚrunzSetupWizard.runß   s?   € ð	9Ü×ÑÕ!øÜ!¤8Ð,ò 	9Ü�Fœ4Ð 2Ó3Ð4°BÐ7Ö8ð	9ús   ‚ —'AÁ Ac                  ó\  — t         j                  «        t        dt        d«      › �«       t        «        t         j	                  «       } t         j                  | «      }t         j                  «       \  }}t        t        j                  «       «      dz  }	 |j                  t         j                  | ||«      «       t         j                  |||«       t         j                  |||«       y # t        $ r6}t        dt        t        dz   «      › d|› �«       t        d«       Y d }~y d }~ww xY w)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.
)ro   Ú_print_welcomert   rJ   Ú_select_providersÚ_collect_keysÚ_proxy_settingsr   r9   ÚgetcwdÚ
write_textÚ_build_configÚOSErrorr/   Ú_print_successÚ_offer_start)Ú	providersÚenv_varsÚportÚ
master_keyÚconfig_pathÚexcs         r>   rq   zSetupWizard._wizardè   sø   € ä×"Ñ"Ô$Ü�”4Ð+Ó,Ð-Ð.Ô/ÜŒä&×8Ñ8Ó:ˆ	Ü%×3Ñ3°IÓ>ˆÜ&×6Ñ6Ó8Ñˆˆjä!¤"§)¡)£+Ó.Ð1FÑFˆð	Ø×"Ñ"¤;×#<Ñ#<¸YÈÐR\Ó#]Ô^ô 	×"Ñ" ;°°jÔAÜ× Ñ  ¨d°JÕ?øô ò 	Ü�DœœfÐ'AÑAÓBÐCÀ1ÀSÀEÐJÔKÜÐNÔOÜûð	ús   Â&C, Ã,	D+Ã5,D&Ä&D+c                  óz  — 	 t         j                  j                  d«      } t	        «        t	        t        t        j                  d«      «      «       t	        dt        d«      › dt        d«      › dt        d	| z   «      › �«       t	        «        t	        t        «       «       t	        «        y # t        $ r d} Y Œ˜w xY w)
NÚlitellmÚunknownrh   rw   ÚWelcomez to ÚLiteLLMry   Úv)Ú	importlibÚmetadataÚversionÚ	Exceptionrt   rH   rm   ÚrstriprJ   rQ   rU   )r’   s    r>   rz   zSetupWizard._print_welcomeÿ   s–   € ð	 Ü×(Ñ(×0Ñ0°Ó;ˆGô 	ŒÜŒf”]×)Ñ)¨$Ó/Ó0Ô1Ü�”6˜)Ó$Ð% T¬$¨y«/Ð):¸!¼DÀÀwÁÓ<OÐ;PÐQÔRÜŒÜŒh‹jÔÜ�øô ò 	 ØŠGð	 ús   ‚B, Â,B:Â9B:c                  ó¦   — t         st        j                  «       S 	 t        j                  «       S # t        $ r t        j                  «       cY S w xY w)zKArrow-key multi-select. Falls back to number input if /dev/tty unavailable.)r   ro   Ú_select_fallbackÚ_select_interactiver�   r<   r=   r>   r{   zSetupWizard._select_providers  sH   € õ !Ü×/Ñ/Ó1Ð1ð	2Ü×2Ñ2Ó4Ð4øÜò 	2Ü×/Ñ/Ó1Ò1ð	2ús   œ0 °AÁAc                  ó&  — t         �t        €J ‚t        dd«      5 } | j                  «       }t        j                  |«      }	 t        j
                  |«       | j                  d«      }|dk(  r¯| j                  d«      }|dk(  rU| j                  d«      }d|j                  dd	¬
«      z   t        j                  |t         j                  |«       cddd«       S d|j                  dd	¬
«      z   t        j                  |t         j                  |«       cddd«       S |j                  dd	¬
«      t        j                  |t         j                  |«       cddd«       S # t        j                  |t         j                  |«       w xY w# 1 sw Y   yxY w)z,Read one keypress from /dev/tty in raw mode.Nz/dev/ttyÚrbé   ó   ó   [z[zutf-8rk   )Úerrorsú)
ÚtermiosÚttyÚopenÚfilenoÚ	tcgetattrÚsetrawÚreadÚdecodeÚ	tcsetattrÚ	TCSADRAIN)Útty_fhÚfdÚoldÚchÚch2Úch3s         r>   Ú	_read_keyzSetupWizard._read_key  sT  € ô Ð"¤s Ð6Ð6Ü�*˜dÓ#ð 	> vØŸ™›ˆBÜ ×*Ñ*¨2Ó.ˆCð>Ü—
‘
˜2”Ø"ŸK™K¨›N�Ø˜’=Ø!'§¡¨Q£�CØ˜d’{Ø%+§[¡[°£^˜Ø&¨¯©°GÀI¨Ó)NÑNô ×!Ñ! "¤g×&7Ñ&7¸Ô=÷	>ñ 	>ð " C§J¡J¨w¸y JÓ$IÑIô ×!Ñ! "¤g×&7Ñ&7¸Ô=÷	>ñ 	>ð —y‘y °�yÓ;ä×!Ñ! "¤g×&7Ñ&7¸Ô=÷	>ñ 	>øô ×!Ñ! "¤g×&7Ñ&7¸Õ=ú÷	>ð 	>ús<   ›&FÁA'EÂ)%FÃEÃ-%FÄEÄ.%FÅ'FÆFÆFÚcursorÚselectedÚfirst_renderc                 óÂ  — dt        d«      › d�t        d«      dz   dg}t        t        «      D ]s  \  }}|| k(  rt	        d«      nd}||v rt        d«      n
t        d«      }|| k(  rt        |d	   «      n|d	   }|j                  d
|› d|› d|› d
t        |d   «      › d�	«       Œu |j                  d«       dj                  |«      }	|sKt        «       rAt        j                  j                  t        j                  |	j                  d«      «      «       t        j                  j                  |	«       t        j                  j                  «        |	j                  d«      S )zFDraw or redraw the provider list. Returns the number of lines printed.rx   úAdd your first modelrh   u;     â†‘â†“ to navigate Â· Space to select Â· Enter to confirmõ   â�¯ry   u   â—‰u   â—‹r   rw   r   r^   )rJ   rQ   Ú	enumerater%   rO   rM   ÚappendÚjoinr?   r6   r7   Úwriter2   ÚformatÚcountÚflush)
r°   r±   r²   ÚlinesÚiÚpÚarrowÚbulletÚname_strÚcontents
             r>   Ú_render_selectorzSetupWizard._render_selector,  s6  € ð ”4Ð.Ó/Ð0°Ð3ÜÐNÓOÐRVÑVØð
ˆô
 œiÓ(ò 	W‰DˆAˆqØ#$¨¢;”D˜”K°CˆEØ%&¨(¡]”U˜5”\¼¸U»ˆFØ*+¨vª+”t˜A˜f™I”¸1¸V¹9ˆHØ�L‰L˜2˜e˜W A f X¨Q¨x¨j¸¼4ÀÀ-Ñ@PÓ;QÐ:RÐRTÐUÕVð		Wð
 	�‰�TÔàŸ™ ›ˆÙ¤Ô 1Ü�J‰J×ÑœXŸ_™_¨W¯]©]¸4Ó-@ÓAÔBÜ�
‰
×Ñ˜Ô!Ü�
‰
×ÑÔØ�}‰}˜TÓ"Ð"r=   c                  ó¸  — d} t        «       }t        «       rAt        j                  j	                  t
        «       t        j                  j                  «        	 t        j                  | |d¬«       	 t        j                  «       }d}|dk(  r| dz
  t        t        «      z  } d}nY|dk(  r| dz   t        t        «      z  } d}n<|dk(  r|j                  | h«       d}n"|d	v r|s|j                  | «       n%|d
v rt        ‚|rt        j                  | |d¬«       Œ§	 t        «       rBt        j                  j	                  t        «       t        j                  j                  «        	 t!        |«      D �cg c]  }t        |   ‘Œ c}S # t        «       rBt        j                  j	                  t        «       t        j                  j                  «        w w xY wc c}w )Nr   T)r²   Fz[Arš   z[Bry   )ri   rh   )úú)Úsetr?   r6   r7   r¹   r0   r¼   ro   rÄ   r¯   Úlenr%   Úsymmetric_difference_updateÚaddrr   r1   Úsorted)r°   r±   ÚkeyÚdirtyr¾   s        r>   r—   zSetupWizard._select_interactiveB  sƒ  € àˆÜ$'£EˆäÔÜ�J‰J×Ñœ\Ô*Ü�J‰J×ÑÔð	#Ü×(Ñ(¨°ÈÐ(ÔMØÜ!×+Ñ+Ó-�Ø�Ø˜(’?Ø$ q™j¬C´	«NÑ:�FØ ‘EØ˜H’_Ø$ q™j¬C´	«NÑ:�FØ ‘EØ˜C’ZØ×8Ñ8¸&¸ÔBØ ‘EØ˜LÑ(Ù#Ø Ÿ™ VÔ,ØØÐ,Ñ,Ü+Ð+ÙÜ×0Ñ0°¸ÐPUÐ0ÔVð' ð ô Ô Ü—
‘
× Ñ ¤Ô.Ü—
‘
× Ñ Õ"ä&,¨XÓ&6Ö7 ”	˜!“Ò7Ð7øô	 Ô Ü—
‘
× Ñ ¤Ô.Ü—
‘
× Ñ Õ"ð !üò 8s   ÁC F Å3GÆAGc                  óª  — t        «        t        dt        d«      › �«       t        t        d«      «       t        «        t        t        d«      D ]F  \  } }t        dt        t        | «      dz   «      › dt        |d   «      › dt        |d   «      › �«       ŒH t        «        	 t        dt        d	«      › d
�«      }|st        t        d«      «       Œ0	 |j                  dd«      j                  d«      D �cg c],  }|j                  «       sŒt        |j                  «       «      ‘Œ. }}t        |D �ch c]   }d|cxk  rt        t        «      k  sŒn n|’Œ" c}«      }|s&t        t        dt        t        «      › d�«      «       Œä|D � cg c]  } t        | dz
     ‘Œ c} S c c}w c c}w c c} w # t        $ r t        t        d«      «       Y nw xY w�Œ1)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)rt   rJ   rQ   r¶   r%   Ústrrc   rO   rk   Úsplitra   ÚintrÌ   rÉ   Ú
ValueError)r¾   r¿   ÚrawÚxÚnumsÚnÚvalids          r>   r–   zSetupWizard._select_fallbackg  s–  € ô 	ŒÜ�”4Ð.Ó/Ð0Ð1Ô2ÜŒdÐ\Ó]Ô^ÜŒÜœi¨Ó+ò 	Y‰DˆAˆqÜ�B”tœC ›F S™LÓ)Ð*¨!¬D°°6±«OÐ+<¸B¼tÀAÀmÑDTÓ?UÐ>VÐWÕXð	YäŒàÜ "¤T¨%£[ M°Ð @ÓAˆCÙÜ”dÐCÓDÔEØðMØ03·±¸CÀÓ0E×0KÑ0KÈCÓ0PÖ^¨1ÐTU×T[ÑT[ÕT]œ˜AŸG™G›I�Ð^�Ð^Ü¨4ÖL a°1¸Ô3K¼SÄ»^Ö3K¢ÒLÓM�ÙÜœ$Ð!?ÄÄIÃÐ?OÈqÐQÓRÔSØØ27Ö8¨Qœ	 ! a¡%Ó(Ò8Ð8ùò _ùÚLùò 9øÜò MÜ”dÐJÓKÖLðMúñ sN   Ã#F0 Ã7F!ÄF!Ä(F0 Ä3F&ÅF&Å.F0 ÆF0 ÆF+ÆF0 Æ!F0 Æ0GÇGr„   c                 óÀ  — i }t        «        t        t        «       «       t        «        t        dt        d«      › �«       t        t        d«      «       t        t        d«      «       t        «        | D �]e  }|d   €'t        dt	        |d   «      › dt        d«      › �«       Œ0t
        j                  |«      }|sŒHt        |j                  d	g «      |j                  d
g «      «      D ]4  \  }}t        dt        d«      › d|› dt        |«      › d�«      }|sŒ0|||<   Œ6 |j                  d«      rŽt        dt        d«      › dt        |j                  dd«      «      › d�«      }|r||d|d   j                  «       › �<   t        dt        d«      › dt        d«      › d�«      }|r||d|d   j                  «       › �<   t
        j                  ||«      ||d   <   �Œh |S )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_)rt   rU   rJ   rQ   rM   ro   Ú_prompt_keyÚzipr;   rc   rO   ÚupperÚ_validate_and_report)	r„   r…   r¿   rÍ   Ú	extra_keyÚ
extra_hintÚvalr$   Ú
deployments	            r>   r|   zSetupWizard._collect_keysƒ  sä  € à*,ˆÜŒÜŒh‹jÔÜŒÜ�”4Ð-Ó.Ð/Ð0Ô1ÜŒdÐIÓJÔKÜŒdÐ^Ó_Ô`ÜŒàó 	NˆAØ�‰|Ð#Ü˜œ5  6¡Ó+Ð,¨B¬tÐ4WÓ/XÐ.YÐZÔ[Øä×)Ñ)¨!Ó,ˆCÙØä),¨Q¯U©U°<ÀÓ-DÀaÇeÁeÈMÐ[]ÓF^Ó)_ò .Ñ%�	˜:Ü# b¬¨e«¨°Q°y°kÀÄ4È
ÓCSÐBTÐTVÐ$WÓX�ÚØ*-�H˜YÒ'ð.ð
 �u‰uÐ%Ô&Ü(¨2¬d°5«k¨]Ð:NÌtÐTU×TYÑTYÐZiÐkmÓTnÓOoÐNpÐprÐ)sÓt�ÙØPX�HÐ:¸1¸T¹7¿=¹=»?Ð:KÐLÑMÜ*¨R´°U³¨}Ð<SÔTXÐYjÓTkÐSlÐlnÐ+oÓp�
ÙØOY�HÐ9¸!¸D¹'¿-¹-»/Ð9JÐKÑLô &1×%EÑ%EÀaÈÓ%MˆH�Q�y‘\Ó"ð/	Nð2 ˆr=   Úproviderc           	      ó  — t        | j                  dd«      «      }	 t        dt        d«      › dt	        | d   «      › d|› d�«      }|r|S t        t        d	«      «       t        t        d
«      «      j                  «       dk(  ryŒi)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)rQ   r;   rc   rO   rJ   rt   Úlower)rç   ÚhintrÍ   s      r>   rß   zSetupWizard._prompt_key©  s‡   € ô ˜8Ÿ<™<¨
°BÓ7Ó8ˆØÜ "¤T¨%£[ M°´4¸ÀÑ8HÓ3IÐ2JÈ)ÐTXÐSYÐY[Ð \Ó]ˆCÙØ�
Ü”$ÐNÓOÔPÜœTÐ"3Ó4Ó5×;Ñ;Ó=ÀÒDØð r=   Úapi_keyc           
      óL  — | j                  d«      }|s|S 	 t        dt        d| d   z   dz   «      › �d¬«       t        ||¬«      }|r-t        dt	        t
        «      › d	t        | d   «      › d
�«       |S t        dt        › d	t        | d   «      › d	t        d«      › �«       t        dt        d«      › dt        d«      › d�«      j                  «       dk7  r|S t        | j                  dd«      «      }t        dt        d«      › d	t        | d   «      › d|› d�«      }|s|S |}�Œ)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é   )r;   rt   rQ   r   rM   r.   rJ   r/   rc   rO   rë   )rç   rí   r   rÚ   rì   Únew_keys         r>   râ   z SetupWizard._validate_and_reportµ  s=  € ð )1¯©°\Ó(Bˆ
ÙØˆNàÜØ”TÐ2°X¸fÑ5EÑEÈÑMÓNÐOÐPØõô $¨*¸gÔFˆEÙÜ˜œ5¤›=˜/¨¬4°¸Ñ0@Ó+AÐ*BÐBYÐZÔ[Ø�ä�B”v�h˜a¤ X¨fÑ%5Ó 6Ð7°q¼Ð>SÓ9TÐ8UÐVÔWÜ˜r¤$ u£+ ¨o¼dÀ7»m¸_ÈBÐOÓP×VÑVÓXÐ\_Ò_Ø�ä˜Ÿ™ Z°Ó4Ó5ˆDÜ# b¬¨e«¨°Q´t¸HÀVÑ<LÓ7MÐ6NÈiÐX\ÐW]Ð]_Ð$`ÓaˆGÙØ�ØˆGñ% r=   c                  óþ  — t        «        t        t        «       «       t        «        t        dt        d«      › �«       t        «        d} 	 t        dt	        d«      › dt        d«      › d�«      }|snH|j                  «       r#dt        |«      cxk  rd	k  rn nt        |«      } nt        t        d
«      «       Œot        dt	        d«      › dt        d«      › d�«      }|r|ndt        j                  d«      › �}| |fS )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-é    )
rt   rU   rJ   rc   rO   rQ   ÚisdigitrÔ   ÚsecretsÚtoken_urlsafe)r†   Úport_rawÚkey_rawr‡   s       r>   r}   zSetupWizard._proxy_settingsÕ  së   € äŒÜŒh‹jÔÜŒÜ�”4Ð(Ó)Ð*Ð+Ô,ÜŒØˆØÜ$ r¬$¨u«+¨°f¼TÀ(»^Ð<LÈBÐ%OÓPˆHÙØØ×ÑÔ! a¬3¨x«=Ô&A¸EÕ&AÜ˜8“}�ØÜ”$ÐAÓBÔCð ô '¨¬D°«K¨=¸ÄTÐJ[ÓE\ÐD]Ð]_Ð'`ÓaˆÙ'.™G°c¼'×:OÑ:OÐPRÓ:SÐ9TÐ4Uˆ
Ø�ZÐÐr=   r…   r‡   c                 ó�  — t        |«      }dg}| D �]t  }|d   d u xs |d   |v }|sŒ|d   dk(  r0|j                  d|d   j                  «       › �d«      }|sŒHd|› �g}n|d   }|D �]  }	d	|	v r|	j                  d	«      d
   n|	}
|d   dk(  rd|
› �n|
}|d|› �dd|	› �gz  }|d   r|d   |v r|j	                  d|d   › �«       |j                  d«      r+|j	                  dt        t        |d   «      «      › d�«       nX|j                  d«      rGd|d   j                  «       › �}||v r-|j	                  dt        |j                  |«      «      › d�«       |j                  d«      s�Œ|j	                  d|d   › �«       �Œ �Œw |dddt        |«      › d�dgz  }|j                  «       D ��ci c]  \  }}|j                  d«      rŒ||“Œ }}}|r[|j	                  d«       |j                  «       D ]&  \  }}|j	                  d|› dt        |«      › d�«       Œ( |j	                  d«       dj                  |«      S c c}}w )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: "rg   r   rÝ   r   z      api_version: zgeneral_settings:z  master_key: "Ú	_LITELLM_zenvironment_variables:rw   z: "rh   )ÚdictÚpoprá   rÓ   r·   r;   rl   rÒ   ÚitemsÚ
startswithr¸   )r„   r…   r‡   Úenv_copyr½   r¿   Ú	has_credsræ   r   rï   Úraw_displayÚdisplayÚazure_base_keyÚkr�   Ú	real_varss                   r>   r€   zSetupWizard._build_configë  sŸ  € ô ˜x›.ˆØ�ˆØó  	KˆAà˜)™¨Ð,ÒH°°)±ÀÐ0HˆIÙØà�‰w˜'Ò!Ø%Ÿ\™\Ð,FÀqÈÁwÇ}Á}ÃÐFWÐ*XÐZ\Ó]�
Ù!ØØ" : ,Ð/Ð0‘à˜8™�àó K�Ø69¸U±l˜eŸk™k¨#Ó.¨rÒ2È�à45°d±G¸wÒ4F˜F ; -Ñ0ÈK�ØØ& w iÐ0Ø)Ø# E 7Ð+ðñ �ð
 �Y’< A i¡L°HÑ$<Ø—L‘LÐ#=¸aÀ	¹l¸^Ð!LÔMØ—5‘5˜Ô$Ø—L‘LÐ#4´\Ä#ÀaÈ
ÁmÓBTÓ5UÐ4VÐVWÐ!XÕYØ—U‘UÐ+Ô,Ø'BÀ1ÀTÁ7Ç=Á=Ã?ÐBSÐ%T�NØ%¨Ñ1ØŸ™Ð'8¼ÀhÇlÁlÐSaÓFbÓ9cÐ8dÐdeÐ%fÔgØ—5‘5˜Ö'Ø—L‘LÐ#6°q¸Ñ7GÐ6HÐ!IÖJò%Kð 	KðD 	ØØØœl¨:Ó6Ð7°qÐ9Øð	
ñ 	
ˆð .6¯^©^Ó-=×_¡T Q¨ÀQÇ\Á\ÐR]ÕE^˜A˜q™DÐ_ˆ	Ñ_ÙØ�L‰LÐ1Ô2Ø!Ÿ™Ó)ò <‘��1Ø—‘˜r !  C¬°Q«Ð'8¸Ð:Õ;ð<à�L‰L˜Ôà�y‰y˜ÓÐùó `s   Æ2IÇIrˆ   r†   c           
      ó$  — t        «        t        t        «       «       t        «        t        dt        t        dz   «      › dt	        t        | «      «      › �«       t        «        t        dt	        d«      › �«       t        «        t        dt        d«      › d| › d|› �«       t        «        t        dt	        d	«      › �«       t        «        t        d
|› �«       t        d|› �«       t        «        t        t        «       «       t        «        y )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=)rt   rU   rM   r.   rJ   rÒ   rQ   )rˆ   r†   r‡   s      r>   r‚   zSetupWizard._print_success'  sÕ   € äŒÜŒh‹jÔÜŒÜ�”5œ /Ñ1Ó2Ð3°5¼¼cÀ+Ó>NÓ9OÐ8PÐQÔRÜŒÜ�”4Ð.Ó/Ð0Ð1Ô2ÜŒÜ�”T˜#“Y�KÐ1°+°¸hÀtÀfÐMÔNÜŒÜ�”4Ð/Ó0Ð1Ð2Ô3ÜŒÜÐ<¸T¸FÐCÔDÜÐ*¨:¨,Ð7Ô8ÜŒÜŒh‹jÔÜ�r=   c           
      ó  — t        dt        d«      › dt        d«      › d�«      j                  «       }|dvrRt	        «        t	        dt        d| › �«      › d	�«       t	        «        t	        t        d
|› d�«      «       t	        «        y t	        «        t	        t        «       «       t	        «        t	        dt        d«      › d|› �«       t	        «        t	        t        d«      «       t	        «        t	        d|› �«       t	        d|› �«       t	        «        t	        t        d«      «       t	        «        t	        d|› d�«       t	        «        t	        t        d«      «       t	        «        t	        d|› dt        d«      › �«       t	        «        t	        t        «       «       t	        «        t	        dt        t        «      › dt        d«      › �«       t	        «        t        j                  d«      }t        j                  j                  |xs dd«      }	 t        j                  ||dt        | «      dt        |«      «       y # t         $ r=}t	        dt        t"        dz   «      › d |› �«       t	        d!| › d"|› d#�«       Y d }~y d }~ww xY w)$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	  rh   )rc   rO   rQ   rë   rt   rJ   rU   rM   r.   Ú	sysconfigÚget_pathr9   Úpathr¸   ÚexeclprÒ   r�   r/   )rˆ   r†   r‡   ÚstartÚscripts_dirÚlitellm_binr‰   s          r>   rƒ   zSetupWizard._offer_start:  s)  € ä$ r¬$¨u«+¨Ð6LÌTÐRYË]ÈOÐ[]Ð%^Ó_×eÑeÓgˆØÐ(Ñ(ÜŒGÜ�Fœ4Ð"3°K°=Ð AÓBÐCÐCZÐ[Ô\ÜŒGÜ”$ÐKÈDÈ6ÐQXÐYÓZÔ[ÜŒGØäŒÜŒh‹jÔÜŒÜ�”4Ð.Ó/Ð0Ð0BÀ4À&ÐIÔJÜŒÜŒdÐSÓTÔUÜŒÜÐ<¸T¸FÐCÔDÜÐ*¨:¨,Ð7Ô8ÜŒÜŒdÐ8Ó9Ô:ÜŒÜÐ*¨4¨&°Ð8Ô9ÜŒÜŒd�>Ó"Ô#ÜŒÜÐ% d V¨5´Ð6TÓ1UÐ0VÐWÔXÜŒÜŒh‹jÔÜŒÜ�”5œ“=�/ ´Ð5GÓ0HÐ/IÐJÔKÜŒä&×/Ñ/°	Ó:ˆÜŸW™WŸ\™\¨+Ò*;¸¸YÓGˆð	VÜ�I‰IØØØÜ�KÓ ØÜ�D“	õøô ò 	VÜ�DœœfÐ'@Ñ@ÓAÐBÀ!ÀCÀ5ÐIÔJÜÐ6°{°mÀ8ÈDÈ6ÐQSÐT×UÑUûð	Vús   È,I É	JÉ3JÊJ©r3   N)r3   ztuple[int, str])Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodru   rq   rz   Úlistrü   r{   rÒ   r¯   rÔ   rÈ   ÚboolrÄ   r—   r–   r|   rß   râ   r}   r€   r   r‚   rƒ   r<   r=   r>   ro   ro   Õ   s/  „ ñð ò9ó ð9ð ò@ó ð@ð, ò
ó ð
ð ð2˜t D™zò 2ó ð2ð ð>�sò >ó ð>ð& ð# ð #°°C±ð #Èð #ÐQTò #ó ð#ð* ð"8  d¡ò "8ó ð"8ðH ðM˜d 4™jò Mó ðMð6 ð#  d¡ð #°°S¸#°X±ò #ó ð#ðJ ð	˜dð 	 sò 	ó ð	ð ð tð °cð ¸cò ó ðð> ò ó ð ð* ð7 Ø˜‘:ð7 à�s˜C�x‘.ð7 ð ð7 ð 
ò	7 ó ð7 ðv ð Dð °ð Àð Èò ó ðð$ ð.V $ð .V¨cð .V¸sð .VÀtò .Vó ñ.Vr=   ro   c                  ó,   — t         j                  «        y)z>Run the interactive setup wizard. Called by `litellm --setup`.N)ro   ru   r<   r=   r>   Úrun_setup_wizardr  q  s   € ä‡O�OÕr=   r  )4r  Úimportlib.metadatar�   r9   Úrerô   r6   r  Úpathlibr   rŸ   r    r   r  Ú__annotations__ÚImportErrorÚtypingr   Úlitellm.utilsr   r%   r  rü   Úcompiler&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r?   rÒ   rD   rH   rJ   rM   rO   rQ   rS   rU   rc   rl   rm   ro   r  r<   r=   r>   ú<module>r(     sØ  ðòó Û 	Û 	Û Û 
Û Ý ðÛÛà"Ð�tÓ"õ å )ð ØØ5Ø#ØØ#Ø˜]Ð+ñð ØØnØ&Ø Ø1ò	
ñð& ØØ9Ø#ØØ/Ø,Ð.EÐFñð ØØ)Ø%Ø$ØØØØ?Ø+ñð ØØ4Ø&ØØØEÐFØ.Ð0AÐBØ)¨;Ð7ñ
ð ØØ?ØØØØ$Ð&6Ð7Ø,ñ	ðyF €	ˆ5��d‘Ñó FðZ �"—*‘*˜_Ó-€ˆ%Ó -à(€ˆÓ (Ø€€eÓ Ø€€uÓ Ø'€ˆÓ 'Ø'€€uÓ 'Ø'€€uÓ 'Ø€ˆÓ Ø€ˆÓ Ø€ˆÓ à!€ˆeÓ !Ø!€ˆeÓ !Ø€ˆ%Ó ðF˜ó FðBˆSð B˜ð B ó Bðˆcð �có ðˆCð �Có ðˆSð �Só ðˆCð �Có ðˆCð �Có ðˆ3ð �3ó ð"�#ó "ð

$˜#ð 
$ #ó 
$ð˜ð  ó ð€ˆuó ÷TVñ TVôxøðs ò Ø€GØ
€CØÓðús   £E+ Å+E:Å9E: