§
    æ˜ºhK:  ã                   óÆ   — d dl Z d dlZd dlmZ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mZmZ d dlmZmZmZ d dlmZmZ  e j        e¦  «        Z G d„ d	e¦  «        ZdS )
é    N)ÚAnyÚDictÚIteratorÚListÚMappingÚOptionalÚUnion)ÚCallbackManagerForLLMRun)ÚBaseLLM)Ú
GenerationÚGenerationChunkÚ	LLMResult)ÚExtraÚ	SecretStrÚroot_validator)Úconvert_to_secret_strÚget_from_dict_or_envc                   ó  — e Zd ZU dZdZeed<   	 dZeed<   	 dZeed<   	 dZ	eed<   	 dZ
ee         ed<   	 dZee         ed	<   	 dZee         ed
<   	 dZee         ed<   	 dZee         ed<   	 dZee         ed<   	 dZee         ed<   	 dZee         ed<   	 dZeeef         ed<   	 dZeed<   	 eed<    G d„ d¦  «        Zedefd„¦   «         Zedeeef         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$e%	 d,dee&eeef                           deeef         fd„¦   «         Z'd,dee&e                  deeef         fd „Z(de&e         de)fd!„Z*d"eeef         de+fd#„Z,	 	 d-d$edee&e                  d%ee-         d&edef
d'„Z.	 	 	 d.d(e&e         dee&e                  d%ee-         d)ee         d&ede)fd*„Z/	 	 d-d$edee&e                  d%ee-         d&ede0e+         f
d+„Z1dS )/Ú
WatsonxLLMa-  
    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_modelc                   ó    — e Zd ZdZej        ZdS )úWatsonxLLM.Configz'Configuration for this pydantic object.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚforbidÚextra© ó    úk/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/llms/watsonxllm.pyÚConfigr'   ^   s   € € € € € Ø5Ð5à”ˆˆˆr/   r1   Úreturnc                 ó   — dS )NFr.   )Úclss    r0   Úis_lc_serializablezWatsonxLLM.is_lc_serializablec   s   € àˆur/   c                 ó   — dddddddœS )NÚWATSONX_URLÚWATSONX_APIKEYÚWATSONX_TOKENÚWATSONX_PASSWORDÚWATSONX_USERNAMEÚWATSONX_INSTANCE_ID)r   r   r   r   r   r    r.   ©Úselfs    r0   Ú
lc_secretszWatsonxLLM.lc_secretsg   s%   € ð !Ø&Ø$Ø*Ø*Ø0ð
ð 
ð 	
r/   Úvaluesc           
      ó°  — t          t          |dd¦  «        ¦  «        |d<   d|                     dd¦  «                             ¦   «         v r#t          t          |dd¦  «        ¦  «        |d<   �nq|d         sIdt          j        vr;|d	         s3d
t          j        vr%|d         sdt          j        vrt          d¦  «        ‚|d         sdt          j        v r"t          t          |dd¦  «        ¦  «        |d<   n±|d	         sd
t          j        v rCt          t          |d	d
¦  «        ¦  «        |d	<   t          t          |dd¦  «        ¦  «        |d<   nX|d         sdt          j        v rBt          t          |dd¦  «        ¦  «        |d<   t          t          |dd¦  «        ¦  «        |d<   |d         rdt          j        vr!t          t          |dd¦  «        ¦  «        |d<   	 ddlm} |d         r|d                              ¦   «         nd|d         r|d                              ¦   «         nd|d         r|d                              ¦   «         nd|d	         r|d	                              ¦   «         nd|d         r|d                              ¦   «         nd|d         r|d                              ¦   «         nd|d         r|d                              ¦   «         nddœ}d„ | 	                    ¦   «         D ¦   «         } ||d         |d         ||d         |d         |d         |d         ¬¦  «        }||d<   n# t          $ r t          d¦  «        ‚w xY w|S )zCValidate that credentials and python package exists in environment.r   r7   zcloud.ibm.comr   r   r8   r   r9   r   r:   zÙDid 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!   c                 ó   — i | ]
\  }}|®||“ŒS ©Nr.   )Ú.0ÚkeyÚvalues      r0   ú
<dictcomp>z3WatsonxLLM.validate_environment.<locals>.<dictcomp>¼   s*   € ð .ð .ð .Ù)˜s EÀEÐDU��UÐDUÐDUÐDUr/   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)r4   r@   rB   rI   Úcredentials_without_none_valuer%   s         r0   Úvalidate_environmentzWatsonxLLM.validate_environmentr   s  € õ .Ý  ¨°Ñ>Ô>ñ
ô 
ˆˆu‰ð ˜fŸjšj¨°Ñ3Ô3×DÒDÑFÔFÐFÐFÝ4Ý$ V¨XÐ7GÑHÔHñ ô  ˆF�8ÑÑð
 ˜7”Oð!à#­2¬:Ð5Ð5Ø˜zÔ*ð 6à&­b¬jÐ8Ð8Ø˜xÔ(ð 9à$­B¬JÐ6Ð6å ð-ñô ð ð ˜”ð  Oµr´zÐ$AÐ$AÝ"7Ý(¨°¸/ÑJÔJñ#ô #��w‘�ð ˜
