
    7|h0&                     *   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%y)    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y)UrlzURL class for parsing the URL.hostpathschemareturnNc                 .    || _         || _        || _        y N)r   r   r   )selfr   r   r   s       f/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/embeddings/sparkllm.py__init__zUrl.__init__%   s    		    __name__
__module____qualname____doc__strr    r   r   r   r   "   s&    (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 y)%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                 6   d}d}d}| j                   r| j                   j                         }| j                  r| j                  j                         }| j                  r| j                  j                         }| j	                  |d||      }g }|D ]  }d|ddgi}	| j                  ||	      }
t        j                  ||
ddi	      j                  }| j                  |      }| |j                  |j                                t|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   s)    
&&779F((99;G  ..??AJ((!	 ) 
   
	*D'dF*K)LMMnnV];G}}'N<N+Od  **84G"##GNN$45##D)
	* r   c                 :    | j                  || 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0r   rJ   c                 N    | j                  |g| j                        }||d   S 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".vay8D8r   r=   r>   c           	         t         j                  |       }|j                  }|j                  }t	        j
                         }t        t        |j                                     }dj                  ||||      }	t        j                  |j                  d      |	j                  d      t        j                        j                         }
t!        j"                  |
      j%                  d      }d|dddd	d
|d	}t!        j"                  |j                  d            j%                  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   rc   r_   signature_originsignature_shasignature_sha_strauthorization_originr`   valuess                  r   rF   z,SparkLLMTextEmbeddings._assemble_ws_auth_url   s-    #--k:vvvvllns}} 78?FF$
 g&##G,nn
 &(	 	
 #,,];BBGBT '?ART 	 (()=)D)DW)MNUU V 
 }MS 9V#444r   c                     | j                  d      }| |dz   d  }| d |dz    }|j                  d      }|dk  rt        d| z         ||d  }|d | }t        |||      }|S )Nz://   /r   zinvalid request url:)indexAssembleHeaderExceptionr   )r=   stidxr   r   edidxr   ro   s          r   rb   z!SparkLLMTextEmbeddings._parse_url   s    !!%(519;'[uqy)

3A:)*@;*NOOEF|FU|dF#r   appidc           	          |dddd| j                   ddididd	t        j                  t        j                  |      j                  d
            j                         iid}|S )N39769795890rv   )r(   uidstatusembr]   utf8)r7   featurer?   rJ   r[   )header	parameterpayload)r7   rl   rm   rC   dumpsrh   rn   )r   r|   rJ   bodys       r   rG   z SparkLLMTextEmbeddings._get_body   sn    !&}J$++:v:NO F,,TZZ-=-D-DW-MNUUW

 r   messagec                    t        j                  |       }|d   d   }|dk7  rt        j                  d| d|        y |d   d   d   }t	        j
                  |      }t        j                  t        j                        }|j                  d	      }t        j                  ||
      }t        |      dkD  r|d d }|S |}|S )Nr   coder   zRequest error: z, r   r   rJ   <)dtypei 
  )rC   loadsloggerwarningrl   	b64decodenpr   float32newbyteorder
frombufferlen)r   datar   	text_base	text_datadtrJ   arrays           r   rK   z&SparkLLMTextEmbeddings._parser_message   s     zz'"H~f%19NN_TF"TF;<Y	26:I((3I"**%B%B=="5D4y4Ud L Lr   )GETr;   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   rb   dictr   r   rG   r   rK   r%   r   r   r'   r'   ,   s   <| $(GL)  N).RV)W*M8I&  O,1'(:DI-hy)  R"GHHcH(',V'<FGO$<2 L&DI &S &Xd4;>O5P &P	1T#Y 	18De<M3N 	1
9 
9e(= 
9 TV55"%58;5NQ5	5 58 
 
 
 
s $ 4S>  	'	 r   r'   c                        e Zd ZdZdeddfdZy)ry   z3Exception raised for errors in the header assembly.msgr   Nc                     || _         y r   )r   )r   r   s     r   r   z AssembleHeaderException.__init__  s	    r   r   r%   r   r   ry   ry     s    =C D r   ry   )&rl   ri   rf   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'   	Exceptionry   r%   r   r   <module>r      sz           5 5 " -   0  < < 
		8	$ aY
 aHi r   