§
    šŠtj5\  ã                   ó  — d dl Z d dlZd dl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 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 d dlmZmZmZ d dlmZ d dlmZ d d	lmZ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+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z:m;Z;  ej<        e=¦  «        Z>dZ?dZ@de#deAfd„ZBdeeCef         de#fd„ZDdeeCef         dee$         de$fd„ZE G d„ de¦  «        ZF G d„ d¦  «        ZGdS )é    N)Údatetime)ÚQueue)Úmktime)	ÚAnyÚDictÚ	GeneratorÚIteratorÚListÚMappingÚOptionalÚTypeÚcast)Ú	urlencodeÚurlparseÚ
urlunparse)Úformat_date_time)ÚCallbackManagerForLLMRun)ÚBaseChatModelÚgenerate_from_stream)Ú	AIMessageÚAIMessageChunkÚBaseMessageÚBaseMessageChunkÚChatMessageÚChatMessageChunkÚFunctionMessageChunkÚHumanMessageÚHumanMessageChunkÚSystemMessageÚToolMessageChunk)Úmake_invalid_tool_callÚparse_tool_call)ÚChatGenerationÚChatGenerationChunkÚ
ChatResult)Úget_from_dict_or_envÚget_pydantic_field_names)Ú
get_fields)Ú
ConfigDictÚFieldÚmodel_validatorz$wss://spark-api.xf-yun.com/v3.5/chatzgeneralv3.5ÚmessageÚreturnc                 óÒ  — t          | t          ¦  «        rd| j        dœ}nÆt          | t          ¦  «        rd| j        dœ}n¦t          | t          ¦  «        r_d| j        dœ}d| j        v r!| j        d         |d<   |d         dk    rd |d<   d| j        v r!| j        d         |d<   |d         dk    rd |d<   n2t          | t          ¦  «        rd| j        dœ}nt          d	| › �¦  «        ‚|S )
NÚuser)ÚroleÚcontentÚ	assistantÚfunction_callr1   Ú Ú
tool_callsÚsystemzGot unknown type )Ú
isinstancer   r1   r   r   Úadditional_kwargsr   Ú
ValueError)r,   Úmessage_dicts     úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/sparkllm.pyÚconvert_message_to_dictr<   9   s  € å�'�;Ñ'Ô'ð 8Ø &°7´?ÐCÐCˆˆÝ	�G�\Ñ	*Ô	*ð 8Ø &°7´?ÐCÐCˆˆÝ	�G�YÑ	'Ô	'ð 8Ø +¸¼ÐHÐHˆØ˜gÔ7Ð7Ð7Ø,3Ô,EÀoÔ,VˆL˜Ñ)à˜IÔ&¨"Ò,Ð,Ø*.�˜YÑ'Ø˜7Ô4Ð4Ð4Ø)0Ô)BÀ<Ô)PˆL˜Ñ&à˜IÔ&¨"Ò,Ð,Ø*.�˜YÑ'øÝ	�G�]Ñ	+Ô	+ð 8Ø (°W´_ÐEÐEˆˆåÐ6¨WÐ6Ð6Ñ7Ô7Ð7àÐó    Ú_dictc           
      ó`  — | d         }| d         }|dk    rt          |¬¦  «        S |dk    rÜg }i }|                      d¦  «        x}rt          |¦  «        |d<   g }|                      d¦  «        x}r}||d<   | d         D ]n}	 |                     t	          |d¬	¦  «        ¦  «         Œ(# t
          $ r:}	|                     t          |t          |	¦  «        ¦  «        ¦  «         Y d }	~	Œgd }	~	ww xY wni }|pd
}
t          |
|||¬¦  «        S |dk    rt          |¬¦  «        S t          ||¬¦  «        S )Nr0   r1   r/   ©r1   r2   r3   r5   T)Ú	return_idr4   )r1   r8   r5   Úinvalid_tool_callsr6   ©r1   r0   )r   ÚgetÚdictÚappendr"   Ú	Exceptionr!   Ústrr   r   r   )r>   Úmsg_roleÚmsg_contentrB   r8   r3   r5   Úraw_tool_callsÚraw_tool_callÚer1   s              r;   Úconvert_dict_to_messagerN   S   s©  € Ø�VŒ}€HØ˜	Ô"€KØ�6ÒÐÝ KÐ0Ñ0Ô0Ð0Ø	�[Ò	 Ð	 ØÐØ"$ÐØ!ŸIšI oÑ6Ô6Ð6ˆ=ð 	EÝ15°mÑ1DÔ1DÐ˜oÑ.Øˆ
Ø"ŸYšY |Ñ4Ô4Ð4ˆ>ð 
	#Ø.<Ð˜lÑ+Ø!& |Ô!4ð ð �ðØ×%Ò%¥o°mÈtÐ&TÑ&TÔ&TÑUÔUÐUÐUøÝ ð ð ð Ø&×-Ò-Ý.¨}½cÀ!¹f¼fÑEÔEñô ð ð ð ð ð ð øøøøðøøøðð !#ÐØÐ# ˆÝØØ/Ø!Ø1ð	
ñ 
ô 
ð 	
ð 
�XÒ	Ð	Ý [Ð1Ñ1Ô1Ð1å ;°XÐ>Ñ>Ô>Ð>s   Â$B(Â(
C,Â20C'Ã'C,Údefault_classc                 óä  — t          t          |                      d¦  «        ¦  «        }t          t          |                      d¦  «        pd¦  «        }i }|                      d¦  «        r+t          | d         ¦  «        }d|v r|d         €d|d<   ||d<   |                      d¦  «        r| d         |d<   |dk    s|t          k    rt	          |¬¦  «        S |d	k    s|t
          k    rt          ||¬
¦  «        S |dk    s|t          k    rt          || d         ¬¦  «        S |dk    s|t          k    rt          || d         ¬¦  «        S |s|t          k    rt          ||¬¦  «        S  ||¬¦  «        S )Nr0   r1   r4   r3   Únamer5   r/   r@   r2   )r1   r8   Úfunction)r1   rQ   ÚtoolÚtool_call_id)r1   rT   rC   )	r   rH   rD   rE   r   r   r   r    r   )r>   rO   rI   rJ   r8   r3   s         r;   Ú_convert_delta_to_message_chunkrU   v   s�  € õ •C˜Ÿš 6Ñ*Ô*Ñ+Ô+€HÝ•s˜EŸIšI iÑ0Ô0Ð6°BÑ7Ô7€KØ ÐØ‡y‚y�Ñ!Ô!ð ;Ý˜U ?Ô3Ñ4Ô4ˆØ�]Ð"Ð" }°VÔ'<Ð'DØ$&ˆM˜&Ñ!Ø-:Ð˜/Ñ*Ø‡y‚y�ÑÔð >Ø*/°Ô*=Ð˜,Ñ'Ø�6ÒÐ˜]Õ.?Ò?Ð?Ý ¨Ð5Ñ5Ô5Ð5Ø	�[Ò	 Ð	  Mµ^Ò$CÐ$CÝ kÐEVÐWÑWÔWÐWØ	�ZÒ	Ð	 =Õ4HÒ#HÐ#HÝ#¨K¸eÀF¼mÐLÑLÔLÐLØ	�VÒ	Ð	˜}Õ0@Ò@Ð@Ý¨À%ÈÔBWÐXÑXÔXÐXØ	ð 2�]Õ&6Ò6Ð6Ý¨¸(ÐCÑCÔCÐCàˆ} [Ð1Ñ1Ô1Ð1r=   c                   óž  — e Zd ZU dZedefd„¦   «         Zedee	e	f         fd„¦   «         Z
dZeed<    edd¬¦  «        Zee	         ed	<   	  edd
¬¦  «        Zee	         ed<   	  edd¬¦  «        Zee	         ed<   	  edd¬¦  «        Zee	         ed<   	  edd¬¦  «        Zee	         ed<   	 dZe	ed<   dZeed<   	  edd¬¦  «        Zeed<   	  ed¬¦  «        Zeed<   	 dZeed<   	  ee¬¦  «        Zee	ef         ed <   	  ed!¬"¦  «        Z e d#¬$¦  «        ed%edefd&„¦   «         ¦   «         Z! e d#¬$¦  «        ed%ee	ef         defd'„¦   «         ¦   «         Z"	 	 d0d(e#e$         d)ee#e	                  d*ee%         d+ede&e'         f
d,„Z(	 	 	 d1d(e#e$         d)ee#e	                  d*ee%         d-ee         d+ede)fd.„Z*ede	fd/„¦   «         Z+dS )2ÚChatSparkLLMu-  IFlyTek Spark chat model integration.

    Setup:
        To use, you should have the environment variable``IFLYTEK_SPARK_API_KEY``,
        ``IFLYTEK_SPARK_API_SECRET`` and ``IFLYTEK_SPARK_APP_ID``.

    Key init args â€” completion params:
        model: Optional[str]
            Name of IFLYTEK SPARK model to use.
        temperature: Optional[float]
            Sampling temperature.
        top_k: Optional[float]
            What search sampling control to use.
        streaming: Optional[bool]
             Whether to stream the results or not.

    Key init args â€” client params:
        api_key: Optional[str]
            IFLYTEK SPARK API KEY. If not passed in will be read from env var IFLYTEK_SPARK_API_KEY.
        api_secret: Optional[str]
            IFLYTEK SPARK API SECRET. If not passed in will be read from env var IFLYTEK_SPARK_API_SECRET.
        api_url: Optional[str]
            Base URL for API requests.
        timeout: Optional[int]
            Timeout for requests.

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

    Instantiate:
        .. code-block:: python

            from langchain_community.chat_models import ChatSparkLLM

            chat = ChatSparkLLM(
                api_key="your-api-key",
                api_secret="your-api-secret",
                model='Spark4.0 Ultra',
                # temperature=...,
                # other params...
            )

    Invoke:
        .. code-block:: python

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

        .. code-block:: python

            AIMessage(
                content='I like programming.',
                response_metadata={
                    'token_usage': {
                        'question_tokens': 3,
                        'prompt_tokens': 16,
                        'completion_tokens': 4,
                        'total_tokens': 20
                    }
                },
                id='run-af8b3531-7bf7-47f0-bfe8-9262cb2a9d47-0'
            )

    Stream:
        .. code-block:: python

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

        .. code-block:: python

            content='I' id='run-fdbb57c2-2d32-4516-b894-6c5a67605d83'
            content=' like programming' id='run-fdbb57c2-2d32-4516-b894-6c5a67605d83'
            content='.' id='run-fdbb57c2-2d32-4516-b894-6c5a67605d83'

        .. code-block:: python

            stream = chat.stream(messages)
            full = next(stream)
            for chunk in stream:
                full += chunk
            full

        .. code-block:: python

            AIMessageChunk(
                content='I like programming.',
                id='run-aca2fa82-c2e4-4835-b7e2-865ddd3c46cb'
            )

    Response metadata
        .. code-block:: python

            ai_msg = chat.invoke(messages)
            ai_msg.response_metadata

        .. code-block:: python

            {
                'token_usage': {
                    'question_tokens': 3,
                    'prompt_tokens': 16,
                    'completion_tokens': 4,
                    'total_tokens': 20
                }
            }

    r-   c                 ó   — dS )z9Return whether this model can be serialized by Langchain.F© )Úclss    r;   Úis_lc_serializablezChatSparkLLM.is_lc_serializable  s	   € ð ˆur=   c                 ó   — ddddddœS )NÚIFLYTEK_SPARK_APP_IDÚIFLYTEK_SPARK_API_KEYÚIFLYTEK_SPARK_API_SECRETÚIFLYTEK_SPARK_API_URLÚIFLYTEK_SPARK_LLM_DOMAIN)Úspark_app_idÚspark_api_keyÚspark_api_secretÚspark_api_urlÚspark_llm_domainrY   ©Úselfs    r;   Ú
lc_secretszChatSparkLLM.lc_secrets  s"   € ð 3Ø4Ø :Ø4Ø :ð
ð 
ð 	
r=   NÚclientÚapp_id)ÚdefaultÚaliasrb   Úapi_keyrc   Ú
api_secretrd   Úapi_urlre   Úmodelrf   Úlc_userÚspark_user_idFÚ	streamingé   Útimeout)rm   Úrequest_timeoutg      à?©rl   Útemperatureé   Útop_k)Údefault_factoryÚmodel_kwargsT)Úpopulate_by_nameÚbefore)ÚmodeÚvaluesc           	      ó8  — t          |ddgd¦  «        |d<   t          |ddgd¦  «        |d<   t          |ddgd	¦  «        |d<   t          |d
dt          ¦  «        |d
<   t          |ddt          ¦  «        |d<   d„ t          | ¦  «                             ¦   «         D ¦   «         }|                     d¦  «        |d         d<   |                     d¦  «        |d         d<   t          |d         |d         |d         |d
         |d         |d         ¬¦  «        |d<   |S )Nrb   rk   r]   rc   rn   r^   rd   ro   r_   re   r`   rf   ra   c                 ó2   — i | ]\  }}|j         ®||j         “ŒS ©Nrx   )Ú.0rQ   Úfields      r;   ú
