Ë
    µŒj£€  ã                  ó  — d dl mZ d dlZd dlZd dlZd dlZd dlm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 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(m)Z) d d	l*m+Z+ d d
l,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z<m=Z=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZG d dlHmIZI d dlJmKZKmLZLmMZMmNZNmOZO d dlPmQZQmRZRmSZS  ej¨                  eU«      ZV	 d	 	 	 	 	 dd„ZWdd„ZXdd„ZYdd„ZZ G d„ de«      Z[y) é    )ÚannotationsN)Ú
itemgetter)ÚAnyÚAsyncIteratorÚCallableÚDictÚIteratorÚListÚMappingÚOptionalÚSequenceÚTypeÚUnionÚcast)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚLanguageModelInput)ÚBaseChatModel)Ú	AIMessageÚAIMessageChunkÚBaseMessageÚBaseMessageChunkÚChatMessageÚChatMessageChunkÚFunctionMessageÚHumanMessageÚHumanMessageChunkÚSystemMessageÚSystemMessageChunkÚToolMessageÚToolMessageChunk)ÚOutputParserLike)ÚJsonOutputKeyToolsParserÚPydanticToolsParserÚmake_invalid_tool_callÚparse_tool_call)ÚChatGenerationÚChatGenerationChunkÚ
ChatResult)ÚRunnableÚRunnableMapÚRunnablePassthrough)ÚBaseTool)Úconvert_to_secret_strÚget_from_dict_or_envÚpre_init)Úconvert_to_openai_tool)Úis_basemodel_subclass)Ú	BaseModelÚ
ConfigDictÚFieldÚ	SecretStr)Ú	HTTPError)Úbefore_sleep_logÚretryÚretry_if_exception_typeÚstop_after_attemptÚwait_exponential)Ú agenerate_with_last_element_markÚcheck_responseÚgenerate_with_last_element_markc           
     ó(  — | d   }| d   }|dk(  r|rt        |¬«      S t        |¬«      S |dk(  rðg }g }d| v rŒd| d   i}t        | d   «      D ]s  \  }}|rK	 |j                  |d   j	                  d«      |d   j	                  d	«      |j	                  d
«      |dœ«       ŒS	 t        |d¬«      }	|	r|j                  |	«       Œu n-d| v rd| d   i}n!d| v rt        | d   t        «      rd| d   i}ni }|rt        |||| j	                  d
«      ¬«      S t        ||||¬«      S |dk(  r|rt        |¬«      S t        |¬«      S |dk(  rji }d| v r| d   |d<   |r-t!        | j	                  dd«      | j	                  d«      |¬«      S t#        | j	                  dd«      | j	                  d«      |¬«      S |rt%        ||¬«      S t'        ||¬«      S # t
        $ r Y �Œ‰w xY w# t        $ r/}
|j                  t        |t        |
«      «      «       Y d}
~
�ŒÀd}
~
ww xY w)zConvert a dict to a message.ÚroleÚcontentÚuser)rB   Ú	assistantÚ
tool_callsÚfunctionÚnameÚ	argumentsÚid)rG   ÚargsrI   ÚindexT)Ú	return_idNÚreasoning_contentÚpartial)rB   Úadditional_kwargsÚtool_call_chunksrI   )rB   rO   rE   Úinvalid_tool_callsÚsystemÚtoolÚ Útool_call_id)rB   rU   rO   ©rA   rB   )r   r   Ú	enumerateÚappendÚgetÚKeyErrorr&   Ú	Exceptionr%   ÚstrÚ
isinstanceÚboolr   r   r   r   r!   r    r   r   )Ú_dictÚis_chunkrA   rB   rE   rQ   rO   rK   ÚvalueÚparsed_toolÚes              úp/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/chat_models/tongyi.pyÚconvert_dict_to_messagere   U   s£  € ð �‰=€DØ�IÑ€GØˆv‚~ñ ô  gÔ.ð	
ô  gÔ.ð	
ð
 
�Ò	Øˆ
ØÐØ˜5Ñ Ø!-¨u°\Ñ/BÐ CÐä )¨%°Ñ*=Ö >‘��uÙðØ"×)Ñ)à(-¨jÑ(9×(=Ñ(=¸fÓ(EØ(-¨jÑ(9×(=Ñ(=¸kÓ(JØ&+§i¡i°£oð */ñõ	ðYÜ&5°eÀtÔ&L˜Ù&Ø&×-Ñ-¨kÔ:øñ' !?ð, ! EÑ)Ø!4°eÐ<OÑ6PÐ QÑØ˜%Ñ¤J¨u°YÑ/?ÄÔ$FØ!*¨E°)Ñ,<Ð =Ñà "Ðñ ô ØØ"3Ø!+Ø—9‘9˜T“?ô	ð	
ô ØØ"3Ø%Ø#5ô	ð	
ð 
�Ò	ñ ô  wÔ/ð	
ô  wÔ/ð	
ð
 
