
    Ngz;                    `   d dl mZ d dlZ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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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%m&Z&m'Z'  ej(        e)          Z* ed          Z+d dZ,d!dZ-d"dZ.d"dZ/d"dZ0d#dZ1d$dZ2 G d de          Z3dS )%    )annotationsN)AnyAsyncIterableAsyncIteratorCallableDictIterableIteratorListMappingOptionalTupleTypeVar)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)get_from_dict_or_envpre_init)Field)	HTTPError)before_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponentialTllmTongyireturnCallable[[Any], Any]c           
         d}d}t          dt          | j                  t          d||          t	          t
                    t          t          t          j	                            S )N      T)
multiplierminmax)reraisestopwaitr   before_sleep)
r   r   max_retriesr   r   r   r   loggerloggingWARNING)r    min_secondsmax_secondss      [/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/tongyi.py_create_retry_decoratorr5   *   sa    KK 00MMM&y11%fgo>>       respr   c           	         | d         dk    r| S | d         dv r*t          d| d          d| d          d| d                    t          d	| d          d| d          d| d          | 
          )z,Check the response from the completion call.status_code   )i  i  zstatus_code: z	 
 code: codez 
 message: messagez"HTTP error occurred: status_code: )response)
ValueErrorr   )r7   s    r4   check_responser?   8   s    Mc!!	m	
	*	*BD/ B B&\B B04YB B
 
 	

 Bm1D B B&\B B04YB B
 
 
 	
r6   kwargsc                N     t                     }|d fd            } |di |S )*Use tenacity to retry the completion call._kwargsr   r"   c                 F     j         j        di | }t          |          S N clientcallr?   )rC   r7   r    s     r4   _generate_with_retryz1generate_with_retry.<locals>._generate_with_retryM   s*    sz))))d###r6   rC   r   r"   r   rF   r5   )r    r@   retry_decoratorrJ   s   `   r4   generate_with_retryrN   I   sQ    -c22O$ $ $ $ $ _$  ))&)))r6   c                N     t                     }|d fd            } |di |S )rB   rC   r   r"   c               ;  \   K    j         j        di | }|D ]}t          |          V  d S rE   rG   )rC   	responsesr7   r    s      r4   _stream_generate_with_retryz?stream_generate_with_retry.<locals>._stream_generate_with_retryY   sP      #CJO..g..	 	' 	'D &&&&&&	' 	'r6   rK   rF   rL   )r    r@   rM   rR   s   `   r4   stream_generate_with_retryrS   U   sQ    -c22O' ' ' ' ' _'
 '&00000r6   c               R   K    G d d          } || fi |2 3 d{V }|W V  6 dS )zAsync version of `stream_generate_with_retry`.

    Because the dashscope SDK doesn't provide an async API,
    we wrap `stream_generate_with_retry` with an async generator.c                  .    e Zd ZddZddZdd	Zdd
ZdS )8astream_generate_with_retry.<locals>._AioTongyiGenerator_llmr!   rC   r   c                *    t          |fi || _        d S N)rS   	generator)selfrW   rC   s      r4   __init__zAastream_generate_with_retry.<locals>._AioTongyiGenerator.__init__i   s    7HHHHDNNNr6   r"   AsyncIterator[Any]c                    | S rY   rF   r[   s    r4   	__aiter__zBastream_generate_with_retry.<locals>._AioTongyiGenerator.__aiter__l   s    Kr6   c                   K   t          j                                        d | j                   d {V }||S t          rY   )asyncioget_running_looprun_in_executor
_safe_nextStopAsyncIteration)r[   values     r4   	__anext__zBastream_generate_with_retry.<locals>._AioTongyiGenerator.__anext__o   s\      !244DDdo       E  ((r6   c                N    	 t          | j                  S # t          $ r Y d S w xY wrY   )nextrZ   StopIterationr_   s    r4   re   zCastream_generate_with_retry.<locals>._AioTongyiGenerator._safe_nextx   s9    DN+++    tts    
$$N)rW   r!   rC   r   )r"   r]   )r"   r   )__name__
__module____qualname__r\   r`   rh   re   rF   r6   r4   _AioTongyiGeneratorrV   h   sh        	I 	I 	I 	I	 	 	 		) 	) 	) 	)	 	 	 	 	 	r6   ro   NrF   )r    r@   ro   chunks       r4   astream_generate_with_retryrq   b   s             , +*399&99       e :99s   &iterableIterable[T]Iterator[Tuple[T, bool]]c              #     K   t          |           }	 t          |          }n# t          $ r Y dS w xY w|D ]
}|dfV  |}|dfV  dS )z[Generate elements from an iterable,
    and a boolean indicating if it is the last element.NFT)iterrj   rk   rr   iteratoritem	next_items       r4   generate_with_last_element_markr{      s       H~~HH~~     	Ek
*s   # 
11AsyncIterable[T]AsyncIterator[Tuple[T, bool]]c                  K   |                                  }	 |                                 d{V }n# t          $ r Y dS w xY w|2 3 d{V }|dfW V  |}6 |dfW V  dS )zaGenerate elements from an async iterable,
    and a boolean indicating if it is the last element.NFT)r`   rh   rf   rw   s       r4    agenerate_with_last_element_markr      s      
 !!##H''))))))))   #       iEk $ *s   3 
