Ë
    µŒjo>  ã                  ó:  — d dl m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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 d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dl m!Z!m"Z" d dl#m$Z$  ejJ                  e&«      Z' G d„ de«      Z( G d„ d«      Z)y)é    )ÚannotationsN)Údatetime)ÚQueue)Úmktime)ÚAnyÚDictÚ	GeneratorÚIteratorÚListÚOptional)Ú	urlencodeÚurlparseÚ
urlunparse)Úformat_date_time)ÚCallbackManagerForLLMRun)ÚLLM)ÚGenerationChunk)Úget_from_dict_or_envÚpre_init)ÚFieldc                  ó²  — e Zd ZU dZdZded<    edd¬«      Zded<   	  edd	¬«      Zded
<   	  edd¬«      Z	ded<   	  edd¬«      Z
ded<   	  edd¬«      Zded<   	 dZded<   dZded<   	  edd¬«      Zded<   	 dZded<   	 dZded<   	  ee¬ «      Zd!ed"<   	 ed(d#„«       Zed)d$„«       Zed*d%„«       Z	 	 d+	 	 	 	 	 	 	 	 	 d,d&„Z	 	 d+	 	 	 	 	 	 	 	 	 d-d'„Zy).ÚSparkLLMuT  iFlyTek Spark completion model integration.

    Setup:
        To use, you should set environment variables ``IFLYTEK_SPARK_APP_ID``,
        ``IFLYTEK_SPARK_API_KEY`` and ``IFLYTEK_SPARK_API_SECRET``.

    .. code-block:: bash

            export IFLYTEK_SPARK_APP_ID="your-app-id"
            export IFLYTEK_SPARK_API_KEY="your-api-key"
            export IFLYTEK_SPARK_API_SECRET="your-api-secret"

    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:
        app_id: Optional[str]
            IFLYTEK SPARK API KEY. Automatically inferred from env var `IFLYTEK_SPARK_APP_ID` if not provided.
        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.llms import SparkLLM

            llm = SparkLLM(
                app_id="your-app-id",
                api_key="your-api_key",
                api_secret="your-api-secret",
                # model='Spark4.0 Ultra',
                # temperature=...,
                # 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

            'ç”Ÿå‘½çš„æ„�ä¹‰åœ¨äºŽå®žçŽ°è‡ªæˆ‘ä»·å€¼ï¼Œè¿½æ±‚å†…å¿ƒçš„å¹³é�™ä¸Žå¿«ä¹�ï¼Œå�Œæ—¶ä¸ºä»–äººå’Œç¤¾ä¼šå¸¦æ�¥æ­£é�¢å½±å“�ã€‚'

    Nr   ÚclientÚapp_id)ÚdefaultÚaliasúOptional[str]Úspark_app_idÚapi_keyÚspark_api_keyÚ
api_secretÚspark_api_secretÚapi_urlÚspark_api_urlÚmodelÚspark_llm_domainÚlc_userÚstrÚspark_user_idFÚboolÚ	streamingé   ÚtimeoutÚintÚrequest_timeoutg      à?ÚfloatÚtemperatureé   Útop_k)Údefault_factoryúDict[str, Any]Úmodel_kwargsc           	     ón  — t        |ddgd«      |d<   t        |ddgd«      |d<   t        |ddgd	«      |d<   t        |d
dgdd«      |d
<   t        |ddgdd«      |d<   |d   xs | j                  |d   d<   |d   xs | j                  |d   d<   t        |d   |d   |d   |d
   |d   |d   ¬«      |d<   |S )Nr   r   ÚIFLYTEK_SPARK_APP_IDr    r   ÚIFLYTEK_SPARK_API_KEYr"   r!   ÚIFLYTEK_SPARK_API_SECRETr$   r#   ÚIFLYTEK_SPARK_API_URLú$wss://spark-api.xf-yun.com/v3.5/chatr&   r%   ÚIFLYTEK_SPARK_LLM_DOMAINúgeneralv3.5r1   r6   r3   )r   r   r!   r#   Úspark_domainr6   r   )r   r1   r3   Ú_SparkLLMClient)ÚclsÚvaluess     úk/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/llms/sparkllm.pyÚvalidate_environmentzSparkLLM.validate_environmentŽ   s&  € ä!5ØØ˜XÐ&Ø"ó"