<dictcomp>z5ChatSparkLLM.validate_environment.<locals>.<dictcomp>O  s2   € ð 
ð 
ð 
á��eØŒ}Ð(ð �%”-à(Ð(Ð(r=   ry   r}   r{   )rk   rn   ro   rp   Úspark_domainr}   rj   )r&   ÚSPARK_API_URLÚSPARK_LLM_DOMAINr(   ÚitemsrD   Ú_SparkLLMClient)rZ   r�   Údefault_valuess      r;   Úvalidate_environmentz!ChatSparkLLM.validate_environment/  sr  € õ "6ØØ˜XÐ&Ø"ñ"
ô "
ˆˆ~Ñõ
 #7ØØ˜iÐ(Ø#ñ#
ô #
ˆˆÑõ
 &:ØØ Ð.Ø&ñ&
ô &
ˆÐ!Ñ"õ
 #7ØØØ#Ýñ	#
ô #
ˆˆÑõ &:ØØØ&Ýñ	&
ô &
ˆÐ!Ñ"ð
ð 
å)¨#™œ×4Ò4Ñ6Ô6ð
ñ 
ô 
ˆð
 1?×0BÒ0BÀ=Ñ0QÔ0Qˆˆ~Ô˜}Ñ-Ø*8×*<Ò*<¸WÑ*EÔ*Eˆˆ~Ô˜wÑ'å*Ø˜.Ô)Ø˜?Ô+ØÐ0Ô1Ø˜?Ô+ØÐ 2Ô3Ø Ô/ð