�ŠØÐØ�U‰?Ø(-¨f©Ð˜fÑ%ñ ô ØŸ	™	 )¨RÓ0Ø"ŸY™Y ~Ó6Ø"3ôð	
ô ØŸ	™	 )¨RÓ0Ø"ŸY™Y ~Ó6Ø"3ôð	
ñ  ô  $°Ô8ð	
ô  $°Ô8ð	
øôo $ò Úðûô %ò YØ*×1Ñ1Ô2HÈÔPSÐTUÓPVÓ2W×XÒXûðYús+   ÁA	G	Â  GÇ		GÇGÇ	HÇ"$HÈHc           
     ó  — t        | t        «      s| S dg}t        | t        «      r|j                  d«        | j                  j
                  d   di | j                  j                  «       D ��ci c]  \  }}||vsŒ||“Œ c}}¤ŽS c c}}w )z}Convert a message chunk to a message.

    Args:
        chunk: Message chunk to convert.

    Returns:
        Message.
    ÚtyperP   é   © )r]   r   r   rX   Ú	__class__Ú__mro__Ú__dict__Úitems)Úmessage_chunkÚignore_keysÚkÚvs       rd   Ú convert_message_chunk_to_messagerr   ²   s�   € ô �mÔ%5Ô6ØÐà�(€KÜ�-¤Ô0Ø×ÑÐ-Ô.Ø-ˆ=×"Ñ"×*Ñ*¨1Ñ-ñ Ø)×2Ñ2×8Ñ8Ô:Ô
SÑ:‘D�A�q¸aÀ{Ò>Rˆ1ˆa‰4Ð:Ò
Sñð ùÛ
Ss   Á/BÁ<Bc                ó¼  — t        | t        «      r| j                  | j                  dœ}|S t        | t        «      rd| j                  dœ}|S t        | t
        «      rQd| j                  dœ}d| j                  v r| j                  d   |d<   d| j                  v r| j                  d   |d<   |S t        | t        «      rd| j                  dœ}|S t        | t        «      rDd| j                  | j                  | j                  xs | j                  j                  d«      d	œ}|S t        | t        «      rdd
| j                  | j                  d	œ}|S t        d| › �«      ‚)zConvert a message to a dict.rV   rC   rD   rE   rN   rR   rS   rG   )rA   rU   rB   rG   rT   zGot unknown type )r]   r   rA   rB   r   r   rO   r   r    rU   rG   rY   r   Ú	TypeError)ÚmessageÚmessage_dicts     rd   Úconvert_message_to_dictrw   Æ   sc  € ô �'œ;Ô'Ø '§¡¸¿¹ÑIˆð8 Ðô7 
�Gœ\Ô	*Ø &°7·?±?ÑCˆð4 Ðô3 
�GœYÔ	'Ø +¸¿¹ÑHˆØ˜7×4Ñ4Ñ4Ø)0×)BÑ)BÀ<Ñ)PˆL˜Ñ&à˜×1Ñ1Ñ1Ø&-×&?Ñ&?À	Ñ&JˆL˜Ñ#ð& Ðô% 
�Gœ]Ô	+Ø (°W·_±_ÑEˆð" Ðô! 
�Gœ[Ô	)àØ#×0Ñ0Ø—‘Ø—L‘LÒI G×$=Ñ$=×$AÑ$AÀ&Ó$Iñ	
ˆð Ðô 
�Gœ_Ô	-àØØ—‘Ø—L‘Lñ	
ˆð Ðô Ð+¨G¨9Ð5Ó6Ð6ó    Ú
ChatTongyic           
     óº   — d}d}t        dt        | j                  «      t        d||¬«      t	        t
        «      t        t        t        j                  «      ¬«      S )Nrh   é   T)Ú