A AAc                      e Zd ZU dZed<d            ZdZded<    edd	
          Z	ded<   	  ee
          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<   	 ed=d            Zed>d            Zed?d             Zed@ fd"            Z	 	 dAdBd+Z	 	 dAdCd-Z	 	 dAdDd0Z	 	 dAdEd2ZdFd3Ze	 dGdHd7            ZedId;            Z xZS )Jr!   uP	  Tongyi completion model integration.

    Setup:
        Install ``dashscope`` and set environment variables ``DASHSCOPE_API_KEY``.

        .. code-block:: bash

            pip install dashscope
            export DASHSCOPE_API_KEY="your-api-key"

    Key init args — completion params:
        model: str
            Name of Tongyi model to use.
        top_p: float
            Total probability mass of tokens to consider at each step.
        streaming: bool
            Whether to stream the results or not.

    Key init args — client params:
        api_key: Optional[str]
            Dashscope API KEY. If not passed in will be read from env var DASHSCOPE_API_KEY.
        max_retries: int
            Maximum number of retries to make when generating.

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

    Instantiate:
        .. code-block:: python

            from langchain_community.llms import Tongyi

            llm = Tongyi(
                model="qwen-max",
                # top_p="...",
                # api_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

            探索 | 、 | 成长 | 、连接与爱。 | 在有限的时间里，寻找个人价值， | 贡献于他人，共同体验世界的美好 | ，让世界因自己的存在而更 | 温暖。

    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

            '探索、成长、连接与爱。在有限的时间里，寻找个人价值，贡献于他人和社会，体验丰富多彩的情感与经历，不断学习进步，让世界因自己的存在而更美好。'

    r"   Dict[str, str]c                
    ddiS )Ndashscope_api_keyDASHSCOPE_API_KEYrF   r_   s    r4   
lc_secretszTongyi.lc_secrets   s    #%899r6   Nr   rH   z	qwen-plusmodel)defaultaliasstr
model_name)default_factoryDict[str, Any]model_kwargsg?floattop_papi_keyzOptional[str]r   Fbool	streaming
   intr.   c                    dS )zReturn type of llm.tongyirF   r_   s    r4   	_llm_typezTongyi._llm_type  s	     xr6   valuesr   c                    t          |ddgd          |d<   	 ddl}n# t          $ r t          d          w xY w	 |j        |d<   n# t          $ r t          d          w xY w|S )	z?Validate that api key and python package exists in environment.r   r   r   r   NzZCould not import dashscope python package. Please install it with `pip install dashscope`.rH   z`dashscope` has no `Generation` attribute, this is likely due to an old version of the dashscope package. Try upgrading it with `pip install --upgrade dashscope`.)r   	dashscopeImportErrorr   AttributeErrorr>   )clsr   r   s      r4   validate_environmentzTongyi.validate_environment  s     ';()46I'
 '
"#	 	 	 	B  	
	(3F8 	 	 	:  	 s    7
A A c                B    | j         | j        | j        d}i || j        S )z7Get the default parameters for calling Tongyi Qwen API.)r   r   r   )r   r   r   r   )r[   normal_paramss     r4   _default_paramszTongyi._default_params   s5     _Z-
 
 6-54#455r6   Mapping[str, Any]c                <    d| j         it                      j        S )Nr   )r   super_identifying_params)r[   	__class__s    r4   r   zTongyi._identifying_params+  s    doM1LMMr6   prompts	List[str]r+   Optional[List[str]]run_manager"Optional[CallbackManagerForLLMRun]r@   r   c           
        g }| j         rut          |          dk    rt          d          d } | j        |d         ||fi |D ]}||}||z  }|J |                    |                     |          g           nV | j        dd|i|}|D ]D}	t          | fd|	i|}
|                    t          di | 	                    |
          g           Et          |d| j        i          S )	Nr%   ,Cannot stream results with multiple prompts.r   r+   promptr   generations
llm_outputrF   )r   lenr>   _streamappend_chunk_to_generation_invocation_paramsrN   r   _generation_from_qwen_respr   r   r[   r   r+   r   r@   r   
generationrp   paramsr   
completions              r4   	_generatezTongyi._generate/  s]    > 	7||a !OPPP48J%gaj$NNvNN ( (%!&JJ%'JJ))) 9 9* E EFGGGG%<T%<%Q%Q$%Q&%Q%QF!  0OOfOOO
""NN$"A"A*"M"MNNO    #do
 
 
 	
r6   'Optional[AsyncCallbackManagerForLLMRun]c                Z  K   g }| j         r{t          |          dk    rt          d          d } | j        |d         ||fi |2 3 d {V }||}||z  }6 |J |                    |                     |          g           n | j        dd|i|}|D ]|}	t          j                    	                    d t          j        t          fi | |	d|           d {V }
|                    t          di |                     |
          g           }t          |d| j        i          S )	Nr%   r   r   r+   )r    r   r   r   rF   )r   r   r>   _astreamr   r   r   rb   rc   rd   	functoolspartialrN   r   r   r   r   r   s              r4   
