U
    h                     @  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 erhd 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)
Connectionc                      s   e Zd ZU dZded< ded< dZded< dd	 fd
dZG d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 Embeddingsr   connzDict[str, Any]paramsNzOptional[str]proxy)kwargsc                   s   t  jf | d S )N)super__init__)selfr   	__class__ K/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/embeddings/oracleai.pyr   %   s    zOracleEmbeddings.__init__c                   @  s   e Zd ZdZdS )zOracleEmbeddings.ConfigZforbidN)__name__
__module____qualname__extrar   r   r   r   Config(   s   r   r
   strNone)r   dir	onnx_file
model_namereturnc              
   C  s   zN| dks"|dks"|dks"|dkr*t d|  }|jd|||d |  W nD t k
r } z&td|  t  |   W 5 d}~X Y nX 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_model2   s      z OracleEmbeddings.load_onnx_modelz	List[str]zList[List[float]])textsr!   c              
   C  sr  zddl }W n, tk
r8 } ztd|W 5 d}~X Y nX |dkrFdS g }zd|j_| j }| jrt|jd| jd g }t|ddD ]"\}}||d	}	|	t
|	 q| jd
}
|
|}|jd|t
| jd |D ]>}|dkr|	g  qt
|d }t
|d }|	| q|  |W S  tk
rl } z&td|  t  |   W 5 d}~X Y nX 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   r0   r4   eZ
embeddingsr'   chunksitextchunkZvector_array_typeinputsrowZrdataZvecr.   r   r   r   embed_documentsY   sV    
 


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   )rC   )r   r?   r   r   r   embed_query   s    zOracleEmbeddings.embed_query)r   r   r   __doc____annotations__r   r   r   staticmethodr/   rC   rD   __classcell__r   r   r   r   r      s   

&>r   )
__future__r   r9   loggingr,   typingr   r   r   r   r   Zlangchain_core.embeddingsr   Zlangchain_core.pydantic_v1r	   r4   r
   	getLoggerr   r*   r   r   r   r   r   <module>	   s   
 	