Ë
    µŒj€(  ã                  óš   — 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y)é    )Ú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d4d-„«       Zed5d.„«       Zed6d/„«       Z	 d7	 	 	 	 	 d8d0„Z	 	 d9	 	 	 	 	 	 	 	 	 d:d1„Z 	 	 d9	 	 	 	 	 	 	 	 	 d;d2„Z!d<d3„Z"y)=Ú	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)Úextrac                 ó   — y)NÚ	llamafile© )Úselfs    úl/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/llms/llamafile.pyÚ	_llm_typezLlamafile._llm_typex   s   € àó    c                óf   — g d¢}t        | j                  «      D �cg c]	  }||vsŒ|‘Œ }}|S c c}w )N)r   ÚcacheÚcallback_managerÚ	callbacksÚmetadataÚnamer   r   ÚtagsÚverboseÚcustom_get_token_ids)r   Ú	__class__)r1   Úignore_keysÚkÚattrss       r2   Ú_param_fieldnameszLlamafile._param_fieldnames|   sD   € ò
ˆô 0°·±Ô?ó
Ù?�!À1ÈKÒCWŠAÐ?ð 	ð 
ð ˆùò
s   œ	.¦.c                óJ   — i }| j                   D ]  }t        | |«      ||<   Œ |S ©N)rB   Úgetattr)r1   ÚparamsÚ	fieldnames      r2   Ú_default_paramszLlamafile._default_params”   s-   € àˆØ×/Ô/ˆIÜ '¨¨iÓ 8ˆF�9Òð 0àˆr4   c                ó®   — | j                   }|j                  «       D ]  \  }}||v sŒ|||<   Œ |�t        |«      dkD  r||d<   | j                  rd|d<   |S )Nr   ÚstopTÚstream)rH   ÚitemsÚlenr   )r1   rJ   ÚkwargsrF   r@   Úvs         r2   Ú_get_parameterszLlamafile._get_parameters›   sf   € ð ×%Ñ%ˆð
 —L‘L–N‰DˆAˆqØ�FŠ{Ø��q’	ð #ð Ð¤ D£	¨A¢Ø!ˆF�6‰Nà�>Š>Ø#ˆF�8Ñàˆr4   c                óz  — | j                   r[t        «       5 } | j                  |f||dœ|¤ŽD ]  }|j                  |j                  «       Œ |j                  «       }ddd«       |S  | j                  dd|i|¤Ž}d|i|¥}		 t        j                  | j                  › d�ddi|	d| j                  ¬	«      }
|
j                  «        d|
_        |
j                  «       d   }|S # 1 sw Y   S xY w# t        j                  j                  $ r. t        j                  j                  d
| j                  › d�«      ‚w xY w)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.

        )rJ   Úrun_managerNrJ   Úpromptú/completionúContent-Typeúapplication/jsonF©ÚurlÚheadersÚjsonrK   ÚtimeoutúTCould not connect to Llamafile server. Please make sure that a server is running at Ú.zutf-8Úcontentr0   )r   r   Ú_streamÚwriteÚtextÚgetvaluerP   ÚrequestsÚpostr   r   Ú
exceptionsÚConnectionErrorÚraise_for_statusÚencodingrZ   )r1   rS   rJ   rR   rN   ÚbuffÚchunkra   rF   ÚpayloadÚresponses              r2   Ú_callzLlamafile._call¯   sS  € ð, �>Š>Ü”˜tØ)˜TŸ\™\ØðØ!%°;ñØBHô�Eð —J‘J˜uŸz™zÕ*ðð
 —}‘}“�÷ ð ˆKð *�T×)Ñ)Ñ>¨tÐ>°vÑ>ˆFØ Ð2¨6Ð2ˆGðÜ#Ÿ=™=ØŸ=™=˜/¨Ð5à&Ð(:ðð !Ø Ø ×0Ñ0ô�ð ×%Ñ%Ô'Ø 'ˆHÔà—=‘=“? 9Ñ-ˆDàˆK÷G ð ˆKûô  ×&Ñ&×6Ñ6ò Ü×)Ñ)×9Ñ9ð3Ø37·=±=°/ÀðDóð ðús   —AC"Â3C/ Ã"C,Ã/AD:c              +  ó  K  —  | j                   dd|i|¤Ž}d|vrd|d<   d|i|¥}	 t        j                  | j                  › d�ddi|d| j                  ¬«      }d|_        |j                  d¬«      D ]A  }| j                  |«      }	t        |	¬«      }
