a
    bg                     @  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rld 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                      s   e Zd ZU dZdZded< ded< dZded< dd	 fd
dZeddZ	e
ddddddddZdddddZdddddZ  ZS )OracleEmbeddingszGet EmbeddingsNr   connzDict[str, Any]paramszOptional[str]proxy)kwargsc                   s   t  jf i | d S )N)super__init__)selfr   	__class__ u/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/embeddings/oracleai.pyr   %   s    zOracleEmbeddings.__init__Zforbid)extrar   strNone)r   dir	onnx_file
model_namereturnc              
   C  s   zN| du s"|du s"|du s"|du r*t d|  }|jd|||d |  W nF t y } z.td|  t  |   W Y d}~n
d}~0 0 dS )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_modelz	List[str]zList[List[float]])textsr   c              
   C  sv  zddl }W n. ty: } ztd|W Y d}~n
d}~0 0 |du rHdS g }zd|j_| j }| jrv|jd| jd g }t|ddD ]"\}}||d	}	|	t
|	 q| jd
}
|
|}|jd|t
| jd |D ]>}|du r|	g  qt
|d }t
|d }|	| q|  |W S  typ } z.td|  t  |   W Y d}~n
d}~0 0 dS )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-   r1   eZ
embeddingsr$   chunksitextchunkZvector_array_typeinputsrowZrdataZvecr+   r   r   r   embed_documentsZ   sT    



z OracleEmbeddings.embed_documentszList[float])r<   r   c                 C  s   |  |gd S )zCompute query embedding using an OracleEmbeddings.
        Args:
            text: The text to embed.
        Returns:
            Embedding for the text.
        r   )r@   )r   r<   r   r   r   embed_query   s    zOracleEmbeddings.embed_query)__name__
__module____qualname____doc__r   __annotations__r   r   r
   Zmodel_configstaticmethodr,   r@   rA   __classcell__r   r   r   r   r      s   
&>r   )
__future__r   r6   loggingr)   typingr   r   r   r   r   Zlangchain_core.embeddingsr   Zpydanticr	   r
   r1   r   	getLoggerrB   r'   r   r   r   r   r   <module>	   s   
 