multiplierÚminÚmax)ÚreraiseÚstopÚwaitr9   Úbefore_sleep)
r9   r;   Úmax_retriesr<   r:   r7   r8   ÚloggerÚloggingÚWARNING)ÚllmÚmin_secondsÚmax_secondss      rd   Ú_create_retry_decoratorrŠ   ê   sL   € Ø€KØ€Kô ØÜ §¡Ó0Ü¨°ÀÔMÜ&¤yÓ1Ü%¤f¬g¯o©oÓ>ôð rx   c                  ó8  ‡ — 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¬«      Zed0d„«       Zed1d„«       Zed2d„«       Zd3d „Zd3d!„Zd4d"„Zd3d#„Z	 	 d5	 	 	 	 	 	 	 	 	 d6d$„Z	 	 d5	 	 	 	 	 	 	 	 	 d7d%„Z	 	 d5	 	 	 	 	 	 	 	 	 d8d&„Z	 	 d5	 	 	 	 	 	 	 	 	 d9d'„Z	 	 	 	 	 	 	 	 d:d(„Zd;d)„Ze 	 d<	 	 	 	 	 	 	 d=d*„«       Z!e d>d+„«       Z"	 	 	 	 	 	 d?ˆ fd,„Z#dd-œ	 	 	 	 	 	 	 d@d.„Z$ˆ xZ%S )Ary   ui  Alibaba Tongyi Qwen chat 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 Qianfan 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.chat_models import ChatTongyi

            tongyi_chat = ChatTongyi(
                model="qwen-max",
                # top_p="...",
                # api_key="...",
                # other params...
            )

    Invoke:
        .. code-block:: python

            messages = [
                ("system", "ä½ æ˜¯ä¸€å��ä¸“ä¸šçš„ç¿»è¯‘å®¶ï¼Œå�¯ä»¥å°†ç”¨æˆ·çš„ä¸­æ–‡ç¿»è¯‘ä¸ºè‹±æ–‡ã€‚"),
                ("human", "æˆ‘å–œæ¬¢ç¼–ç¨‹ã€‚"),
            ]
            tongyi_chat.invoke(messages)

        .. code-block:: python

            AIMessage(
                content='I enjoy programming.',
                response_metadata={
                    'model_name': 'qwen-max',
                    'finish_reason': 'stop',
                    'request_id': '0bd14853-4abc-9593-8642-8dbb915bd4df',
                    'token_usage': {
                        'input_tokens': 30,
                        'output_tokens': 4,
                        'total_tokens': 34
                    }
                },
                id='run-533b3688-d12b-40c6-a2f7-52f291f8fa0a-0'
            )

    Stream:
        .. code-block:: python

            for chunk in tongyi_chat.stream(messages):
                print(chunk)

        .. code-block:: python

            content='I' id='run-8fbcce63-42fc-4208-9399-da46ac40c967'
            content=' enjoy' id='run-8fbcce63-42fc-4208-9399-da46ac40c967'
            content=' programming' id='run-8fbcce63-42fc-4208-9399-da46ac40c967'
            content='.' response_metadata={'finish_reason': 'stop', 'request_id': '67aec2b5-72bf-96a4-ae29-5bfebd2e7305', 'token_usage': {'input_tokens': 30, 'output_tokens': 4, 'total_tokens': 34}} id='run-8fbcce63-42fc-4208-9399-da46ac40c967'

    Async:
        .. code-block:: python

            await tongyi_chat.ainvoke(messages)

            # stream:
            # async for chunk in tongyi_chat.astream(messages):
            #    print(chunk)

            # batch:
            # await tongyi_chat.abatch([messages])

        .. code-block:: python

            AIMessage(
                content='I enjoy programming.',
                response_metadata={
                    'model_name': 'qwen-max',
                    'finish_reason': 'stop',
                    'request_id': 'a55a2d6c-a876-9789-9dd9-7b52bf8adde0',
                    'token_usage': {
                        'input_tokens': 30,
                        'output_tokens': 4,
                        'total_tokens': 34
                    }
                },
                id='run-3bffa3ec-e8d9-4043-b57d-348e047d64de-0'
            )

    Tool calling:
        .. code-block:: python

            from pydantic import BaseModel, Field


            class GetWeather(BaseModel):
                '''Get the current weather in a given location'''

                location: str = Field(
                    ..., description="The city and state, e.g. San Francisco, CA"
                )


            class GetPopulation(BaseModel):
                '''Get the current population in a given location'''

                location: str = Field(
                    ..., description="The city and state, e.g. San Francisco, CA"
                )

            chat_with_tools = tongyi_chat.bind_tools([GetWeather, GetPopulation])
            ai_msg = chat_with_tools.invoke(
                "Which city is hotter today and which is bigger: LA or NY?"
            )
            ai_msg.tool_calls

        .. code-block:: python
            [
                {
                    'name': 'GetWeather',
                    'args': {'location': 'Los Angeles, CA'},
                    'id': ''
                }
            ]

    Structured output:
        .. code-block:: python

            from typing import Optional

            from pydantic import BaseModel, Field


            class Joke(BaseModel):
                '''Joke to tell user.'''

                setup: str = Field(description="The setup of the joke")
                punchline: str = Field(description="The punchline to the joke")
                rating: Optional[int] = Field(description="How funny the joke is, from 1 to 10")


            structured_chat = tongyi_chat.with_structured_output(Joke)
            structured_chat.invoke("Tell me a joke about cats")

        .. code-block:: python

            Joke(
                setup='Why did the cat join the band?',
                punchline='Because it wanted to be a solo purr-sonality!',
                rating=None
            )

    Response metadata
        .. code-block:: python

            ai_msg = tongyi_chat.invoke(messages)
            ai_msg.response_metadata

        .. code-block:: python

            {
                'model_name': 'qwen-max',
                'finish_reason': 'stop',
                'request_id': '32a13e4c-370e-99cb-8f9b-4c999d98c57d',
                'token_usage': {
                    'input_tokens': 30,
                    'output_tokens': 4,
                    'total_tokens': 34
                }
            }

    c                ó
   — ddiS )NÚdashscope_api_keyÚDASHSCOPE_API_KEYri   ©Úselfs    rd   Ú
lc_secretszChatTongyi.lc_secrets·  s   € à#Ð%8Ð9Ð9rx   Nr   Úclientz
qwen-turboÚmodel)ÚdefaultÚaliasr\   Ú
model_name)Údefault_factoryúDict[str, Any]Úmodel_kwargsgš™™™™™é?ÚfloatÚtop_pÚapi_key)r•   zOptional[SecretStr]r�   Fr^   Ú	streamingé
   Úintrƒ   T)Úpopulate_by_namec                 ó   — y)zReturn type of llm.Útongyiri   r�   s    rd   Ú	_llm_typezChatTongyi._llm_type×  s   € ð rx   c                ó:  — t        t        |dd«      «      |d<   	 ddl}g d¢}|d   |v sd|d   v r	 |j                  |d	<   |S 	 |j                  |d	<   |S # t        $ r t        d«      ‚w xY w# 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   NzdCould not import dashscope python package. Please install it with `pip install dashscope --upgrade`.)zqwen-audio-turbozqwen-audio-turbo-latestzqwen-vl-pluszqwen-vl-plus-latestzqwen-vl-maxzqwen-vl-max-latestr–   Úvlr’   z®`dashscope` has no `MultiModalConversation` attribute, this is likely due to an old version of the dashscope package. Try upgrading it with `pip install --upgrade dashscope`.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.   r/   Ú	dashscopeÚImportErrorÚMultiModalConversationÚAttributeErrorÚ