Ô#ð Ð'9½R¼ZÐ'GÐ'GÝ%:Ý(¨°Ð=OÑPÔPñ&ô &��zÑ"õ &;Ý(¨°Ð=OÑPÔPñ&ô &��zÑ"Ð"ð ˜Ô!ð Ð%5½¼Ð%CÐ%CÝ#8Ý(¨°Ð;KÑLÔLñ$ô $��xÑ õ &;Ý(¨°Ð=OÑPÔPñ&ô &��zÑ"ð ˜-Ô(ð Ð,AÍÌÐ,SÐ,SÝ(=Ý(¨°Ð@UÑVÔVñ)ô )��}Ñ%ð+	ØGÐGÐGÐGÐGÐGð <BÀ%¼=ÐR�v˜e”}×5Ò5Ñ7Ô7Ð7Èdà˜(Ô#ð˜& Ô*×;Ò;Ñ=Ô=Ð=àà˜'”?ð˜ œ×9Ò9Ñ;Ô;Ð;àà˜*Ô%ð˜F :Ô.×?Ò?ÑAÔAÐAàà˜*Ô%ð˜F :Ô.×?Ò?ÑAÔAÐAàà˜-Ô(ð ˜v mÔ4×EÒEÑGÔGÐGàà˜)Ô$ð˜6 )Ô,×=Ò=Ñ?Ô?Ð?àð'ð ˆKð*.ð .Ø-8×->Ò->Ñ-@Ô-@ð.ñ .ô .Ð*ð +˜NØ 
Ô+Ø$ _Ô5Ø:Ø˜hÔ'Ø! ,Ô/Ø 
Ô+Ø˜hÔ'ðñ ô ˆMð '4ˆF�?Ñ#Ð#øåð 	ð 	ð 	ÝðGñô ð ð	øøøð
 ˆs   Ç!EL9 Ì9Mc                 óD   — | j         | j        | j        | j        | j        dœS )zGet the identifying parameters.©r   r   r"   r   r   rU   r=   s    r0   Ú_identifying_paramszWatsonxLLM._identifying_paramsÒ   s-   € ð œØ!Ô/Ø”kØœ/Øœð
ð 
ð 	
r/   c                 ó   — dS )zReturn type of llm.zIBM watsonx.air.   r=   s    r0   Ú	_llm_typezWatsonxLLM._llm_typeÝ   s
   € ð  Ðr/   Úresponsec                 ó  — | €dddœS d}d}dt           dt          t           t          f         dt          fd„}| D ]C}|                     d¦  «        }|r*| |d|d         ¦  «        z  }| |d	|d         ¦  «        z  }ŒD||dœS )