ñ 
ô 
ˆˆxÑð ˆr=   c           
      ó¤  — t          | ¦  «        }|                     di ¦  «        }t          |¦  «        D ]Y}||v rt          d|› d�¦  «        ‚||vr<t                               d|› d|› d|› d�¦  «         |                     |¦  «        ||<   ŒZ|                     |                     ¦   «         ¦  «        }|rt          d|› d	�¦  «        ‚||d<   |S )
z>Build extra kwargs from additional params that were passed in.r}   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r'   rD   Úlistr9   ÚloggerÚwarningÚpopÚintersectionÚkeys)rZ   r�   Úall_required_field_namesÚextraÚ
field_nameÚinvalid_model_kwargss         r;   Úbuild_extrazChatSparkLLM.build_extrae  s4  € õ $<¸CÑ#@Ô#@Ð Ø—
’
˜>¨2Ñ.Ô.ˆÝ˜v™,œ,ð 		;ð 		;ˆJØ˜UÐ"Ð"Ý Ð!F¨*Ð!FÐ!FÐ!FÑGÔGÐGØÐ!9Ð9Ð9Ý—’ðN *ð Nð NØðNð Nà)3ðNð Nð Nñô ð ð
 %+§J¢J¨zÑ$:Ô$:��jÑ!øà7×DÒDÀUÇZÂZÁ\Ä\ÑRÔRÐØð 	ÝðTÐ2ð Tð Tð Tñô ð ð
 "'ˆˆ~Ñàˆr=   ÚmessagesÚstopÚrun_managerÚkwargsc              +   ó¼  K  — t           }| j                             d„ |D ¦   «         | j        | j        d¬¦  «         | j                             | j        ¬¦  «        D ]}d|vrŒ|d         }i }d|v r|                     d¦  «        |d<   t          ||¦  «        }	t          |	|pd ¬¦  «        }
