o
    Æ°i¬  ã                   @   sZ   d dl mZmZmZmZmZ d dlmZmZ d dl	m
Z
 d dlmZmZ G dd„ dƒZdS )é    )ÚAnyÚDictÚListÚOptionalÚUnion)ÚAllMessageValuesÚChatCompletionUserMessage)ÚModelResponse)ÚVectorStoreResultContentÚVectorStoreSearchResponsec                
   @   s¶   e Zd ZdZedee dee fdd„ƒZ	edee
 defdd„ƒZe		dd
ededee
 defdd„ƒZede
deeeeee
f f  fdd„ƒZede
de
dee
 fdd„ƒZd	S )ÚRAGQueryz
Context:

ÚmessagesÚreturnc                 C   s˜   | rt | ƒdkr
dS | d }t|tƒrd|vrdS |d }t|tƒr$|S t|tƒrJt |ƒdkrJ|D ]}t|tƒrI| d¡dkrId|v rI|d   S q1dS )z?
        Extract the query from the last user message.
        r   NéÿÿÿÿÚcontentÚtypeÚtext)ÚlenÚ
isinstanceÚdictÚstrÚlistÚget)r   Zlast_messager   Úitem© r   úL/home/app/Keep/.python/lib/python3.10/site-packages/litellm/rag/rag_query.pyÚextract_query_from_messages   s"   
ÿ€z$RAGQuery.extract_query_from_messagesÚcontext_chunksc                 C   sˆ   t j}| D ]9}t|tƒr3| d¡}|r&|D ]}| d¡}|r$||d 7 }qqd|v r2||d d 7 }qt|tƒr>||d 7 }qd|dœS )zE
        Process search results and build a context message.
        r   r   z

Úuser)Zroler   )r   ÚCONTENT_PREFIX_STRINGr   r   r   r   )r   Zcontext_contentÚchunkZresult_contentZcontent_itemZcontent_textr   r   r   Úbuild_context_message*   s,   
ÿ
€ý€
€þzRAGQuery.build_context_messageNÚresponseÚsearch_resultsÚrerank_resultsc                 C   sd   t | dƒr0| jr0| jD ]$}t|ddƒ}|dur/t|ddƒpi }||d< |r)||d< t|d|ƒ q| S )z=
        Add search results to the response choices.
        ÚchoicesÚmessageNZprovider_specific_fieldsr#   r$   )Úhasattrr%   ÚgetattrÚsetattr)r"   r#   r$   Úchoicer&   Zprovider_fieldsr   r   r   Úadd_search_results_to_responseE   s   	
ÿ€z'RAGQuery.add_search_results_to_responseÚsearch_responsec                 C   sV   g }|   dg ¡D ] }|  dg ¡}|D ]}|  d¡dkr'|  d¡r'| |d ¡ qq|S )z9Extract text documents from vector store search response.Údatar   r   r   )r   Úappend)r,   Z	documentsÚresultZcontent_listr   r   r   r   Úextract_documents_from_search`   s   €þz&RAGQuery.extract_documents_from_searchÚrerank_responsec                 C   sR   g }|   dg ¡}|  dg ¡D ]}|  d¡}|dur&|t|ƒk r&| || ¡ q|S )zJGet the original search results corresponding to the top reranked results.r-   ÚresultsÚindexN)r   r   r.   )r,   r1   Z
top_chunksZoriginal_resultsr/   r3   r   r   r   Úget_top_chunks_from_rerankm   s   
€z#RAGQuery.get_top_chunks_from_rerank)N)Ú__name__Ú
__module__Ú__qualname__r   Ústaticmethodr   r   r   r   r   r   r   r!   r	   r   r+   r   r   r0   r4   r   r   r   r   r      s2    ýÿþýüÿþ r   N)Útypingr   r   r   r   r   Zlitellm.types.llms.openair   r   Zlitellm.types.utilsr	   Zlitellm.types.vector_storesr
   r   r   r   r   r   r   Ú<module>   s
    