
    h(                        d dl mZ d dlZd dlmZmZmZmZmZm	Z	 d dl
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  ej0                  e      Z G d	 d
e      Zy)    )annotationsN)AnyAsyncIteratorDictIteratorListOptional)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LLM)GenerationChunk)convert_to_secret_strget_from_dict_or_envpre_init)Field	SecretStrc                  
    e Zd ZU dZ ee      Zded<   	  ee      Zded<   	 dZ	ded<    edd	
      Z
ded<    edd
      Zded<   dZded<   	  ed      Zded<   	 dZded<   	  edd
      Zded<   	 dZded<   dZded<   dZded <   	 ed*d!       Zed+ fd"       Zed,d#       Zed+d$       Z	 	 	 	 	 	 d-d%Z	 	 d.	 	 	 	 	 	 	 	 	 d/d&Z	 	 d.	 	 	 	 	 	 	 	 	 d0d'Z	 	 d.	 	 	 	 	 	 	 	 	 d1d(Z	 	 d.	 	 	 	 	 	 	 	 	 d2d)Z xZS )3QianfanLLMEndpointun  Baidu Qianfan completion model integration.

    Setup:
        Install ``qianfan`` and set environment variables ``QIANFAN_AK``, ``QIANFAN_SK``.

        .. code-block:: bash

            pip install qianfan
            export QIANFAN_AK="your-api-key"
            export QIANFAN_SK="your-secret_key"

    Key init args — completion params:
        model: str
            Name of Qianfan model to use.
        temperature: Optional[float]
            Sampling temperature.
        endpoint: Optional[str]
            Endpoint of the Qianfan LLM
        top_p: Optional[float]
            What probability mass to use.

    Key init args — client params:
        timeout: Optional[int]
            Timeout for requests.
        api_key: Optional[str]
            Qianfan API KEY. If not passed in will be read from env var QIANFAN_AK.
        secret_key: Optional[str]
            Qianfan SECRET KEY. If not passed in will be read from env var QIANFAN_SK.

    See full list of supported init args and their descriptions in the params section.

    Instantiate:
        .. code-block:: python

            from langchain_community.llms import QianfanLLMEndpoint

            llm = QianfanLLMEndpoint(
                model="ERNIE-3.5-8K",
                # api_key="...",
                # secret_key="...",
                # other params...
            )

    Invoke:
        .. code-block:: python

            input_text = "用50个字左右阐述，生命的意义在于"
            llm.invoke(input_text)

        .. code-block:: python

            '生命的意义在于体验、成长、爱与被爱、贡献与传承，以及对未知的勇敢探索与自我超越。'

    Stream:
        .. code-block:: python

            for chunk in llm.stream(input_text):
                print(chunk)

        .. code-block:: python

            生命的意义 | 在于不断探索 | 与成长 | ，实现 | 自我价值，| 给予爱 | 并接受 | 爱， | 在经历 | 中感悟 | ，让 | 短暂的存在 | 绽放出无限 | 的光彩 | 与温暖 | 。

        .. code-block:: python

            stream = llm.stream(input_text)
            full = next(stream)
            for chunk in stream:
                full += chunk
            full

        .. code-block::

            '生命的意义在于探索、成长、爱与被爱、贡献价值、体验世界之美，以及在有限的时间里追求内心的平和与幸福。'

    Async:
        .. code-block:: python

            await llm.ainvoke(input_text)

            # stream:
            # async for chunk in llm.astream(input_text):
            #    print(chunk)

            # batch:
            # await llm.abatch([input_text])

        .. code-block:: python

            '生命的意义在于探索、成长、爱与被爱、贡献社会，在有限的时间里追寻无限的可能，实现自我价值，让生活充满色彩与意义。'

    )default_factoryDict[str, Any]init_kwargsmodel_kwargsNr   clientapi_key)defaultaliaszOptional[SecretStr]
qianfan_ak
secret_key
qianfan_skFzOptional[bool]	streamingr   zOptional[str]modelendpoint<   timeoutzOptional[int]request_timeoutg?zOptional[float]top_pgffffff?temperature   penalty_scorec                   t        t        |ddgdd            |d<   t        t        |ddgdd            |d<   i |j                  d	i       d
|d
   i}|d   j                         dk7  r|d   j                         |d<   |d   j                         dk7  r|d   j                         |d<   |d   |d   dk7  r|d   |d<   	 dd l} |j
                  di ||d<   |S # t        $ r t        d      w xY w)Nr   r   
QIANFAN_AK r!   r   r   
QIANFAN_SKr   r"   akskr#   r   r   zGqianfan package not found, please install it with `pip install qianfan` )r   r   getget_secret_valueqianfan
CompletionImportError)clsvaluesparamsr4   s       m/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/llms/baidu_qianfan_endpoint.pyvalidate_environmentz'QianfanLLMEndpoint.validate_environment   sJ   4 y)	 
|  5 |,	 
|
jj+
VG_
 ,002b8!,/@@BF4L,002b8!,/@@BF4L*)fZ.@B.F!'