|r)| 
                    t          |	j        ¦  «        |
¬¦  «         |
V — Œ€d S )	Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS rY   ©r<   ©r…   Úms     r;   ú
<listcomp>z(ChatSparkLLM._stream.<locals>.<listcomp>‹  ó!   € Ð:Ð:Ð:¨AÕ$ QÑ'Ô'Ð:Ð:Ð:r=   T)rt   ©rv   ÚdataÚreasoning_content©r,   Úgeneration_info)Úchunk)r   rj   Úarunrs   r}   Ú	subscriberw   r“   rU   r$   Úon_llm_new_tokenrH   r1   )rh   r›   rœ   r�   rž   Údefault_chunk_classr1   Údeltarª   r«   Úcg_chunks              r;   Ú_streamzChatSparkLLM._stream�  s$  è è € õ -ÐàŒ×ÒØ:Ð:°Ð:Ñ:Ô:ØÔØÔØð	 	ñ 	
ô 	
ð 	
ð ”{×,Ò,°TÔ5IÐ,ÑJÔJð 	ð 	ˆGØ˜WÐ$Ð$ØØ˜F”OˆEØ ˆOØ" eÐ+Ð+Ø7<·y²yÐATÑ7UÔ7U�Ð 3Ñ4Ý3°EÐ;NÑOÔOˆEÝ*Ø¨Ð/FÀ$ðñ ô ˆHð ð QØ×,Ò,­S°´Ñ-?Ô-?ÀxÐ,ÑPÔPÐPØˆNˆNˆNˆNð	ð 	r=   Ústreamc                 óà  — |s| j         r  | j        d|||dœ|¤Ž}t          |¦  «        S | j                             d„ |D ¦   «         | j        | j        d¦  «         i }i }| j                             | j        ¬¦  «        D ]}	d|	v r|	d         |d<   d|	vrŒ|	d         }Œi }
d|v r| 	                    d¦  «        |
d<   t          |¦  «        }t          ||
pd ¬	¦  «        g}t          ||¬
¦  «        S )N)r›   rœ   r�   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rY   r¡   r¢   s     r;   r¤   z*ChatSparkLLM._generate.<locals>.<listcomp>®  r¥   r=   Fr¦   ÚusageÚtoken_usager§   r¨   r©   )ÚgenerationsÚ
llm_outputrY   )rt   r²   r   rj   r¬   rs   r}   r­   rw   r“   rN   r#   r%   )rh   r›   rœ   r�   r³   rž   Ústream_iterÚ
completionr¹   r1   rª   r,   r¸   s                r;   Ú	_generatezChatSparkLLM._generateŸ  sU  € ð ð 	5�T”^ð 	5Ø&˜$œ,ð Ø!¨¸+ðð ØIOðð ˆKõ (¨Ñ4Ô4Ð4àŒ×ÒØ:Ð:°Ð:Ñ:Ô:ØÔØÔØñ		
ô 	
ð 	
ð ˆ
Øˆ
Ø”{×,Ò,°TÔ5IÐ,ÑJÔJð 	)ð 	)ˆGØ˜'Ð!Ð!Ø,3°GÔ,<�
˜=Ñ)Ø˜WÐ$Ð$ØØ  œˆJˆJØˆØ *Ð,Ð,Ø3=·>²>ÐBUÑ3VÔ3VˆOÐ/Ñ0Ý)¨*Ñ5Ô5ˆå 7¸OÐ<SÈtÐTÑTÔTð
ˆõ  k¸jÐIÑIÔIÐIr=   c                 ó   — dS )Nzspark-llm-chatrY   rg   s    r;   Ú	_llm_typezChatSparkLLM._llm_typeÄ  s   € àÐr=   )NN©NNN),Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚclassmethodÚboolr[   Úpropertyr   rH   ri   rj   r   Ú__annotations__r*   rb   r   rc   rd   re   rf   rs   rt   rw   Úintry   Úfloatr{   rE   r}   r)   Úmodel_configr+   rŽ   rš   r
   r   r   r	   r$   r²   r%   r¼   r¾   rY   r=   r;   rW   rW   ‘   s³  € € € € € € ðmð mð^ ð 4ð ð ð ñ „[ðð ð
˜D  c œNð 
ð 
ð 
ñ „Xð
ð €FˆCÐÐÑØ"' %°¸HÐ"EÑ"EÔ"E€L�(˜3”-ÐEÐEÑEðà#( 5°¸YÐ#GÑ#GÔ#G€M�8˜C”=ÐGÐGÑGðà&+ e°DÀÐ&MÑ&MÔ&MÐ�h˜s”mÐMÐMÑMðà#( 5°¸YÐ#GÑ#GÔ#G€M�8˜C”=ÐGÐGÑGðà&+ e°DÀÐ&HÑ&HÔ&HÐ�h˜s”mÐHÐHÑHØØ"€M�3Ð"Ð"Ñ"Ø€IˆtÐÐÑØ/Ø ˜5 ¨9Ð5Ñ5Ô5€O�SÐ5Ð5Ñ5Ø0Ø˜ sÐ+Ñ+Ô+€K�Ð+Ð+Ñ+Ø+Ø€Eˆ3€N€N�NØ.Ø#( 5¸Ð#>Ñ#>Ô#>€L�$�s˜C�x”.Ð>Ð>Ñ>ØQà�:Øðñ ô €Lð €_˜(Ð#Ñ#Ô#Øð.¨$ð .°3ð .ð .ð .ñ „[ñ $Ô#ð.ðh €_˜(Ð#Ñ#Ô#Øð  c¨3 h¤ð °Cð ð ð ñ „[ñ $Ô#ðð: %)Ø:>ð	ð à�{Ô#ðð �t˜C”yÔ!ðð Ð6Ô7ð	ð
 ðð 
Ð%Ô	&ðð ð ð ðB %)Ø:>Ø!%ð#Jð #Jà�{Ô#ð#Jð �t˜C”yÔ!ð#Jð Ð6Ô7ð	#Jð
 ˜”ð#Jð ð#Jð 
ð#Jð #Jð #Jð #JðJ ð ˜3ð  ð  ð  ñ „Xð ð  ð  r=   rW   c                   ó¸  — e Zd ZdZ	 	 	 ddedededee         dee         dee         fd	„Zedededed
efd„¦   «         Z		 	 d de
e         dedee         ded
df
d„Z	 	 d de
e         dedee         ded
ej        f
d„Zdedee         d
dfd„Zdededed
dfd„Zded
dfd„Zdeded
dfd„Z	 d!dededee         d
efd„Zd"dee         d
eeddf         fd„ZdS )#rŒ   z�
    Use websocket-client to call the SparkLLM interface provided by Xfyun,
    which is the iFlyTek's open platform for AI capabilities
    Nrk   rn   ro   rp   rˆ   r}   c                 ó  — 	 dd l }|| _        n# t          $ r t          d¦  «        ‚w xY w|st          n|| _        || _        || _        |pt          | _        t          ¦   «         | _
        dddœ| _        || _        || _        d S )Nr   zhCould not import websocket client python package. Please install it with `pip install websocket-client`.r4   r2   rC   )Ú	websocketÚwebsocket_clientÚImportErrorr‰   rp   rk   r}   rŠ   rˆ   r   ÚqueueÚblocking_messagern   ro   )rh   rk   rn   ro   rp   rˆ   r}   rÍ   s           r;   Ú__init__z_SparkLLMClient.__init__Ï  s­   € ð	ØÐÐÐà$-ˆDÔ!Ð!øÝð 	ð 	ð 	ÝðIñô ð ð	øøøð -4Ð@•}�}¸ˆŒØˆŒØ(ˆÔØ(Ð<Õ,<ˆÔÝ"'¡'¤'ˆŒ
Ø,.¸Ð DÐ DˆÔØˆŒØ$ˆŒˆˆs   ‚ Ž(r-   c                 óæ  — t          t          t          j        ¦   «                              ¦   «         ¦  «        ¦  «        }t          | ¦  «        }|j        }|j        }d|› d|› d|› d�}t          j	        | 
                    d¦  «        | 
                    d¦  «        t          j        ¬¦  «                             ¦   «         }t          j        |¦  «                             d¬¦  «        }	d|› d	|	› d
