§
    šŠtjg  ã                   óˆ   — d Z ddlmZmZmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZ ddlmZ  G d„ d	ee¦  «        Zd
S )z¢RWKV models.

Based on https://github.com/saharNooby/rwkv.cpp/blob/master/rwkv/chat_with_bot.py
         https://github.com/BlinkDL/ChatRWKV/blob/main/v2/chat.py
é    )ÚAnyÚDictÚListÚMappingÚOptionalÚSet)ÚCallbackManagerForLLMRun)ÚLLM)Úpre_init)Ú	BaseModelÚ
ConfigDict)Úenforce_stop_tokensc                   ó>  — e Zd ZU dZeed<   	 eed<   	 dZeed<   	 dZeed<   	 dZ	e
ed	<   	 d
Ze
ed<   	 dZe
ed<   	 dZe
ed<   	 dZeed<   	 dZeed<   	 dZeed<   dZeed<   dZeed<   dZeed<   dZeed<    ed¬¦  «        Zedeeef         fd„¦   «         Zedee         fd„¦   «         Zededefd„¦   «         Z ede!eef         fd„¦   «         Z"edefd „¦   «         Z#d+d"e$e         d#edefd$„Z%d%edefd&„Z&	 	 d,d%ed'e'e$e                  d(e'e(         d)edef
d*„Z)dS )-ÚRWKVa´  RWKV language models.

    To use, you should have the ``rwkv`` python package installed, the
    pre-trained model file, and the model's config information.

    Example:
        .. code-block:: python

            from langchain_community.llms import RWKV
            model = RWKV(model="./models/rwkv-3b-fp16.bin", strategy="cpu fp32")

            # Simplest invocation
            response = model.invoke("Once upon a time, ")
    ÚmodelÚtokens_pathzcpu fp32ÚstrategyTÚrwkv_verboseg      ð?Útemperatureg      à?Útop_pgš™™™™™Ù?Úpenalty_alpha_frequencyÚpenalty_alpha_presenceé   Ú	CHUNK_LENÚmax_tokens_per_generationNÚclientÚ	tokenizerÚpipelineÚmodel_tokensÚmodel_stateÚforbid)ÚextraÚreturnc                 ó\   — | j         | j        | j        | j        | j        | j        | j        dœS )úGet the identifying parameters.©Úverboser   r   r   r   r   r   r&   ©Úselfs    ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/llms/rwkv.pyÚ_default_paramszRWKV._default_paramsQ   s:   € ð ”|Ø”ZØÔ+Ø'+Ô'CØ&*Ô&AØœØ)-Ô)Gð
ð 
ð 	
ó    c                  ó   — dhS )r%   r'   © r.   r,   r*   Ú_rwkv_param_nameszRWKV._rwkv_param_names^   s   € ð ð
ð 	
r,   Úvaluesc                 óÒ  ‡— 	 ddl }n# t          $ r t          d¦  «        ‚w xY w	 ddlm} ddlm} |j                             |d         ¦  «        |d<   |                      ¦   «         Šˆfd„| 	                    ¦   «         D ¦   «         }|d	         |d
<    ||d         fd|d         i|¤Ž|d<    ||d         |d         ¦  «        |d<   n# t          $ r t          d¦  «        ‚w xY w|S )z;Validate that the python package exists in the environment.r   Nz\Could not import tokenizers python package. Please install it with `pip install tokenizers`.)r   )ÚPIPELINEr   r   c                 ó$   •— i | ]\  }}|‰v ¯	||“ŒS r.   r.   )Ú.0ÚkÚvÚ	rwkv_keyss      €r*   ú
<dictcomp>z-RWKV.validate_environment.<locals>.<dictcomp>v   s$   ø€ ÐNÐNÐN¡T Q¨¸qÀI¸~¸~˜A˜q¸~¸~¸~r,   r   r'   r   r   r   r   zPCould not import rwkv python package. Please install it with `pip install rwkv`.)
Ú
tokenizersÚImportErrorÚ
rwkv.modelr   Ú
rwkv.utilsr2   Ú	TokenizerÚ	from_filer/   Úitems)Úclsr0   r9   Ú	RWKVMODELr2   Úmodel_kwargsr7   s         @r*   Úvalidate_environmentzRWKV.validate_environmente   si  ø€ ð	ØÐÐÐÐøÝð 	ð 	ð 	ÝðCñô ð ð	øøøð
	Ø4Ð4Ð4Ð4Ð4Ð4Ø+Ð+Ð+Ð+Ð+Ð+à",Ô"6×"@Ò"@ÀÈÔAVÑ"WÔ"WˆF�;Ñà×-Ò-Ñ/Ô/ˆIØNÐNÐNÐN¨V¯\ª\©^¬^ÐNÑNÔNˆLØ&,¨^Ô&<ˆL˜Ñ#Ø(˜yØ�w”ð ð  Ø*0°Ô*<ð Ø@Lð ð  ˆF�8Ñð "* ¨&°Ô*:¸FÀ=Ô<QÑ!RÔ!RˆF�:ÑÐøåð 	ð 	ð 	Ýð=ñô ð ð	øøøð
 ˆs   ƒ ˆ"¦B#C
 Ã