ˆˆ~Ñô
 #7ØØ˜iÐ(Ø#ó#
ˆˆÑô
 &:ØØ Ð.Ø&ó&
ˆÐ!Ñ"ô
 #7ØØ˜iÐ(Ø#Ø2ó	#
ˆˆÑô &:ØØ Ð)Ø&Øó	&
ˆÐ!Ñ"ð 17°}Ñ0EÒ0XÈÏÉˆˆ~Ñ˜}Ñ-Ø*0°©/Ò*F¸S¿Y¹Yˆˆ~Ñ˜wÑ'ä*Ø˜.Ñ)Ø˜?Ñ+ØÐ0Ñ1Ø˜?Ñ+ØÐ 2Ñ3Ø Ñ/ô
ˆˆxÑð ˆó    c                 ó   — y)zReturn type of llm.zspark-llm-chat© )Úselfs    rC   Ú	_llm_typezSparkLLM._llm_type¹   s   € ð  rE   c                ó–   — | j                   | j                  | j                  | j                  | j                  dœ}i |¥| j
                  ¥S )z4Get the default parameters for calling SparkLLM API.)r&   Ústreamr/   r3   r1   )r&   r+   r/   r3   r1   r6   )rH   Únormal_paramss     rC   Ú_default_paramszSparkLLM._default_params¾   sL   € ð !%× 5Ñ 5Ø—n‘nØ#×3Ñ3Ø—Z‘ZØ×+Ñ+ñ
ˆð 6�-Ð5 4×#4Ñ#4Ð5Ð5rE   c                ól  — | j                   r-d} | j                  |||fi |¤ŽD ]  }||j                  z  }Œ |S d}| j                  j	                  d|dœg| j
                  | j                  | j                   «       | j                  j                  | j                  ¬«      D ]  }d|vrŒ|d   d   }Œ |S )av  Call out to an sparkllm for each generation with a prompt.
        Args:
            prompt: The prompt to pass into the model.
            stop: Optional list of stop words to use when generating.
        Returns:
            The string generated by the llm.

        Example:
            .. code-block:: python
                response = client("Tell me a joke.")
        Ú Úuser©ÚroleÚcontent©r-   ÚdatarS   )	r+   Ú_streamÚtextr   Úarunr)   r6   Ú	subscriber/   )rH   ÚpromptÚstopÚrun_managerÚkwargsÚ
completionÚchunkrS   s           rC   Ú_callzSparkLLM._callË   sÄ   € ð$ �>Š>ØˆJØ%˜Ÿ™ f¨d°KÑJÀ6ÔJ�Ø˜eŸj™jÑ(‘
ð KàÐØˆ
Ø�‰×ÑØ¨Ñ0Ð1Ø×ÑØ×ÑØ�N‰Nô		
ð —{‘{×,Ñ,°T×5IÑ5IÐ,ÖJˆGØ˜WÑ$ØØ  ™¨Ñ3‰Jð Kð
 ÐrE   c              +  ó*  K  — | j                   j                  d|dœg| j                  | j                  d«       | j                   j	                  | j
                  ¬«      D ]0  }d|vrŒ|d   }|r|j                  |«       t        |d   ¬«      –— Œ2 y ­w)NrP   rQ   TrT   rU   rS   )rW   )r   Úrunr)   r6   rY   r/   Úon_llm_new_tokenr   )rH   rZ   r[   r\   r]   rS   Údeltas          rC   rV   zSparkLLM._streamð   s’   è ø€ ð 	�‰�‰Ø¨Ñ0Ð1Ø×ÑØ×ÑØô		
