§
    šŠtj0&  ã                   ó:  — 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	m
Z
mZmZmZ d dlmZ d dlm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  ej        e ¦  «        Z! G d„ d¦  «        Z" G d„ dee¦  «        Z# G d„ de$¦  «        Z%dS )é    N)Údatetime)Úmktime)ÚAnyÚDictÚListÚLiteralÚOptional)Ú	urlencode)Úformat_date_time)Ú
Embeddings)Úsecret_from_env)Úndarray)Ú	BaseModelÚ
ConfigDictÚFieldÚ	SecretStrc                   ó*   — e Zd ZdZdedededdfd„ZdS )ÚUrlzURL class for parsing the URL.ÚhostÚpathÚschemaÚreturnNc                 ó0   — || _         || _        || _        d S ©N)r   r   r   )Úselfr   r   r   s       úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/embeddings/sparkllm.pyÚ__init__zUrl.__init__%   s   € ØˆŒ	ØˆŒ	ØˆŒØˆó    ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   © r   r   r   r   "   sJ   € € € € € Ø(Ð(ð˜Sð ¨ð °Sð ¸Tð ð ð ð ð ð r   r   c                   ó”  — e Zd ZU dZ ed ed¦  «        ¬¦  «        Zeed<   	  ed edd¬	¦  «        ¬¦  «        Z	e
e         ed
<   	  ed edd¬	¦  «        ¬¦  «        Ze
e         ed<   	  ed¬	¦  «        Zeed<   	  ed¬	¦  «        Zed         ed<   	  ed¬¦  «        Zdee         dede
eee                           fd„Zdee         de
eee                           fd„Zdede
ee                  fd„Ze	 d&dededededef
d „¦   «         Zededefd!„¦   «         Zd"ededeeef         fd#„Zed$ede
e         fd%„¦   «         Z dS )'ÚSparkLLMTextEmbeddingsu  SparkLLM embedding model integration.

    Setup:
        To use, you should have the environment variable "SPARK_APP_ID","SPARK_API_KEY"
        and "SPARK_API_SECRET" set your APP_ID, API_KEY and API_SECRET or pass it
        as a name parameter to the constructor.

        .. code-block:: bash

            export SPARK_APP_ID="your-api-id"
            export SPARK_API_KEY="your-api-key"
            export SPARK_API_SECRET="your-api-secret"

    Key init args â€” completion params:
        api_key: Optional[str]
            Automatically inferred from env var `SPARK_API_KEY` if not provided.
        app_id: Optional[str]
            Automatically inferred from env var `SPARK_APP_ID` if not provided.
        api_secret: Optional[str]
            Automatically inferred from env var `SPARK_API_SECRET` if not provided.
        base_url: Optional[str]
            Base URL path for API requests.

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

    Instantiate:

        .. code-block:: python

            from langchain_community.embeddings import SparkLLMTextEmbeddings

            embed = SparkLLMTextEmbeddings(
                api_key="...",
                app_id="...",
                api_secret="...",
                # other
            )

    Embed single text:
        .. code-block:: python

            input_text = "The meaning of life is 42"
            embed.embed_query(input_text)

        .. code-block:: python

            [-0.4912109375, 0.60595703125, 0.658203125, 0.3037109375, 0.6591796875, 0.60302734375, ...]

    Embed multiple text:
        .. code-block:: python

            input_texts = ["This is a test query1.", "This is a test query2."]
            embed.embed_documents(input_texts)

        .. code-block:: python

            [
                [-0.1962890625, 0.94677734375, 0.7998046875, -0.1971435546875, 0.445556640625, 0.54638671875, ...],
                [  -0.44970703125, 0.06585693359375, 0.7421875, -0.474609375, 0.62353515625, 1.0478515625, ...],
            ]
    Úapp_idÚSPARK_APP_ID)ÚaliasÚdefault_factoryÚspark_app_idÚapi_keyÚSPARK_API_KEYN)ÚdefaultÚspark_api_keyÚ
