
    BTh%4                        d dl Z d dlmZ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 d	lmZmZmZmZmZmZ d d
lmZ  e j<                  e      Z dZ! G d dee      Z" G d de"      Z#y# e$ r	 d dlmZ Y Ow xY w)    N)AnyDictIterableListOptional)
Embeddings)secret_from_env)Pinecone)PineconeAsyncio)SparseValues)EmbeddingsList)	BaseModel
ConfigDictFieldPrivateAttr	SecretStrmodel_validator)Self@   c                   N   e Zd ZU dZ ed      Zeed<    ed      Ze	e
   ed<   eed<   	 dZe	e   ed<   	  ee      Zeed	<   	  ee      Zeed
<   	 dZe	e   ed<   dZeed<    e edd      d      Zeed<   	  eddd      Zede
fd       Z ed      ededefd              Z  ed      de!fd       Z"d e#e   de$e%ef   fd!Z&d e#e   de#e#e'      fd"Z(d e#e   de#e#e'      fd#Z)d$ede#e'   fd%Z*d$ede#e'   fd&Z+d e#e   ded'ede,fd(Z-d e#e   ded'ede,fd)Z.y)*PineconeEmbeddingsa+  PineconeEmbeddings embedding model.

    Example:
        .. code-block:: python

            from langchain_pinecone import PineconeEmbeddings
            from langchain_pinecone import PineconeVectorStore
            from langchain_core.documents import Document

            # Initialize embeddings with a specific model
            embeddings = PineconeEmbeddings(model="multilingual-e5-large")

            # Embed a single query
            query_embedding = embeddings.embed_query("What is machine learning?")

            # Embed multiple documents
            docs = ["Document 1 content", "Document 2 content"]
            doc_embeddings = embeddings.embed_documents(docs)

            # Use with PineconeVectorStore
            from pinecone import Pinecone

            pc = Pinecone(api_key="your-api-key")
            index = pc.Index("your-index-name")

            vectorstore = PineconeVectorStore(
                index=index,
                embedding=embeddings
            )

            # Add documents to vector store
            vectorstore.add_documents([
                Document(page_content="Hello, world!"),
                Document(page_content="This is a test.")
            ])

            # Search for similar documents
            results = vectorstore.similarity_search("hello", k=2)
    N)default_client_async_clientmodel
batch_size)default_factoryquery_paramsdocument_params	dimensionFshow_progress_barPINECONE_API_KEYzsPinecone API key not found. Please set the PINECONE_API_KEY environment variable or pass it via `pinecone_api_key`.)error_messageapi_key)r   aliaspinecone_api_keyforbidT )extrapopulate_by_nameprotected_namespacesreturnc                 L    t        | j                  j                         d      S )z#Lazily initialize the async client.	langchainr$   
source_tag)PineconeAsyncioClientr&   get_secret_value)selfs    o/var/www/catia.catastroantioquia-mas.com/valormas/lib/python3.12/site-packages/langchain_pinecone/embeddings.pyasync_clientzPineconeEmbeddings.async_clientm   s%     %))::<
 	
    beforemodevaluesc                     ddddddddddi}|j                  d	      }||v r'||   }|j                         D ]  \  }}||vs|||<    |S )
)Set default configuration based on model.zmultilingual-e5-large`   queryEND
input_typetruncatepassagei   r   r   r   r    r   getitemsclsr:   default_config_mapr   configkeyvalues          r4   set_default_configz%PineconeEmbeddings.set_default_configt   s~    
 $ /6E J2;#O!	&
 

7#&&'.F$lln (
Uf$"'F3K( r6   afterc                 b    | j                   j                         }t        |d      }|| _        | S )zDValidate that Pinecone version and credentials exist in environment.r.   r/   )r&   r2   PineconeClientr   )r3   api_key_strclients      r4   validate_environmentz'PineconeEmbeddings.validate_environment   s2     ++<<>L r6   textsc                    | j                   t        }n| j                   }| j                  r'	 ddlm}  |t        dt        |      |            }||fS t        dt        |      |      }||fS # t
        $ r}t        d      |d }~ww xY w)Nr   )tqdmzgMust have tqdm installed if `show_progress_bar` is set to True. Please install with `pip install tqdm`.)r   DEFAULT_BATCH_SIZEr!   	tqdm.autorW   ImportErrorrangelen)r3   rU   r   rW   e_iters         r4   _get_batch_iteratorz&PineconeEmbeddings._get_batch_iterator   s    ??"+JJ!!* q#e*j9:E j   !SZ4Ej    !> s   A- -	B6BBc           	          g }| j                  |      \  }}|D ]R  }| j                  | j                  | j                  ||||z          }|j	                  |D cg c]  }|d   	 c}       T |S c c}w )zEmbed search docs.r   
parametersrU   r:   )r_   _embed_textsr   r   extendr3   rU   
embeddingsr^   r   iresponsers           r4   embed_documentsz"PineconeEmbeddings.embed_documents   s    (*
 44U;z 	?A((jj//AJ/ ) H
 H=qq{=>	?  >s   A0
c           	        K   g }| j                  |      \  }}|D ]Z  }| j                  | j                  | j                  ||||z           d {   }|j	                  |D cg c]  }|d   	 c}       \ |S 7 *c c}w w)Nra   r:   )r_   _aembed_textsr   r   rd   re   s           r4   aembed_documentsz#PineconeEmbeddings.aembed_documents   s     (*
 44U;z 	?A!//jj//AJ/ 0  H
 H=qq{=>	? 
 >s$   ABA:B#A<
/B<Btextc                 `    | j                  | j                  | j                  |g      d   d   S )zEmbed query text.ra   r   r:   )rc   r   r   )r3   rn   s     r4   embed_queryzPineconeEmbeddings.embed_query   s=      **):):4& ! 

 	r6   c                    K   | j                  | j                  | j                  |g       d{   }|d   d   S 7 w)z Asynchronously embed query text.ra   Nr   r:   )rl   r   r   )r3   rn   rf   s      r4   aembed_queryzPineconeEmbeddings.aembed_query   sK     --**++& . 
 


 !}X&&
