§
    šŠtj€(  ã                  ó¢   — d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ  G d
„ de¦  «        ZdS )é    )ÚannotationsN)ÚStringIO)ÚAnyÚDictÚIteratorÚListÚOptional)ÚCallbackManagerForLLMRun)ÚLLM)ÚGenerationChunk)Úget_pydantic_field_names)Ú
ConfigDictc                  óä  — e Zd ZU dZdZded<   	 dZded<   	 dZd	ed
<   	 dZded<   	 dZ	ded<   	 dZ
ded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   	 dZded <   	 d!Zd	ed"<   	 d#Zded$<   	 d#Zded%<   	 dZded&<   	 d'Zded(<   	 d)Zded*<   	  ed+¬,¦  «        Zed@d.„¦   «         ZedAd0„¦   «         ZedBd2„¦   «         Z	 dCdDd7„Z	 	 dEdFd;„Z 	 	 dEdGd=„Z!dHd?„Z"dS )IÚ	LlamafileaO  Llamafile lets you distribute and run large language models with a
    single file.

    To get started, see: https://github.com/Mozilla-Ocho/llamafile

    To use this class, you will need to first:

    1. Download a llamafile.
    2. Make the downloaded file executable: `chmod +x path/to/model.llamafile`
    3. Start the llamafile in server mode:

        `./path/to/model.llamafile --server --nobrowser`

    Example:
        .. code-block:: python

            from langchain_community.llms import Llamafile
            llm = Llamafile()
            llm.invoke("Tell me a joke.")
    zhttp://localhost:8080ÚstrÚbase_urlNzOptional[int]Úrequest_timeoutFÚboolÚ	streamingéÿÿÿÿÚintÚseedgš™™™™™é?ÚfloatÚtemperatureé(   Útop_kgffffffî?Útop_pgš™™™™™©?Úmin_pÚ	n_predictr   Ún_keepg      ð?Útfs_zÚ	typical_pgš™™™™™ñ?Úrepeat_penaltyé@   Úrepeat_last_nTÚpenalize_nlg        Úpresence_penaltyÚfrequency_penaltyÚmirostatg      @Úmirostat_taugš™™™™™¹?Úmirostat_etaÚforbid)ÚextraÚreturnc                ó   — dS )NÚ	llamafile© )Úselfs    ú`/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/llms/llamafile.pyÚ	_llm_typezLlamafile._llm_typex   s   € àˆ{ó    ú	List[str]c                óP   ‡— g d¢Šˆfd„t          | j        ¦  «        D ¦   «         }|S )N)r   ÚcacheÚcallback_managerÚ	callbacksÚmetadataÚnamer   r   ÚtagsÚverboseÚcustom_get_token_idsc                ó   •— g | ]}|‰v¯|‘Œ	S r1   r1   )Ú.0ÚkÚignore_keyss     €r3   ú
