
    Ng0&                     :   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       c/var/www/html/ai-engine/env/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9F 	<(99;;G  	B.??AAJ((!	 ) 
 
   
	* 
	*D'dF*K*K)LMMnnV];;G}'N<N+O    **844G"##GNN$4$45555##D))))r   c                 8    |                      || j                  S )zPublic 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 )zPublic 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.     dVT]33".vayyD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lnns}} 7 788?FF$
 
 g&&##G,,n
 
 
 &((	 	
 #,];;BBGBTT ww'?'?'?ARARART 	 ()=)D)DW)M)MNNUU V 
 
 }MMS 9V#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    !!%((519;;'[uqy[)

3A::)*@;*NOOOEFF|FUF|dF##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,TZ-=-=-D-DW-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%199NN;T;;T;;<<<4Y	26:I(33I"*%%B%%B="555D4yy4UdU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* * *M8I&    O,1E'(:DIII- - -hy)    RE"GHHHHcHHH(',uV'<'<'<FGO$<<<2 :  L&DI &S &Xd4;>O5P & & & &P	1T#Y 	18De<M3N 	1 	1 	1 	1
9 
9e(= 
9 
9 
9 
9 TV5 55"%58;5NQ5	5 5 5 \58 
 
 
 
 
 \
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   