s   -><>rb   c                 R    | j                   j                  j                  |||      S N)r   inputsrb   )r   	inferenceembed)r3   rU   r   rb   s       r4   rc   zPineconeEmbeddings._embed_texts   s-     ||%%++* , 
 	
r6   c                    K   | j                   4 d {   }|j                  j                  |||       d {   }|cd d d       d {    S 7 =7 7 	# 1 d {  7  sw Y   y xY wwrt   )r5   rv   rw   )r3   rU   r   rb   aclientrf   s         r4   rl   z PineconeEmbeddings._aembed_texts   su      $$ 	 	/6/@/@/F/FEj 0G 0 *J 		 	 	*	 	 	 	sS   A,AA,"AAAA,AA,AA,A)A A)%A,)/__name__
__module____qualname____doc__r   r   rQ   __annotations__r   r   r1   strr   intr   dictr   r   r   r    r!   boolr	   r&   r   r   model_configpropertyr5   r   classmethodr   rN   r   rT   r   tupler   r_   floatrj   rm   rp   rr   r   rc   rl   r(   r6   r4   r   r   "   s   &R *$7G^75@5NM812NJ; $J$-t4L$4)!$7OT7+#Ix}##t#"''F

 #i Q L 
3 
 
 (#    $$ '"d  #!c !uXs]7K !*T#Y 4U3D 
DI 
$tE{:K 
 U 's 'tE{ '
#Y
'*
8<
	
#Y'*8<	r6   r   c                       e Zd ZdZ ed      ededefd              Zde	e
   de	e   fdZde	e
   de	e   fd	Zd
e
defdZd
e
defdZy)PineconeSparseEmbeddingsa
  PineconeSparseEmbeddings embedding model.

    Example:
        .. code-block:: python

            from langchain_pinecone import PineconeSparseEmbeddings
            from langchain_pinecone import PineconeVectorStore
            from langchain_core.documents import Document

            # Initialize sparse embeddings
            sparse_embeddings = PineconeSparseEmbeddings(model="pinecone-sparse-english-v0")

            # Embed a single query (returns SparseValues)
            query_embedding = sparse_embeddings.embed_query("What is machine learning?")
            # query_embedding contains SparseValues with indices and values

            # Embed multiple documents
            docs = ["Document 1 content", "Document 2 content"]
            doc_embeddings = sparse_embeddings.embed_documents(docs)

            # Use with an index configured for sparse vectors
            from pinecone import Pinecone

            pc = Pinecone(api_key="your-api-key")

            # Create index with sparse embeddings support
            if not pc.has_index("sparse-index"):
                pc.create_index_for_model(
                    name="sparse-index",
                    cloud="aws",
                    region="us-east-1",
                    embed={
                        "model": "pinecone-sparse-english-v0",
                        "field_map": {"text": "chunk_text"},
                        "metric": "dotproduct",
                        "read_parameters": {},
                        "write_parameters": {}
                    }
                )

            index = pc.Index("sparse-index")

            # IMPORTANT: Use PineconeSparseVectorStore for sparse vectors
            # The regular PineconeVectorStore won't work with sparse embeddings
            from langchain_pinecone.vectorstores_sparse import PineconeSparseVectorStore

            # Initialize sparse vector store with sparse embeddings
            vector_store = PineconeSparseVectorStore(
                index=index,
                embedding=sparse_embeddings
            )

            # Add documents
            from uuid import uuid4

            documents = [
                Document(page_content="Machine learning is awesome", metadata={"source": "article"}),
                Document(page_content="Neural networks power modern AI", metadata={"source": "book"})
            ]

            # Generate unique IDs for each document
            uuids = [str(uuid4()) for _ in range(len(documents))]

            # Add documents to the vector store
            vector_store.add_documents(documents=documents, ids=uuids)

            # Search for similar documents
            results = vector_store.similarity_search("machine learning", k=2)
    r7   r8   r:   r,   c                     ddddddddddi}|j                  d	      }||v r'||   }|j                         D ]  \  }}||vs|||<    |S )
r<   zpinecone-sparse-english-v0r=   r>   r?   r@   rC   NrD   r   rE   rH   s          r4   rN   z+PineconeSparseEmbeddings.set_default_config)  s~    
 ) /6E J2;#O!	+
 