<listcomp>z/Llamafile._param_fieldnames.<locals>.<listcomp>�   s*   ø€ ð 
ð 
ð 
ØÀ1ÈKÐCWÐCWˆAÐCWÐCWÐCWr5   )r   Ú	__class__)r2   ÚattrsrC   s     @r3   Ú_param_fieldnameszLlamafile._param_fieldnames|   sM   ø€ ð
ð 
ð 
ˆð
ð 
ð 
ð 
Ý/°´Ñ?Ô?ð
ñ 
ô 
ˆð ˆr5   úDict[str, Any]c                óD   — i }| j         D ]}t          | |¦  «        ||<   Œ|S ©N)rG   Úgetattr)r2   ÚparamsÚ	fieldnames      r3   Ú_default_paramszLlamafile._default_params”   s5   € àˆØÔ/ð 	9ð 	9ˆIÝ '¨¨iÑ 8Ô 8ˆF�9ÑÐØˆr5   ÚstopúOptional[List[str]]Úkwargsr   c                ó¦   — | j         }|                     ¦   «         D ]\  }}||v r|||<   Œ|�t          |¦  «        dk    r||d<   | j        rd|d<   |S )Nr   rO   TÚstream)rN   ÚitemsÚlenr   )r2   rO   rQ   rL   rB   Úvs         r3   Ú_get_parameterszLlamafile._get_parameters›   sr   € ð Ô%ˆð
 —L’L‘N”Nð 	ð 	‰DˆAˆqØ�Fˆ{ˆ{Ø��q‘	øàÐ¥ D¡	¤	¨A¢ Ø!ˆF�6‰NàŒ>ð 	$Ø#ˆF�8Ñàˆr5   ÚpromptÚrun_managerú"Optional[CallbackManagerForLLMRun]c                óP  — | j         rjt          ¦   «         5 } | j        |f||dœ|¤ŽD ]}|                     |j        ¦  «         Œ|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |S  | j        dd|i|¤Ž}d|i|¥}		 t          j        | j	        › d�ddi|	d| j
        ¬	¦  «        }
n@# t          j        j        $ r) t          j                             d
| j	        › d�¦  «        ‚w xY w|
                     ¦   «          d|
_        |
                     ¦   «         d         }|S )a¨  Request prompt completion from the llamafile server and return the
        output.

        Args:
            prompt: The prompt to use for generation.
            stop: A list of strings to stop generation when encountered.
            run_manager:
            **kwargs: Any additional options to pass as part of the
            generation request.

        Returns:
            The string generated by the model.

        )rO   rY   NrO   rX   ú/completionúContent-Typeúapplication/jsonF©ÚurlÚheadersÚjsonrS   ÚtimeoutúTCould not connect to Llamafile server. Please make sure that a server is running at ú.zutf-8Úcontentr1   )r   r   Ú_streamÚwriteÚtextÚgetvaluerW   ÚrequestsÚpostr   r   Ú
exceptionsÚConnectionErrorÚraise_for_statusÚencodingrb   )r2   rX   rO   rY   rQ   ÚbuffÚchunkri   rL   ÚpayloadÚresponses              r3   Ú_callzLlamafile._call¯   sÎ  € ð, Œ>ð $	Ý‘”ð '˜tØ)˜Tœ\ØðØ!%°;ðð ØBHðð ð +ð +�Eð —J’J˜uœzÑ*Ô*Ð*Ð*à—}’}‘”�ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ð ˆKð *�TÔ)Ð>Ð>¨tÐ>°vÐ>Ð>ˆFØ Ð2¨6Ð2ˆGðÝ#œ=Øœ=Ð5Ð5Ð5à&Ð(:ðð !Ø Ø Ô0ðñ ô ��øõ Ô&Ô6ð ð ð ÝÔ)×9Ò9ðDØ37´=ðDð Dð Dñô ð ðøøøð ×%Ò%Ñ'Ô'Ð'Ø 'ˆHÔà—=’=‘?”? 9Ô-ˆDàˆKs   –AA%Á%A)Á,A)Â(B1 Â1=C.úIterator[GenerationChunk]c              +  óæ  K  —  | j         dd|i|¤Ž}d|vrd|d<   d|i|¥}	 t          j        | j        › d�ddi|d| j        ¬¦  «        }n@# t          j        j        $ r) t          j                             d	| j        › d
�¦  «        ‚w xY wd|_        |                     d¬¦  «        D ]H}|  	                    |¦  «        }	t          |	¬¦  «        }
|r|                     |
j        ¬¦  «         |
V — ŒIdS )a"  Yields results objects as they are generated in real time.

        It also calls the callback manager's on_llm_new_token event with
        similar parameters to the OpenAI LLM class method of the same name.

        Args:
            prompt: The prompts to pass into the model.
            stop: Optional list of stop words to use when generating.
            run_manager:
            **kwargs: Any additional options to pass as part of the
            generation request.

        Returns:
            A generator representing the stream of tokens being generated.

        Yields:
            Dictionary-like objects each containing a token

        Example:
        .. code-block:: python

            from langchain_community.llms import Llamafile
            llm = Llamafile(
                temperature = 0.0
            )
            for chunk in llm.stream("Ask 'Hi, how are you?' like a pirate:'",
                    stop=["'","
"]):
                result = chunk["choices"][0]
                print(result["text"], end='', flush=True)

        rO   rS   TrX   r\   r]   r^   r_   rd   re   Úutf8)Údecode_unicode)ri   )ÚtokenNr1   )rW   rk   rl   r   r   rm   rn   rp   Ú