ValueErrorÚ
Generation)ÚclsÚvaluesr¦   Údashscope_multimodal_modelss       rd   Úvalidate_environmentzChatTongyi.validate_environmentÜ  sñ   € ô '<Ü  Ð)<Ð>QÓRó'
ˆÐ"Ñ#ð	Ûò'
Ð#ð �<Ñ Ð$?Ñ?Ø�v˜lÑ+Ñ+ðØ#,×#CÑ#C��xÑ ð  ˆðØ#,×#7Ñ#7��xÑ ð ˆøôE ò 	ÜðLóð ð	ûô& "ò Ü ðKóð ðûô "ò Ü ð>óð ðús"   ›A ²A- ÁB ÁA*Á-BÂBc                óœ   — | j                   | j                  t        t        | j                  «      j                  «       ddœ| j                  ¥S )z7Get the default parameters for calling Tongyi Qwen API.ru   )r“   r›   rœ   Úresult_format)r–   r›   r   r6   r�   Úget_secret_valuer™   r�   s    rd   Ú_default_paramszChatTongyi._default_params  sH   € ð —_‘_Ø—Z‘ZÜœI t×'=Ñ'=Ó>×OÑOÓQØ&ñ	
ð
 ×Ñð
ð 	
rx   c                ó@   ‡ — t        ‰ «      }|dˆ fd„«       } |di |¤ŽS )ú*Use tenacity to retry the completion call.c                 óR   •—  ‰j                   j                  di | ¤Ž}t        |«      S )Nri   )r’   Úcallr>   )Ú_kwargsÚrespr�   s     €rd   Ú_completion_with_retryz@ChatTongyi.completion_with_retry.<locals>._completion_with_retry  s'   ø€ à#�4—;‘;×#Ñ#Ñ. gÑ.ˆDÜ! $Ó'Ð'rx   ©r¸   r   Úreturnr   ri   ©rŠ   )r�   ÚkwargsÚretry_decoratorrº   s   `   rd   Úcompletion_with_retryz ChatTongyi.completion_with_retry  s/   ø€ ä1°$Ó7ˆà	ô	(ó 
ð	(ñ &Ñ/¨Ñ/Ð/rx   c                ó@   ‡ — t        ‰ «      }|dˆ fd„«       } |di |¤ŽS )rµ   c               ;  óB  •K  —  ‰	j                   j                  di | ¤Ž}d }|D ]÷  }| j                  d«      r×| j                  dd«      sÅt        j                  t        j
                  |«      «      }|j                  d«      re|d   j                  d«      rQ|d   d   d   }|d   }t        |j                  d«      t        «      r d	j                  d
„ |d   D «       «      }||d<   |}|€|}n‰	j                  ||«      }|}t        |«      –— Œët        |«      –— Œù y ­w)NÚstreamÚincremental_outputFÚoutputÚchoicesr   ru   rB   rT   c              3  ó`   K  — | ]&  }t        |t        «      r|j                  d d«      –— Œ( y­w)ÚtextrT   N)r]   ÚdictrY   )Ú.0Úitems     rd   Ú	<genexpr>zaChatTongyi.stream_completion_with_retry.<locals>._stream_completion_with_retry.<locals>.<genexpr>3  s-   è ø€ ð 3á,> DÜ#-¨d´DÔ#9ð !%§¡¨°× 4Ù,>ùs   ‚,.ri   )r’   r·   rY   ÚjsonÚloadsÚdumpsr]   ÚlistÚjoinÚsubtract_client_responser>   )
r¸   Ú	responsesÚ	prev_respr¹   Ú	resp_copyÚchoiceru   Úcontent_textÚ
delta_respr�   s
            €rd   Ú_stream_completion_with_retryzNChatTongyi.stream_completion_with_retry.<locals>._stream_completion_with_retry"  s  øè ø€ à(˜Ÿ™×(Ñ(Ñ3¨7Ñ3ˆIØˆIã!�ð —;‘;˜xÔ(°·±Ø(¨%ô2ô !%§
¡
¬4¯:©:°dÓ+;Ó <�IØ —}‘} XÔ.°9¸XÑ3F×3JÑ3JÈ9Ô3UØ!*¨8Ñ!4°YÑ!?ÀÑ!B˜Ø"(¨Ñ"3˜Ü% g§k¡k°)Ó&<¼dÔCØ+-¯7©7ñ 3à,3°IÒ,>ó3ó ,˜Lð
 2>˜G IÑ.Ø(˜Ø Ð(Ø%)™
à%)×%BÑ%BÀ4ÈÓ%S˜
Ø $�IÜ(¨Ó4Ó4ä(¨Ó.Ó.ñ5 "ùs   ƒDDr»   ri   r½   )r�   r¾   r¿   rÙ   s   `   rd   Ústream_completion_with_retryz'ChatTongyi.stream_completion_with_retry  s0   ø€ ä1°$Ó7ˆà	ô	/ó 
ð	/ñ@ -Ñ6¨vÑ6Ð6rx   c                ó,  — t        j                  t        j                  |«      «      }|d   d   d   }|d   }t        j                  t        j                  |«      «      }|d   d   d   }|d   }|d   j                  |d   d«      |d<   |j	                  d«      rwt        |d   «      D ]f  \  }	}
|
d   }|j	                  d«      sŒ|d   |	   d   }d	|v r|d	   j                  |d	   d«      |d	<   d
|v sŒL|d
   j                  |d
   d«      |d
