
    7|hz;                    ^   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jP                  e)      Z* ed      Z+ddZ,ddZ-ddZ.ddZ/ddZ0ddZ1	 	 	 	 ddZ2 G d de      Z3y)    )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Tongyic           
         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)llmmin_secondsmax_secondss      ^/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/tongyi.py_create_retry_decoratorr3   *   sL    KK 0M&y1%fgoo>     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   )resps    r2   check_responser=   8   s    Mc!	m	
	*D/0 1&\N-Y/@B
 	

 0m1D0E F&\N-Y/@B
 	
r4   c                @     t               }|d fd       } |di |S )*Use tenacity to retry the completion call.c                 R     j                   j                  di | }t        |      S N clientcallr=   )_kwargsr<   r/   s     r2   _generate_with_retryz1generate_with_retry.<locals>._generate_with_retryM   s%    szz))d##r4   rF   r   returnr   rB   r3   )r/   kwargsretry_decoratorrG   s   `   r2   generate_with_retryrM   I   s/    -c2O$ $  )&))r4   c                @     t               }|d fd       } |di |S )r?   c               ;  n   K    j                   j                  di | }|D ]  }t        |        y wrA   rC   )rF   	responsesr<   r/   s      r2   _stream_generate_with_retryz?stream_generate_with_retry.<locals>._stream_generate_with_retryY   s8     #CJJOO.g.	 	'D &&	's   25rH   rB   rJ   )r/   rK   rL   rQ   s   `   r2   stream_generate_with_retryrR   U   s/    -c2O' '
 '000r4   c               V   K    G d d      } || fi |2 3 d{   }| 7 
6 yw)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y)	8astream_generate_with_retry.<locals>._AioTongyiGeneratorc                &    t        |fi || _        y N)rR   	generator)self_llmrF   s      r2   __init__zAastream_generate_with_retry.<locals>._AioTongyiGenerator.__init__i   s    7HHDNr4   c                    | S rW   rB   rY   s    r2   	__aiter__zBastream_generate_with_retry.<locals>._AioTongyiGenerator.__aiter__l   s    Kr4   c                   K   t        j                         j                  d | j                         d {   }||S t        7 wrW   )asyncioget_running_looprun_in_executor
_safe_nextStopAsyncIteration)rY   values     r2   	__anext__zBastream_generate_with_retry.<locals>._AioTongyiGenerator.__anext__o   sE     !224DDdoo E  ((s   2AAAc                L    	 t        | j                        S # t        $ r Y y w xY wrW   )nextrX   StopIterationr]   s    r2   rc   zCastream_generate_with_retry.<locals>._AioTongyiGenerator._safe_nextx   s(    DNN++  s    	##N)rZ   r    rF   r   )rI   zAsyncIterator[Any])rI   r   )__name__
__module____qualname__r[   r^   rf   rc   rB   r4   r2   _AioTongyiGeneratorrU   h   s    	I		)	r4   rm   NrB   )r/   rK   rm   chunks       r2   astream_generate_with_retryro   b   s9      , +39&9  e9s   )'%')')c              #     K   t        |       }	 t        |      }|D ]
  }|df |} |df y# t        $ r Y yw xY ww)z[Generate elements from an iterable,
    and a boolean indicating if it is the last element.NFT)iterrh   ri   iterableiteratoritem	next_items       r2   generate_with_last_element_markrw      s^      H~HH~  	Ek *  s   ?0 ?	<?<?c                  K   | j                         }	 |j                          d{   }|2 3 d{   }|df |}7 # t        $ r Y yw xY w7 6 |df yw)zaGenerate elements from an async iterable,
    and a boolean indicating if it is the last element.NFT)r^   rf   rd   rr   s       r2    agenerate_with_last_element_markry      sw     
 !!#H'')) $  iEk * 8 *sW   AA AA AAAAAA 	AAA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	 	 d*	 	 	 	 	 	 	 	 	 d+dZ	 	 d*	 	 	 	 	 	 	 	 	 d,dZ	 	 d*	 	 	 	 	 	 	 	 	 d-d Z	 	 d*	 	 	 	 	 	 	 	 	 d.d!Zd/d"Ze	 d0	 	 	 	 	 d1d#       Zed2d$       Z xZS )3r    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

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

    c                
    ddiS )Ndashscope_api_keyDASHSCOPE_API_KEYrB   r]   s    r2   
lc_secretszTongyi.lc_secrets   s    #%899r4   Nr   rD   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                     y)zReturn type of llm.tongyirB   r]   s    r2   	_llm_typezTongyi._llm_type  s     r4   c                    t        |ddgd      |d<   	 ddl}	 |j                  |d<   |S # t        $ r t        d      w xY w# t        $ r t        d      w xY w)	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`.rD   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;   )clsvaluesr   s      r2   validate_environmentzTongyi.validate_environment  s     ';()46I'
"#		(33F8   	B 	  	: 	s   * A ?Ac                j    | j                   | j                  | j                  d}i || j                  S )z7Get the default parameters for calling Tongyi Qwen API.)r   r   r   )r   r   r|   r   )rY   normal_paramss     r2   _default_paramszTongyi._default_params   s:     __ZZ--
 6-54#4#455r4   c                4    d| j                   it        |   S )Nr   )r   super_identifying_params)rY   	__class__s    r2   r   zTongyi._identifying_params+  s    dooM1LMMr4   c           
        g }| j                   rht        |      dkD  rt        d      d } | j                  |d   ||fi |D ]  }||}||z  } |J |j	                  | j                  |      g       nS | j                  dd|i|}|D ]:  }	t        | fd|	i|}