!3F:	1w11;F;F8   	( 	s   C C4c                N    i | j                   | j                  dt        |   S )N)r#   r"   )r#   r"   super_identifying_params)self	__class__s    r:   r>   z&QianfanLLMEndpoint._identifying_params   s/    
==4::>
g)
 	
    c                     y)zReturn type of llm.zbaidu-qianfan-endpointr1   )r?   s    r:   	_llm_typezQianfanLLMEndpoint._llm_type   s     (rA   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  d}i || j                  S )z3Get the default parameters for calling Qianfan API.)r"   r#   streamr&   r'   r(   r*   )r"   r#   r    r&   r'   r(   r*   r   )r?   normal_paramss     r:   _default_paramsz"QianfanLLMEndpoint._default_params   sZ     ZZnn#33ZZ++!//
 6-54#4#455rA   c                p    d|v r|j                  d      |d<   i || j                  d| j                  |S )Nr    rE   )promptr"   )popr"   rG   )r?   rI   kwargss      r:   _convert_prompt_msg_paramsz-QianfanLLMEndpoint._convert_prompt_msg_params   sR    
 & %zz+6F8
$**5
""
 
 	
rA   c                    | j                   r-d} | j                  |||fi |D ]  }||j                  z  } |S  | j                  |fi |}||d<    | j                  j
                  di |}|d   S )a  Call out to an qianfan models endpoint for each generation with a prompt.
        Args:
            prompt: The prompt to pass into the model.
            stop: Optional list of stop words to use when generating.
        Returns:
            The string generated by the model.

        Example:
            .. code-block:: python
                response = qianfan_model.invoke("Tell me a joke.")
        r-   stopresultr1   )r    _streamtextrL   r   do	r?   rI   rN   run_managerrK   
completionchunkr9   response_payloads	            r:   _callzQianfanLLMEndpoint._call   s    $ >>J%fdKJ6J )ejj(
)000B6Bv)4;;>>3F3))rA   c                  K   | j                   r0d} | j                  |||fi |2 3 d {   }||j                  z  } | j                  |fi |}||d<    | j                  j
                  di | d {   }|d   S 7 U6 |S 7 w)Nr-   rN   rO   r1   )r    _astreamrQ   rL   r   adorS   s	            r:   _acallzQianfanLLMEndpoint._acall
  s      >>J,t}}VT;Q&Q ) )eejj(
 100B6Bv!0!:6!::)))Q ;s2   $BBB BAB6B7	B BBc              +     K    | j                   |fi i |ddi}||d<    | j                  j                  di |D ]5  }|st        |d         }|r|j	                  |j
                         | 7 y wNrE   TrN   rO   )rQ   r1   )rL   r   rR   r   on_llm_new_tokenrQ   r?   rI   rN   rT   rK   r9   resrV   s           r:   rP   zQianfanLLMEndpoint._stream  s      100V;Uf;UhPT;UVv!4;;>>+F+ 	C'S];00<	s   A A63A6c               *  K    | j                   |fi i |ddi}||d<    | j                  j                  di | d {   2 3 d {   }|st        |d         }|r#|j	                  |j
                         d {    | F7 J7 C7 6 y wr^   )rL   r   r[   r   r_   rQ   r`   s           r:   rZ   zQianfanLLMEndpoint._astream-  s      100V;Uf;UhPT;UVv.t{{888 	 	#'S];%66uzzBBB 9 	 C	 9sM   >B BBB	B
BB/B BBBBB)r8   r   returnr   )rc   r   )rc   str)rI   rd   rK   r   rc   dict)NN)
rI   rd   rN   Optional[List[str]]rT   "Optional[CallbackManagerForLLMRun]rK   r   rc   rd   )
rI   rd   rN   rf   rT   'Optional[AsyncCallbackManagerForLLMRun]rK   r   rc   rd   )
rI   rd   rN   rf   rT   rg   rK   r   rc   zIterator[GenerationChunk])
rI   rd   rN   rf   rT   rh   rK   r   rc   zAsyncIterator[GenerationChunk])__name__
__module____qualname____doc__r   re   r   __annotations__r   r   r   r   r    r"   r#   r&   r'   r(   r*   r   r;   propertyr>   rC   rG   rL   rX   r\   rP   rZ   __classcell__)r@   s   @r:   r   r      s1   [z #("=K=@ $)#>L.>8FC&+D	&JJ#J&+D&MJ#M %I~%/ .E=. #Hm"E%*2Y%GO]G0 E? #'K'%&M?& % %N 
 
 ( ( 6 6

 
 
	
  %):>	** "* 8	*
 * 
*@ %)?C	** "* =	*
 * 
*, %):>	 " 8	
  
#& %)?C	 " =	
  
(rA   r   )
__future__r   loggingtypingr   r   r   r   r   r	   langchain_core.callbacksr
   r   #langchain_core.language_models.llmsr   langchain_core.outputsr   langchain_core.utilsr   r   r   pydanticr   r   	getLoggerri   loggerr   r1   rA   r:   <module>rz      sK    "   4 2 V V %			8	$b brA   