§
    Ý˜ºh|  ã                   óf  — 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Zd dlZd dlm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ d dlZd dlmZmZ d dlmZmZmZ d d	lmZ d d
lmZm Z  d dl!m"Z"m#Z#  ej$        ¦   «         dk    rd dl%Z% e"¦   «         rd dl&m'Z' d dl(m)Z) d dl*m+Z+  e#¦   «         rd dl,Z,d dlm-Z-mZm.Z.mZ  e/ej0        ej1        z   ¦  «        Z2 e/ej0        ej3        z   ej1        z   dz   ¦  «        Z4ddiddiddiddiddiddiddidœZ5dZ6dd 7                    e5 8                    ¦   «         ¦  «        › d�Z9 G d„ d ¦  «        Z:e G d!„ d"¦  «        ¦   «         Z;d#e
fd$„Z< G d%„ d&e¦  «        Z=e>d'k    r9 e;¦   «         Z?d(e?_@        d)e?_@         e=e?¦  «        ZAeA B                    ¦   «          dS dS )*é    N)ÚArgumentParserÚ	Namespace)ÚAsyncIterator)Ú	dataclassÚfield)ÚThread)ÚOptional)ÚAsyncInferenceClientÚChatCompletionStreamOutput)ÚAutoTokenizerÚGenerationConfigÚPreTrainedTokenizer)ÚBaseTransformersCLICommand)ÚServeArgumentsÚServeCommand)Úis_rich_availableÚis_torch_availableÚWindows)ÚConsole)ÚLive)ÚMarkdown)ÚAutoModelForCausalLMr   ÚBitsAndBytesConfigr   z .!\"#$%&'()*+,\-/:<=>?@[]^_`{|}~Útextz5There is a Llama in my lawn, how can I get rid of it?zyWrite a Python function that integrates any Python function f(x) numerically over an arbitrary interval [x_start, x_end].z4How many helicopters can a human eat in one sitting?z4Count to 10 but skip every number ending with an 'e'zWhy aren't birds real?z2Why is it important to eat socks after meditating?z$Which number is larger, 9.9 or 9.11?)ÚllamaÚcodeÚ
helicopterÚnumbersÚbirdsÚsocksÚnumbers2aŒ  

**TRANSFORMERS CHAT INTERFACE**

Chat interface to try out a model. Besides chatting with the model, here are some basic commands:
- **!help**: shows all available commands (set generation settings, save chat, etc.)
- **!status**: shows the current status of the model and generation settings
- **!clear**: clears the current conversation and starts a new one
- **!exit**: closes the interface
am  

**TRANSFORMERS CHAT INTERFACE HELP**

Full command list:
- **!help**: shows this help message
- **!clear**: clears the current conversation and starts a new one
- **!status**: shows the current status of the model and generation settings
- **!example {NAME}**: loads example named `{NAME}` from the config and uses it as the user input.
Available example names: `z`, `a%  `
- **!set {ARG_1}={VALUE_1} {ARG_2}={VALUE_2}** ...: changes the system prompt or generation settings (multiple
settings are separated by a space). Accepts the same flags and format as the `generate_flags` CLI argument.
If you're a new user, check this basic flag guide: https://huggingface.co/docs/transformers/llm_tutorial#common-options
- **!save {SAVE_NAME} (optional)**: saves the current chat and settings to file by default to
`./chat_history/{MODEL_NAME}/chat_{DATETIME}.yaml` or `{SAVE_NAME}` if provided
- **!exit**: closes the interface
c                   ó´   — e Zd Zddee         dee         fd„Zdee         deee	f         fd„Z
defd„Zd	„ Zd
efd„Zd
edefd„Zddefd„Zdededefd„ZdS )ÚRichInterfaceNÚ
model_nameÚ	user_namec                 ór   — t          ¦   «         | _        |€d| _        n|| _        |€	d| _        d S || _        d S )NÚ	assistantÚuser)r   Ú_consoler$   r%   )Úselfr$   r%   s      úb/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/transformers/commands/chat.pyÚ__init__zRichInterface.__init__s   s?   € Ý™	œ	ˆŒØÐØ)ˆDŒOˆOà(ˆDŒOØÐØ#ˆDŒNˆNˆNà&ˆDŒNˆNˆNó    ÚstreamÚreturnc              ƒ   óæ  K  — | j                              d| j        › d�¦  «         t          | j         d¬¦  «        5 }d}|ƒ d {V —†2 3 d {V —†}|j        d         j        j        }|sŒ!t          j        dd|¦  «        }||z  }g }| 	                    ¦   «         D ]W}| 
                    |¦  «         |                     d	¦  «        r| 
                    d
¦  «         ŒB| 
                    d¦  «         ŒXt          d                     |¦  «                             ¦   «         d¬¦  «        }|                     |d¬¦  «         Œø6 	 d d d ¦  «         n# 1 swxY w Y   | j                              ¦   «          |S )Nz[bold blue]<z>:é   )ÚconsoleÚrefresh_per_secondÚ r   z<(/*)(\w*)>z\<\1\2\>z```ú
