
    Ng                         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 )zRWKV 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    Y/var/www/html/ai-engine/env/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NTQqI~~Aq~~~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"WF;--//INNNNV\\^^NNNL&,^&<L#(yw   *0*< @L   F8 "*&*:F=<Q!R!RF: 	 	 	=  	
 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>V9V9Vq!9V9V9Vr,   )r   r+   __dict__r?   r(   s    r*   _identifying_paramszRWKV._identifying_params   sG     TZ
"
 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r77a<<<<2%**'***V#&kkAoo$(K$7$7''($*:% %!C! DN,,-F	 &kkAoo
 KK'R $777)3C!"%&
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   dn33F;;?@@D%&&
t566 	 	A  q			/ md&BBC				 M//D$4DJ 0  E K##J&&$%
5!!5!!!Q&!!!\\5'**F.''(9())(DEECs""3 19q=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    , !!&))&tT22D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          JJJ2'HcL$"K.E5.%(U((( %(E''' Is+%(s(((/FCIsHcL#K:  L 

c3h 

 

 

 X

 
s3x 
 
 
 \
 $ 4    X< 
WS#X%6 
 
 
 X
 3    X tCy s 3    2$C $C $ $ $ $R %):>	  tCy! 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,   