
    7|h                         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y
)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)y),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/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/rwkv.py_default_paramszRWKV._default_paramsQ   sG     ||ZZ++'+'C'C&*&A&A)-)G)G
 	
    c                      dhS )r%   r'    r.   r,   r*   _rwkv_param_nameszRWKV._rwkv_param_names^   s     
 	
r,   valuesc                    	 ddl }	 ddlm} ddlm} |j                  j                  |d         |d<   | j                         }|j                         D ci c]  \  }}||v s|| }}}|d   |d	<    ||d
   fd|d   i||d<    ||d   |d         |d<   |S # t        $ r t        d      w xY wc c}}w # t        $ r t        d      w xY w)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   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   r3   	RWKVMODELr2   	rwkv_keyskvmodel_kwargss	            r*   validate_environmentzRWKV.validate_environmente   s   		4+","6"6"@"@AV"WF;--/I-3\\^NTQqI~AqDNLN&,^&<L#(w *0*< @L F8 "*&*:F=<Q!RF: 1  	C 	 O  	= 	s/   B AB: B4$B4)1B: B14B: :Cc                     d| j                   i| j                  | j                  j                         D ci c]  \  }}|t        j                         v s||! c}}S c c}}w )r%   r   )r   r+   __dict__r9   r   r/   )r)   r=   r>   s      r*   _identifying_paramszRWKV._identifying_params   se     TZZ
""
 !% 3 3 5W1d>T>T>V9Vq!tW
 	
 Xs   A A c                      y)zReturn the type of llm.rwkvr.   r(   s    r*   	_llm_typezRWKV._llm_type   s     r,   _tokensnewline_adjc                    g }d}|D ]2  }| j                   j                  |      }t        |      dk(  sJ ||z  }4 |D cg c]  }t        |       }}| xj                  |z  c_        d }	t        |      dkD  rY| j
                  j                  |d | j                   | j                        \  }	| _        || j                  d  }t        |      dkD  rYd}
|	|
xx   |z  cc<   | j                  d   |v rd|	| j                  d   <   |	S c c}w )Nu   ，：？！   r      i6e)	r   encodelenintr   r   forwardr   r    )r)   rG   rH   AVOID_REPEAT_TOKENSAVOID_REPEATiddxtokensoutEND_OF_LINEs              r*   run_rnnzRWKV.run_rnn   s"    % 	&A%%a(Br7a<<2%	&
 #**Q#a&**V#&kAo$(KK$7$7'($*:*:%!C! DNN,-F	 &kAo
 KK'R $77)3C!!"%&
 +s    Dpromptc                    d | _         g | _        | j                  | j                  j	                  |      j
                        }t        | j                        }|}i }d}t        | j                        D ]  }|D ],  }||xx   | j                  ||   | j                  z  z   z  cc<   . | j                  j                  || j                  | j                        }	d}
|	|
k(  r |S |	|vrd||	<   n||	xx   dz  cc<   | j                  |	g      }| j                  j                  | j                  |d        }d|vs||z  }||z   dz   }|| j                  dz
  k\  s |S  |S )N )r   r   r   rJ   u   �d   )r    r   rY   r   rM   idsrN   ranger   r   r   r   sample_logitsr   r   decode)r)   rZ   logitsbeginout_last
occurrencedecodedrS   ntokenEND_OF_TEXTxxxs               r*   rwkv_generatezRWKV.rwkv_generate   s   dnn33F;??@D%%&
t556 	A q	// md&B&BBC	
 MM//D$4$4DJJ 0 E K#  J&$%
5!5!Q&!\\5'*F..''(9(9()(DECs"3 19q=66<<5	4 r,   stoprun_managerkwargsc                 D    | j                  |      }|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)
        )rk   r   )r)   rZ   rl   rm   rn   texts         r*   _callz
RWKV._call   s+    , !!&)&tT2Dr,   )r   )NN)*__name__
__module____qualname____doc__str__annotations__r   r   boolr   floatr   r   r   r   rO   r   r   r   r   r   r   r    r   model_configpropertyr   r+   staticmethodr   r/   r   r@   r   rC   rF   r   rY   rk   r   r	   rq   r.   r,   r*   r   r      s    J2'HcL$"K.E5.%(U( %(E' Is+%(s(/FCIsHcL#KL 

c3h 

 

 
s3x 
 
 $ 4  < 
WS#X%6 
 
 3  tCy s 3 2$C $C $R %):>	 tCy! 67	
  
r,   r   N)ru   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      s1    ; : = 3 ) * >Z3	 Zr,   