api_secretÚSPARK_API_SECRETÚspark_api_secretz#https://emb-cn-huabei-1.xf-yun.com/Úbase_urlÚpara)r5   ÚqueryÚdomainT)Úpopulate_by_nameÚtextsr   r   c                 ó2  — d}d}d}| j         r| j                              ¦   «         }| j        r| j                             ¦   «         }| j        r| j                             ¦   «         }|                      |d||¬¦  «        }g }|D ]’}d|ddœgi}	|                      ||	¦  «        }
t          j        ||
ddi¬	¦  «        j        }|  	                    |¦  «        }|�(| 
                    |                     ¦   «         ¦  «         Œ}| 
                    d
¦  «         Œ“|S )aD  Internal method to call Spark Embedding API and return embeddings.

        Args:
            texts: A list of texts to embed.
            host: Base URL path for API requests

        Returns:
            A list of list of floats representing the embeddings,
            or list with value None if an error occurs.
        Ú ÚPOST)Úrequest_urlÚmethodr-   r1   ÚmessagesÚuser)ÚcontentÚrolezcontent-typezapplication/json)ÚjsonÚheadersN)r,   Úget_secret_valuer0   r3   Ú_assemble_ws_auth_urlÚ	_get_bodyÚrequestsÚpostÚtextÚ_parser_messageÚappendÚtolist)r   r9   r   r(   r-   r1   ÚurlÚembed_resultrJ   Úquery_contextrA   ÚresponseÚres_arrs                r   Ú_embedzSparkLLMTextEmbeddings._embedƒ   sW  € ð ˆØˆØˆ
ØÔð 	:ØÔ&×7Ò7Ñ9Ô9ˆFØÔð 	<ØÔ(×9Ò9Ñ;Ô;ˆGØÔ ð 	BØÔ.×?Ò?ÑAÔAˆJØ×(Ò(ØØØØ!ð	 )ñ 
ô 
ˆð  ˆØð 
	*ð 
	*ˆDØ'°dÀFÐ*KÐ*KÐ)LÐMˆMØ—n’n V¨]Ñ;Ô;ˆGÝ”}Ø˜'¨NÐ<NÐ+Oðñ ô äð ð ×*Ò*¨8Ñ4Ô4ˆGØÐ"Ø×#Ò# G§N¢NÑ$4Ô$4Ñ5Ô5Ð5Ð5à×#Ò# DÑ)Ô)Ð)Ð)ØÐr   c                 ó8   — |                       || j        ¦  «        S )zâPublic method to get embeddings for a list of documents.

        Args:
            texts: The list of texts to embed.

        Returns:
            A list of embeddings, one for each text, or None if an error occurs.
        ©rS   r4   )r   r9   s     r   Úembed_documentsz&SparkLLMTextEmbeddings.embed_documents«   s   € ð �{Š{˜5 $¤-Ñ0Ô0Ð0r   rJ   c                 óR   — |                       |g| j        ¦  «        }|�|d         ndS )zÇPublic method to get embedding for a single query text.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text, or None if an error occurs.
        Nr   rU   )r   rJ   Úresults      r   Úembed_queryz"SparkLLMTextEmbeddings.embed_query¶   s.   € ð —’˜d˜V T¤]Ñ3Ô3ˆØ"Ð.ˆv�aŒyˆy°DÐ8r   ÚGETr;   r=   r>   c           	      óÐ  — t                                | ¦  «        }|j        }|j        }t	          j        ¦   «         }t          t          |                     ¦   «         ¦  «        ¦  «        }d 	                    ||||¦  «        }	t          j        |                     d¦  «        |	                     d¦  «        t          j        ¬¦  «                             ¦   «         }
