
    dh:                         S SK r S SKrS SKJr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Jr  S SKJrJrJr  S SKJrJr  \ R6                  " \5      r\" S	S
SS9 " S S\5      5       rg)    N)AnyDictIteratorListMappingOptionalUnion)
deprecated)CallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)convert_to_secret_strget_from_dict_or_envpre_init)
ConfigDict	SecretStrz0.0.18z1.0zlangchain_ibm.WatsonxLLM)sinceremovalalternative_importc                   @   \ rS rSr% Sr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\\\4   \S'    Sr\\S'    Sr\\S'   \" SS9r\S\4S j5       r\ S\!\\4   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\\)\!\\4         S\!\\4   4S jj5       r*S.S \\)\      S\!\\4   4S! jjr+S\)\   S\,4S" jr-S#\!\\4   S\.4S$ jr/  S/S%\S \\)\      S&\\0   S'\S\4
S( jjr1   S0S)\)\   S \\)\      S&\\0   S*\\   S'\S\,4S+ jjr2  S/S%\S \\)\      S&\\0   S'\S\3\.   4
S, jjr4S-r5g)1
WatsonxLLM   a  
IBM watsonx.ai large language models.

To use, you should have ``ibm_watsonx_ai`` python package installed,
and the environment variable ``WATSONX_APIKEY`` set with your API key, or pass
it as a named parameter to the constructor.


Example:
    .. code-block:: python

        from ibm_watsonx_ai.metanames import GenTextParamsMetaNames
        parameters = {
            GenTextParamsMetaNames.DECODING_METHOD: "sample",
            GenTextParamsMetaNames.MAX_NEW_TOKENS: 100,
            GenTextParamsMetaNames.MIN_NEW_TOKENS: 1,
            GenTextParamsMetaNames.TEMPERATURE: 0.5,
            GenTextParamsMetaNames.TOP_K: 50,
            GenTextParamsMetaNames.TOP_P: 1,
        }

        from langchain_community.llms import WatsonxLLM
        watsonx_llm = WatsonxLLM(
            model_id="google/flan-ul2",
            url="https://us-south.ml.cloud.ibm.com",
            apikey="*****",
            project_id="*****",
            params=parameters,
        )
 model_iddeployment_id
project_idspace_idNurlapikeytokenpasswordusernameinstance_idversionparamsverifyF	streamingwatsonx_modelforbid)extrareturnc                     g)NF )clss    [/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/llms/watsonxllm.pyis_lc_serializableWatsonxLLM.is_lc_serializablef   s        c                     SSSSSSS.$ )NWATSONX_URLWATSONX_APIKEYWATSONX_TOKENWATSONX_PASSWORDWATSONX_USERNAMEWATSONX_INSTANCE_ID)r    r!   r"   r#   r$   r%   r/   selfs    r1   
lc_secretsWatsonxLLM.lc_secretsj   s      !&$**0
 	