<   Œh |S )zvSubtract prev response from curr response.

        Useful when streaming without `incremental_output = True`
        rÅ   rÆ   r   ru   rB   rT   rE   rF   rG   rH   )rÍ   rÎ   rÏ   ÚreplacerY   rW   )r�   r¹   rÔ   rÕ   rÖ   ru   Úprev_resp_copyÚprev_choiceÚprev_messagerK   Ú	tool_callrF   Úprev_functions                rd   rÒ   z#ChatTongyi.subtract_client_responseE  sD  € ô —J‘JœtŸz™z¨$Ó/Ó0ˆ	Ø˜8Ñ$ YÑ/°Ñ2ˆØ˜Ñ#ˆäŸ™¤D§J¡J¨yÓ$9Ó:ˆØ$ XÑ.¨yÑ9¸!Ñ<ˆØ" 9Ñ-ˆà$ YÑ/×7Ñ7¸ÀYÑ8OÐQSÓTˆ�	Ñà�;‰;�|Ô$Ü$-¨g°lÑ.CÖ$DÑ ��yØ$ ZÑ0�à×#Ñ# LÕ1Ø$0°Ñ$>¸uÑ$EÀjÑ$Q�Mà Ñ)Ø+3°FÑ+;×+CÑ+CØ)¨&Ñ1°2ó,˜ Ñ(ð # hÒ.Ø08¸Ñ0E×0MÑ0MØ)¨+Ñ6¸ó1˜ Ò-ð %Eð Ðrx   c               óv   K  —  G d„ d«      } | | j                   di |¤Ž¬«      2 3 d{  –—† }|­–— Œ7 Œ
6 y­w)z}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)	úEChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGeneratorc                ó   — || _         y ©N©Ú	generator)r�   rè   s     rd   Ú__init__zNChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator.__init__l  s	   € Ø!*�•rx   c                ó   — | S ræ   ri   r�   s    rd   Ú	__aiter__zOChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator.__aiter__o  s   € Ø�rx   c              “  óŽ   K  — t        j                  «       j                  d | j                  «      ƒ d {  –—† }|�|S t        ‚7 Œ­wræ   )ÚasyncioÚget_running_loopÚrun_in_executorÚ
_safe_nextÚStopAsyncIteration)r�   ra   s     rd   Ú	__anext__zOChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator.__anext__r  sE   è ø€ Ü%×6Ñ6Ó8×HÑHØ˜$Ÿ/™/ó÷ �ð Ð$Ø �Lä,Ð,ðús   ‚2A´AµAc                óL   — 	 t        | j                  «      S # t        $ r Y y w xY wræ   )Únextrè   ÚStopIterationr�   s    rd   rð   zPChatTongyi.astream_completion_with_retry.<locals>._AioTongyiGenerator._safe_next{  s(   € ð Ü §¡Ó/Ð/øÜ$ò  Ùð ús   ‚ —	#¢#N)rè   r   )r¼   zAsyncIterator[Any])r¼   r   )Ú__name__Ú
__module__Ú__qualname__ré   rë   rò   rð   ri   rx   rd   Ú_AioTongyiGeneratorrä   k  s   „ ó+óó-ô rx   rù   rç   Nri   )rÚ   )r�   r¾   rù   Úchunks       rd   Úastream_completion_with_retryz(ChatTongyi.astream_completion_with_retryg  sF   è ø€ ÷	 ñ 	 ñ, /Ø7�d×7Ñ7ÑA¸&ÑAõ
÷ 	�%ð ŒKð	øñ 
ùs   ‚$9¦7ª5«7®9µ7·9c           	     óˆ  — g }| j                   rLd } | j                  |f||dœ|¤ŽD ]  }|€|}Œ||z  }Œ |€J ‚|j                  | j                  |«      «       nP | j                  d||dœ|¤Ž} | j
                  di |¤Ž}	|j                  t        di | j                  |	«      ¤Ž«       t        |d| j                  i¬«      S ©N)r€   Úrun_manager)Úmessagesr€   r–   )ÚgenerationsÚ
llm_outputri   )
r�   Ú_streamrX   Ú_chunk_to_generationÚ_invocation_paramsrÀ   r'   Ú_chat_generation_from_qwen_respr)   r–   )
r�   rÿ   r€   rþ   r¾   r   Úgeneration_chunkrú   Úparamsr¹   s
             rd   Ú	_generatezChatTongyi._generate†  s   € ð ˆØ�>Š>Ø>BÐØ%˜Ÿ™ØðØ#°ñØ@Fô�ð $Ð+Ø',Ñ$à$¨Ñ-Ñ$ðð $Ð/Ð/Ð/Ø×Ñ˜t×8Ñ8Ð9IÓJÕKà%< T×%<Ñ%<ð &Ø!¨ñ&Ø06ñ&ˆFð .�4×-Ñ-Ñ7°Ñ7ˆDØ×ÑÜÑL ×!EÑ!EÀdÓ!KÑLôô Ø#à˜dŸo™oðô