�}
t          j        |
 
                    d¦  «        ¦  «                             d¬¦  «        }|||dœ}t#          |¦  «        }t%          |j        |j        |j        |j        ||j        f¦  «        }|S )zK
        Generate a request url with an api key and an api secret.
        zhost: z
date: z
GET z	 HTTP/1.1zutf-8)Ú	digestmod)Úencodingz	api_key="zQ", algorithm="hmac-sha256",         headers="host date request-line", signature="ú")ÚauthorizationÚdateÚhost)r   r   r   ÚnowÚ	timetupler   ÚnetlocÚpathÚhmacÚnewÚencodeÚhashlibÚsha256ÚdigestÚbase64Ú	b64encodeÚdecoder   r   ÚschemeÚparamsÚfragment)rp   rn   ro   rØ   Ú
parsed_urlrÙ   rÝ   Úsignature_originÚsignature_shaÚsignature_sha_base64Úauthorization_originr×   Úparams_dictÚencoded_paramsÚurls                  r;   Ú_create_urlz_SparkLLMClient._create_urlë  s˜  € õ  ¥¥x¤|¡~¤~×'?Ò'?Ñ'AÔ'AÑ BÔ BÑCÔCˆõ ˜gÑ&Ô&ˆ
ØÔ ˆØŒˆàM DÐMÐM°$ÐMÐM¸dÐMÐMÐMÐõ œØ×Ò˜gÑ&Ô&Ø×#Ò# GÑ,Ô,Ý”nð
ñ 
ô 
÷ Š&‰(Œ(ð	 	õ  &Ô/°Ñ>Ô>×EÒEÈwÐEÑWÔWÐð N¨7ð  Nð  NØ6Jð Nð  Nð  NÐåÔ(Ð)=×)DÒ)DÀWÑ)MÔ)MÑNÔN×UÒUØð Vñ 
ô 
ˆð
 )6¸tÈTÐRÐRˆÝ" ;Ñ/Ô/ˆÝàÔ!ØÔ!Ø”ØÔ!ØØÔ#ðñ	
