
    Ig                         d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ d
edefdZ	 	 	 ddee   dedededeee      deee      dee   ddfdZ G d de      Zy)z7Taken from: https://docs.pinecone.io/docs/hybrid-search    N)AnyDictListOptional)CallbackManagerForRetrieverRun)Document)
Embeddings)BaseRetriever)pre_init)
ConfigDicttextreturnc                 x    t        t        j                  | j                  d            j	                               S )zhHash a text using SHA256.

    Args:
        text: Text to hash.

    Returns:
        Hashed text.
    zutf-8)strhashlibsha256encode	hexdigest)r   s    r/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_community/retrievers/pinecone_hybrid_search.py	hash_textr      s*     w~~dkk'23==?@@    contextsindex
embeddingssparse_encoderids	metadatas	namespacec           	         d}t        dt        |       |      }	 ddlm}	  |	|      }|| D 
cg c]  }
t        |
       }}
|D ]  }t        ||z   t        |             }| || }||| }|r||| n|D cg c]  }i  c}}t        ||      D 
cg c]  \  }
}d|
i| }}
}|j                  |      }|j                  |      }|D ]!  }|d   D cg c]  }t        |       c}|d<   # g }t        ||||      D ]  \  }}}}|j                  ||||d        |j                  ||        y# t        $ r Y w xY wc c}
w c c}w c c}}
w c c}w )	a  Create an index from a list of contexts.

    It modifies the index argument in-place!

    Args:
        contexts: List of contexts to embed.
        index: Index to use.
        embeddings: Embeddings model to use.
        sparse_encoder: Sparse encoder to use.
        ids: List of ids to use for the documents.
        metadatas: List of metadata to use for the documents.
        namespace: Namespace value for index partition.
        r   )tqdmNcontextvalues)idsparse_valuesr#   metadata)r   )rangelen	tqdm.autor!   ImportErrorr   minzipembed_documentsencode_documentsfloatappendupsert)r   r   r   r   r   r   r   
batch_size	_iteratorr!   r"   ii_endcontext_batch	batch_ids_metadata_batchr&   metadense_embedssparse_embedsss1vectorsdoc_idsparsedenses                              r   create_indexrC      s   , JaX
3I"O	 {19:gy!:: %3A
NCM2 5)%L	"+Iam1L"1L 	 &)%G
! ,8,
 
 "11-@&77F 	<A/0{;59;AhK	< /2}lD0
 
	+FFE8 NN %+# (	
	 	W	2K%3  
 ; 2M
 <s(   D0 E 4	EE
E0	D=<D=c                   
   e Zd ZU dZeed<   	 	 dZeed<   	 dZeed<   	 dZ	e
ed<   	 dZeed	<   	 dZee   ed
<   	  edd      Z	 	 	 ddee   deee      deee      d
ee   ddf
dZededefd       Zdedededee   fdZy)PineconeHybridSearchRetrieverz#`Pinecone Hybrid Search` retriever.r   Nr   r      top_kg      ?alphar   Tforbid)arbitrary_types_allowedextratextsr   r   r   c           	      d    t        || j                  | j                  | j                  |||       y )N)r   r   r   )rC   r   r   r   )selfrL   r   r   r   s        r   	add_textsz'PineconeHybridSearchRetriever.add_texts{   s/     	JJOO	
r   r#   c                 P    	 ddl m} ddlm} |S # t        $ r t	        d      w xY w)z?Validate that api key and python package exists in environment.r   hybrid_convex_scale)BaseSparseEncoderzbCould not import pinecone_text python package. Please install it with `pip install pinecone_text`.)pinecone_text.hybridrR   (pinecone_text.sparse.base_sparse_encoderrS   r*   )clsr#   rR   rS   s       r   validate_environmentz2PineconeHybridSearchRetriever.validate_environment   s:    		@   	F 	s    %queryrun_managerkwargsc          	         ddl m} | j                  j                  |      }| j                  j                  |      } |||| j                        \  }}|d   D cg c]  }t        |       c}|d<    | j                  j                  d||| j                  d| j                  d|}g }	|d   D ]G  }
|
d   j                  d      }|
d   }d	|vrd	|
v r|
d	   |d	<   |	j                  t        ||
             I |	S c c}w )Nr   rQ   r#   T)vectorsparse_vectorrG   include_metadatar   matchesr&   r"   score)page_contentr&    )rT   rR   r   encode_queriesr   embed_queryrH   r/   r   rX   rG   r   popr0   r   )rN   rX   rY   rZ   rR   
sparse_vec	dense_vecr>   resultfinal_resultresr"   r&   s                r   _get_relevant_documentsz5PineconeHybridSearchRetriever._get_relevant_documents   s    	=((77>
OO//6	 3Iz4:: V	:4>x4HIbb	I
8!!! 
$**!nn
 
 )$ 	SC*o)))4G:Hh&7c>$'L!g QR	S %  Js   C<NNN)__name__
__module____qualname____doc__r	   __annotations__r   r   r   rG   intrH   r/   r   r   r   r   model_configr   dictrO   r   r   rW   r   r   rk   rb   r   r   rE   rE   e   s
   -"NC E3 E3N(E5(#Ix}#. $L $(*.#'
Cy
 d3i 
 DJ'	

 C=
 

" $ 4  *HTW	hr   rE   rl   )rp   r   typingr   r   r   r   langchain_core.callbacksr   langchain_core.documentsr   langchain_core.embeddingsr	   langchain_core.retrieversr
   langchain_core.utilsr   pydanticr   r   r   rt   rC   rE   rb   r   r   <module>r|      s    =  , , C - 0 3 ) 	AC 	AC 	A"  $&*#H33iH3H3 H3 	H3
 
$s)	H3 T
#H3 }H3 
H3VRM Rr   