_ageneratezTongyi._agenerateP  s      > 	7||a !OPPP48J,t}WQZ{UUfUU ( ( ( ( ( ( (e%!&JJ%'JJ	  V
 ))) 9 9* E EFGGGG%<T%<%Q%Q$%Q&%Q%QF! 	 	#*#;#=#=#M#M%+ 7;v/X/XQW/X $ $      
 ""NN$"A"A*"M"MNNO    #do
 
 
 	
s   Ar   Iterator[GenerationChunk]c           	   +     K    | j         d|dd|}t          t          | fd|i|          D ]M\  }}t          di |                     ||          }|r"|                    |j        || j                   |V  Nd S NT)r+   streamr   )rp   verboserF   )r   r{   rS   r   r   on_llm_new_tokentextr   	r[   r   r+   r   r@   r   stream_respis_last_chunkrp   s	            r4   r   zTongyi._streamv  s       "9!8 "
d"
 "
&,"
 "
 +J&tEEFEfEE+
 +
 	 	&K $  11+}MM E  ,,J L -   
 KKKK	 	r6   AsyncIterator[GenerationChunk]c           	      K    | j         d|dd|}t          t          | fd|i|          2 3 d {V \  }}t          di |                     ||          }|r(|                    |j        || j                   d {V  |W V  Z6 d S r   )r   r   rq   r   r   r   r   r   r   s	            r4   r   zTongyi._astream  s#      "9!8 "
d"
 "
&,"
 "
 1Q'FFVFvFF1
 1
 	 	 	 	 	 	 	,+} $  11+}MM E  !22J L 3         
 KKKKK1
 1
 1
s   B	c                ^    i | j         |}|||d<   |                    d          rd|d<   |S )Nr+   r   Tincremental_output)r   get)r[   r+   r@   r   s       r4   r   zTongyi._invocation_params  sQ    
"

 !F6N::h 	0+/F'(r6   Tr7   r   c                    |rRt          | d         d         t          | d         d         | d         t          | d                                       S t          | d         d                   S )	Noutputr   finish_reason
request_idusage)r   r   token_usager   generation_info)r   )dict)r7   r   s     r4   r   z!Tongyi._generation_from_qwen_resp  s      
	5(^F+ $"&x."A#L1 $T'] 3 3! ! !    T(^F34444r6   rp   r   r   c                8    t          | j        | j                  S )Nr   )r   r   r   )rp   s    r4   r   zTongyi._chunk_to_generation  s$    !1
 
 
 	
r6   )r"   r   )r"   r   )r   r   r"   r   )r"   r   )r"   r   )NN)
r   r   r+   r   r   r   r@   r   r"   r   )
r   r   r+   r   r   r   r@   r   r"   r   )
r   r   r+   r   r   r   r@   r   r"   r   )
r   r   r+   r   r   r   r@   r   r"   r   )r+   r   r@   r   r"   r   )T)r7   r   r   r   r"   r   )rp   r   r"   r   )rl   rm   rn   __doc__propertyr   rH   __annotations__r   r   r   r   r   r   r   r.   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   __classcell__)r   s   @r4   r!   r!      sr        J JX : : : X: FeKw???J????#(5#>#>#>L>>>>ED',uT'K'K'KKKKK5I/K<   X    X. 6 6 6 X6 N N N N N XN %):>	
 
 
 
 
H %)?C	$
 $
 $
 $
 $
R %):>	    6 %)?C	    0	 	 	 	 )-5 5 5 5 \5, 
 
 
 \
 
 
 
 
r6   )r    r!   r"   r#   )r7   r   r"   r   )r    r!   r@   r   r"   r   )rr   rs   r"   rt   )rr   r|   r"   r}   )4
__future__r   rb   r   r0   typingr   r   r   r   r   r	   r
   r   r   r   r   r   langchain_core.callbacksr   r   #langchain_core.language_models.llmsr   langchain_core.outputsr   r   r   langchain_core.utilsr   r   pydanticr   requests.exceptionsr   tenacityr   r   r   r   r   	getLoggerrl   r/   r   r5   r?   rN   rS   rq   r{   r   r!   rF   r6   r4   <module>r      s   " " " " " "                                         8 7 7 7 7 7 I I I I I I I I I I ? ? ? ? ? ? ? ?       ) ) ) ) ) )              
	8	$	$GCLL   
 
 
 
"	* 	* 	* 	*
1 
1 
1 
1   @       m
 m
 m
 m
 m
W m
 m
 m
 m
 m
r6   