Nr   )Úgenerated_token_countÚinput_token_countrF   Úresultr2   c                 ó2   — |                      | d¦  «        pdS )Nr   )rJ   )rF   r]   s     r0   Úget_count_valuez8WatsonxLLM._extract_token_usage.<locals>.get_count_valueì   s   € Ø—:’:˜c 1Ñ%Ô%Ð*¨Ð*r/   Úresultsr\   r[   )Ústrr   r   ÚintrJ   )rY   r\   r[   r_   Úresr`   s         r0   Ú_extract_token_usagezWatsonxLLM._extract_token_usageâ   sÖ   € ð ÐØ-.ÀQÐGÐGÐGàÐØ !Ðð	+¥ð 	+­dµ3½°8¬nð 	+Åð 	+ð 	+ð 	+ð 	+ð ð 	ð 	ˆCØ—g’g˜iÑ(Ô(ˆGØð Ø! _ _Ð5HÈ'ÐRSÌ*Ñ%UÔ%UÑUÐ!Ø%¨¨Ø+¨W°Q¬Zñ*ô *ñ Ð%øð
 &;Ø!2ð
ð 
ð 	
r/   Ústopc                 ó@   — | j         r	i | j         ¥nd }|�	|pi d|iz  }|S )NÚstop_sequences)r"   )r>   re   r"   s      r0   Ú_get_chat_paramszWatsonxLLM._get_chat_paramsü   s7   € Ø48´KÐ!I  D¤K  ÀTˆØÐØ�l Ð'7¸Ð&>Ñ>ˆFØˆr/   c                 ód  — g }|D ]v}|                      d¦  «        }|r]|d                               d¦  «        }t          |d                               d¦  «        d|i¬¦  «        }|                     |g¦  «         Œw|                      |¦  «        }|| j        | j        dœ}t          ||¬¦  «        S )	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)rJ   r   Úappendrd   r   r   r   )	r>   rY   rr   rc   r`   rl   ÚgenÚfinal_token_usagers   s	            r0   Ú_create_llm_resultzWatsonxLLM._create_llm_result  sÐ   € àˆØð 	*ð 	*ˆCØ—g’g˜iÑ(Ô(ˆGØð *Ø '¨¤
§¢¨}Ñ =Ô =�Ý Ø  œŸšÐ(8Ñ9Ô9Ø%4°mÐ$Dðñ ô �ð ×"Ò" C 5Ñ)Ô)Ð)øØ ×5Ò5°hÑ?Ô?Ðà,ØœØ!Ô/ð
ð 
ˆ
õ
  [¸ZÐHÑHÔHÐHr/   Ústream_responsec           
      ó2  — |d         st          d¬¦  «        S t          |d         d         d         t          |d         d                              dd¦  «        |d         d                              dd¦  «        | j        | j        d	œ¬
¦  «        ¬¦  «        S )z0Convert a stream response to a generation chunk.r`   r   ©rn   r   rk   rj   Nr[   )r[   r   r   )rl   rs   rm   )r   ÚdictrJ   r   r   )r>   rx   s     r0   Ú$_stream_response_to_generation_chunkz/WatsonxLLM._stream_response_to_generation_chunk  s´   € ð
 ˜yÔ)ð 	,Ý"¨Ð+Ñ+Ô+Ð+ÝØ  Ô+¨AÔ.Ð/?Ô@Ý Ø-¨iÔ8¸Ô;×?Ò?ÀÈtÑTÔTà-<¸YÔ-GÈÔ-J×-NÒ-NØ/°ñ.ô .ð !%¤Ø%)Ô%7ðð ð	ñ 	ô 	ð
ñ 
ô 
ð 	
r/   ÚpromptÚrun_managerÚkwargsc                 óV   —  | j         d|g||dœ|¤Ž}|j        d         d         j        S )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("What is a molecule")
        )Úpromptsre   r~   r   r.   )Ú	_generaterr   rn   )r>   r}   re   r~   r   r]   s         r0   Ú_callzWatsonxLLM._call+  sJ   € ð&  �”ð 
Ø�H 4°[ð
ð 
ØDJð
ð 
ˆð Ô! !Ô$ QÔ'Ô,Ð,r/   r�   Ústreamc                 ó  — |                       |¬¦  «        }|�|n| j        }|r¸t          |¦  «        dk    rt          d|› �¦  «        ‚t	          d¬¦  «        } | j        |d         f||dœ|¤Ž}	|	D ]}
|€|
}Œ||
z  }Œ|€J ‚t          |j        t          ¦  «        r-|j         	                    d	¦  «        }t          |gg|¬
¦  «        S t          |gg¬¦  «        S | j                             ||¬¦  «        }|                      |¦  «        S )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"])
        ©re   Né   z6WatsonxLLM currently only supports single prompt, got r   rz   r   )re   r~   rs   rq   )rr   )r}   r"   )rh   r$   ÚlenrN   r   Ú_streamÚ
isinstancero   r{   Úpopr   r%   Úgeneraterw   )r>   r�   re   r~   r„   r   r"   Úshould_streamÚ
generationÚstream_iterÚchunkrs   rY   s                r0   r‚   zWatsonxLLM._generateC  s`  € ð( ×&Ò&¨DÐ&Ñ1Ô1ˆØ"(Ð"4˜˜¸$¼.ˆØð 	5Ý�7‰|Œ|˜aÒÐÝ ØVÈWÐVÐVñô ð õ )¨bÐ1Ñ1Ô1ˆJØ&˜$œ,Ø˜”
ðØ!%°;ðð ØBHðð ˆKð %ð (ð (�ØÐ%Ø!&�J�Jà %Ñ'�J�JØÐ)Ð)Ð)Ý˜*Ô4µdÑ;Ô;ð TØ'Ô7×;Ò;¸LÑIÔI�
Ý ¨z¨l¨^È
ÐSÑSÔSÐSÝ¨:¨,¨Ð8Ñ8Ô8Ð8àÔ)×2Ò2¸'È&Ð2ÑQÔQˆHØ×*Ò*¨8Ñ4Ô4Ð4r/   c              +   óä   K  — |                       |¬¦  «        }| j                             |d|¬¦  «        D ]9}|                      |¦  «        }|V — |r|                     |j        |¬¦  «         Œ:dS )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='')
        r†   T)r}   Úraw_responser"   )r�   N)rh   r%   Úgenerate_text_streamr|   Úon_llm_new_tokenrn   )r>   r}   re   r~   r   r"   Ústream_respr�   s           r0   r‰   zWatsonxLLM._streamp  sž   è è € ð* ×&Ò&¨DÐ&Ñ1Ô1ˆØÔ-×BÒBØ¨°Vð Cñ 