iter_linesÚ_get_chunk_contentr   Úon_llm_new_tokenri   )r2   rX   rO   rY   rQ   rL   rs   rt   Ú	raw_chunkrf   rr   s              r3   rg   zLlamafile._streamë   sl  è è € ðL &�Ô%Ð:Ð:¨4Ð:°6Ð:Ð:ˆØ˜6Ð!Ð!Ø#ˆF�8Ñà˜VÐ. vÐ.ˆð	Ý”}Ø”}Ð1Ð1Ð1à"Ð$6ðð ØØÔ,ðñ ô ˆHˆHøõ Ô"Ô2ð 	ð 	ð 	ÝÔ%×5Ò5ð@Ø/3¬}ð@ð @ð @ñô ð ð	øøøð #ˆÔà!×,Ò,¸DÐ,ÑAÔAð 	ð 	ˆIØ×-Ò-¨iÑ8Ô8ˆGÝ#¨Ð1Ñ1Ô1ˆEàð ?Ø×,Ò,°5´:Ð,Ñ>Ô>Ð>ØˆKˆKˆKˆKð	ð 	s   ¢(A Á=Brr   c                ó’   — |                      d¦  «        r1|                     d¦  «        }t          j        |¦  «        }|d         S |S )z÷When streaming is turned on, llamafile server returns lines like:

        'data: {"content":" They","multimodal":true,"slot_id":0,"stop":false}'

        Here, we convert this to a dict and return the value of the 'content'
        field
        zdata:zdata: rf   )Ú
startswithÚlstriprb   Úloads)r2   rr   ÚcleanedÚdatas       r3   r|   zLlamafile._get_chunk_content1  sI   € ð ×Ò˜GÑ$Ô$ð 	Ø—l’l 8Ñ,Ô,ˆGÝ”:˜gÑ&Ô&ˆDØ˜	”?Ð"àˆLr5   )r.   r   )r.   r6   )r.   rH   rJ   )rO   rP   rQ   r   r.   rH   )NN)
rX   r   rO   rP   rY   rZ   rQ   r   r.   r   )
rX   r   rO   rP   rY   rZ   rQ   r   r.   rv   )rr   r   r.   r   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r   r   r   r   r   r   r    r!   r"   r#   r%   r&   r'   r(   r)   r*   r+   r   Úmodel_configÚpropertyr4   rG   rN   rW   ru   rg   r|   r1   r5   r3   r   r      sÎ  € € € € € € ðð ð* ,€HÐ+Ð+Ð+Ñ+Ø;à%)€OÐ)Ð)Ð)Ñ)Ø%à€IÐÐÐÑðJð
 €D€N€N€N�Nð#ð €KÐÐÐÑØ#à€E€O€O€O�Oðð €EÐÐÐÑð7ð €EÐÐÐÑð@ð €IÐÐÐÑð<ð
 €F€O€O€O�Oðð
 €EÐÐÐÑØNà€IÐÐÐÑð ð  €NÐÐÐÑðð €MÐÐÐÑð$ð €KÐÐÐÑðð "ÐÐ!Ð!Ð!Ñ!ØAà"ÐÐ"Ð"Ð"Ñ"ØAà€HÐÐÐÑðð €LÐÐÐÑØGà€LÐÐÐÑØFà�:Øðñ ô €Lð ðð ð ñ „Xðð ðð ð ñ „Xðð. ðð ð ñ „Xðð +/ðð ð ð ð ð. %)Ø:>ð	:ð :ð :ð :ð :ð~ %)Ø:>ð	Dð Dð Dð Dð DðLð ð ð ð ð r5   r   )Ú
__future__r   rb   Úior   Útypingr   r   r   r   r	   rk   Ú langchain_core.callbacks.managerr
   Ú#langchain_core.language_models.llmsr   Úlangchain_core.outputsr   Úlangchain_core.utilsr   Úpydanticr   r   r1   r5   r3   ú<module>r”      sý   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6à €€€Ø EÐ EÐ EÐ EÐ EÐ EØ 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø Ð Ð Ð Ð Ð ðpð pð pð pð p�ñ pô pð pð pð pr5   