ô 	
ˆð ˆ
r=   Fr›   Úuser_idrt   c                 ód  — | j                              d¦  «         | j                              t                               | j        | j        | j        ¦  «        | j        | j	        | j
        | j        ¬¦  «        }||_        ||_        |€| j        n||_        ||_        |                     ¦   «          d S )NF)Ú
on_messageÚon_errorÚon_closeÚon_open)rÎ   ÚenableTraceÚWebSocketApprŒ   rò   rp   rn   ro   rõ   rö   r÷   rø   r›   ró   r}   rt   Úrun_forever)rh   r›   ró   r}   rt   Úwss         r;   Úrunz_SparkLLMClient.run  s±   € ð 	Ô×)Ò)¨%Ñ0Ô0Ð0ØÔ"×/Ò/Ý×'Ò'Ø”Ø”Ø”ñô ð
 ”Ø”]Ø”]Ø”Lð 0ñ 

ô 

ˆð ˆŒØˆŒ
Ø/;Ð/C˜$Ô+Ð+ÈˆŒØ ˆŒØ
�ŠÑÔÐÐÐr=   c                 ól   — t          j        | j        ||||f¬¦  «        }|                     ¦   «          |S )N)ÚtargetÚargs)Ú	threadingÚThreadrý   Ústart)rh   r›   ró   r}   rt   Ú	ws_threads         r;   r¬   z_SparkLLMClient.arun1  sI   € õ Ô$Ø”8àØØØð	ð
ñ 
ô 
ˆ	ð 	�ŠÑÔÐØÐr=   rü   Úerrorc                 óf   — | j                              d|i¦  «         |                     ¦   «          d S )Nr  )rÐ   ÚputÚclose)rh   rü   r  s      r;   rö   z_SparkLLMClient.on_errorD  s,   € ØŒ
�Š˜ Ð'Ñ(Ô(Ð(Ø
�Š‰
Œ
ˆ
ˆ
ˆ
r=   Úclose_status_codeÚclose_reasonc                 ó|   — t                                d||dœi¦  «         | j                             ddi¦  «         d S )NÚlog)r	  r
  ÚdoneT)r‘   ÚdebugrÐ   r  )rh   rü   r	  r
  s       r;   r÷   z_SparkLLMClient.on_closeH  sP   € Ý�ŠàØ):Ø$0ðð ðñ	