|r|j                  |
j                  ¬«       |
–— ŒC y# t        j
                  j                  $ r. t        j
                  j                  d	| j                  › d
�«      ‚w xY w­w)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)

        rJ   rK   TrS   rT   rU   rV   rW   r\   r]   Úutf8)Údecode_unicode)ra   )ÚtokenNr0   )rP   rc   rd   r   r   re   rf   rh   Ú
iter_linesÚ_get_chunk_contentr   Úon_llm_new_tokenra   )r1   rS   rJ   rR   rN   rF   rk   rl   Ú	raw_chunkr^   rj   s              r2   r_   zLlamafile._streamë   s&  è ø€ ðL &�×%Ñ%Ñ:¨4Ð:°6Ñ:ˆØ˜6Ñ!Ø#ˆF�8Ñà˜VÐ. vÐ.ˆð	Ü—}‘}Ø—}‘}�o [Ð1à"Ð$6ðð ØØ×,Ñ,ôˆHð #ˆÔà!×,Ñ,¸DÐ,ÖAˆIØ×-Ñ-¨iÓ8ˆGÜ#¨Ô1ˆEáØ×,Ñ,°5·:±:Ð,Ô>Ø‹Kñ Bøô ×"Ñ"×2Ñ2ò 	Ü×%Ñ%×5Ñ5ð/Ø/3¯}©}¨o¸Qð@óð ð	üs   ‚$D§3B8 ÁADÂ8ADÄDc                ó~   — |j                  d«      r+|j                  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: r^   )Ú
startswithÚlstriprZ   Úloads)r1   rj   ÚcleanedÚdatas       r2   rs   zLlamafile._get_chunk_content1  s=   € ð ×Ñ˜GÔ$Ø—l‘l 8Ó,ˆGÜ—:‘:˜gÓ&ˆDØ˜	‘?Ð"àˆLr4   )Úreturnr   )r|   z	List[str])r|   úDict[str, Any]rD   )rJ   úOptional[List[str]]rN   r   r|   r}   )NN)
rS   r   rJ   r~   rR   ú"Optional[CallbackManagerForLLMRun]rN   r   r|   r   )
rS   r   rJ   r~   rR   r   rN   r   r|   zIterator[GenerationChunk])rj   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Úpropertyr3   rB   rH   rP   rm   r_   rs   r0   r4   r2   r   r      s0  … ñð* ,€HˆcÓ+Ø;à%)€O�]Ó)Ø%à€IˆtÓðJð
 €Dˆ#ƒNð#ð €K�ÓØ#à€Eˆ3ƒOðð €Eˆ5Óð7ð €Eˆ5Óð@ð €IˆsÓð<ð
 €FˆCƒOðð
 €Eˆ5ÓØNà€IˆuÓð ð  €N�EÓðð €M�3Óð$ð €K�Óðð "Ð�eÓ!ØAà"Ð�uÓ"ØAà€HˆcÓðð €L�%ÓØGà€L�%ÓØFáØô€Lð òó ðð òó ðð. òó ðð +/ðØ'ðØ:=ðà	óð. %)Ø:>ð	:àð:ð "ð:ð 8ð	:ð
 ð:ð 
ó:ð~ %)Ø:>ð	DàðDð "ðDð 8ð	Dð
 ðDð 
#óDôLr4   r   )Ú
__future__r   rZ   Úior   Útypingr   r   r   r   r	   rc   Ú langchain_core.callbacks.managerr
   Ú#langchain_core.language_models.llmsr   Úlangchain_core.outputsr   Úlangchain_core.utilsr   Úpydanticr   r   r0   r4   r2   Ú<module>r�      s4   ðÝ "ã Ý ß 6Õ 6ã Ý EÝ 3Ý 2Ý 9Ý ôp�õ pr4   