
    BTh'                        d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZmZ  ej4                  e      Z G d
 de      Zy)    )annotationsN)deepcopy)AnyDictListOptionalSequenceUnion)	Callbacks)BaseDocumentCompressorDocument)secret_from_env)PineconePineconeAsyncio)
ConfigDictField	SecretStrc                     e Zd ZU dZdZded<   	 dZded<   	 dZded	<   	  ed
d      Z	ded<   	  e e
dd            Zded<   	 dZded<   	 dZded<   	  edd      Zd&dZd'dZd(dZ	 	 	 	 	 	 d)dZd*dZdddd d!	 	 	 	 	 	 	 	 	 	 	 	 	 d+d"Zdddd d!	 	 	 	 	 	 	 	 	 	 	 	 	 d+d#Z	 d,	 	 	 	 	 	 	 d-d$Z	 d,	 	 	 	 	 	 	 d-d%Zy).PineconeRerankz4Document compressor that uses `Pinecone Rerank API`.NzOptional[Pinecone]clientzOptional[PineconeAsyncio]async_client   Optional[int]top_nzbge-reranker-v2-m3z<Model to use for reranking. Default is 'bge-reranker-v2-m3'.)defaultdescriptionstrmodelPINECONE_API_KEY)r   )default_factoryzOptional[SecretStr]pinecone_api_keyOptional[List[str]]rank_fieldsTboolreturn_documentsforbid)extraarbitrary_types_allowedc                    t        | j                  t              r| j                  j                         S | j                  S )z+Get the API key from SecretStr or directly.)
isinstancer!   r   get_secret_valueselfs    k/var/www/catia.catastroantioquia-mas.com/valormas/lib/python3.12/site-packages/langchain_pinecone/rerank.py_get_api_keyzPineconeRerank._get_api_key-   s3    d++Y7((99;;$$$    c                    | j                   +t        | j                               | _         | j                   S t        | j                   t              st	        d      | j                   S )zGet or create the sync client.api_keyzThe 'client' parameter must be an instance of Pinecone.
You may create the Pinecone object like:

from pinecone import Pinecone
client = Pinecone(api_key=...))r   r   r/   r*   	TypeErrorr,   s    r.   _get_sync_clientzPineconeRerank._get_sync_client3   s\    ;;"4+<+<+>?DK {{ DKK2P 
 {{r0   c                   K   | j                   +t        | j                               | _         | j                   S t        | j                   t              st	        d      | j                   S w)zGet or create the async client.r2   zThe 'async_client' parameter must be an instance of PineconeAsyncio.
You may create the PineconeAsyncio object like:

from pinecone import PineconeAsyncio
async_client = PineconeAsyncio(api_key=...))r   r   r/   r*   r4   r,   s    r.   _get_async_clientz PineconeRerank._get_async_client?   si     $ /8I8I8K LD     D--?d 
    s   A)A+c                b   t        |t              rR|j                  j                  d      }t        |t              r|r|}nd| }||j
                  d|j                  }|S t        |t              r-|j                  d      }t        |t              r|sd| |d<   |S d| t	        |      dS )Niddoc_)r9   text)r*   r   metadatagetr   page_contentdict)r-   documentindexdoc_id_from_metadoc_iddoc_data
current_ids          r.   _document_to_dictz PineconeRerank._document_to_dictK   s    
 h)'0044T:*C05E)w  -- ##H
 O$'!d+Jj#.j#'wO .#h-@@r0   c                    i }|dk7  r||d<   |S )z/Returns the parameters for the rerank API call.zcohere-rerank-3.5truncate )r-   r   rH   
parameterss       r.   _rerank_paramszPineconeRerank._rerank_paramse   s     
''%-Jz"r0   END)r#   r   r   rH   c                  t        |      dk(  rg S t        |      D cg c]  \  }}| j                  ||       }	}}	 | j                         }
||n| j                  }|t        d      |
j                  j                  |||	|xs | j                  xs dg|xs | j                  | j                  | j                  ||            }g }|j                  D ]j  }|j                  j                  |j                  |j                   d}| j                  r|j                  j#                         |d	<   |j%                  |       l |S c c}}w # t&        $ r$}t(        j+                  d
|        g cY d}~S d}~ww xY w)zVReturns an ordered list of documents ordered by their relevance to the provided query.r   r@   rA   N No model specified for rerankingr;   r   rH   r   query	documentsr#   r   r%   rJ   r9   rA   scorer@   zRerank error: )len	enumeraterF   r5   r   
ValueError	inferencererankr#   r   r%   rK   datar@   r9   rA   rU   to_dictappend	Exceptionloggererrorr-   rS   rR   r#   r   r   rH   idocdocsr   model_to_usererank_resultresult_dictsresult_item_dataresult_dictes                    r.   rZ   zPineconeRerank.rerankm   s    y>QI
 $I.