ô 	
ð 	
ð 	Œ
�Š˜ �~Ñ&Ô&Ð&Ð&Ð&r=   c                 ó¶   — dddœ| _         t          j        |                      |j        |j        |j        ¬¦  «        ¦  «        }|                     |¦  «         d S )Nr4   r2   rC   )r›   ró   r}   )rÑ   ÚjsonÚdumpsÚ
gen_paramsr›   ró   r}   Úsend)rh   rü   r§   s      r;   rø   z_SparkLLMClient.on_openS  s[   € Ø,.¸Ð DÐ DˆÔÝŒzØ�OŠOØœ¨b¬jÀrÄð ñ ô ñ
ô 
ˆð
 	�Š�‰Œˆˆˆr=   r,   c                 ó0  — t          j        |¦  «        }|d         d         }|dk    rD| j                             dd|› d|d         d         › �i¦  «         |                     ¦   «          d S |d         d	         }|d
         }|d         d         }|                     dd¦  «        }|j        r| j                             d|i¦  «         n)| j        dxx         |z  cc<   d|v r|d         | j        d<   |dk    rœ|j        s!| j                             d| j        i¦  «         |r>|                     di ¦  «                             di ¦  «                             di ¦  «        ni }	| j                             d|	i¦  «         |                     ¦   «          d S d S )NÚheaderÚcoder   r  zCode: z	, Error: r,   ÚpayloadÚchoicesÚstatusÚtextr1   r4   r§   r¨   é   r¶   )r  ÚloadsrÐ   r  r  rD   rt   rÑ   )
rh   rü   r,   r§   r  r  r  Ú
text_chunkr1   Ú
usage_datas
             r;   rõ   z_SparkLLMClient.on_message\  s¿  € ÝŒz˜'Ñ"Ô"ˆØ�HŒ~˜fÔ%ˆØ�1Š9ˆ9ØŒJ�NŠNØÐM 4ÐMÐM°$°x´.ÀÔ2KÐMÐMÐNñô ð ð �HŠH‰JŒJˆJˆJˆJà˜9”o iÔ0ˆGØ˜XÔ&ˆFØ  œ¨Ô+ˆJØ —n’n Y°Ñ3Ô3ˆGØŒ|ð Ø”