|j	                  t        di | j                  |
      g       < t        |d| j                  i      S )	Nr"   ,Cannot stream results with multiple prompts.r   r(   promptr   generations
llm_outputrB   )r   lenr;   _streamappend_chunk_to_generation_invocation_paramsrM   r   _generation_from_qwen_respr   r   rY   promptsr(   run_managerrK   r   
generationrn   paramsr   
completions              r2   	_generatezTongyi._generate/  s    >>7|a !OPP48J%gaj$NvN (%!&J%'J	(
 ))) 9 9* EFG%<T%<%<%Q$%Q&%QF! 0OfOO
""N$"A"A*"MNO
 #doo
 	
r4   c                X  K   g }| j                   rGt        |      dkD  rt        d      d } | j                  |d   ||fi |2 3 d {   }||}||z  } | j                  dd|i|}|D ]u  }	t        j                         j                  d t        j                  t        fi | |	d|       d {   }
|j	                  t        di | j                  |
      g       w t        |d| j                   i      S 7 6 |J |j	                  | j                  |      g       B7 rw)	Nr"   r   r   r(   )r/   r   r   r   rB   )r   r   r;   _astreamr   r   r   r`   ra   rb   	functoolspartialrM   r   r   r   r   r   s              r2   
_ageneratezTongyi._agenerateP  s^     >>7|a !OPP48J,t}}WQZ{UfU ( (e%!&J%'J &=T%<%<%Q$%Q&%QF! 	#*#;#;#=#M#M%%+7;v/XQW/X$ 
 ""N$"A"A*"MNO	 #doo
 	
'(U
 ))) 9 9* EFGs8   AD*DC?	DA)D*5D(6A	D*?D(D*c           	   +    K    | j                   d|dd|}t        t        | fd|i|      D ]N  \  }}t        di | j	                  ||      }|r(|j                  |j                  || j                         | P y wNT)r(   streamr   )rn   verboserB   )r   rw   rR   r   r   on_llm_new_tokentextr   	rY   r   r(   r   rK   r   stream_respis_last_chunkrn   s	            r2   r   zTongyi._streamv  s      "9!8!8 "
d"
&,"
 +J&tEFEfE+
 	&K $ 11+}ME ,,JJ LL - 
 K	s   A?Bc           	    ,  K    | j                   d|dd|}t        t        | fd|i|      2 3 d {   \  }}t        di | j	                  ||      }|r0|j                  |j                  || j                         d {    | _7 Z7 6 y wr   )r   ry   ro   r   r   r   r   r   r   s	            r2   r   zTongyi._astream  s      "9!8!8 "
d"
&,"
 1Q'FVFvF1
 	 	,+} $ 11+}ME !22JJ LL 3   
 K	1
s8   -BBBBABB
BBBBc                `    i | j                   |}|||d<   |j                  d      rd|d<   |S )Nr(   r   Tincremental_output)r   get)rY   r(   rK   r   s       r2   r   zTongyi._invocation_params  sL    
""

 !F6N::h+/F'(r4   c                    |r4t        | 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)r<   r   s     r2   r   z!Tongyi._generation_from_qwen_resp  s^     (^F+ $"&x."A#L1 $T'] 3!  T(^F344r4   c                D    t        | j                  | j                        S )Nr   )r   r   r   )rn   s    r2   r   zTongyi._chunk_to_generation  s    !11
 	
r4   )rI   zDict[str, str])rI   r   )r   r   rI   r   )rI   r   )rI   zMapping[str, Any])NN)
r   	List[str]r(   Optional[List[str]]r   "Optional[CallbackManagerForLLMRun]rK   r   rI   r   )
r   r   r(   r   r   'Optional[AsyncCallbackManagerForLLMRun]rK   r   rI   r   )
r   r   r(   r   r   r   rK   r   rI   zIterator[GenerationChunk])
r   r   r(   r   r   r   rK   r   rI   zAsyncIterator[GenerationChunk])r(   r   rK   r   rI   r   )T)r<   r   r   r   rI   r   )rn   r   rI   r   )rj   rk   rl   __doc__propertyr~   rD   __annotations__r   r   r   r   r   r|   r   r+   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   __classcell__)r   s   @r2   r    r       s   JX : : FCKw?J?#(#>L.>E5D',T'K}K5It/K<   . 6 6 N N %):>	

 "
 8	

 
 

H %)?C	$
$
 "$
 =	$

 $
 
$
R %):>	 " 8	
  
#6 %)?C	 " =	
  
(0	 )-55"&5	5 5, 
 
r4   )r/   r    rI   zCallable[[Any], Any])r<   r   rI   r   )r/   r    rK   r   rI   r   )rs   zIterable[T]rI   zIterator[Tuple[T, bool]])rs   zAsyncIterable[T]rI   zAsyncIterator[Tuple[T, bool]])4
__future__r   r`   r   r-   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   	getLoggerrj   r,   r   r3   r=   rM   rR   ro   rw   ry   r    rB   r4   r2   <module>r      s    "       8 I I ?  )  
		8	$CL
"	*
1@" m
W m
r4   