7#&&'.F$lln (
Uf$"'F3K( r6   rU   c           	          g }| j                  |      \  }}|D ]Y  }| j                  | j                  | j                  ||||z          }|D ]$  }|j	                  t        |d   |d                & [ |S )z)Embed search docs with sparse embeddings.ra   sparse_indicessparse_valuesindicesr:   )r_   rc   r   r   appendr   re   s           r4   rj   z(PineconeSparseEmbeddings.embed_documents=  s    )+
 44U;z 		A((jj//AJ/ ) H
  !! +;)<QEWX		 r6   c           	      
  K   g }| j                  |      \  }}|D ]a  }| j                  | j                  | j                  ||||z           d{   }|D ]$  }|j	                  t        |d   |d                & c |S 7 1w)z8Asynchronously embed search docs with sparse embeddings.ra   Nr   r   r   )r_   rl   r   r   r   r   re   s           r4   rm   z)PineconeSparseEmbeddings.aembed_documentsO  s     )+
 44U;z 		A!//jj//AJ/ 0  H
  !! +;)<QEWX		 s   ABB2Brn   c                     | j                  | j                  | j                  |g      d   }t        |d   |d         S )z(Embed query text with sparse embeddings.ra   r   r   r   r   )rc   r   r   r   )r3   rn   rh   s      r4   rp   z$PineconeSparseEmbeddings.embed_query_  sQ    $$**):):4& % 

 -.x7P
 	
r6   c                    K   | j                  | j                  | j                  |g       d{   }|d   }t        |d   |d         S 7 w)z7Asynchronously embed query text with sparse embeddings.ra   Nr   r   r   r   )rl   r   r   r   )r3   rn   rf   rh   s       r4   rr   z%PineconeSparseEmbeddings.aembed_queryh  sb     --**((& . 
 


 a=-.x7P
 	

s   -AAAN)rz   r{   r|   r}   r   r   r   r   rN   r   r   r   rj   rm   rp   rr   r(   r6   r4   r   r      s    DL (#    $$T#Y 43E $DI $|:L  
 
 


s 

| 

r6   r   )$loggingtypingr   r   r   r   r   langchain_core.embeddingsr   langchain_core.utilsr	   pineconer
   rQ   r   r1   r   5pinecone.core.openapi.inference.model.embeddings_listr   rZ   *pinecone.data.features.inference.inferencepydanticr   r   r   r   r   r   typing_extensionsr   	getLoggerrz   loggerrX   r   r   r(   r6   r4   <module>r      s     6 6 0 0 / "JT
  #			8	$ }J }@P
1 P
g  JIJs   A: :BB