—’ ¨
Ð3Ñ4Ô4Ð4Ð4àÔ% iÐ0Ð0Ô0°GÑ;Ð0Ð0Ñ0Ø&¨*Ð4Ð4ØAKØ+ôB�DÔ)Ð*=Ñ>ð ˜Š{ˆ{Ø”|ð DØ”J—N’N F¨DÔ,AÐ#BÑCÔCÐCð ð�D—H’H˜Y¨Ñ+Ô+×/Ò/°¸Ñ<Ô<×@Ò@ÀÈÑLÔLÐLàð ð
 ”
—’ ¨Ð4Ñ5Ô5Ð5Ø—’‘
”
�
�
�
ð ˆ{r=   c                 ó¼   — | j         |dœdd| j        iidd|iidœ}|r!|d         d                              |¦  «         t                               d|› �¦  «         |S )	N)rk   ÚuidÚchatÚdomainr,   r  )r  Ú	parameterr  r#  zSpark Request Parameters: )rk   rˆ   Úupdater‘   r  )rh   r›   ró   r}   r§   s        r;   r  z_SparkLLMClient.gen_params|  s‚   € ð "&¤°WÐ=Ð=Ø  8¨TÔ->Ð"?Ð@Ø! F¨HÐ#5Ð6ð
ð 
ˆð ð 	;Ø�Ô˜fÔ%×,Ò,¨\Ñ:Ô:Ð:Ý�ŠÐ8°$Ð8Ð8Ñ9Ô9Ð9Øˆr=   ru   rv   c              #   óü   K  — 	 	 | j                              |¬¦  «        }n*# t           j        $ r}t          d|› d�¦  «        ‚d }~ww xY wd|v rt	          |d         ¦  «        ‚d|v r|V — Œjd|v rd S d|vrd S |V — Œz)	NTr¦   z-SparkLLMClient wait LLM api response timeout z secondsr  r¶   r  r§   )rÐ   rD   ÚEmptyÚTimeoutErrorÚConnectionError)rh   rv   r1   Ú_s       r;   r­   z_SparkLLMClient.subscribeŠ  sÍ   è è € ð	ðØœ*Ÿ.š.°˜.Ñ9Ô9��øÝ”;ð ð ð Ý"ØUÀGÐUÐUÐUñô ð øøøøðøøøð ˜'Ð!Ð!Ý% g¨gÔ&6Ñ7Ô7Ð7Ø˜'Ð!Ð!Ø���ØØ˜Ð Ð Ø�Ø˜WÐ$Ð$Ø�ØˆMˆMˆMð!	s   …! ¡A°AÁAr¿   )NFr„   )ru   )rÀ   rÁ   rÂ   rÃ   rH   r   rE   rÒ   Ústaticmethodrò   r
   r   rÅ   rý   r  r  r¬   r   rö   rÈ   r÷   rø   rõ   r�   r  r   r­   rY   r=   r;   rŒ   rŒ   É  sž  € € € € € ðð ð "&Ø&*Ø'+ð%ð %àð%ð ð%ð ð	%ð
 ˜#”ð%ð ˜s”mð%ð ˜t”nð%ð %ð %ð %ð8 ð*˜Sð *¨3ð *¸Cð *ÀCð *ð *ð *ñ „\ð*ð` (,Øðð à�t”*ðð ðð ˜t”nð	ð
 ðð 
ðð ð ð ð: (,Øðð à�t”*ðð ðð ˜t”nð	ð
 ðð 
Ô	ðð ð ð ð&˜3ð  x°¤}ð ¸ð ð ð ð ð	'˜3ð 	'°3ð 	'Àcð 	'Èdð 	'ð 	'ð 	'ð 	'ð˜#ð  $ð ð ð ð ð˜Sð ¨3ð °4ð ð ð ð ðB LPðð ØðØ'*ðØ:BÀ4¼.ðà	ðð ð ð ðð  ¨#¤ð ¸	À$ÈÈdÐBRÔ8Sð ð ð ð ð ð r=   rŒ   )Hrä   rá   rÞ   r  ÚloggingrÐ   r  r   r   Útimer   Útypingr   r   r   r	   r
   r   r   r   r   Úurllib.parser   r   r   Úwsgiref.handlersr   Úlangchain_core.callbacksr   Ú*langchain_core.language_models.chat_modelsr   r   Úlangchain_core.messagesr   r   r   r   r   r   r   r   r   r   r    Ú*langchain_core.output_parsers.openai_toolsr!   r"   Úlangchain_core.outputsr#   r$   r%   Úlangchain_core.utilsr&   r'   Úlangchain_core.utils.pydanticr(   Úpydanticr)   r*   r+   Ú	getLoggerrÀ   r‘   r‰   rŠ   rE   r<   rH   rN   rU   rW   rŒ   rY   r=   r;   ú<module>r9     s€  ðØ €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð 5Ð 4Ð 4Ð 4Ð 4Ð 4Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à	ˆÔ	˜8Ñ	$Ô	$€à6€Ø Ð ð [ð °Tð ð ð ð ð4 ? 7¨3°¨8Ô#4ð  ?¸ð  ?ð  ?ð  ?ð  ?ðF2Ø�3˜�8Ôð2Ø-1Ð2BÔ-Cð2àð2ð 2ð 2ð 2ð6u ð u ð u ð u ð u �=ñ u ô u ð u ðp	Rð Rð Rð Rð Rñ Rô Rð Rð Rð Rr=   