ð —{‘{×,Ñ,°T×5IÑ5IÐ,ÖJˆGØ˜WÑ$ØØ˜F‘OˆEÙØ×,Ñ,¨UÔ3Ü! u¨YÑ'7Ô8Ó8ñ Kùs   ‚BB)rB   r   Úreturnr   )re   r(   )re   r5   )NN)
rZ   r(   r[   úOptional[List[str]]r\   ú"Optional[CallbackManagerForLLMRun]r]   r   re   r(   )
rZ   r(   r[   rf   r\   rg   r]   r   re   zIterator[GenerationChunk])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r    r"   r$   r&   r)   r+   r/   r1   r3   Údictr6   r   rD   ÚpropertyrI   rM   r`   rV   rG   rE   rC   r   r      s�  … ñVðp €FˆCÓÙ"'°¸HÔ"E€L�-ÓEðá#(°¸YÔ#G€M�=ÓGð*á&+°DÀÔ&MÐ�mÓMð-á#(°¸YÔ#G€M�=ÓGðá&+°DÀÔ&HÐ�mÓHØØ"€M�3Ó"Ø€IˆtÓØ/Ù ¨°9Ô=€O�SÓ=Ø0Ø€K�ÓØ+Ø€Eˆ3ƒNØ.Ù#(¸Ô#>€L�.Ó>ØQàò(ó ð(ðT ò ó ð ð ò
6ó ð
6ð %)Ø:>ð	#àð#ð "ð#ð 8ð	#ð
 ð#ð 
ó#ðP %)Ø:>ð	9àð9ð "ð9ð 8ð	9ð
 ð9ð 
#ô9rE   r   c                  óÌ   — e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Z	 	 d	 	 	 	 	 	 	 	 	 dd„Z	 	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Z	dd„Z
dd	„Zdd
„Z	 d	 	 	 	 	 	 	 dd„Zddd„Zy)r@   z�
    Use websocket-client to call the SparkLLM interface provided by Xfyun,
    which is the iFlyTek's open platform for AI capabilities
    Nc                óâ   — 	 dd l }|| _        |sdn|| _        || _        || _        |xs d| _        t        «       | _        dddœ| _	        || _
        || _        y # t        $ r t        d«      ‚w xY w)Nr   zhCould not import websocket client python package. Please install it with `pip install websocket-client`.r<   r>   rO   Ú	assistant©rS   rR   )Ú	websocketÚwebsocket_clientÚImportErrorr#   r   r6   r?   r   ÚqueueÚblocking_messager   r!   )rH   r   r   r!   r#   r?   r6   rs   s           rC   Ú__init__z_SparkLLMClient.__init__  sŠ   € ð	Ûà$-ˆDÔ!ñ ;BÑ2Àwð 	Œð ˆŒØ(ˆÔØ(Ò9¨MˆÔÜ"'£'ˆŒ
Ø,.¸Ñ DˆÔØˆŒØ$ˆ�øô ò 	ÜðIóð ð	ús   ‚A ÁA.c                óÜ  — t        t        t        j                  «       j	                  «       «      «      }t        | «      }|j                  }|j                  }d|› d|› d|› d�}t        j                  |j                  d«      |j                  d«      t        j                  ¬«      j                  «       }t        j                  |«      j!                  d¬«      }	d|› d	|	› d
�}
t        j                  |
j                  d«      «      j!                  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)r#   r   r!   r~   Ú
parsed_urlr   rƒ   Úsignature_originÚsignature_shaÚsignature_sha_base64Úauthorization_originr}   Úparams_dictÚencoded_paramsÚurls                  rC   Ú_create_urlz_SparkLLMClient._create_url*  sf  € ô  ¤¤x§|¡|£~×'?Ñ'?Ó'AÓ BÓCˆô ˜gÓ&ˆ
Ø× Ñ ˆØ�‰ˆà# D 6¨°$°°v¸d¸VÀ9ÐMÐô Ÿ™Ø×Ñ˜gÓ&Ø×#Ñ# GÓ,Ü—n‘nô
÷ ‰&‹(ð	 	ô  &×/Ñ/°Ó>×EÑEÈwÐEÓWÐà!*¨7¨)ð 46Ø6JÐ5KÈ1ð NÐä×(Ñ(Ð)=×)DÑ)DÀWÓ)MÓN×UÑUØð Vó 
ˆð
 )6¸tÈTÑRˆÜ" ;Ó/ˆÜà×!Ñ!Ø×!Ñ!Ø—‘Ø×!Ñ!ØØ×#Ñ#ðó	