t!          j        |
¦  «                             d¬¦  «        }d|›dd›dd	›d
|›d�	}t!          j        |                     d¦  «        ¦  «                             d¬¦  «        }|||dœ}| dz   t'          |¦  «        z   S )Nz host: {}
date: {}
{} {} HTTP/1.1úutf-8)Ú	digestmod)Úencodingz	api_key="z", algorithm="zhmac-sha256z", headers="zhost date request-linez", signature="ú")r   ÚdateÚauthorizationú?)r'   Ú
_parse_urlr   r   r   Únowr   r   Ú	timetupleÚformatÚhmacÚnewÚencodeÚhashlibÚsha256ÚdigestÚbase64Ú	b64encodeÚdecoder
   )r=   r>   r-   r1   Úur   r   rd   r`   Úsignature_originÚsignature_shaÚsignature_sha_strÚauthorization_originra   Úvaluess                  r   rF   z,SparkLLMTextEmbeddings._assemble_ws_auth_urlÂ   so  € õ #×-Ò-¨kÑ:Ô:ˆØŒvˆØŒvˆÝŒl‰nŒnˆÝ¥ s§}¢}¡¤Ñ 7Ô 7Ñ8Ô8ˆØ?×FÒFØ�$˜ ñ
ô 
Ðõ œØ×Ò˜gÑ&Ô&Ø×#Ò# GÑ,Ô,Ý”nð
ñ 
ô 
÷ Š&‰(Œ(ð	 	õ
 #Ô,¨]Ñ;Ô;×BÒBÈGÐBÑTÔTÐÐð ˆwˆw˜˜˜Ð'?Ð'?Ð'?ÐARÐARÐARðTð 	õ Ô(Ð)=×)DÒ)DÀWÑ)MÔ)MÑNÔN×UÒUØð Vñ 
ô 
ˆð ¨¸}ÐMÐMˆà˜SÑ ¥9¨VÑ#4Ô#4Ñ4Ð4r   c                 ó  — |                       d¦  «        }| |dz   d …         }| d |dz   …         }|                      d¦  «        }|dk    rt          d| z   ¦  «        ‚||d …         }|d |…         }t          |||¦  «        }|S )Nz://é   ú/r   zinvalid request url:)ÚindexÚAssembleHeaderExceptionr   )r=   Ústidxr   r   Úedidxr   rp   s          r   rc   z!SparkLLMTextEmbeddings._parse_urlß   s•   € à×!Ò! %Ñ(Ô(ˆØ˜5 1™9˜;˜;Ô'ˆØ˜[˜u q™y˜[Ô)ˆØ—
’
˜3‘”ˆØ�AŠ:ˆ:Ý)Ð*@À;Ñ*NÑOÔOÐOØ�E�F�FŒ|ˆØ�F�U�FŒ|ˆÝ��d˜FÑ#Ô#ˆØˆr   Úappidc           	      óÌ   — |dddœd| j         ddidœidd	t          j        t          j        |¦  «                             d
¦  «        ¦  «                             ¦   «         iidœ}|S )NÚ39769795890rw   )r(   ÚuidÚstatusÚembr^   Úutf8)r7   Úfeaturer?   rJ   r\   )ÚheaderÚ	parameterÚpayload)r7   rm   rn   rC   Údumpsri   ro   )r   r}   rJ   Úbodys       r   rG   z SparkLLMTextEmbeddings._get_bodyì   s~   € à!&¨}ÈÐJÐJà $¤+¸:ÀvÐ:NÐOÐOðð Ø�FÔ,­T¬Z¸Ñ-=Ô-=×-DÒ-DÀWÑ-MÔ-MÑNÔN×UÒUÑWÔWððð

ð 

ˆð ˆr   Úmessagec                 ó¼  — t          j        | ¦  «        }|d         d         }|dk    r"t                               d|› d|› �¦  «         d S |d         d         d         }t	          j        |¦  «        }t          j        t          j        ¦  «        }| 	                    d	¦  «        }t          j
        ||¬
¦  «        }t          |¦  «        dk    r|d d…         }n|}|S )Nr…   Úcoder   zRequest error: z, r‡   r„   rJ   ú<)Údtypei 
  )rC   ÚloadsÚloggerÚwarningrm   Ú	b64decodeÚnprŽ   Úfloat32ÚnewbyteorderÚ
frombufferÚlen)rŠ   ÚdatarŒ   Ú	text_baseÚ	text_dataÚdtrJ   Úarrays           r   rK   z&SparkLLMTextEmbeddings._parser_messageú   sÕ   € õ Œz˜'Ñ"Ô"ˆØ�HŒ~˜fÔ%ˆØ�1Š9ˆ9Ý�NŠNÐ;¨TÐ;Ð;°TÐ;Ð;Ñ<Ô<Ð<Ø�4à˜Yœ¨	Ô2°6Ô:ˆIÝÔ(¨Ñ3Ô3ˆIÝ”�"œ*Ñ%Ô%ˆBØ—’ Ñ%Ô%ˆBÝ”= °"Ð5Ñ5Ô5ˆDÝ�4‰yŒy˜4ÒÐØ˜U˜d˜Uœ��à�ØˆLr   )rZ   r;   r;   )!r    r!   r"   r#   r   r   r,   r   Ú__annotations__r0   r	   r3   r4   r$   r7   r   r   Úmodel_configr   ÚfloatrS   rV   rY   ÚstaticmethodrF   r   rc   Údictr   r   rG   r   rK   r%   r   r   r'   r'   ,   sÑ  € € € € € € ð<ð <ð| $˜eØ¨¨¸Ñ(GÔ(Gðñ ô €L�)ð ð ñ ð NØ).¨Ø¨¨¸ÐRVÐ)WÑ)WÔ)Wð*ñ *ô *€M�8˜IÔ&ð ð ñ ð OØ,1¨EØØ'˜Ð(:ÀDÐIÑIÔIð-ñ -ô -Ð�h˜yÔ)ð ð ñ ð RØ�EÐ"GÐHÑHÔH€HˆcÐHÐHÑHØ(Ø', u°VÐ'<Ñ'<Ô'<€FˆG�OÔ$Ð<Ð<Ñ<ð2ð �:Øðñ ô €Lð&˜D œIð &¨Sð &°X¸dÀ4ÈÄ;Ô>OÔ5Pð &ð &ð &ð &ðP	1 T¨#¤Yð 	1°8¸DÀÀeÄÔ<MÔ3Nð 	1ð 	1ð 	1ð 	1ð
9 ð 
9¨°°e´Ô(=ð 
9ð 
9ð 
9ð 
9ð àTVð5ð 5Øð5Ø"%ð5Ø8;ð5ØNQð5à	ð5ð 5ð 5ñ „\ð5ð8 ð
 ð 
¨ð 
ð 
ð 
ñ „\ð
ð˜sð ¨$ð °4¸¸S¸´>ð ð ð ð ð ðØðà	�'Ô	ðð ð ñ „\ðð ð r   r'   c                   ó"   — e Zd ZdZdeddfd„ZdS )rz   z3Exception raised for errors in the header assembly.Úmsgr   Nc                 ó   — || _         d S r   )rŠ   )r   r£   s     r   r   z AssembleHeaderException.__init__  s   € ØˆŒˆˆr   r   r%   r   r   rz   rz     s<   € € € € € Ø=Ð=ð˜Cð  Dð ð ð ð ð ð r   rz   )&rm   rj   rg   rC   Úloggingr   Útimer   Útypingr   r   r   r   r	   Úurllib.parser
   Úwsgiref.handlersr   Únumpyr“   rH   Úlangchain_core.embeddingsr   Úlangchain_core.utilsr   r   Úpydanticr   r   r   r   Ú	getLoggerr    r�   r   r'   Ú	Exceptionrz   r%   r   r   ú<module>r°      sÆ  ðØ €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø "Ð "Ð "Ð "Ð "Ð "Ø -Ð -Ð -Ð -Ð -Ð -à Ð Ð Ð Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð Ð Ð Ð Ð Ð Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ð 
ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð ñ ô ð ðað að að að a˜Y¨
ñ aô að aðHð ð ð ð ˜iñ ô ð ð ð r   