z  
zgithub-dark)Ú
code_themeT)Úrefresh)r)   Úprintr$   r   ÚchoicesÚdeltaÚcontentÚreÚsubÚ
splitlinesÚappendÚ
startswithr   ÚjoinÚstripÚupdate)	r*   r.   Úliver   ÚtokenÚoutputsÚlinesÚlineÚmarkdowns	            r+   Ústream_outputzRichInterface.stream_output~   sÞ  è è € ØŒ×ÒÐ>¨4¬?Ð>Ð>Ð>Ñ?Ô?Ð?Ý˜$œ-¸AÐ>Ñ>Ô>ð &	4À$ØˆDØ%+˜|˜|˜|˜|˜|˜|ð $4ð $4ð $4ð $4ð $4ð $4ð $4�eØœ-¨Ô*Ô0Ô8�àð Øõ œ& °¸gÑFÔF�à˜‘�ð �Ø ŸOšOÑ-Ô-ð -ð -�DØ—L’L Ñ&Ô&Ð&Ø—’ uÑ-Ô-ð -ð Ÿš TÑ*Ô*Ð*Ð*àŸš VÑ,Ô,Ð,Ð,å# B§G¢G¨E¡N¤N×$8Ò$8Ñ$:Ô$:À}ÐUÑUÔU�ð —’˜H¨d�Ñ3Ô3Ð3Ð3ðI  ,˜|ð&	4ð &	4ð &	4ñ &	4ô &	4ð &	4ð &	4ð &	4ð &	4ð &	4ð &	4øøøð &	4ð &	4ð &	4ð &	4ðP 	Œ×ÒÑÔÐàˆs   ¼EÁD?ÁC3EÅEÅEc                 ó~   — | j                              d| j        › d�¦  «        }| j                              ¦   «          |S )z!Gets user input from the console.ú[bold red]<z>:
)r)   Úinputr%   r8   )r*   rM   s     r+   rM   zRichInterface.input¬   s>   € à”×#Ò#Ð$F°$´.Ð$FÐ$FÐ$FÑGÔGˆØŒ×ÒÑÔÐØˆr-   c                 ó8   — | j                              ¦   «          dS )zClears the console.N)r)   Úclear©r*   s    r+   rO   zRichInterface.clear²   s   € àŒ×ÒÑÔÐÐÐr-   r   c                 ó‚   — | j                              d| j        › d|› �¦  «         | j                              ¦   «          dS )z%Prints a user message to the console.rL   z>:[/ bold red]
N)r)   r8   r%   )r*   r   s     r+   Úprint_user_messagez RichInterface.print_user_message¶   sE   € àŒ×ÒÐP¨$¬.ÐPÐPÈ$ÐPÐPÑQÔQÐQØŒ×ÒÑÔÐÐÐr-   Úcolorc                 óx   — | j                              d|› d|› �¦  «         | j                              ¦   «          dS )z,Prints text in a given color to the console.z[bold ú]N©r)   r8   )r*   r   rS   s      r+   Úprint_colorzRichInterface.print_color»   sC   € àŒ×ÒÐ3 UÐ3Ð3¨TÐ3Ð3Ñ4Ô4Ð4ØŒ×ÒÑÔÐÐÐr-   FÚminimalc                 ó¢   — | j                              t          |rt          nt          ¦  «        ¦  «         | j                              ¦   «          dS )z'Prints the help message to the console.N)r)   r8   r   ÚHELP_STRING_MINIMALÚHELP_STRING)r*   rX   s     r+   Ú
print_helpzRichInterface.print_helpÀ   sE   € àŒ×Ò�H¸GÐ%TÕ%8Ð%8ÍÑUÔUÑVÔVÐVØŒ×ÒÑÔÐÐÐr-   Úgeneration_configÚmodel_kwargsc                 óì   — | j                              d|› d�¦  «         |r| j                              d|› �¦  «         | j                              d|› �¦  «         | j                              ¦   «          dS )zFPrints the status of the model and generation settings to the console.z[bold blue]Model: r5   z[bold blue]Model kwargs: z[bold blue]NrV   )r*   r$   r]   r^   s       r+   Úprint_statuszRichInterface.print_statusÅ   s†   € àŒ×ÒÐ?°Ð?Ð?Ð?Ñ@Ô@Ð@Øð 	LØŒM×ÒÐ J¸LÐ JÐ JÑKÔKÐKØŒ×ÒÐ=Ð*;Ð=Ð=Ñ>Ô>Ð>ØŒ×ÒÑÔÐÐÐr-   )NN)F)Ú__name__Ú
__module__Ú__qualname__r	   Ústrr,   r   r   ÚtupleÚintrJ   rM   rO   rR   rW   Úboolr\   r   Údictr`   © r-   r+   r#   r#   r   s+  € € € € € ð	'ð 	' 8¨C¤=ð 	'ÀHÈSÄMð 	'ð 	'ð 	'ð 	'ð,¨-Ð8RÔ*Sð ,ÐX]Ð^aÐcfÐ^fÔXgð ,ð ,ð ,ð ,ð\�sð ð ð ð ðð ð ð sð ð ð ð ð
 ð ¨Cð ð ð ð ð
ð  $ð ð ð ð ð
 sð Ð?Oð Ð_cð ð ð ð ð ð r-   r#   c                   ó„  — e Zd ZU dZ edddi¬¦  «        Zee         ed<    edddi¬¦  «        Z	ee         ed<    eddd	i¬¦  «        Z
ee         ed
<    edddi¬¦  «        Zeed<    edddi¬¦  «        Zee         ed<    edddi¬¦  «        Zeed<    edddi¬¦  «        Zee         ed<    edddi¬¦  «        Zeed<    edddi¬¦  «        Zeed<    eddg d¢dœ¬¦  «        Zee         ed<    eddg d¢dœ¬¦  «        Zee         ed <    eddd!i¬¦  «        Zeed"<    eddd#i¬¦  «        Zee         ed$<    eddd%i¬¦  «        Zeed&<    eddd'i¬¦  «        Zeed(<    ed)d*d+d)gdœ¬¦  «        Zeed,<    eddd-i¬¦  «        Zeed.<    ed/dd0i¬¦  «        Zeed1<    ed2dd3i¬¦  «        Zeed4<   d5„ ZdS )6ÚChatArgumentsz£
    Arguments for the chat CLI.

    See the metadata arg for each argument's description -- the medatata will be printed with
    `transformers chat --help`
    NÚhelpz_Name of the pre-trained model. The positional argument will take precedence if both are passed.)ÚdefaultÚmetadataÚmodel_name_or_pathzKUsername to display in chat interface. Defaults to the current user's name.r(   zSystem prompt.Úsystem_promptz./chat_history/zFolder to save chat history.Úsave_folderz"Path to a yaml file with examples.Úexamples_pathFz7Whether to show runtime warnings in the chat interface.ÚverbosezÏPath to a local generation config file or to a HuggingFace repo containing a `generation_config.json` file. Other generation settings passed as CLI arguments will be applied on top of this generation config.r]   ÚmainzLSpecific model version to use (can be a branch name, tag name or commit id).Úmodel_revisionÚautozDevice to use for inference.ÚdevicezA`torch_dtype` is deprecated! Please use `dtype` argument instead.)rv   Úbfloat16Úfloat16Úfloat32)rl   r9   Útorch_dtypez Override the default `torch.dtype` and load the model under this dtype. If `'auto'` is passed, the dtype will be automatically derived from the model's weights.Údtypez2Whether to trust remote code when loading a model.Útrust_remote_codezÂWhich attention implementation to use; you can run --attn_implementation=flash_attention_2, in which case you must install this manually by running `pip install flash-attn --no-build-isolation`.Úattn_implementationzIWhether to use 8 bit precision for the base model - works only with LoRA.Úload_in_8bitzIWhether to use 4 bit precision for the base model - works only with LoRA.Úload_in_4bitÚnf4zQuantization type.Úfp4Úbnb_4bit_quant_typez#Whether to use nested quantization.Úuse_bnb_nested_quantÚ	localhostz%Interface the server will listen to..Úhosté@  zPort the server will listen to.Úportc                 óJ   — | j         �| j        dk    r| j         | _        dS dS dS )z(Only used for BC `torch_dtype` argument.Nrv   )r{   r|   rP   s    r+   Ú__post_init__zChatArguments.__post_init__!  s5   € ð ÔÐ'¨D¬J¸&Ò,@Ð,@ØÔ)ˆDŒJˆJˆJð (Ð'Ð,@Ð,@r-   )ra   rb   rc   Ú__doc__r   ro   r	   rd   Ú__annotations__r(   rp   rq   rr   rs   rg   r]   ru   rw   r{   r|   r}   r~   r   r€   rƒ   r„   r†   rˆ   rf   rŠ   ri   r-   r+   rk   rk   Î   sì  € € € € € € ðð ð ).¨ØàÐuð
ð)ñ )ô )Ð˜ œð ð ñ ð  ˜%ØØÐgÐhðñ ô €Dˆ(�3Œ-ð ð ñ ð $) 5°ÀÐIYÐ@ZÐ#[Ñ#[Ô#[€M�8˜C”=Ð[Ð[Ñ[Ø�uÐ%6À&ÐJhÐAiÐjÑjÔj€K�ÐjÐjÑjØ#( 5°ÀÐImÐ@nÐ#oÑ#oÔ#o€M�8˜C”=ÐoÐoÑoØ�E %°6Ð;tÐ2uÐvÑvÔv€GˆTÐvÐvÑvð (- uØàð1ð
ð	(ñ 	(ô 	(Ð�x ”}ð 	ð 	ñ 	ð  ˜%ØØÐhÐiðñ ô €N�Cð ð ñ ð �% °&Ð:XÐ1YÐZÑZÔZ€FˆCÐZÐZÑZØ!& ØàWØAÐAÐAð
ð 
ð"ñ "ô "€K�˜#”ð ð ñ ð !˜5ØðPàAÐAÐAð
ð 
ðñ ô €Eˆ8�CŒ=ð ð ñ ð $˜eØ Ð)]Ð ^ðñ ô Ð�tð ð ñ ð */¨Øàð rð
ð*ñ *ô *Ð˜ #œð ð ñ ð ˜ØØÐeÐfðñ ô €L�$ð ð ñ ð ˜ØØÐeÐfðñ ô €L�$ð ð ñ ð  %˜u¨UÐFZÐhmÐotÐguÐ=vÐ=vÐwÑwÔwÐ˜ÐwÐwÑwØ!& ¨uÀÐHmÐ?nÐ!oÑ!oÔ!oÐ˜$ÐoÐoÑoð �˜k°VÐ=dÐ4eÐfÑfÔf€Dˆ#ÐfÐfÑfØ�˜d¨fÐ6WÐ-XÐYÑYÔY€Dˆ#ÐYÐYÑYð*ð *ð *ð *ð *r-   rk   Úargsc                 ó    — t          | ¦  «        S )z;
    Factory function used to chat with a local model.
    )ÚChatCommand)r�   s    r+   Úchat_command_factoryr�   (  s   € õ �tÑÔÐr-   c                   ó"  — e Zd Zedefd„¦   «         Zd„ Zedefd„¦   «         Zed"de	de
e         defd	„¦   «         Zed"d
e
e         dee         fd„¦   «         Zdee         defd„Zde	dedeeef         fd„Zededede
e         de
e         deeee         f         f
d„¦   «         Zede	de
d         fd„¦   «         Zde	dedef         fd„Zdede	dedeeeeef         f         dededee         deee         eef         fd„Zd „ Zd!„ ZdS )#r�   Úparserc                 ó  — t           f}|                      d|¬¦  «        }|                     d¦  «        }|                     dt          dd¬¦  «         |                     dt          dd	d
¬¦  «         |                     t          ¬¦  «         dS )z³
        Register this command to argparse so it's available for the transformer-cli

        Args:
            parser: Root parser to register command-specific arguments
        Úchat)Údataclass_typeszPositional argumentsÚmodel_name_or_path_or_addressNz7Name of the pre-trained model or address to connect to.)Útyperm   rl   Úgenerate_flagsa�  Flags to pass to `generate`, using a space as a separator between flags. Accepts booleans, numbers, and lists of integers, more advanced parameterization should be set through --generation-config. Example: `transformers chat <model_repo> max_new_tokens=100 do_sample=False eos_token_id=[1,2]`. If you're a new user, check this basic flag guide: https://huggingface.co/docs/transformers/llm_tutorial#common-optionsÚ*)r—   rm   rl   Únargs)Úfunc)rk   Ú
add_parserÚadd_argument_groupÚadd_argumentrd   Úset_defaultsr�   )r’   r•   Úchat_parserÚgroups       r+   Úregister_subcommandzChatCommand.register_subcommand0  s´   € õ )Ð*ˆØ×'Ò'¨ÀÐ'ÑPÔPˆà×.Ò.Ð/EÑFÔFˆØ×ÒØ+ÝØØJð	 	ñ 	
ô 	
ð 	
ð 	×ÒØÝØðWð ð 	ñ 	
ô 	
ð 	
ð 	× Ò Õ&:Ð Ñ;Ô;Ð;Ð;Ð;r-   c                 ó�  — |j         �Ä|j         }|                     d¦  «        s*|                     d¦  «        s|                     d¦  «        rkd| _        |j        dk    s|j        dk    rt          d¦  «        ‚|j                              dd¦  «        \  |_        |_        |j        €t          d	¦  «        ‚nd
| _        |j         |_        t          ¦   «         s$t          ¦   «         s| j        rt          d¦  «        ‚t          ¦   «         st          d¦  «        ‚t          ¦   «         s| j        rt          d¦  «        ‚|| _        d S )NÚhttpÚhttpsr…   Fr‡   uu   Looks like youâ€™ve set both a server address and a custom host/port. Please pick just one way to specify the server.ú:é   z\When connecting to a server, please specify a model name with the --model_name_or_path flag.TzÇYou need to install rich to use the chat interface. Additionally, you have not specified a remote endpoint and are therefore spawning a backend. Torch is required for this: (`pip install rich torch`)zHYou need to install rich to use the chat interface. (`pip install rich`)z…You have not specified a remote endpoint and are therefore spawning a backend. Torch is required for this: (`pip install rich torch`))r–   r@   Úspawn_backendr†   rˆ   Ú
ValueErrorÚrsplitro   r   r   ÚImportErrorr�   )r*   r�   Únames      r+   r,   zChatCommand.__init__Q  s€  € ØÔ-Ð9ØÔ5ˆDØ�Š˜vÑ&Ô&ð M¨$¯/ª/¸'Ñ*BÔ*Bð MÀdÇoÂoÐVaÑFbÔFbð MØ%*�Ô"à”9 Ò+Ð+¨t¬y¸DÒ/@Ð/@Ý$ðJñô ð ð
 (,Ô'I×'PÒ'PÐQTÐVWÑ'XÔ'XÑ$�”	˜4œ9àÔ*Ð2Ý$Øvñô ð ð 3ð
 &*�Ô"Ø*.Ô*L�Ô'å Ñ"Ô"ð 	Õ,>Ñ,@Ô,@ð 	ÀTÔEWð 	Ýðxñô ð õ #Ñ$Ô$ð 	ÝÐhÑiÔiÐiÝ#Ñ%Ô%ð 	¨$Ô*<ð 	Ýð7ñô ð ð
 ˆŒ	ˆ	ˆ	r-   r/   c                  óª   — t          j        ¦   «         dk    rt          j        ¦   «         S t	          j        t          j        ¦   «         ¦  «        j        S )z)Returns the username of the current user.r   )ÚplatformÚsystemÚosÚgetloginÚpwdÚgetpwuidÚgetuidÚpw_nameri   r-   r+   Úget_usernamezChatCommand.get_usernamex  s<   € õ Œ?ÑÔ 	Ò)Ð)Ý”;‘=”=Ð å”<¥¤	¡¤Ñ,Ô,Ô4Ð4r-   Nr�   Úfilenamec                 óê  — i }t          |¦  «        |d<   | |d<   |j        }|€At          j        d¦  «        }|j        › d|› d�}t
          j                             ||¦  «        }t          j        t
          j         	                    |¦  «        d¬¦  «         t          |d	¦  «        5 }t          j        ||d
¬¦  «         ddd¦  «         n# 1 swxY w Y   t
          j                             |¦  «        S )z!Saves the chat history to a file.ÚsettingsÚchat_historyNz%Y-%m-%d_%H-%M-%Sz/chat_ú.jsonT)Úexist_okÚwr1   )Úindent)Úvarsrq   ÚtimeÚstrftimer–   r°   ÚpathrA   ÚmakedirsÚdirnameÚopenÚjsonÚdumpÚabspath)r”   r�   r·   Úoutput_dictÚfolderÚtime_strÚfs          r+   Ú	save_chatzChatCommand.save_chat€  s  € ð ˆÝ"& t¡*¤*ˆ�JÑØ&*ˆ�NÑ#àÔ!ˆàÐÝ”}Ð%8Ñ9Ô9ˆHØÔ<ÐSÐSÀHÐSÐSÐSˆHÝ”w—|’| F¨HÑ5Ô5ˆHå
Œ•B”G—O’O HÑ-Ô-¸Ð=Ñ=Ô=Ð=Ý�(˜CÑ Ô ð 	0 AÝŒI�k 1¨QÐ/Ñ/Ô/Ð/ð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0åŒw�Š˜xÑ(Ô(Ð(s   Â'CÃCÃCrp   c                 ó   — | €g }nd| dœg}|S )zClears the chat history.Nr¯   ©Úroler;   ri   )rp   r”   s     r+   Úclear_chat_historyzChatCommand.clear_chat_history“  s&   € ð Ð ØˆDˆDà%°-Ð@Ð@ÐAˆDØˆr-   r˜   c                 ó  ‡— t          |¦  «        dk    ri S d„ |D ¦   «         }d„ |                     ¦   «         D ¦   «         }d„ |                     ¦   «         D ¦   «         }dt          dt          fd„Šˆfd„|                     ¦   «         D ¦   «         }d	                     d
„ |                     ¦   «         D ¦   «         ¦  «        }d|z   dz   }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }	 t          j        |¦  «        }n"# t          j        $ r t          d¦  «        ‚w xY w|S )zUParses the generate flags from the user input into a dictionary of `generate` kwargs.r   c                 ó„   — i | ]=}d |                      d¦  «        d         z   d z   |                      d¦  «        d         “Œ>S )ú"ú=r   r§   )Úsplit)Ú.0Úflags     r+   ú
<dictcomp>z4ChatCommand.parse_generate_flags.<locals>.<dictcomp>¦  sD   € Ð!pÐ!pÐ!pÐY] #¨¯
ª
°3©¬¸Ô(:Ñ":¸SÑ"@À$Ç*Â*ÈSÁ/Ä/ÐRSÔBTÐ!pÐ!pÐ!pr-   c                 ón   — i | ]2\  }}||                      ¦   «         d v r|                      ¦   «         n|“Œ3S ))ÚtrueÚfalse)Úlower©r×   ÚkÚvs      r+   rÙ   z4ChatCommand.parse_generate_flags.<locals>.<dictcomp>ª  sJ   € ð "
ð "
ð "
ÙFJÀaÈˆA˜AŸGšG™IœIÐ):Ð:Ð:ˆq�wŠw‰yŒyˆyÀð"
ð "
ð "
r-   c                 ó*   — i | ]\  }}||d k    rdn|“ŒS )ÚNoneÚnullri   rÞ   s      r+   rÙ   z4ChatCommand.parse_generate_flags.<locals>.<dictcomp>­  s*   € Ð!mÐ!mÐ!mÁdÀaÈ !¨q°Fª{¨{ V VÀÐ!mÐ!mÐ!mr-   Úsr/   c                 ó’   — |                       d¦  «        r
| dd …         } |                      ddd¦  «                             ¦   «         S )Nú-r§   ú.r4   )r@   ÚreplaceÚisdigit)rä   s    r+   Ú	is_numberz3ChatCommand.parse_generate_flags.<locals>.is_number°  sE   € à�|Š|˜CÑ Ô ð Ø�a�b�b”E�Ø—9’9˜S " aÑ(Ô(×0Ò0Ñ2Ô2Ð2r-   c                 ó>   •— i | ]\  }}| ‰|¦  «        sd |› d �n|“ŒS )rÔ   ri   )r×   rß   rà   rê   s      €r+   rÙ   z4ChatCommand.parse_generate_flags.<locals>.<dictcomp>¶  s9   ø€ Ð!tÐ!tÐ!tÉTÈQÐPQ !°Y°Y¸q±\´\Ð%H X¨ X X X XÀqÐ!tÐ!tÐ!tr-   z, c                 ó"   — g | ]\  }}|› d |› �‘ŒS )z: ri   rÞ   s      r+   ú
<listcomp>z4ChatCommand.parse_generate_flags.<locals>.<listcomp>»  s&   € Ð*bÐ*bÐ*b¹4¸1¸a¨a¨;¨;°1¨;¨;Ð*bÐ*bÐ*br-   Ú{Ú}z"null"rã   z"true"rÛ   z"false"rÜ   z"[ú[z]"rU   rÕ   r¦   z�Failed to convert `generate_flags` into a valid JSON object.
`generate_flags` = {generate_flags}
Converted JSON string = {generate_flags_string})
ÚlenÚitemsrd   rg   rA   rè   rÆ   ÚloadsÚJSONDecodeErrorr©   )r*   r˜   Úgenerate_flags_as_dictÚgenerate_flags_stringÚprocessed_generate_flagsrê   s        @r+   Úparse_generate_flagsz ChatCommand.parse_generate_flagsž  sð  ø€ åˆ~ÑÔ !Ò#Ð#ØˆIð
 "qÐ!pÐaoÐ!pÑ!pÔ!pÐð"
ð "
ØNd×NjÒNjÑNlÔNlð"
ñ "
ô "
Ðð "nÐ!mÐNd×NjÒNjÑNlÔNlÐ!mÑ!mÔ!mÐð	3�ð 	3¥ð 	3ð 	3ð 	3ð 	3ð "uÐ!tÐ!tÐ!tÐUk×UqÒUqÑUsÔUsÐ!tÑ!tÔ!tÐð
 !%§	¢	Ð*bÐ*bÐCY×C_ÒC_ÑCaÔCaÐ*bÑ*bÔ*bÑ cÔ cÐð !$Ð&;Ñ ;¸cÑ AÐð !6× =Ò =¸hÈÑ OÔ OÐØ 5× =Ò =¸hÈÑ OÔ OÐØ 5× =Ò =¸iÈÑ QÔ QÐØ 5× =Ò =¸dÀCÑ HÔ HÐØ 5× =Ò =¸dÀCÑ HÔ HÐð !6× =Ò =¸cÀ3Ñ GÔ GÐð	Ý'+¤zÐ2GÑ'HÔ'HÐ$Ð$øÝÔ#ð 	ð 	ð 	ÝðDñô ð ð	øøøð (Ð's   ÅE$ Å$FÚmodel_generation_configc                 ó°  — |j         ��d|j         v r^t          j                             |j         ¦  «        }t          j                             |j         ¦  «        }t          j        ||¦  «        }n>t          j        |j         ¦  «        }n$t          j        |¦  «        } |j	        di dddœ¤Ž |  
                    |j        ¦  «        } |j	        di |¤Ž}||fS )zj
        Returns a GenerationConfig object holding the generation parameters for the CLI command.
        Nr»   Té   )Ú	do_sampleÚmax_new_tokensri   )r]   r°   rÂ   rÄ   Úbasenamer   Úfrom_pretrainedÚcopyÚdeepcopyrC   rø   r˜   )r*   r�   rù   rÄ   r·   r]   Úparsed_generate_flagsr^   s           r+   Úget_generation_parameterizationz+ChatCommand.get_generation_parameterizationÔ  së   € ð Ô!Ð-Ø˜$Ô0Ð0Ð0Ýœ'Ÿ/š/¨$Ô*@ÑAÔA�Ýœ7×+Ò+¨DÔ,BÑCÔC�Ý$4Ô$DÀWÈhÑ$WÔ$WÐ!Ð!å$4Ô$DÀTÔE[Ñ$\Ô$\Ð!Ð!õ
 !%¤Ð.EÑ FÔ FÐØ$ÐÔ$ÐRÐR°TÈSÐ'QÐ'QÐRÐRÐRð !%× 9Ò 9¸$Ô:MÑ NÔ NÐØ/Ð(Ô/ÐHÐHÐ2GÐHÐHˆð ! ,Ð.Ð.r-   Ú	tokenizerr]   Ú
eos_tokensÚeos_token_idsc                 óv  — |j         €|j        }n|j         }g }|�;|                     |                      |                     d¦  «        ¦  «        ¦  «         |�2|                     d„ |                     d¦  «        D ¦   «         ¦  «         t          |¦  «        dk    r|                     |j        ¦  «         ||fS )z:Retrieves the pad token ID and all possible EOS token IDs.Nú,c                 ó,   — g | ]}t          |¦  «        ‘ŒS ri   )rf   )r×   Útoken_ids     r+   rí   z0ChatCommand.parse_eos_tokens.<locals>.<listcomp>  s   € Ð%]Ð%]Ð%]¸¥c¨(¡m¤mÐ%]Ð%]Ð%]r-   r   )Úpad_token_idÚeos_token_idÚextendÚconvert_tokens_to_idsrÖ   rñ   r?   )r  r]   r  r  r  Úall_eos_token_idss         r+   Úparse_eos_tokenszChatCommand.parse_eos_tokensð  sÌ   € ð Ô)Ð1Ø,Ô9ˆLˆLà,Ô9ˆLàÐàÐ!Ø×$Ò$ Y×%DÒ%DÀZ×EUÒEUÐVYÑEZÔEZÑ%[Ô%[Ñ\Ô\Ð\àÐ$Ø×$Ò$Ð%]Ð%]ÀM×DWÒDWÐX[ÑD\ÔD\Ð%]Ñ%]Ô%]Ñ^Ô^Ð^åÐ Ñ!Ô! QÒ&Ð&Ø×$Ò$Ð%6Ô%CÑDÔDÐDàÐ.Ð.Ð.r-   Ú
model_argsr   c                 óš   — | j         r)t          d| j        | j        | j        | j        ¬¦  «        }n| j        rt          d¬¦  «        }nd }|S )NT)r€   Úbnb_4bit_compute_dtyperƒ   Úbnb_4bit_use_double_quantÚbnb_4bit_quant_storage)r   )r€   r   r|   rƒ   r„   r   )r  Úquantization_configs     r+   Úget_quantization_configz#ChatCommand.get_quantization_config  sv   € àÔ"ð 	'Ý"4Ø!à'1Ô'7Ø$.Ô$BØ*4Ô*IØ'1Ô'7ð#ñ #ô #ÐÐð Ô$ð 	'Ý"4Ø!ð#ñ #ô #ÐÐð #'Ðà"Ð"r-   r   c                 óŠ  — t          j        |j        |j        |j        ¬¦  «        }|j        dv r|j        nt          t          |j        ¦  «        }|                      |¦  «        }|j        |j	        |d|dœ}t          j        |j        fd|j        i|¤Ž}t          |dd ¦  «        €|                     |j        ¦  «        }||fS )N)Úrevisionr}   )rv   Nrv   )r  r~   r|   Ú
device_mapr  r}   Úhf_device_map)r   rÿ   Úmodel_name_or_path_positionalru   r}   r|   ÚgetattrÚtorchr  r~   r   Útorw   )r*   r�   r  r|   r  r^   Úmodels          r+   Úload_model_and_tokenizerz$ChatCommand.load_model_and_tokenizer   sé   € Ý!Ô1ØÔ.ØÔ(Ø"Ô4ð
ñ 
ô 
ˆ	ð #œj¨NÐ:Ð:�”
�
ÅÍÈtÌzÑ@ZÔ@ZˆØ"×:Ò:¸4Ñ@Ô@ÐàÔ+Ø#'Ô#;ØØ Ø#6ð
ð 
ˆõ %Ô4ØÔ.ð
ð 
ØBFÔBXð
Ø\hð
ð 
ˆõ �5˜/¨4Ñ0Ô0Ð8Ø—H’H˜Tœ[Ñ)Ô)ˆEà�iÐÐr-   Ú
user_inputÚ	interfaceÚexamplesr^   r”   c                 óÀ  — d}|dk    r0|                       |j        ¦  «        }|                     ¦   «          �n¡|dk    r|                     ¦   «          �n…|                     d¦  «        r‹t          |                     ¦   «         ¦  «        dk     rf|                     ¦   «         }	t          |	¦  «        dk    r	|	d         }
nd}
|                      |||
¦  «        }
|                     d|
› d	�d
¬¦  «         �nå|                     d¦  «        r‡|dd…          	                    ¦   «         }|                     ¦   «         }|D ]#}d|vr|                     d|› d�d¬¦  «          n0Œ$|  
                    |¦  «        } |j        di |¤Ž} |j        di |¤Ž �nI|                     d¦  «        rßt          |                     ¦   «         ¦  «        dk    rº|                     ¦   «         d         }||v r\|                     ¦   «          g }|                     ||         d         ¦  «         |                     d||         d         dœ¦  «         n•d|› dt          |                     ¦   «         ¦  «        › d�}|                     |d¬¦  «         nU|dk    r|                     |j        ||¬¦  «         n1d}|                     d|› d�d¬¦  «         |                     ¦   «          ||||fS )z£
        Handles all user commands except for `!exit`. May update the chat history (e.g. reset it) or the
        generation config (e.g. set a new flag).
        Tz!clearz!helpz!saveé   r§   NzChat saved in ú!Úgreen)r   rS   z!setr1   rÕ   z(Invalid flag format, missing `=` after `z;`. Please use the format `arg_1=value_1 arg_2=value_2 ...`.Úredú!exampler   r(   rÏ   zExample z* not found in list of available examples: rç   z!status)r$   r]   r^   Fú'z/' is not a valid command. Showing help message.ri   )rÑ   rp   rO   r\   r@   rñ   rÖ   rÍ   rW   rB   rø   rC   rR   r?   ÚlistÚkeysr`   ro   )r*   r"  r�   r#  r$  r]   r^   r”   Úvalid_commandÚsplit_inputr·   Únew_generate_flagsrØ   Úparsed_new_generate_flagsÚnew_model_kwargsÚexample_nameÚexample_errors                    r+   Úhandle_non_exit_user_commandsz)ChatCommand.handle_non_exit_user_commands;  s|  € ð ˆà˜Ò!Ð!Ø×*Ò*¨4Ô+=Ñ>Ô>ˆDØ�OŠOÑÔÐÑà˜7Ò"Ð"Ø× Ò Ñ"Ô"Ð"Ñ"à×"Ò" 7Ñ+Ô+ð 7	#µ°J×4DÒ4DÑ4FÔ4FÑ0GÔ0GÈ!Ò0KÐ0KØ$×*Ò*Ñ,Ô,ˆKå�;ÑÔ 1Ò$Ð$Ø& qœ>��à�Ø—~’~ d¨D°(Ñ;Ô;ˆHØ×!Ò!Ð'C¸Ð'CÐ'CÐ'CÈ7Ð!ÑSÔSÐSÑSà×"Ò" 6Ñ*Ô*ð -	#ð ",¨A¨B¨B¤×!5Ò!5Ñ!7Ô!7ÐØ!3×!9Ò!9Ñ!;Ô!;Ðà*ð 8ð 8�Ø˜d�?�?Ø×)Ò)ðAÀtð Að Að Að $ð *ñ ô ð ð �Eð #ð -1×,EÒ,EÐFXÑ,YÔ,YÐ)Ø#;Ð#4Ô#;Ð#XÐ#XÐ>WÐ#XÐ#XÐ Ø#�Ô#Ð7Ð7Ð&6Ð7Ð7Ð7ùà×"Ò" :Ñ.Ô.ð 	#µ3°z×7GÒ7GÑ7IÔ7IÑ3JÔ3JÈaÒ3OÐ3OØ%×+Ò+Ñ-Ô-¨aÔ0ˆLØ˜xÐ'Ð'Ø—’Ñ!Ô!Ð!Ø�Ø×,Ò,¨X°lÔ-CÀFÔ-KÑLÔLÐLØ—’ V¸ÀÔ8NÈvÔ8VÐWÐWÑXÔXÐXÐXð p˜|ÐoÐoÕW[Ð\d×\iÒ\iÑ\kÔ\kÑWlÔWlÐoÐoÐoð ð ×%Ò%¨=ÀÐ%ÑFÔFÐFÐFà˜9Ò$Ð$Ø×"Ò"ØÔ2Ø"3Ø)ð #ñ ô ð ð ð "ˆMØ×!Ò!Ð'f¨:Ð'fÐ'fÐ'fÐnsÐ!ÑtÔtÐtØ× Ò Ñ"Ô"Ð"à�]Ð$5°|ÐCÐCr-   c                 óR   — t          j        |                      ¦   «         ¦  «         d S ©N)ÚasyncioÚrunÚ