ˆð ˆ
rE   c                ó¤  — | j                   j                  d«       | j                   j                  t        j	                  | j
                  | j                  | j                  «      | j                  | j                  | j                  | j                  ¬«      }||_        ||_        |€| j                  n||_        ||_        |j!                  «        y )NF)Ú
on_messageÚon_errorÚon_closeÚon_open)rt   ÚenableTraceÚWebSocketAppr@   r˜   r#   r   r!   rš   r›   rœ   r�   ÚmessagesÚuser_idr6   r+   Úrun_forever)rH   r    r¡   r6   r+   Úwss         rC   rb   z_SparkLLMClient.runW  s©   € ð 	×Ñ×)Ñ)¨%Ô0Ø×"Ñ"×/Ñ/Ü×'Ñ'Ø—‘Ø—‘Ø—‘óð
 —‘Ø—]‘]Ø—]‘]Ø—L‘Lð 0ó 

ˆð ˆŒØˆŒ
Ø/;Ð/C˜$×+Ò+ÈˆŒØ ˆŒØ
�‰ÕrE   c                óp   — t        j                  | j                  ||||f¬«      }|j                  «        |S )N)ÚtargetÚargs)Ú	threadingÚThreadrb   Ústart)rH   r    r¡   r6   r+   Ú	ws_threads         rC   rX   z_SparkLLMClient.arunp  s>   € ô ×$Ñ$Ø—8‘8àØØØð	ô
ˆ	ð 	�‰ÔØÐrE   c                ó^   — | j                   j                  d|i«       |j                  «        y )NÚerror)rv   ÚputÚclose)rH   r£   r¬   s      rC   r›   z_SparkLLMClient.on_errorƒ  s    € Ø�
‰
�‰˜ Ð'Ô(Ø
�‰�
rE   c                ór   — t         j                  d||dœi«       | j                  j                  ddi«       y )NÚlog)Úclose_status_codeÚclose_reasonÚdoneT)ÚloggerÚdebugrv   r­   )rH   r£   r±   r²   s       rC   rœ   z_SparkLLMClient.on_close‡  s7   € Ü�‰àØ):Ø$0ñðô	
ð 	�
‰
�‰˜ �~Õ&rE   c                óÄ   — dddœ| _         t        j                  | j                  |j                  |j
                  |j                  ¬«      «      }|j                  |«       y )NrO   rq   rr   )r    r¡   r6   )rw   ÚjsonÚdumpsÚ