ð 	
rx   c           	   ‹  ó  K  — g }| j                   r,d } | j                  |f||dœ|¤Ž2 3 d {  –—† }|€|}Œ||z  }Œ | j                  d||dœ|¤Ž}t        j                  «       j                  d t        j                  | j                  fi |¤Ž«      ƒ d {  –—† }	|j                  t        di | j                  |	«      ¤Ž«       t        |d| j                  i¬«      S 7 Œ°6 |€J ‚|j                  | j                  |«      «       ŒA7 Œn­wrý   )r�   Ú_astreamrX   r  r  rí   rî   rï   Ú	functoolsrN   rÀ   r'   r  r)   r–   )
r�   rÿ   r€   rþ   r¾   r   Ú
generationrú   r  r¹   s
             rd   Ú
_ageneratezChatTongyi._agenerate¨  s9  è ø€ ð ˆØ�>Š>Ø8<ˆJØ,˜tŸ}™}Øð Ø#°ñ Ø@Fò ÷ (�eð Ð%Ø!&‘Jà %Ñ'‘Jð &= T×%<Ñ%<ð &Ø!¨ñ&Ø06ñ&ˆFô !×1Ñ1Ó3×CÑCØÜ×!Ñ! $×"<Ñ"<ÑGÀÑGó÷ ˆDð ×ÑÜÑL ×!EÑ!EÀdÓ!KÑLôô Ø#à˜dŸo™oðô
ð 	
ð)(øð  ð Ð)Ð)Ð)Ø×Ñ˜t×8Ñ8¸ÓDÕEð
ús3   ‚'D©C ­C®C ±A&DÂDÂADÃC Ã 'Dc           
   +  ór  K  —  | j                   d||ddœ|¤Ž}t         | j                  di |¤Ž«      D ]  \  }}|d   d   d   }|d   }	|d   dk(  r"|	d	   d
k(  r|	j                  dd
«      d
k(  rd|	vrŒ@t	        di | j                  |d|¬«      ¤Ž}
|r|j                  |
j                  |
¬«       |
–— Œ� y ­w)NT©rÿ   r€   rÃ   rÅ   rÆ   r   ru   Úfinish_reasonÚnullrB   rT   rM   rE   ©r`   Úis_last_chunk©rú   ri   )r  r?   rÚ   rY   r(   r  Úon_llm_new_tokenrÈ   )r�   rÿ   r€   rþ   r¾   r  Ústream_respr  rÖ   ru   rú   s              rd   r  zChatTongyi._streamÍ  sû   è ø€ ð "9 ×!8Ñ!8ð "
Ø D°ñ"
Ø9?ñ"
ˆô +JØ-ˆD×-Ñ-Ñ7°Ñ7ö+
Ñ&ˆK˜ð ! Ñ*¨9Ñ5°aÑ8ˆFØ˜YÑ'ˆGà�Ñ'¨6Ò1Ø˜IÑ&¨"Ò,Ø—K‘KÐ 3°RÓ8¸BÒ>Ø ¨Ñ/àä'ñ Ø×6Ñ6Ø¨$¸mð 7ó ñˆEñ
 Ø×,Ñ,¨U¯Z©Z¸uÐ,ÔEØ‹Kñ)+
ùs   ‚B5B7c           
    ó$  K  —  | j                   d||ddœ|¤Ž}t         | j                  di |¤Ž«      2 3 d {  –—† \  }}t        di | j	                  |d|¬«      ¤Ž}|r%|j                  |j                  |¬«      ƒ d {  –—†  |­–— ŒV7 ŒQ7 Œ6 y ­w)NTr  r  r  ri   )r  r=   rû   r(   r  r  rÈ   )	r�   rÿ   r€   rþ   r¾   r  r  r  rú   s	            rd   r
  zChatTongyi._astreamî  s¼   è ø€ ð "9 ×!8Ñ!8ð "
Ø D°ñ"
Ø9?ñ"
ˆô 1QØ.ˆD×.Ñ.Ñ8°Ñ8ô1
÷ 
	Ñ,�+˜}ô (ñ Ø×6Ñ6Ø¨$¸mð 7ó ñˆEñ
 Ø!×2Ñ2°5·:±:ÀUÐ2ÓK×KÐKØŒKð
	øð Løñ1
ùs8   ‚2B´B¸B
¹B¼ABÁ?BÂ 
BÂ
BÂBÂBc                ó`  — i | j                   ¥|¥}|�||d<   |j                  d«      r|j                  d«      sd|d<   |D �cg c]  }t        |«      ‘Œ }}t        |«      D ��cg c]  \  }}|d   dk(  sŒ|‘Œ }}}t	        |«      dk(  r|d	   d	k7  rt        d
«      ‚||d<   |S c c}w c c}}w )Nr€   rÃ   ÚtoolsTrÄ   rA   rR   rh   r   z-System message can only be the first message.rÿ   )r³   rY   rw   rW   Úlenrª   )	r�   rÿ   r€   r¾   r  ÚmÚmessage_dictsÚiÚsystem_message_indicess	            rd   r  zChatTongyi._invocation_params  sÜ   € ð 4�D×(Ñ(Ð3¨FÐ3ˆØÐØ!ˆF�6‰Nð �:‰:�hÔ¨¯
©
°7Ô(;Ø+/ˆFÐ'Ñ(á=EÓF¹X¸Ô0°Õ3¸XˆÐFô $ MÔ2ô"
Ù2‘$�!�Q°a¸±iÀ8Ó6KŠAÐ2ð 	ñ "
ô Ð%Ó&¨!Ò+Ð0FÀqÑ0IÈQÒ0NÜÐLÓMÐMà*ˆˆzÑàˆùò Gùó"
s   ÁB%Á%B*Á6B*c                ó   — |d   €i S |d   S )Nr   ri   )r�   Úllm_outputss     rd   Ú_combine_llm_outputszChatTongyi._combine_llm_outputs  s   € Ø�q‰>Ð!ØˆIØ˜1‰~Ðrx   c                óª   — | d   d   d   }t        |d   |¬«      }|r+t        |t        |d   | d   t        | d   «      ¬	«      ¬
«      S t        |¬«      S )NrÅ   rÆ   r   ru   )r`   r  Ú
request_idÚusage)r  r#  Útoken_usage©ru   Úgeneration_info)ru   )re   rÉ   )r¹   r`   r  rÖ   ru   s        rd   r  z*ChatTongyi._chat_generation_from_qwen_resp!  sl   € ð �h‘ 	Ñ*¨1Ñ-ˆÜ)¨&°Ñ*;ÀhÔOˆÙÜØÜ $Ø"(¨Ñ"9Ø# LÑ1Ü $ T¨'¡]Ó 3ô!ôð ô  Ô(Ð(rx   c                óV   — t        t        | j                  «      | j                  ¬«      S )Nr&  )r'   rr   ru   r'  r  s    rd   r  zChatTongyi._chunk_to_generation:  s$   € äÜ4°U·]±]ÓCØ!×1Ñ1ô
ð 	
rx   c                ó`   •— |D �cg c]  }t        |«      ‘Œ }}t        ‰| �  dd|i|¤ŽS c c}w )að  Bind tool-like objects to this chat model.

        Args:
            tools: A list of tool definitions to bind to this chat model.
                Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
                models, callables, and BaseTools will be automatically converted to
                their schema dictionary representation.
            **kwargs: Any additional parameters to pass to the
                :class:`~langchain.runnable.Runnable` constructor.
        r  ri   )r1   ÚsuperÚbind)r�   r  r¾   rS   Úformatted_toolsrj   s        €rd   Ú
bind_toolszChatTongyi.bind_toolsA  s>   ø€ ñ  EJÓJÁE¸DÔ1°$Õ7ÀEˆÐJÜ‰w‰|Ñ< /Ð<°VÑ<Ð<ùò Ks   †+)Úinclude_rawc               ó¨  — |rt        d|› �«      ‚t        |t        «      xr t        |«      }| j	                  |g«      }|rt        |gd¬«      }nt        |«      d   d   }t        |d¬«      }|r^t        j                  t        d«      |z  d„ ¬	«      }t        j                  d
„ ¬«      }	|j                  |	gd¬«      }
t        |¬«      |
z  S ||z  S )aµ  Model wrapper that returns outputs formatted to match the given schema.

        Args:
            schema: The output schema as a dict or a Pydantic class. If a Pydantic class
                then the model output will be an object of that class. If a dict then
                the model output will be a dict. With a Pydantic class the returned
                attributes will be validated, whereas with a dict they will not be. If
                `method` is "function_calling" and `schema` is a dict, then the dict
                must match the OpenAI function-calling spec.
            include_raw: If False then only the parsed structured output is returned. If
                an error occurs during model output parsing it will be raised. If True
                then both the raw model response (a BaseMessage) and the parsed model
                response will be returned. If an error occurs during output parsing it
                will be caught and returned as well. The final output is always a dict
                with keys "raw", "parsed", and "parsing_error".

        Returns:
            A Runnable that takes any ChatModel input and returns as output:

                If include_raw is True then a dict with keys:
                    raw: BaseMessage
                    parsed: Optional[_DictOrPydantic]
                    parsing_error: Optional[BaseException]

                If include_raw is False then just _DictOrPydantic is returned,
                where _DictOrPydantic depends on the schema:

                If schema is a Pydantic class then _DictOrPydantic is the Pydantic
                    class.

                If schema is a dict then _DictOrPydantic is a dict.

        zReceived unsupported arguments T)r  Úfirst_tool_onlyrF   rG   )Úkey_namer0  Úrawc                 ó   — y ræ   ri   ©Ú_s    rd   Ú<lambda>z3ChatTongyi.with_structured_output.<locals>.<lambda>�  s   € ÐRVrx   )ÚparsedÚparsing_errorc                 ó   — y ræ   ri   r4  s    rd   r6  z3ChatTongyi.with_structured_output.<locals>.<lambda>�  s   € Àdrx   )r7  r8  )Úexception_key)r2  )rª   r]   rg   r2   r-  r$   r1   r#   r,   Úassignr   Úwith_fallbacksr+   )r�   Úschemar.  r¾   Úis_pydantic_schemar‡   Úoutput_parserr1  Úparser_assignÚparser_noneÚparser_with_fallbacks              rd   Úwith_structured_outputz!ChatTongyi.with_structured_outputT  sð   € ñP ÜÐ>¸v¸hÐGÓHÐHÜ'¨´Ó5ÒWÔ:OÐPVÓ:WÐØ�o‰o˜v˜hÓ'ˆÙÜ.AØ�hØ $ô/‰Mô
 .¨fÓ5°jÑAÀ&ÑIˆHÜ4Ø!°4ôˆMñ Ü/×6Ñ6Ü! %Ó(¨=Ñ8ÉôˆMô .×4Ñ4¹NÔKˆKØ#0×#?Ñ#?Ø�¨_ð $@ó $Ð ô  3Ô'Ð*>Ñ>Ð>à˜Ñ&Ð&rx   )r¼   zDict[str, str])r¼   r\   )r­   r   r¼   r   )r¼   r˜   )r¾   r   r¼   r   )r¹   r   rÔ   r   r¼   r   )NN)
rÿ   úList[BaseMessage]r€   úOptional[List[str]]rþ   ú"Optional[CallbackManagerForLLMRun]r¾   r   r¼   r)   )
rÿ   rD  r€   rE  rþ   ú'Optional[AsyncCallbackManagerForLLMRun]r¾   r   r¼   r)   )
rÿ   rD  r€   rE  rþ   rF  r¾   r   r¼   zIterator[ChatGenerationChunk])
rÿ   rD  r€   rE  rþ   rG  r¾   r   r¼   z"AsyncIterator[ChatGenerationChunk])rÿ   rD  r€   r   r¾   r   r¼   r˜   )r   zList[Optional[dict]]r¼   rÉ   )FT)r¹   r   r`   r^   r  r^   r¼   r˜   )rú   r(   r¼   r'   )r  zDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]r¾   r   r¼   z)Runnable[LanguageModelInput, BaseMessage])r=  zUnion[Dict, Type[BaseModel]]r.  r^   r¾   r   r¼   z4Runnable[LanguageModelInput, Union[Dict, BaseModel]])&rö   r÷   rø   Ú__doc__Úpropertyr‘   r’   Ú__annotations__r5   r–   rÉ   r™   r›   r�   r�   rƒ   r4   Úmodel_configr£   r0   r¯   r³   rÀ   rÚ   rÒ   rû   r  r  r  r
  r  r!  Ústaticmethodr  r  r-  rC  Ú__classcell__)rj   s   @rd   ry   ry   ø   s±  ø… ñ|ð| ò:ó ð:ð €FˆCÓÙ L¸Ô@€J�Ó@ðñ $)¸Ô#>€L�.Ó>à€Eˆ5ÓØDá-2°4¸yÔ-IÐÐ*ÓIØ5à€IˆtÓØ/à€K�ÓØ<áØô€Lð òó ðð ò)ó ð)ðV ò
