o
    Zh                     @  s   d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
 d dlmZ d dlmZmZ er6d dlmZ eeZ	 G dd deeZdS )	    )annotationsN)TYPE_CHECKINGAnyDictListOptional)
Embeddings)	BaseModel
ConfigDict)
Connectionc                      sx   e Zd ZU dZ	 dZded< 	 ded< 	 dZded< d  fd
dZeddZ		 e
d!ddZd"ddZd#ddZ  ZS )$OracleEmbeddingszGet EmbeddingsNr   connzDict[str, Any]paramszOptional[str]proxykwargsc                   s   t  jdi | d S )N )super__init__)selfr   	__class__r   ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/embeddings/oracleai.pyr   %   s   zOracleEmbeddings.__init__Zforbid)extrar   dirstr	onnx_file
model_namereturnNonec              
   C  s   z(| du s|du s|du s|du rt d|  }|jd|||d |  W dS  t yE } ztd|  t  |   d}~ww )zLoad an ONNX model to Oracle Database.
        Args:
            conn: Oracle Connection,
            dir: Oracle Directory,
            onnx_file: ONNX file name,
            model_name: Name of the model.
        NzInvalid inputa  
                begin
                    dbms_data_mining.drop_model(model_name => :model, force => true);
                    SYS.DBMS_VECTOR.load_onnx_model(:path, :filename, :model, 
                        json('{"function" : "embedding", 
                            "embeddingOutput" : "embedding", 
                            "input": {"input": ["DATA"]}}'));
                end;)pathfilenamemodelAn exception occurred :: )	Exceptioncursorexecutecloseloggerinfo	traceback	print_exc)r   r   r   r   r$   exr   r   r   load_onnx_model3   s$    z OracleEmbeddings.load_onnx_modeltexts	List[str]List[List[float]]c              
   C  sX  zddl }W n ty } ztd|d}~ww |du rdS g }znd|j_| j }| jr5|jd| jd g }t|ddD ]\}}||d	}	|	t
|	 q=| jd
}
|
|}|jd|t
| jd |D ]}|du rt|	g  qht
|d }t
|d }|	| qh|  |W S  ty } ztd|  t  |   d}~ww )zCompute doc embeddings using an OracleEmbeddings.
        Args:
            texts: The list of texts to embed.
        Returns:
            List of embeddings, one for each input text.
        r   NzIUnable to import oracledb, please install with `pip install -U oracledb`.Fz&begin utl_http.set_proxy(:proxy); end;)r      )start)Zchunk_idZ
chunk_datazSYS.VECTOR_ARRAY_TzNselect t.* from dbms_vector_chain.utl_to_embeddings(:content, json(:params)) t)contentr   Zembed_vectorr"   )oracledbImportErrordefaultsZ
fetch_lobsr   r$   r   r%   	enumerateappendjsondumpsZgettypeZ	newobjectr   loadsr&   r#   r'   r(   r)   r*   )r   r-   r3   eZ
embeddingsr$   chunksitextchunkZvector_array_typeZinputsrowZrdataZvecr+   r   r   r   embed_documentsZ   s\   



z OracleEmbeddings.embed_documentsr>   List[float]c                 C  s   |  |gd S )zCompute query embedding using an OracleEmbeddings.
        Args:
            text: The text to embed.
        Returns:
            Embedding for the text.
        r   )rA   )r   r>   r   r   r   embed_query   s   zOracleEmbeddings.embed_query)r   r   )
r   r   r   r   r   r   r   r   r   r   )r-   r.   r   r/   )r>   r   r   rB   )__name__
__module____qualname____doc__r   __annotations__r   r   r
   Zmodel_configstaticmethodr,   rA   rC   __classcell__r   r   r   r   r      s"   
 
&>r   )
__future__r   r8   loggingr)   typingr   r   r   r   r   Zlangchain_core.embeddingsr   Zpydanticr	   r
   r3   r   	getLoggerrD   r'   r   r   r   r   r   <module>   s   
 