gen_paramsr    r¡   r6   Úsend)rH   r£   rU   s      rC   r�   z_SparkLLMClient.on_open’  sN   € Ø,.¸Ñ DˆÔÜ�z‰zØ�O‰OØŸ™¨b¯j©jÀrÇÁð ó ó
ˆð
 	�‰��rE   c                ó²  — t        j                  |«      }|d   d   }|dk7  r:| j                  j                  dd|› d|d   d   › �i«       |j	                  «        y |d   d	   }|d
   }|d   d   d   }|j
                  r$| j                  j                  d|d   d   i«       n| j                  dxx   |z  cc<   |dk(  r—|j
                  s'| j                  j                  d| j                  i«       |r2|j                  di «      j                  di «      j                  di «      ni }| j                  j                  d|i«       |j	                  «        y y )NÚheaderÚcoder   r¬   zCode: z	, Error: ÚmessageÚpayloadÚchoicesÚstatusrW   rS   rU   é   Úusage)r·   Úloadsrv   r­   r®   r+   rw   Úget)	rH   r£   r¾   rU   r½   rÀ   rÁ   rS   Ú
usage_datas	            rC   rš   z_SparkLLMClient.on_message›  sJ  € Ü�z‰z˜'Ó"ˆØ�H‰~˜fÑ%ˆØ�1Š9Ø�J‰J�N‰NØ˜F 4 &¨	°$°x±.ÀÑ2KÐ1LÐMÐNôð �H‰H�Jà˜9‘o iÑ0ˆGØ˜XÑ&ˆFØ˜f‘o aÑ(¨Ñ3ˆGØ�|Š|Ø—
‘
—‘ ¨°©¸Ñ(:Ð;Õ<à×%Ñ% iÓ0°GÑ;Ó0Ø˜Š{Ø—|’|Ø—J‘J—N‘N F¨D×,AÑ,AÐ#BÔCñ ð —H‘H˜Y¨Ó+×/Ñ/°¸Ó<×@Ñ@ÀÈÔLàð ð
 —
‘
—‘ ¨Ð4Ô5Ø—‘•
ð rE   c                ó²   — | j                   |dœdd| j                  iidd|iidœ}|r|d   d   j                  |«       t        j	                  d|› �«       |S )	N)r   ÚuidÚchatÚdomainr¾   rW   )r¼   Ú	parameterr¿   rË   zSpark Request Parameters: )r   r?   Úupdater´   rµ   )rH   r    r¡   r6   rU   s        rC   r¹   z_SparkLLMClient.gen_params¶  sm   € ð "&§¡°WÑ=Ø  8¨T×->Ñ->Ð"?Ð@Ø! F¨HÐ#5Ð6ñ
ˆñ Ø�Ñ˜fÑ%×,Ñ,¨\Ô:Ü�‰Ð1°$°Ð8Ô9ØˆrE   c              #  óî   K  — 	 	 | j                   j                  |¬«      }d|v rt	        |d   «      ‚d|v r|–— Œ9d|v ry d|vry |–— ŒG# t         j                  $ r}t        d|› d�«      ‚d }~ww xY w­w)NrT   z-SparkLLMClient wait LLM api response timeout z secondsr¬   rÃ   r³   rU   )rv   rÅ   ÚEmptyÚTimeoutErrorÚConnectionError)rH   r-   rS   Ú_s       rC   rY   z_SparkLLMClient.subscribeÄ  sš   è ø€ ØðØŸ*™*Ÿ.™.°˜.Ó9�ð
 ˜'Ñ!Ü% g¨gÑ&6Ó7Ð7Ø˜'Ñ!Ø’ØØ˜Ñ ØØ˜WÑ$ØØŠMð! øô —;‘;ò Ü"ØCÀGÀ9ÈHÐUóð ûðüs'   ‚A5…A ¡*A5ÁA2ÁA-Á-A2Á2A5)NNN)r   r(   r   r(   r!   r(   r#   r   r?   r   r6   úOptional[dict])r#   r(   r   r(   r!   r(   re   r(   )NF)
r    ú
List[Dict]r¡   r(   r6   rÒ   r+   r*   re   ÚNone)
r    rÓ   r¡   r(   r6   rÒ   r+   r*   re   zthreading.Thread)r£   r   r¬   zOptional[Any]re   rÔ   )r£   r   r±   r.   r²   r(   re   rÔ   )r£   r   re   rÔ   )r£   r   r¾   r(   re   rÔ   )N)r    Úlistr¡   r(   r6   rÒ   re   rm   )r,   )r-   zOptional[int]re   zGenerator[Dict, None, None])rh   ri   rj   rk   rx   Ústaticmethodr˜   rb   rX   r›   rœ   r�   rš   r¹   rY   rG   rE   rC   r@   r@     s%  „ ñð "&Ø&*Ø'+ð%àð%ð ð%ð ð	%ð
 ð%ð $ð%ð %ó%ð< ò*ó ð*ð` (,Øðàðð ðð %ð	ð
 ðð 
óð: (,Øðàðð ðð %ð	ð
 ðð 
óó&ó	'óóð8 LPðØðØ'*ðØ:Hðà	óõrE   r@   )*Ú
__future__r   rŠ   r‡   r„   r·   Úloggingrv   r§   r   r   Útimer   Útypingr   r   r	   r
   r   r   Úurllib.parser   r   r   Úwsgiref.handlersr   Úlangchain_core.callbacksr   Ú#langchain_core.language_models.llmsr   Úlangchain_core.outputsr   Úlangchain_core.utilsr   r   Úpydanticr   Ú	getLoggerrh   r´   r   r@   rG   rE   rC   Ú<module>rã      sq   ðÝ "ã Û Û Û Û Û Û Ý Ý Ý ß A× Aß 8Ñ 8Ý -å =Ý 3Ý 2ß ?Ý à	ˆ×	Ñ	˜8Ó	$€ôi9ˆsô i9÷XOò OrE   