C$c                 óh   — d| j         i| j        ¥d„ | j                             ¦   «         D ¦   «         ¥S )r%   r   c                 óP   — i | ]#\  }}|t                                ¦   «         v ¯ ||“Œ$S r.   )r   r/   )r4   r5   r6   s      r*   r8   z,RWKV._identifying_params.<locals>.<dictcomp>Š   s4   € ÐWÐWÐW™˜˜1¸½d×>TÒ>TÑ>VÔ>VÐ9VÐ9Vˆq�!Ð9VÐ9VÐ9Vr,   )r   r+   Ú__dict__r?   r(   s    r*   Ú_identifying_paramszRWKV._identifying_params„   sG   € ð �T”Zð
àÔ"ð
ð XÐW ¤× 3Ò 3Ñ 5Ô 5ÐWÑWÔWð
ð 	
r,   c                 ó   — dS )zReturn the type of llm.Úrwkvr.   r(   s    r*   Ú	_llm_typezRWKV._llm_type�   s	   € ð ˆvr,   r   Ú_tokensÚnewline_adjc                 óò  — g }d}|D ]6}| j                              |¦  «        }t          |¦  «        dk    sJ ‚||z  }Œ7d„ |D ¦   «         }| xj        |z  c_        d }t          |¦  «        dk    rW| j                             |d | j        …         | j        ¦  «        \  }| _        || j        d …         }t          |¦  «        dk    °Wd}	||	xx         |z  cc<   | j        d         |v rd|| j        d         <   |S )Nu   ï¼Œï¼šï¼Ÿï¼�é   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r.   )Úint)r4   Úxs     r*   ú
<listcomp>z RWKV.run_rnn.<locals>.<listcomp>š   s   € Ð*Ð*Ð*˜Q•#�a‘&”&Ð*Ð*Ð*r,   r   é»   éÿÿÿÿi6eÄ)r   ÚencodeÚlenr   r   Úforwardr   r    )
r)   rK   rL   ÚAVOID_REPEAT_TOKENSÚAVOID_REPEATÚiÚddÚtokensÚoutÚEND_OF_LINEs
             r*   Úrun_rnnzRWKV.run_rnn’   s4  € Ø ÐØ%ˆØð 	&ð 	&ˆAØ”×%Ò% aÑ(Ô(ˆBÝ�r‘7”7˜a’<�<�<�<Ø 2Ñ%ÐÐà*Ð* 'Ð*Ñ*Ô*ˆØÐÔ˜VÑ#ÐÔàˆå�&‰kŒk˜AŠoˆoØ$(¤K×$7Ò$7ØÐ'˜œÐ'Ô(¨$Ô*:ñ%ô %Ñ!ˆC�Ô!ð ˜DœNÐ,Ð,Ô-ˆFõ	 �&‰kŒk˜AŠoˆoð
 ˆØˆKÐÐÔ˜KÑ'ÐÐÑàÔ˜RÔ Ð$7Ð7Ð7Ø)3ˆC�Ô! "Ô%Ñ&Øˆ
r,   Úpromptc                 ó�  — d | _         g | _        |                      | j                             |¦  «        j        ¦  «        }t          | j        ¦  «        }|}i }d}t          | j        ¦  «        D ]Ö}|D ](}||xx         | j	        ||         | j
        z  z   z  cc<   Œ)| j                             || j        | j        ¬¦  «        }	d}
