
    dh                         S r SSKJrJrJrJrJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJrJr  SSKJr   " S S	\\5      rg
)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                      \ rS rSr% Sr\\S'    \\S'    Sr\\S'    Sr\	\S'    S	r
\\S
'    Sr\\S'    Sr\\S'    Sr\\S'    Sr\\S'    Sr\\S'    Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   \" SS9r\S\\\4   4S j5       r\S\\   4S j5       r\ S\S\4S j5       r!\S\"\\4   4S  j5       r#\S\4S! j5       r$S,S"\%\   S#\S\4S$ jjr&S%\S\4S& jr'  S-S%\S'\(\%\      S(\(\)   S)\S\4
S* jjr*S+r+g).RWKV   a  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                     U R                   U R                  U R                  U R                  U R                  U R
                  U R                  S.$ )Get the identifying parameters.verboser   r   r   r   r   r   r'   selfs    U/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/llms/rwkv.py_default_paramsRWKV._default_paramsQ   sG     ||ZZ++'+'C'C&*&A&A)-)G)G
 	
    c                      S1$ )r&   r(    r0   r.   r+   _rwkv_param_namesRWKV._rwkv_param_names^   s     
 	
r.   valuesc                     SSK n SSKJn  SSKJn  UR                  R                  US   5      US'   U R                  5       nUR                  5        VVs0 sH  u  pgXe;   d  M  Xg_M     nnnUS   US	'   U" US
   4SUS   0UD6US'   U" US   US   5      US'   U$ ! [         a    [        S5      ef = fs  snnf ! [         a    [        S5      ef = f)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.utilsr5   	Tokenizer	from_filer1   items)	clsr3   r6   	RWKVMODELr5   	rwkv_keyskvmodel_kwargss	            r+   validate_environmentRWKV.validate_environmente   s   		4+","6"6"@"@AV"WF;--/I-3\\^N^TQq~DAD^LN&,^&<L#(w *0*< @L F8 "*&*:F=<Q!RF: 1  	C 	 O  	= 	s/   B AB= 
B7%B7+1B= B47B= =Cc                     SU R                   0U R                  EU R                  R                  5        VVs0 sH!  u  pU[        R                  5       ;   d  M  X_M#     snnE$ s  snnf )r&   r   )r   r,   __dict__r<   r   r1   )r*   r@   rA   s      r+   _identifying_paramsRWKV._identifying_params   si     TZZ
""
 !% 3 3 5W 5d>T>T>V9Vtqt 5W
 	
 Xs   A#A#c                     g)zReturn the type of llm.rwkvr0   r)   s    r+   	_llm_typeRWKV._llm_type   s     r.   _tokensnewline_adjc                     / nSnU H3  nU R                   R                  U5      n[        U5      S:X  d   eX6-  nM5     U Vs/ sH  n[        U5      PM     nnU =R                  U-  sl        S n	[        U5      S:  aY  U R
                  R                  US U R                   U R                  5      u  ol        XR                  S  n[        U5      S:  a  MY  Sn
X==   U-  ss'   U R                  S   U;   a  SXR                  S   '   U	$ s  snf )Nu   ，：？！   r      i6e)	r   encodelenintr    r   forwardr   r!   )r*   rM   rN   AVOID_REPEAT_TOKENSAVOID_REPEATiddxtokensoutEND_OF_LINEs              r+   run_rnnRWKV.run_rnn   s    %A%%a(Br7a<<% 
 #**'Q#a&'*V#&kAo$(KK$7$7'($*:*:%!C! NN,-F	 &kAo
 K'R $77)3C!!"%&
 +s   Dpromptc                    S U l         / U l        U R                  U R                  R	                  U5      R
                  5      n[        U R                  5      nUn0 nSn[        U R                  5       H  nU H+  nX(==   U R                  XX   U R                  -  -   -  ss'   M-     U R                  R                  X R                  U R                  S9n	Sn
X:X  a    U$ X;  a  SXY'   OXY==   S-  ss'   U R                  U	/5      nU R                  R                  U R                  US  5      nSU;  d  M  Xk-  nX7-   S-   nXpR                  S-
  :  d  M    U$    U$ )N )r   r   r   rP   u   �d   )r!   r    r_   r   rS   idsrT   ranger   r   r   r   sample_logitsr   r   decode)r*   ra   logitsbeginout_last
occurrencedecodedrY   ntokenEND_OF_TEXTxxxs               r+   rwkv_generateRWKV.rwkv_generate   sh   dnn33F;??@D%%&
t556A	// md&B&BBC	  
 MM//$4$4DJJ 0 E K#  &$%
!!Q&!\\5'*F..''(9(9()(DECs" 9q=66<<5 74 r.   stoprun_managerkwargsc                 D    U R                  U5      nUb  [        XR5      nU$ )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)
)rr   r   )r*   ra   rt   ru   rv   texts         r+   _call
RWKV._call   s)    , !!&)&t2Dr.   )r!   r    )r   )NN),__name__
__module____qualname____firstlineno____doc__str__annotations__r   r   boolr   floatr   r   r   r   rU   r   r   r   r   r   r    r!   r   model_configpropertyr   r,   staticmethodr   r1   r   rC   r   rG   rK   r   r_   rr   r   r	   ry   __static_attributes__r0   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)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   r0   r.   r+   <module>r      s1    ; : = 3 ) * >Z3	 Zr.   