ó ð
ó	0ó%7óN óDðD %)Ø:>ð	 
à#ð 
ð "ð 
ð 8ð	 
ð
 ð 
ð 
ó 
ðJ %)Ø?Cð	#
à#ð#
ð "ð#
ð =ð	#
ð
 ð#
ð 
ó#
ðP %)Ø:>ð	à#ðð "ðð 8ð	ð
 ðð 
'óðH %)Ø?Cð	à#ðð "ðð =ð	ð
 ðð 
,óð,Ø)ðØ14ðØ@Cðà	óó0ð
 àAEð)Øð)Ø!ð)Ø:>ð)à	ò)ó ð)ð0 ò
ó ð
ð=àSð=ð ð=ð 
3õ	=ð. "ñ	A'à,ðA'ð ð	A'ð
 ðA'ð 
>÷A'rx   )F)r_   zMapping[str, Any]r`   r^   r¼   z$Union[BaseMessage, BaseMessageChunk])rn   r   r¼   r   )ru   r   r¼   rÉ   )r‡   ry   r¼   zCallable[[Any], Any])\Ú
__future__r   rí   r  rÍ   r…   Úoperatorr   Útypingr   r   r   r   r	   r
   r   r   r   r   r   r   Úlangchain_core.callbacksr   r   Úlangchain_core.language_modelsr   Ú*langchain_core.language_models.chat_modelsr   Úlangchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   r    r!   Ú"langchain_core.output_parsers.baser"   Ú*langchain_core.output_parsers.openai_toolsr#   r$   r%   r&   Úlangchain_core.outputsr'   r(   r)   Úlangchain_core.runnablesr*   r+   r,   Úlangchain_core.toolsr-   Úlangchain_core.utilsr.   r/   r0   Ú%langchain_core.utils.function_callingr1   Úlangchain_core.utils.pydanticr2   Úpydanticr3   r4   r5   r6   Úrequests.exceptionsr7   Útenacityr8   r9   r:   r;   r<   Úlangchain_community.llms.tongyir=   r>   r?   Ú	getLoggerrö   r„   re   rr   rw   rŠ   ry   ri   rx   rd   Ú<module>rb     sú   ðÝ "ã Û Û Û Ý ÷÷ ÷ ó ÷õ >Ý D÷÷ ÷ õ õ @÷ó ÷ñ ÷
 PÑ OÝ )ß VÑ VÝ HÝ ?÷ó õ *÷õ ÷ñ ð 
ˆ×	Ñ	˜8Ó	$€ð 05ðZ
ØðZ
Ø(,ðZ
à)óZ
ózó(!óHô]
'�õ ]
'rx   