|	|
k    r ny|	|vrd||	<   n||	xx         dz  cc<   |                      |	g¦  «        }| j                             | j        |d …         ¦  «        }d|vr||z  }||z   dz   }|| j        dz
  k    r nŒ×|S )NÚ )r   r   r   rN   u   ï¿½éd   )r    r   r_   r   rU   ÚidsrV   Úranger   r   r   r   Úsample_logitsr   r   Údecode)r)   r`   ÚlogitsÚbeginÚout_lastÚ
occurrenceÚdecodedrZ   ÚnÚtokenÚEND_OF_TEXTÚxxxs               r*   Úrwkv_generatezRWKV.rwkv_generate«   s™  € ØˆÔØˆÔØ—’˜dœn×3Ò3°FÑ;Ô;Ô?Ñ@Ô@ˆÝ�DÔ%Ñ&Ô&ˆØˆàˆ
àˆÝ�tÔ5Ñ6Ô6ð 	ð 	ˆAØð ð �Ø�q�	�	”	ØÔ/Ø  ”m dÔ&BÑBñCñ�	�	‘	�	ð ”M×/Ò/Ø DÔ$4¸D¼Jð 0ñ ô ˆEð ˆKØ˜Ò#Ð#Ø�Ø˜JÐ&Ð&Ø$%�
˜5Ñ!Ð!à˜5Ð!Ð!Ô! QÑ&Ð!Ð!Ñ!à—\’\ 5 'Ñ*Ô*ˆFØ”.×'Ò'¨Ô(9¸(¸)¸)Ô(DÑEÔEˆCØ˜sÐ"Ð"Ø˜3‘�Ø  1™9 q™=�Ø˜Ô6¸Ñ<Ò<Ð<Ø�Eøàˆr,   ÚstopÚrun_managerÚkwargsc                 óT   — |                       |¦  «        }|�t          ||¦  «        }|S )aŠ  RWKV generation

        Args:
            prompt: The prompt to pass into the model.
            stop: A list of strings to stop generation when encountered.

        Returns:
            The string generated by the model.

        Example:
            .. code-block:: python

                prompt = "Once upon a time, "
                response = model.invoke(prompt, n_predict=55)
        )rq   r   )r)   r`   rr   rs   rt   Útexts         r*   Ú_callz
RWKV._callÑ   s1   € ð, ×!Ò! &Ñ)Ô)ˆàÐÝ& t¨TÑ2Ô2ˆDØˆr,   )r   )NN)*Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   r   Úboolr   Úfloatr   r   r   r   rP   r   r   r   r   r   r   r    r   Úmodel_configÚpropertyr   r+   Ústaticmethodr   r/   r   rC   r   rG   rJ   r   r_   rq   r   r	   rw   r.   r,   r*   r   r      sÝ  € € € € € € ðð ð €J€J�JØ2àÐÐÑØ'à€HˆcÐÐÑØà€L�$ÐÐÑØ"à€K�ÐÐÑØ.à€Eˆ5ÐÐÑØ.à%(Ð˜UÐ(Ð(Ñ(ðð %(Ð˜EÐ'Ð'Ñ'ðð €IˆsÐÐÑØ+à%(Ð˜sÐ(Ð(Ñ(Ø/à€FˆCÐÐÑà€IˆsÐÐÑà€HˆcÐÐÑà€L�#ÐÐÑà€K�ÐÐÑà�:Øðñ ô €Lð ð

  c¨3 h¤ð 

ð 

ð 

ñ „Xð

ð ð
˜s 3œxð 
ð 
ð 
ñ „\ð
ð ð¨$ð °4ð ð ð ñ „Xðð< ð
 W¨S°#¨XÔ%6ð 
ð 
ð 
ñ „Xð
ð ð˜3ð ð ð ñ „Xððð ˜t Cœyð °sð À3ð ð ð ð ð2$ Cð $¨Cð $ð $ð $ð $ðR %)Ø:>ð	ð àðð �t˜C”yÔ!ðð Ð6Ô7ð	ð
 ðð 
ðð ð ð ð ð r,   r   N)r{   Útypingr   r   r   r   r   r   Úlangchain_core.callbacksr	   Ú#langchain_core.language_models.llmsr
   Úlangchain_core.utilsr   Úpydanticr   r   Úlangchain_community.llms.utilsr   r   r.   r,   r*   ú<module>r‰      sá   ððð ð ;Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :à =Ð =Ð =Ð =Ð =Ð =Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø )Ð )Ð )Ð )Ð )Ð )Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à >Ð >Ð >Ð >Ð >Ð >ðZð Zð Zð Zð Zˆ3�	ñ Zô Zð Zð Zð Zr,   