ô 
ð 	Fð 	FˆKð ×=Ò=¸kÑJÔJˆEØˆKˆKˆKàð FØ×,Ò,¨U¬Z¸uÐ,ÑEÔEÐEøð	Fð 	Fr/   rD   )NN)NNN)2r(   r)   r*   r+   r   ra   Ú__annotations__r   r   r   r   r   r   r   r   r   r   r    r!   r"   r{   r#   r	   Úboolr$   r   r1   Úclassmethodr5   Úpropertyr   r?   r   rS   r   rV   rX   Ústaticmethodr   rd   rh   r   rw   r   r|   r
   rƒ   r‚   r   r‰   r.   r/   r0   r   r      sª  € € € € € € ðð ð> €HˆcÐÐÑØà€M�3ÐÐÑØ(à€J�ÐÐÑØ*à€HˆcÐÐÑØ(à#€Cˆ�)Ô	Ð#Ð#Ñ#Ø1à"&€FˆH�YÔÐ&Ð&Ñ&Ø4à!%€Eˆ8�IÔÐ%Ð%Ñ%Ø3à$(€Hˆh�yÔ!Ð(Ð(Ñ(Ø6à$(€Hˆh�yÔ!Ð(Ð(Ñ(Ø6à'+€K�˜)Ô$Ð+Ð+Ñ+Ø9à#'€GˆX�iÔ Ð'Ð'Ñ'Ø5à!€FˆH�TŒNÐ!Ð!Ñ!Ø;à!€FˆE�#�t�)ÔÐ!Ð!Ñ!ð0ð €IˆtÐÐÑØ1àÐÐÑðð ð ð ð ñ ô ð ð
 ð 4ð ð ð ñ „[ðð ð
˜D  c œNð 
ð 
ð 
ñ „Xð
ð €^ÑÔð]¨$ð ]°4ð ]ð ]ð ]ñ Ôð]ð~ ð
 W¨S°#¨XÔ%6ð 
ð 
ð 
ñ „Xð
ð ð ˜3ð  ð  ð  ñ „Xð ð à37ð
ð 
Ø˜4  S¨# X¤Ô/Ô0ð
à	ˆc�3ˆhŒð
ð 
ð 
ñ „\ð
ð2ð  X¨d°3¬iÔ%8ð ÀDÈÈcÈÄNð ð ð ð ðI¨4°¬:ð I¸)ð Ið Ið Ið Ið(
à˜c 3˜hœð
ð 
ð
ð 
ð 
ð 
ð0 %)Ø:>ð	-ð -àð-ð �t˜C”yÔ!ð-ð Ð6Ô7ð	-ð
 ð-ð 
ð-ð -ð -ð -ð6 %)Ø:>Ø!%ð+5ð +5à�c”ð+5ð �t˜C”yÔ!ð+5ð Ð6Ô7ð	+5ð
 ˜”ð+5ð ð+5ð 
ð+5ð +5ð +5ð +5ð` %)Ø:>ð	Fð FàðFð �t˜C”yÔ!ðFð Ð6Ô7ð	Fð
 ðFð 
�/Ô	"ðFð Fð Fð Fð Fð Fr/   r   )ÚloggingrL   Útypingr   r   r   r   r   r   r	   Úlangchain_core.callbacksr
   Ú#langchain_core.language_models.llmsr   Úlangchain_core.outputsr   r   r   Úlangchain_core.pydantic_v1r   r   r   Úlangchain_core.utilsr   r   Ú	getLoggerr(   Úloggerr   r.   r/   r0   ú<module>r¤      s  ðØ €€€Ø 	€	€	€	Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ Fà =Ð =Ð =Ð =Ð =Ð =Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Là	ˆÔ	˜8Ñ	$Ô	$€ðFð Fð Fð Fð F�ñ Fô Fð Fð Fð Fr/   