
    3fi0                        d Z ddlmZ ddl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ZddlmZ ddlmZ ddlmZmZ ddlmZ  G d	 d
e      Z G d de      Zy)z(Wrapper around LLMRails vector database.    )annotationsN)AnyIterableListOptionalTuple)Document)
Embeddings)VectorStoreVectorStoreRetriever)Fieldc                      e Zd ZdZ	 	 d	 	 	 ddZddZ	 d	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZ	e
	 	 d	 	 	 	 	 	 	 	 	 dd	       Zdd
Zy)LLMRailsaK  Implementation of Vector Store using LLMRails.

     See https://llmrails.com/

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import LLMRails

            vectorstore = LLMRails(
                api_key=llm_rails_api_key,
                datastore_id=datastore_id
            )
    Nc                4   |xs t         j                  j                  d      | _        |xs t         j                  j                  d      | _        | j                  t        j                  d       t        j                         | _	        || _
        d| _        y)zInitialize with LLMRails API.LLM_RAILS_DATASTORE_IDLLM_RAILS_API_KEYNz,Can't find Rails credentials in environment.zhttps://api.llmrails.com/v1)osenvironget_datastore_id_api_keyloggingwarningrequestsSession_sessiondatastore_idbase_url)selfr   api_keys      h/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/vectorstores/llm_rails.py__init__zLLMRails.__init__"   so     *URZZ^^<T-UF2::>>2E#F== OOJK ((*(5    c                    d| j                   iS )z=Returns headers that should be attached to each post request.z	X-API-KEY)r   )r   s    r!   _get_post_headerszLLMRails._get_post_headers1   s    T]]++r#   c                   g }|D ]  }t        t        j                               }| j                  j	                  | j
                   d| j                   d||dd| j                               }|j                  dk7  rCt        j                  d| d|j                   d	|j                   d
|j                          |c S |j                  |        |S )zRun more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.

        Returns:
            List of ids from adding the texts into the vectorstore.

        /datastores/z/text)nametextT)jsonverifyheaders   z%Create request failed for doc_name =  with status code 	, reason , text )struuiduuid4r   postr   r   r%   status_coder   errorreasonr)   append)r   texts	metadataskwargsnamesr)   doc_nameresponses           r!   	add_textszLLMRails.add_texts5   s      	#D4::<(H}}))==/d.@.@-AG&5..0	 * H ##s*;H:EW++,Ihoo5Fg}}o' LL"%	#( r#   c           
     @   g }|D ]w  }t         j                  j                  |      st        j                  d| d       <|j                  dt         j                  j                  |      t        |d      ff       y | j                  j                  | j                   d| j                   d|d| j                               }|j                  d	k7  rJt        j                  d
| j                   d|j                   d|j                   d|j                          yy)a  
        LLMRails provides a way to add documents directly via our API where
        pre-processing and chunking occurs internally in an optimal way
        This method provides a way to use that API in LangChain

        Args:
            files_list: Iterable of strings, each representing a local file path.
                    Files could be text, HTML, PDF, markdown, doc/docx, ppt/pptx, etc.
                    see API docs for full list

        Returns:
            List of ids associated with each of the files indexed
        zFile z does not exist, skippingfilerbr'   z/fileT)filesr+   r,   r-   z&Create request failed for datastore = r.   r/   r0   F)r   pathexistsr   r6   r8   basenameopenr   r4   r   r   r%   r5   r7   r)   )r   