r4   valuesc           
      *   [        [        USS5      5      US'   SUR                  SS5      R                  5       ;   a  [        [        USS5      5      US'   GOuUS   (       d[  S[        R
                  ;  aG  US	   (       d=  S
[        R
                  ;  a)  US   (       d  S[        R
                  ;  a  [        S5      eUS   (       d  S[        R
                  ;   a  [        [        USS5      5      US'   OUS	   (       d  S
[        R
                  ;   a3  [        [        US	S
5      5      US	'   [        [        USS5      5      US'   OPUS   (       d  S[        R
                  ;   a2  [        [        USS5      5      US'   [        [        USS5      5      US'   US   (       a  S[        R
                  ;  a  [        [        USS5      5      US'    SSKJn  US   (       a  US   R                  5       OSUS   (       a  US   R                  5       OSUS   (       a  US   R                  5       OSUS	   (       a  US	   R                  5       OSUS   (       a  US   R                  5       OSUS   (       a  US   R                  5       OSUS   (       a  US   R                  5       OSS.nUR                  5        VVs0 sH  u  pEUc  M
  XE_M     nnnU" US   US   UUS   US   US   US   S9nXqS'   U$ s  snnf ! [         a    [        S5      ef = f)zCValidate that credentials and python package exists in environment.r    r6   zcloud.ibm.comr   r!   r7   r"   r8   r#   r9   zDid not find 'token', 'password' or 'apikey', please add an environment variable `WATSONX_TOKEN`, 'WATSONX_PASSWORD' or 'WATSONX_APIKEY' which contains it, or pass 'token', 'password' or 'apikey' as a named parameter.r$   r:   r%   r;   r   )ModelInferenceNr&   )r    r!   r"   r#   r$   r%   r&   r   r   r'   r   r   r(   )r   r   credentialsr'   r   r   r(   r*   zdCould not import ibm_watsonx_ai python package. Please install it with `pip install ibm_watsonx_ai`.)r   r   getget_secret_valueosenviron
ValueError ibm_watsonx_ai.foundation_modelsrB   itemsImportError)r0   r@   rB   rC   keyvaluecredentials_without_none_valuer*   s           r1   validate_environmentWatsonxLLM.validate_environmentu   s.    . >
u fjj3DDFF4$VX7GH F8
 7O#2::5z*&bjj8x($BJJ6 -  Orzz$A"7(/J#w 
#'9RZZ'G%:(=OP&z" &;(=OP&z" !%5%C#8(;KL$x  &;(=OP&z" -(,A,S(=(@UV)}%1	G <B%=ve}557d;A(;KF8$557QU ;A/F7O446t j) :&779 j) :&779 m, =)::< =C9<MF9%668SW1K8 .9->->-@.-@zsE

-@ + . +
+$_5:h'!,/
+h'M '4?# ).  	G 	s%   C.K< =K6	K6%K< 6K< <Lc                 v    U R                   U R                  U R                  U R                  U R                  S.$ )zGet the identifying parameters.r   r   r'   r   r   rR   r<   s    r1   _identifying_paramsWatsonxLLM._identifying_params   s3     !//kk//
 	
r4   c                     g)zReturn type of llm.zIBM watsonx.air/   r<   s    r1   	_llm_typeWatsonxLLM._llm_type   s      r4   responsec                     U c  SSS.$ SnSnS[         S[        [         [        4   S[        4S jnU  H9  nUR	                  S5      nU(       d  M  X" SUS   5      -  nX#" S	US   5      -  nM;     UUS.$ )
Nr   )generated_token_countinput_token_countrL   resultr-   c                 8    UR                  U S5      =(       d    S$ )Nr   )rD   )rL   r\   s     r1   get_count_value8WatsonxLLM._extract_token_usage.<locals>.get_count_value   s    ::c1%**r4   resultsr[   rZ   )strr   r   intrD   )rX   r[   rZ   r^   resr`   s         r1   _extract_token_usageWatsonxLLM._extract_token_usage   s     -.QGG !	+ 	+d38n 	+ 	+ Cggi(Gw!_5H'RS*%UU!%+WQZ* %	  &;!2
 	
r4   stopc                 V    U R                   (       a  0 U R                   EO0 nUb  XS'   U$ )Nstop_sequences)r'   )r=   rf   r'   s      r1   _get_chat_paramsWatsonxLLM._get_chat_params  s+    48KKDKKR'+#$r4   c                 <   / nU Ha  nUR                  S5      nU(       d  M  US   R                  S5      n[        US   R                  S5      SU0S9nUR                  U/5        Mc     U R                  U5      nUU R                  U R
                  S.n[        X(S9$ )	z2Create the LLMResult from the choices and prompts.r`   r   stop_reasongenerated_textfinish_reasontextgeneration_info)token_usager   r   generations
llm_output)rD   r   appendrd   r   r   r   )	r=   rX   rt   rc   r`   rn   genfinal_token_usageru   s	            r1   _create_llm_resultWatsonxLLM._create_llm_result  s    Cggi(Gw '
} =  (89%4m$D ""C5)  !55h?,!//


 [HHr4   stream_responsec           	          US   (       d	  [        SS9$ [        US   S   S   [        US   S   R                  SS5      U R                  U R                  S.S	9S
9$ )z0Convert a stream response to a generation chunk.r`   r   rp   r   rm   rl   N)r   r   )rn   ru   ro   )r   dictrD   r   r   )r=   r{   s     r1   $_stream_response_to_generation_chunk/WatsonxLLM._stream_response_to_generation_chunk  sn    
 y)"++ +A./?@ -i8;??tT $%)%7%7	
 		
r4   promptrun_managerkwargsc                 f    U R                   " SU/X#S.UD6nUR                  S   S   R                  $ )a\  Call the IBM watsonx.ai inference endpoint.
Args:
    prompt: The prompt to pass into the model.
    stop: Optional list of stop words to use when generating.
    run_manager: Optional callback manager.
Returns:
    The string generated by the model.
Example:
    .. code-block:: python

        response = watsonx_llm.invoke("What is a molecule")
)promptsrf   r   r   r/   )	_generatert   rp   )r=   r   rf   r   r   r\   s         r1   _callWatsonxLLM._call1  sD    &  
H4
DJ
 !!!$Q',,,r4   r   streamc                    U R                  US9nUb  UOU R                  nU(       a  [        U5      S:  a  [        SU 35      e[	        SS9nU R
                  " US   4X#S.UD6n	U	 H  n
Uc  U
nM
  X-  nM     Uc   e[        UR                  [        5      (       a'  UR                  R                  S5      n[        U//US	9$ [        U//S
9$ U R                  R                  XS9nU R                  U5      $ )a  Call the IBM watsonx.ai inference endpoint which then generate the response.
Args:
    prompts: List of strings (prompts) to pass into the model.
    stop: Optional list of stop words to use when generating.
    run_manager: Optional callback manager.
Returns:
    The full LLMResult output.
Example:
    .. code-block:: python

        response = watsonx_llm.generate(["What is a molecule"])
rf      z6WatsonxLLM currently only supports single prompt, got r   r}   r   )rf   r   ru   rs   )rt   )r   r'   )ri   r)   lenrH   r   _stream
isinstancerq   r~   popr   r*   generatery   )r=   r   rf   r   r   r   r'   should_stream
generationstream_iterchunkru   rX   s                r1   r   WatsonxLLM._generateI  s   ( &&D&1"("4$..7|a LWIV  )b1J,,
!%BHK %%!&J'J	 %
 )))*44d;;'77;;LI
 zl^
SS:,88))22'2QH**844r4   c              +      #    U R                  US9nU R                  R                  USUS9 H9  nU R                  U5      nU(       a  UR	                  UR
                  US9  Uv   M;     g7f)a  Call the IBM watsonx.ai inference endpoint which then streams the response.
Args:
    prompt: The prompt to pass into the model.
    stop: Optional list of stop words to use when generating.
    run_manager: Optional callback manager.
Returns:
    The iterator which yields generation chunks.
Example:
    .. code-block:: python

        response = watsonx_llm.stream("What is a molecule")
        for chunk in response:
            print(chunk, end='')  # noqa: T201
r   T)r   raw_responser'   )r   N)ri   r*   generate_text_streamr   on_llm_new_tokenrp   )r=   r   rf   r   r   r'   stream_respr   s           r1   r   WatsonxLLM._streamv  ss     * &&D&1--BBV C 
K ==kJE,,UZZu,EK
s   A)A+r/   )N)NN)NNN)6__name__
__module____qualname____firstlineno____doc__r   ra   __annotations__r   r   r   r    r   r   r!   r"   r#   r$   r%   r&   r'   r~   r(   r	   boolr)   r*   r   r   model_configclassmethodr2   propertyr   r>   r   rO   r   rS   rV   staticmethodr   rd   ri   r   ry   r   r   r   r   r   r   r   __static_attributes__r/   r4   r1   r   r      sP   > HcM3(J*Hc(#C)	#1"&FHY&4!%E8I%3$(Hhy!(6$(Hhy!(6'+K)$+9#'GXi '5!FHTN!;!FE#t)!0 It1M3L 4   
DcN 
 
 c$ c4 c cJ 
WS#X%6 
 
  3     37
4S#X/0
	c3h
 
2Xd3i%8 DcN I4: I) I(
c3h
 

* %):>	-- tCy!- 67	-
 - 
-6 %):>!%+5c+5 tCy!+5 67	+5
 +5 +5 
+5` %):>	 tCy! 67	
  
/	" r4   r   )loggingrF   typingr   r   r   r   r   r   r	   langchain_core._api.deprecationr
   langchain_core.callbacksr   #langchain_core.language_models.llmsr   langchain_core.outputsr   r   r   langchain_core.utilsr   r   r   pydanticr   r   	getLoggerr   loggerr   r/   r4   r1   <module>r      sg     	 F F F 6 = 7 I I V V *			8	$ 
E6PA AAr4   