3 ""Cq"9
 

#	**,F %*$554::L# !CDD",,33"'G4+;+;Gx)tzz!%!6!6..\H.U 4 M L$1$6$6 
1 *3366-33-33 ((.>.G.G.O.O.QK
+##K0
1  I
L  	LL>!-.I	s$   E DE 	E;E60E;6E;c               .  K   t        |      dk(  rg S t        |      D cg c]  \  }}| j                  ||       }	}}	 | j                          d{   }
||n| j                  }|t        d      |
j                  j                  |||	|xs | j                  xs dg|xs | j                  | j                  | j                  ||             d{   }g }|j                  D ]j  }|j                  j                  |j                  |j                   d}| j                  r|j                  j#                         |d	<   |j%                  |       l |S c c}}w 7 7 # t&        $ r$}t(        j+                  d
|        g cY d}~S d}~ww xY ww)z6Async rerank documents using Pinecone's reranking API.r   rN   NrO   r;   rP   rQ   rT   r@   zAsync rerank error: )rV   rW   rF   r7   r   rX   rY   rZ   r#   r   r%   rK   r[   r@   r9   rA   rU   r\   r]   r^   r_   r`   ra   s                    r.   arerankzPineconeRerank.arerank   s     y>QI $I.
3 ""Cq"9
 

"	1133F %*$554::L# !CDD"("2"2"9"9"'G4+;+;Gx)tzz!%!6!6..\H.U #: # M L$1$6$6 
1 *3366-33-33 ((.>.G.G.O.O.QK
+##K0
1  I
 40  	LL/s34I	se   FEFE% E BE% E#B E% F E% #E% %	F.FFFFFc                8   |sg S g }| j                  ||      }|sg S |D ]w  }|d   	|d   }d|cxk  rt        |      k  s#n &||   }t        |j                  t	        |j
                              }	|d   |	j
                  d<   |j                  |	       y |S )z/Compress documents using Pinecone's rerank API.rS   rR   rA   r   r<   rU   relevance_score)rZ   rV   r   r>   r   r<   r]   
r-   rS   rR   	callbacks
compressedreranked_resultsres	doc_indexrc   doc_copys
             r.   compress_documentsz!PineconeRerank.compress_documents   s     I
;;%;HI# 		0C7|'L		2C	N2#I.C'((8CLL3I H <?w<H%%&78%%h/		0 r0   c                T  K   |sg S g }| j                  ||       d{   }|sg S |D ]w  }|d   	|d   }d|cxk  rt        |      k  s#n &||   }t        |j                  t	        |j
                              }	|d   |	j
                  d<   |j                  |	       y |S 7 w)z5Async compress documents using Pinecone's rerank API.rn   NrA   r   ro   rU   rp   )rl   rV   r   r>   r   r<   r]   rq   s
             r.   acompress_documentsz"PineconeRerank.acompress_documents   s      I
!%	!OOI# 		0C7|'L		2C	N2#I.C'((8CLL3I H <?w<H%%&78%%h/		0 ! Ps   B(B&B(B(AB()returnOptional[str])r{   r   )r{   r   )r@   zUnion[str, Document, dict]rA   intr{   r?   )r   r   rH   r   r{   r?   )rS   z$Sequence[Union[str, Document, dict]]rR   r   r#   r"   r   r|   r   r   rH   r   r{   zList[Dict[str, Any]])N)rS   Sequence[Document]rR   r   rr   zOptional[Callbacks]r{   r~   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r!   r#   r%   r   model_configr/   r5   r7   rF   rK   rZ   rl   rx   rz   rI   r0   r.   r   r      s   >!%F%;.2L+2;E=($RE3  &,1'(:DI-) '+K$+F!d!C $L
%

!A,A A 
	A4 ,0##777 7
 )7 7 7 7 
7| ,0##575 5
 )5 5 5 5 
5v *.	%  '	
 
B *.	%  '	
 
r0   r   )
__future__r   loggingcopyr   typingr   r   r   r   r	   r
   langchain_core.callbacks.baser   langchain_core.documentsr   r   langchain_core.utilsr   pineconer   r   pydanticr   r   r   	getLoggerr   r_   r   rI   r0   r.   <module>r      sG    "   = = 3 E 0 . 1 1			8	$E+ Er0   