files_listr:   r;   rC   rA   r>   s          r!   	add_fileszLLMRails.add_files[   s   &  	OD77>>$'dV+DEFLL&277#3#3D#94d;K"LMN	O ==%%}}o\$*<*<)=UC**,	 & 
 3&MM89K9K8L M$$,$8$8#98??BS T ( r#   c                D   | j                   j                  | j                         | j                   d| j                   dt        j                  ||d      d      }|j                  dk7  r@t        j                  dd|j                   d	|j                   d
|j                   d       g S |j                         d   }|D cg c]D  }t        |d   |d   j                         D ci c]  \  }}|dk7  r|| c}}      |d   d   fF }}}}|S c c}}w c c}}}w )ag  Return LLMRails documents most similar to query, along with scores.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 5 Max 10.
            alpha: parameter for hybrid search .

        Returns:
            List of Documents most similar to the query and score for each.
        r'   z/search)kr)   
   )r,   urldatatimeoutr-   zQuery failed %sz(code r/   z
, details )resultsr)   metadatascore)page_contentrR   )r   r4   r%   r   r   r*   dumpsr5   r   r6   r7   r)   r	   items)	r   queryrK   r>   rQ   xkeyvaluedocss	            r!   similarity_search_with_scorez%LLMRails.similarity_search_with_score   sC    ==%%**,==/d.@.@-AI!U34	 & 
 3&MM!--.i7H
==/$
 I--/), 
 
  !"6 +,J-*=*=*?&C'> U
 *g&

 
 	
s   $D*D<DDc                ^    | j                  ||      }|D cg c]  \  }}|	 c}}S c c}}w )a  Return LLMRails documents most similar to query, along with scores.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 5.

        Returns:
            List of Documents most similar to the query
        )rK   )r\   )r   rW   rK   r;   docs_and_scoresdoc_s          r!   similarity_searchzLLMRails.similarity_search   s1     ;;EQ;G"12Q222s   )c                8     | di |}|j                  |       |S )a  Construct LLMRails wrapper from raw documents.
        This is intended to be a quick way to get started.
        Example:
            .. code-block:: python

                from langchain_community.vectorstores import LLMRails
                llm_rails = LLMRails.from_texts(
                    texts,
                    datastore_id=datastore_id,
                    api_key=llm_rails_api_key
                )
         )r?   )clsr9   	embeddingr:   r;   	llm_railss         r!   
from_textszLLMRails.from_texts   s#    , M&M	E"r#   c                    t        dd| i|S )Nvectorstorerc   )LLMRailsRetriever)r   r;   s     r!   as_retrieverzLLMRails.as_retriever   s     <T<V<<r#   )NN)r   Optional[str]r    rl   )returndict)N)r9   Iterable[str]r:   Optional[List[dict]]r;   r   rm   	List[str])rH   ro   r:   rp   r;   r   rm   bool)   )rW   r1   rK   intrm   zList[Tuple[Document, float]])   )rW   r1   rK   rt   r;   r   rm   zList[Document])
r9   rq   re   zOptional[Embeddings]r:   rp   r;   r   rm   r   )r;   r   rm   rj   )__name__
__module____qualname____doc__r"   r%   r?   rI   r\   ra   classmethodrg   rk   rc   r#   r!   r   r      s+   " '+!%6#6 6, +/$$ ($ 	$
 
$R +/,!, (, 	,
 
,^ $%,, ,	%,^ $%33 3033	3   +/*.	 ( (	
  
 2=r#   r   c                  D    e Zd ZU dZded<    ed       Zded<   	 d
dZy	)rj   zRetriever for LLMRails.r   ri   c                 
    ddiS )NrK   rs   rc   rc   r#   r!   <lambda>zLLMRailsRetriever.<lambda>   s
    a r#   )default_factoryrn   search_kwargsc                :    | j                   j                  |       y)zZAdd text to the datastore.

        Args:
            texts (List[str]): The text
        N)ri   r?   )r   r9   s     r!   r?   zLLMRailsRetriever.add_texts   s     	""5)r#   N)r9   rq   rm   None)rv   rw   rx   ry   __annotations__r   r   r?   rc   r#   r!   rj   rj      s%    !0@AM4A
*r#   rj   )ry   
__future__r   r*   r   r   r2   typingr   r   r   r   r   r   langchain_core.documentsr	   langchain_core.embeddingsr
   langchain_core.vectorstoresr   r   pydanticr   r   rj   rc   r#   r!   <module>r      sH    . "   	  7 7  - 0 I P={ P=f*, *r#   