o
    ¤ƒÖi“  ã                   @   sB   d dl Z d dlmZ ddlmZ d dlZd dlZG dd„ dƒZdS )é    N)Úsettingsé   )ÚGeminiClientc                   @   s8   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zddd„ZdS )Ú
RAGServicec                 C   sd   t ƒ | _tjd | _d| jd › d| jd › d| jd › d| jd	 › d
| jd › d| _|  ¡  d S )NÚ	vector_dbzdbname='ÚNAMEz' user='ÚUSERz' host='ÚHOSTz' password='ÚPASSWORDz' port='ÚPORTú')r   Úclientr   Ú	DATABASESÚ	db_configÚconn_stringÚ_init_db©Úself© r   ú1/var/www/html/crm_dreinet/ai_agent/rag_service.pyÚ__init__   s   DzRAGService.__init__c                 C   s   t  | j¡S ©N)Úpsycopg2Úconnectr   r   r   r   r   Ú_get_connection   s   zRAGService._get_connectionc              
   C   sx   z!|   ¡ }| ¡ }| d¡ | d¡ | ¡  | ¡  | ¡  W dS  ty; } ztd|› ƒ W Y d}~dS d}~ww )z:Initializes the vector database schema if it doesn't existz&CREATE EXTENSION IF NOT EXISTS vector;a6  
                CREATE TABLE IF NOT EXISTS documents (
                    id SERIAL PRIMARY KEY,
                    content TEXT,
                    metadata JSONB,
                    embedding vector(768),
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                );
            zError initializing DB: N)r   ÚcursorÚexecuteÚcommitÚcloseÚ	ExceptionÚprint)r   ÚconnÚcurÚer   r   r   r      s   

€ÿzRAGService._init_dbNc                 C   sP   | j  |¡}|  ¡ }| ¡ }| d|t |¡|f¡ | ¡  | ¡  | ¡  dS )z%Adds a document to the knowledge basezHINSERT INTO documents (content, metadata, embedding) VALUES (%s, %s, %s)N)	r   Ú
embed_textr   r   r   ÚjsonÚdumpsr   r   )r   ÚtextÚmetadataÚ	embeddingr!   r"   r   r   r   Úadd_document0   s   þzRAGService.add_documenté   c                 C   sT   | j  |¡}|  ¡ }| ¡ }| d|||f¡ | ¡ }| ¡  | ¡  dd„ |D ƒS )zSearches for similar documentszº
            SELECT content, metadata, 1 - (embedding <=> %s::vector) as similarity
            FROM documents
            ORDER BY embedding <=> %s::vector
            LIMIT %s
        c                 S   s$   g | ]}|d  |d |d dœ‘qS )r   r   é   )Úcontentr(   Úscorer   )Ú.0Úrr   r   r   Ú
<listcomp>S   s   $ z%RAGService.search.<locals>.<listcomp>)r   Úembed_queryr   r   r   Úfetchallr   )r   ÚqueryÚlimitr)   r!   r"   Úresultsr   r   r   Úsearch@   s   ûzRAGService.searchr   )r+   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r*   r7   r   r   r   r   r      s    
r   )	r   Údjango.confr   Úgemini_clientr   ÚnumpyÚnpr%   r   r   r   r   r   Ú<module>   s    