_inner_runrP   s    r+   r9  zChatCommand.run�  s"   € ÝŒ�D—O’OÑ%Ô%Ñ&Ô&Ð&Ð&Ð&r-   c              ƒ   óP  K  — | j         r½t          | j        j        | j        j        | j        j        | j        j        | j        j        | j        j        | j        j	        | j        j
        | j        j        | j        j        d¬¦  «        }t          |¦  «        }t          |j        ¬¦  «        }d|_        |                     ¦   «          | j        j        dz   | j        j        z   }| j        j        dk    rdn| j        j        }t)          |› d| j        j        › �¦  «        }| j        }|j        €t,          }n@t/          |j        ¦  «        5 }	t1          j        |	¦  «        }d d d ¦  «         n# 1 swxY w Y   |j        €|                      ¦   «         }
n|j        }
t9          j        |j        ¦  «        }|                      ||¦  «        \  }}t?          |j        |
¬	¦  «        }|                      ¦   «          |  !                    |j"        ¦  «        }| #                    d¬
¦  «         	 	 | $                    ¦   «         }| %                    d¦  «        rx|dk    r	 | &                    ¦   «         ƒ d {V —† d S |  '                    |||||||¬¦  «        \  }}}}|r| %                    d¦  «        s	 | &                    ¦   «         ƒ d {V —† Œ¢n| (                    d|dœ¦  «         | )                    |d| *                    ¦   «         |dœ¬¦  «        }| +                    |¦  «        ƒ d {V —†}| (                    d|dœ¦  «         n+# tX          $ r Y | &                    ¦   «         ƒ d {V —† d S w xY w	 | &                    ¦   «         ƒ d {V —† n# | &                    ¦   «         ƒ d {V —† w xY w�Œƒ)NÚerror)rw   r|   r}   r~   r   r€   rƒ   r„   r†   rˆ   Ú	log_level)ÚtargetTú@r…   zhttp://localhostr¦   )r$   r%   )rX   r'  z!exit)r"  r�   r#  r$  r]   r^   r”   r*  r(   rÏ   )r]   r   )r.   Ú
extra_bodyr'   )-r¨   r   r�   rw   r|   r}   r~   r   r€   rƒ   r„   r†   rˆ   r   r   r9  ÚdaemonÚstartro   ru   r
   rr   ÚDEFAULT_EXAMPLESrÅ   ÚyamlÚ	safe_loadr(   r¶   r   rÿ   r  r#   rO   rÑ   rp   r\   rM   r@   Úcloser5  r?   Úchat_completionÚto_json_stringrJ   ÚKeyboardInterrupt)r*   Ú
serve_argsÚserve_commandÚthreadr   r†   Úclientr�   r$  rÌ   r(   rù   r]   r^   r#  r”   r"  r.  r.   Úmodel_outputs                       r+   r:  zChatCommand._inner_run’  s_  è è € ØÔð 	Ý'Ø”yÔ'Ø”i”oØ"&¤)Ô"=Ø$(¤IÔ$AØ!œYÔ3Ø!œYÔ3Ø$(¤IÔ$AØ%)¤YÔ%CØ”Y”^Ø”Y”^Ø!ðñ ô ˆJõ )¨Ñ4Ô4ˆMå =Ô#4Ð5Ñ5Ô5ˆFØ ˆFŒMØ�LŠL‰NŒNˆNà”	Ô,¨sÑ2°T´YÔ5MÑMˆØ%)¤Y¤^°{Ò%BÐ%BÐ!Ð!ÈÌ	ÌˆÝ%¨Ð&@Ð&@°´	´Ð&@Ð&@ÑAÔAˆàŒyˆØÔÐ%Ý'ˆHˆHå�dÔ(Ñ)Ô)ð -¨QÝœ>¨!Ñ,Ô,�ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð Œ9ÐØ×$Ò$Ñ&Ô&ˆDˆDà”9ˆDå"2Ô"BÀ4ÔCZÑ"[Ô"[ÐØ*.×*NÒ*NÈtÐUlÑ*mÔ*mÑ'Ð˜<å!¨TÔ-DÐPTÐUÑUÔUˆ	Ø�ŠÑÔÐØ×&Ò& tÔ'9Ñ:Ô:ˆð 	×Ò TÐÑ*Ô*Ð*ð)	%ð(%Ø&Ÿ_š_Ñ.Ô.�
ð ×(Ò(¨Ñ-Ô-ð Ià! WÒ,Ð,ØðB —l’l‘n”nÐ$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ð? PT×OqÒOqØ'1Ø!%Ø&/Ø%-Ø.?Ø)5Ø!%ð Prñ Pô PÑL˜˜mÐ->Àð )ð !°
×0EÒ0EÀjÑ0QÔ0Qð !Ø ð( —l’l‘n”nÐ$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ð+!ð —K’K¨¸JÐ GÐ GÑHÔHÐHà×/Ò/ØØà->×-MÒ-MÑ-OÔ-OØ!&ð ð  ð 0ñ ô �ð &/×%<Ò%<¸VÑ%DÔ%DÐDÐDÐDÐDÐDÐD�à—’ [¸\ÐJÐJÑKÔKÐKÐKøå$ð ð ð Øà—l’l‘n”nÐ$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ðøøøð Lð
 —l’l‘n”nÐ$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ø�f—l’l‘n”nÐ$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øøøñS)	%sI   Å	E*Å*E.Å1E.È&/M  É28M  ËA9M  Ì?N Í 
M(Í
N Í'M(Í(N ÎN#r7  )ra   rb   rc   Ústaticmethodr   r¢   r,   rd   r¶   rk   r	   rÍ   r,  rh   rÑ   rø   r   re   r  r   rf   r  r  r   r!  r#   r5  r9  r:  ri   r-   r+   r�   r�   /  sÓ  € € € € € Øð< Nð <ð <ð <ñ „\ð<ð@#ð #ð #ðN ð5˜#ð 5ð 5ð 5ñ „\ð5ð ð)ð )˜mð )°xÀ´}ð )ÐPSð )ð )ð )ñ „\ð)ð$ ðð ¨(°3¬-ð À4ÈÄ:ð ð ð ñ „\ðð4(°4¸´9ð 4(Àð 4(ð 4(ð 4(ð 4(ðl/Ø!ð/Ø<Lð/à	Ð Ð%Ô	&ð/ð /ð /ð /ð8 ð/Ø&ð/à+ð/ð ˜S”Mð/ð   ”}ð	/ð
 
ˆs�D˜”Iˆ~Ô	ð/ð /ð /ñ „\ð/ð6 ð#¨Mð #¸hÐG[Ô>\ð #ð #ð #ñ „\ð#ð& ¨]ð  ¸uÐE[Ð]jÐEjÔ?kð  ð  ð  ð  ð6PDàðPDð ðPDð !ð	PDð
 �s˜D  c œNÐ*Ô+ðPDð ,ðPDð ðPDð �4ŒjðPDð 
ˆt�DŒzÐ+¨TÐ1Ô	2ðPDð PDð PDð PDðh'ð 'ð 'ðW%ð W%ð W%ð W%ð W%r-   r�   Ú__main__z meta-llama/Llama-3.2-3b-Instructzhttp://localhost:8000)Cr8  r   rÆ   r°   r®   r<   ÚstringrÀ   Úargparser   r   Úcollections.abcr   Údataclassesr   r   Ú	threadingr   Útypingr	   rD  Úhuggingface_hubr
   r   Útransformersr   r   r   Útransformers.commandsr   Útransformers.commands.servingr   r   Útransformers.utilsr   r   r¯   r²   Úrich.consoler   Ú	rich.liver   Úrich.markdownr   r  r   r   ÚsetÚascii_lettersÚ
whitespaceÚALLOWED_KEY_CHARSÚdigitsÚALLOWED_VALUE_CHARSrC  rZ   rA   r-  r[   r#   rk   r�   r�   ra   r�   r–   r”   r9  ri   r-   r+   ú<module>re     sð  ðð  €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø )Ð )Ð )Ð )Ð )Ð )Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð ð ð
 =Ð <Ð <Ð <Ð <Ð <Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dð €8„?ÑÔ˜	Ò!Ð!Ø€J€J€JàÐÑÔð 'Ø$Ð$Ð$Ð$Ð$Ð$ØÐÐÐÐÐØ&Ð&Ð&Ð&Ð&Ð&àÐÑÔð Ø€L€L€Lðð ð ð ð ð ð ð ð ð ð ð ð �C˜Ô,¨vÔ/@Ñ@ÑAÔAÐ Ø�cØ
Ô˜6œ=Ñ(¨6Ô+<Ñ<Ð?bÑbñô Ð ð
 ÐMÐNàð)ðð ÐQÐRØÐNÐOØÐ.Ð/ØÐJÐKØÐ?Ð@ðð Ð ð 	Ð ðð "Ÿ;š;Ð'7×'<Ò'<Ñ'>Ô'>Ñ?Ô?ðð ð €ð&Yð Yð Yð Yð Yñ Yô Yð Yðx ðV*ð V*ð V*ð V*ð V*ñ V*ô V*ñ „ðV*ðr˜yð ð ð ð ðz%ð z%ð z%ð z%ð z%Ð,ñ z%ô z%ð z%ðz ˆzÒÐØˆ=‰?Œ?€DØ)K€DÔ&Ø)@€DÔ&Øˆ;�tÑÔ€DØ‡H‚H�J„J€J€J€Jð Ðr-   