a
    bg
                    @  sp  d dl mZ d dlZd dlZd dl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mZmZmZmZmZmZmZmZmZ d dlZd dl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+ d dl,m-Z- e. Z/e
rjd dl0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl7m5Z9 d dl:m;Z;m<Z<m=Z=m>Z>m?Z? e&ddddZ@e&ddddZAe&ddddZBe&ddddZCdZDdOddd d d d!d"d#d$d d!d d%d&d'd(d)d*d+d,d-ZEG d.d/ d/e(ZFG d0d1 d1e$ZGd2d3d4d5d6ZHd7d3d4d8d9ZIdPd2d<d=d>d3d?d@dAZJdQd2d<d=d>d3d?dBdCZKdDdEdFdGdHZLdRdIdJdKdLdMdNZMdS )S    )annotationsN)TYPE_CHECKINGAnyCallableClassVar
CollectionDictIterableListLiteralOptionalTupleTypeUnioncast)#AsyncCallbackManagerForRetrieverRunCallbackManagerForRetrieverRun)Document)
Embeddings)LangChainException)BaseRetriever)get_from_env)VectorStore)
ConfigDictmodel_validator)maximal_marginal_relevance)TokenCredential)AsyncTokenCredential)SearchClientSearchItemPaged)AsyncSearchItemPagedr   )CorsOptionsScoringProfileSearchFieldSemanticConfigurationVectorSearchZAZURESEARCH_FIELDS_IDid)keyZenv_keydefaultZAZURESEARCH_FIELDS_CONTENTcontentZ!AZURESEARCH_FIELDS_CONTENT_VECTORZcontent_vectorZAZURESEARCH_FIELDS_TAGmetadatai  	langchainFstrOptional[str]Optional[List[SearchField]]Optional[VectorSearch]COptional[Union[SemanticConfiguration, List[SemanticConfiguration]]]Optional[List[ScoringProfile]]Optional[CorsOptions]boolOptional[Dict[str, Any]]Optional[TokenCredential]Optional[AsyncTokenCredential]z&Union[SearchClient, AsyncSearchClient])endpoint
index_namer(   azure_ad_access_tokensemantic_configuration_namefieldsvector_searchsemantic_configurationsscoring_profilesdefault_scoring_profiledefault_fields
user_agentcors_optionsasync_ additional_search_client_optionsazure_credentialazure_async_credentialreturnc           0        s  ddl m m}m} ddlm} ddlm}m} ddl	m} ddl
m} ddlm} ddlm} ddlm}m}m}m}m}m}m} m}!m}"m}#m}$m}%m}& G  fd	d
d
|}'|pi }|
pg }
|d ur| dkr| }(|(d |(})n||}(|(})n0|d ur|'|}(|(})n|p| }(|p&| })|f | |(|d|}*z|*j|d W n |y   |d urdd |D dd |
D fddt ! t !  D }+t"|+dkrdddfddd#fdd|+D },t$d|+ d|, n|
}|d u r^|#|d|$j%|ddd|%j&d d!|d"|$j'||%j&d#d!g|&d$dd%|&d&d"d%gd'}|rt(|t)sv|g}|"||d(}-n2|r|||!| t*d)gd*d+}.|"|.gd,}-nd }-|||||-||	|d-}/|*+|/ Y n0 |s|f | ||(|d.|S |f | ||)|d.|S d S )/Nr   )AccessTokenAzureKeyCredentialr   )ResourceNotFoundError)DefaultAzureCredentialInteractiveBrowserCredential)rL   r!   )SearchIndexClient)#ExhaustiveKnnAlgorithmConfigurationExhaustiveKnnParametersHnswAlgorithmConfigurationHnswParametersSearchIndexr%   SemanticFieldSemanticPrioritizedFieldsSemanticSearchr&   VectorSearchAlgorithmKindVectorSearchAlgorithmMetricVectorSearchProfilec                      s@   e Zd Zdd fddZdddddddd	d
ddddZdS )z6_get_search_client.<locals>.AzureBearerTokenCredentialr-   )tokenc                   s    |t t d | _d S )Ni  )inttime_token)selfrZ   rI    z/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/azuresearch.py__init__   s    z?_get_search_client.<locals>.AzureBearerTokenCredential.__init__NF)claims	tenant_id
enable_caer.   r4   r   rI   )scopesrc   rd   re   kwargsrH   c                _  s   | j S N)r]   )r^   rc   rd   re   rf   rg   r`   r`   ra   	get_token   s    z@_get_search_client.<locals>.AzureBearerTokenCredential.get_token)__name__
__module____qualname__rb   ri   r`   r_   r`   ra   AzureBearerTokenCredential   s
   rm   ZINTERACTIVEz!https://search.azure.com/.default)r8   
credentialrB   namec                 S  s   i | ]}|j |jqS r`   rp   type).0fr`   r`   ra   
<dictcomp>       z&_get_search_client.<locals>.<dictcomp>c                 S  s   i | ]}|j |jqS r`   rq   )rs   Zdfr`   r`   ra   ru      rv   c                   s   i | ]\}}| | qS r`   r`   rs   r(   value)mandatory_fieldsr`   ra   ru      s   r-   )xrH   c              
     s:   |  d  | d d |  d |  d|   d
S )Nz current type: 'MISSINGz'. It has to be 'z#' or you can point to a different 'z;' field name by using the env variable 'AZURESEARCH_FIELDS_')getupper)rz   )fields_typesry   r`   ra   fmt_err   s    z#_get_search_client.<locals>.fmt_err
c                   s   g | ]} |qS r`   r`   rs   rz   )r   r`   ra   
<listcomp>   rv   z&_get_search_client.<locals>.<listcomp>z2You need to specify at least the following fields z; or provide alternative field names in the env variables.

r)      i  i  )mZef_constructionZ	ef_searchmetric)rp   kind
parametersZdefault_exhaustive_knn)r   myHnswProfile)rp   Zalgorithm_configuration_nameZmyExhaustiveKnnProfile)Z
algorithmsZprofiles)configurationsZdefault_configuration_name)
field_name)Zcontent_fields)rp   Zprioritized_fields)r   )rp   r<   r=   semantic_searchr?   r@   rC   )r8   r9   rn   rB   ),azure.core.credentialsrI   rJ   r   Zazure.core.exceptionsrK   Zazure.identityrL   rM   Zazure.identity.aioazure.search.documentsr   azure.search.documents.aioZazure.search.documents.indexesrN   %azure.search.documents.indexes.modelsrO   rP   rQ   rR   rS   r%   rT   rU   rV   r&   rW   rX   rY   r~   ri   Z	get_indexsetitemslenjoin
ValueErrorZHNSWZCOSINEZEXHAUSTIVE_KNN
isinstancelistFIELDS_CONTENTZcreate_index)0r8   r9   r(   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rJ   r   rK   rL   rM   ZAsyncDefaultAzureCredentialr   AsyncSearchClientrN   rO   rP   rQ   rR   rS   r%   rT   rU   rV   r&   rW   rX   rY   rm   rn   Zasync_credentialZindex_clientZmissing_fieldserrorr   Zsemantic_configurationindexr`   )rI   r   r   ry   ra   _get_search_clientS   s    <







!
	r   c                   @  s  e Zd ZdZddddddddddddddd	d
ddddddddddddZddddZeddddZdddddZddd d!d"d#dd$d%d&d'Z	ddd d!d"d#dd$d%d(d)Z
ddd d*d"d#d$d+d,d-Zddd d*d"d#d$d+d.d/Zdd#dd0d1d2d3Zdd#dd0d1d4d5Zddd7dd8ddd9d:d;d<Zd6d=dd8dd>d?d@dAZddd7dd8ddd9d:dBdCZd6d=dd8dd>d?dDdEZdddFdd8dGdd>dHdIdJZdddFdd8dGdd>dHdKdLZdddMdd8ddd9dNdOdPZdddMdd8ddd9dNdQdRZddd8ddd>dNdSdTZddd8ddd>dNdUdVZdddMdd8d8dYddd>dZd[d\ZdddMdd8d8dYddd>dZd]d^Zddd8dd9d?d_d`Zddd8dd9d?dadbZddd8ddd>dNdcddZddd8ddd>dNdedfZdddFdd8dGdd>dHdgdhZdddFdd8dGdd>dHdidjZ dddMdd8d8dYddd>dZdkdlZ!dddMdd8d8dYddd>dZdmdnZ"ddMddd8dddodpdqdrZ#ddMddd8dddsdpdtduZ$ddd8dd9d?dvdwZ%ddd8dd9d?dxdyZ&dddFdd8d{dGdd>d|d}d~Z'dddFdd8d{dGdd>d|ddZ(dddMdd8ddddNddZ)dddMdd8ddddNddZ*e+ddd$dd"ddddddd dddZ,e+ddd$dd"ddddddd dddZ-e+dddddddd*dd"dddddd d
ddZ.e+dddddddd*dd"dddddd d
ddZ/dddddZ0dS )AzureSearchz&`Azure Cognitive Search` vector store.hybridN)vector_search_dimensionsrE   r:   rF   rG   r-   r.   zUnion[Callable, Embeddings]r/   r0   r1   r2   r3   zOptional[int]r5   r6   r7   r   )azure_search_endpointazure_search_keyr9   embedding_functionsearch_typer;   r<   r=   r>   r?   r@   rC   r   rE   r:   rF   rG   rg   c                K  s  zddl m}m}m}m} W n. tyJ } ztd|W Y d }~n
d }~0 0 || _t| jtrj| jj	| _	n| j| _	|t
|jddd|t|jd|t||jd|pt| 	ddd	|t|jdg}d
}d|v r|d r|d|d  7 }t||||||||	|
||||||d| _t||||||||	|
||||d||d| _|| _|| _|rP|n|| _|| _|| _|| _|| _|| _|| _|	| _|
| _|| _ || _!|| _"|| _#d S )Nr   )SearchableFieldr$   SearchFieldDataTypeSimpleFieldzeUnable to import azure.search.documents. Please install with `pip install -U azure-search-documents`.T)rp   rr   r(   Z
filterablerq   Textr   )rp   rr   Z
searchabler   Zvector_search_profile_namer,   rB    )r;   r<   r=   r>   r?   r@   rA   rB   rC   rE   rF   )r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rF   rG   )$r   r   r$   r   r   ImportErrorr   r   r   embed_query	FIELDS_IDStringr   FIELDS_CONTENT_VECTORr   Singler   FIELDS_METADATAr   clientasync_clientr   r;   r<   Z_azure_search_endpointZ_azure_search_keyZ_index_nameZ_semantic_configuration_name_fieldsZ_vector_searchZ_semantic_configurationsZ_scoring_profilesZ_default_scoring_profileZ_default_fieldsZ_user_agentZ_cors_options)r^   r   r   r9   r   r   r;   r<   r=   r>   r?   r@   rC   r   rE   r:   rF   rG   rg   r   r$   r   r   erA   rB   r`   r`   ra   rb      s    
zAzureSearch.__init__None)rH   c                 C  s   t | dr| jr| j  t | dr| jrz6t }| rN|| j  n|| j  W nL t	y   t
 }t| z|| j  W |  n
|  0 Y n0 d S )Nr   r   )hasattrr   closer   asyncioget_event_loop
is_runningcreate_taskrun_until_completeRuntimeErrornew_event_loopset_event_loop)r^   loopr`   r`   ra   __del__  s    

zAzureSearch.__del__zOptional[Embeddings]c                 C  s   t | jtr| jS d S rh   )r   r   r   r^   r`   r`   ra   
embeddings  s    
zAzureSearch.embeddingszList[float])textrH   c                   s,   | j r| j |I d H S tt| j|S d S rh   )r   aembed_queryr   r   r   )r^   r   r`   r`   ra   _aembed_query  s    zAzureSearch._aembed_querykeyszIterable[str]zOptional[List[dict]]zOptional[List[str]]z	List[str])texts	metadatasr   rg   rH   c                  s   t  jtrHz jt|}W qZ tyD    fdd|D }Y qZ0 n fdd|D }t|dkrttd g S |sd|v rt|d t|kr|d } j	t
||||dS )z$Add texts data to an existing index.c                   s   g | ]} j |qS r`   )r   r   r   r   r`   ra   r     rv   z)AzureSearch.add_texts.<locals>.<listcomp>c                   s   g | ]}  |qS r`   r   r   r   r`   ra   r     rv   r   Nothing to insert, skipping.idsr   )r   r   r   Zembed_documentsr   NotImplementedErrorr   loggerdebugadd_embeddingszipr^   r   r   r   rg   r   r`   r   ra   	add_texts  s    

 zAzureSearch.add_textsc                  s   t  jtrTz jt|I d H }W qf tyP    fdd|D I d H }Y qf0 n fdd|D }t|dkrtd g S |sd|v rt|d t|kr|d } j	t
||||dI d H S )Nc                   s   g | ]} j |I d H qS rh   )r   r   r   r   r`   ra   r     s   z*AzureSearch.aadd_texts.<locals>.<listcomp>c                   s   g | ]}  |qS r`   r   r   r   r`   ra   r     rv   r   r   r   r   )r   r   r   Zaembed_documentsr   r   r   r   r   aadd_embeddingsr   r   r`   r   ra   
aadd_texts  s    

 zAzureSearch.aadd_textsz!Iterable[Tuple[str, List[float]]])text_embeddingsr   r   rH   c                  s@  g }g }t |D ]\}\}}|r*|| }	n"tt }	tt|	dd}	|rX|| ni }
ddt|	t	|t
tj|tjd tt|
i}|
r fdd|
 D }|| || ||	 t|tkr jj|d}td	d
 |D st|g }qt|dkr|S  jj|d}tdd
 |D r4|S t|dS )$Add embeddings to an existing index.utf-8ascii@search.actionuploadZdtypec                   s*   i | ]"\}}|d d  j D v r||qS )c                 S  s   g | ]
}|j qS r`   ro   r   r`   r`   ra   r   $  rv   z9AzureSearch.add_embeddings.<locals>.<dictcomp>.<listcomp>r<   rs   kvr   r`   ra   ru   !  s   z.AzureSearch.add_embeddings.<locals>.<dictcomp>	documentsc                 s  s   | ]}|j V  qd S rh   Z	succeededrs   rr`   r`   ra   	<genexpr>-  rv   z-AzureSearch.add_embeddings.<locals>.<genexpr>r   c                 s  s   | ]}|j V  qd S rh   r   r   r`   r`   ra   r   9  rv   N)	enumerater-   uuiduuid4base64urlsafe_b64encodebytesdecoder   r   r   nparrayfloat32tolistr   jsondumpsr   updateappendr   MAX_UPLOAD_BATCH_SIZEr   upload_documentsallr   r^   r   r   r   r   datair   	embeddingr(   r+   docZadditional_fieldsresponser`   r   ra   r     s@    





zAzureSearch.add_embeddingsc                  sJ  g }g }t |D ]\}\}}|r(|| n
tt }	tt|	dd}	|rV|| ni }
ddt|	t	|t
tj|tjd tt|
i}|
r fdd|
 D }|| || ||	 t|tkr jj|dI d	H }td
d |D st|g }qt|dkr|S  jj|dI d	H }tdd |D r>|S t|d	S )r   r   r   r   r   r   c                   s*   i | ]"\}}|d d  j D v r||qS )c                 S  s   g | ]
}|j qS r`   ro   r   r`   r`   ra   r   ]  rv   z:AzureSearch.aadd_embeddings.<locals>.<dictcomp>.<listcomp>r   r   r   r`   ra   ru   Z  s   z/AzureSearch.aadd_embeddings.<locals>.<dictcomp>r   Nc                 s  s   | ]}|j V  qd S rh   r   r   r`   r`   ra   r   f  rv   z.AzureSearch.aadd_embeddings.<locals>.<genexpr>r   c                 s  s   | ]}|j V  qd S rh   r   r   r`   r`   ra   r   r  rv   )r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r`   r   ra   r   >  s<    




zAzureSearch.aadd_embeddingsr4   )r   rg   rH   c                 K  s.   |r&| j dd |D }t|dkS dS dS )Delete by vector ID.

        Args:
            ids: List of ids to delete.

        Returns:
            bool: True if deletion is successful,
            False otherwise.
        c                 S  s   g | ]}t |iqS r`   )r   rs   r   r`   r`   ra   r     rv   z&AzureSearch.delete.<locals>.<listcomp>r   FN)r   delete_documentsr   r^   r   rg   resr`   r`   ra   deletew  s    
zAzureSearch.deletec                   s4   |r,| j dd |D I dH }t|dkS dS dS )r   c                 S  s   g | ]}d |iqS )r'   r`   r   r`   r`   ra   r     rv   z'AzureSearch.adelete.<locals>.<listcomp>Nr   F)r   r  r   r  r`   r`   ra   adelete  s    
zAzureSearch.adeleter   )r   r[   List[Document])queryr   r   rg   rH   c                K  s~   |p| j }|dkr*| j|fd|i|}nP|dkrJ| j|fd|i|}n0|dkrj| j|fd|i|}ntd| d|S N
similarityr   r   semantic_hybridsearch_type of  not allowed.)r   r=   hybrid_searchsemantic_hybrid_searchr   r^   r  r   r   rg   docsr`   r`   ra   similarity_search  s    
zAzureSearch.similarity_search)r   List[Tuple[Document, float]])r  r   rg   rH   c                K  s|   | d| j}|dkr,| j|fd|i|S |dkrJ| j|fd|i|S |dkrh| j|fd|i|S td| ddS )	$Run similarity search with distance.r   r	  r   r   r
  r  r  N)popr   vector_search_with_scorehybrid_search_with_score!semantic_hybrid_search_with_scorer   r^   r  r   rg   r   r`   r`   ra   similarity_search_with_score  s    z(AzureSearch.similarity_search_with_scorec                  s   |p| j }|dkr0| j|fd|i|I d H }n\|dkrV| j|fd|i|I d H }n6|dkr|| j|fd|i|I d H }ntd| d|S r  )r   avector_searchahybrid_searchasemantic_hybrid_searchr   r  r`   r`   ra   asimilarity_search  s    
zAzureSearch.asimilarity_searchc                  s   | d| j}|dkr2| j|fd|i|I dH S |dkrV| j|fd|i|I dH S |dkrz| j|fd|i|I dH S td| ddS )	r  r   r	  r   Nr   r
  r  r  )r}   r   avector_search_with_scoreahybrid_search_with_score"asemantic_hybrid_search_with_scorer   r  r`   r`   ra   asimilarity_search_with_score  s    z)AzureSearch.asimilarity_search_with_scorescore_thresholdzOptional[float])r  r   r#  rg   rH   c                  s4   | j |fd|i|} d u r"|S  fdd|D S )Nr   c                   s   g | ]}|d   kr|qS    r`   r   r"  r`   ra   r     rv   zGAzureSearch.similarity_search_with_relevance_scores.<locals>.<listcomp>r  r^   r  r   r#  rg   resultr`   r"  ra   'similarity_search_with_relevance_scores  s
    z3AzureSearch.similarity_search_with_relevance_scoresc                  s:   | j |fd|i|I d H } d u r(|S  fdd|D S )Nr   c                   s   g | ]}|d   kr|qS r$  r`   r   r"  r`   ra   r     rv   zHAzureSearch.asimilarity_search_with_relevance_scores.<locals>.<listcomp>r  r'  r`   r"  ra   (asimilarity_search_with_relevance_scores  s
    z4AzureSearch.asimilarity_search_with_relevance_scores)filters)r  r   r,  rg   rH   c                K  s   | j |||d}dd |D S )\  
        Returns the most similar indexed documents to the query text.

        Args:
            query (str): The query text for which to find similar documents.
            k (int): The number of documents to return. Default is 4.

        Returns:
            List[Document]: A list of documents that are most similar to the query text.
        r   r,  c                 S  s   g | ]\}}|qS r`   r`   rs   r   _r`   r`   ra   r     rv   z-AzureSearch.vector_search.<locals>.<listcomp>r&  r^   r  r   r,  rg   docs_and_scoresr`   r`   ra   r=     s    zAzureSearch.vector_searchc                  s$   | j |||dI dH }dd |D S )r-  r.  Nc                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     rv   z.AzureSearch.avector_search.<locals>.<listcomp>r*  r1  r`   r`   ra   r    s    zAzureSearch.avector_searchc                 K  s,   |  |}| j|d|fd|i|}t|S )  Return docs most similar to query.

        Args:
            query (str): Text to look up documents similar to.
            k (int, optional): Number of Documents to return. Defaults to 4.
            filters (str, optional): Filtering expression. Defaults to None.

        Returns:
            List[Tuple[Document, float]]: List of Documents most similar
                to the query and score for each
         r,  r   _simple_search_results_to_documentsr^   r  r   r,  rg   r   resultsr`   r`   ra   r    s    
z$AzureSearch.vector_search_with_scorec                   s>   |  |I dH }| j|d|fd|i|I dH }t|I dH S )r3  Nr4  r,  r   _asimple_search_aresults_to_documentsr8  r`   r`   ra   r  1  s    z%AzureSearch.avector_search_with_score         ?float)r  r   fetch_klambda_multr,  rg   rH   c          	      K  s:   |  |}| j|d|fd|i|}t|t|||dS )"  Perform a search and return results that are reordered by MMR.

        Args:
            query (str): Text to look up documents similar to.
            k (int, optional): How many results to give. Defaults to 4.
            fetch_k (int, optional): Total results to select k from.
                Defaults to 20.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5
            filters (str, optional): Filtering expression. Defaults to None.

        Returns:
            List[Tuple[Document, float]]: List of Documents most similar
                to the query and score for each
        r4  r,  query_embeddingrA  r   r   r6  0_reorder_results_with_maximal_marginal_relevancer   r   	r^   r  r   r@  rA  r,  rg   r   r9  r`   r`   ra   (max_marginal_relevance_search_with_scoreJ  s
    
z4AzureSearch.max_marginal_relevance_search_with_scorec          	        sL   |  |I dH }| j|d|fd|i|I dH }t|t|||dI dH S )rB  Nr4  r,  rC  r   r;  1_areorder_results_with_maximal_marginal_relevancer   r   rG  r`   r`   ra   )amax_marginal_relevance_search_with_scorel  s    z5AzureSearch.amax_marginal_relevance_search_with_scorec                 K  s$   | j |fd|i|}dd |D S )r-  r   c                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     rv   z-AzureSearch.hybrid_search.<locals>.<listcomp>r  r^   r  r   rg   r2  r`   r`   ra   r    s    zAzureSearch.hybrid_searchc                   s*   | j |fd|i|I dH }dd |D S )r-  r   Nc                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     rv   z.AzureSearch.ahybrid_search.<locals>.<listcomp>r  rM  r`   r`   ra   r    s    zAzureSearch.ahybrid_searchc                 K  s,   |  |}| j|||fd|i|}t|S )!  Return docs most similar to query with a hybrid query.

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

        Returns:
            List of Documents most similar to the query and score for each
        r,  r5  r8  r`   r`   ra   r    s    
z$AzureSearch.hybrid_search_with_scorec                   s>   |  |I dH }| j|||fd|i|I dH }t|I dH S )rO  Nr,  r:  r8  r`   r`   ra   r    s    z%AzureSearch.ahybrid_search_with_scorec                  s4   | j |fd|i|} d u r"|S  fdd|D S )Nr   c                   s   g | ]}|d   kr|qS r$  r`   r   r"  r`   ra   r     rv   zCAzureSearch.hybrid_search_with_relevance_scores.<locals>.<listcomp>rL  r'  r`   r"  ra   #hybrid_search_with_relevance_scores  s
    z/AzureSearch.hybrid_search_with_relevance_scoresc                  s:   | j |fd|i|I d H } d u r(|S  fdd|D S )Nr   c                   s   g | ]}|d   kr|qS r$  r`   r   r"  r`   ra   r     rv   zDAzureSearch.ahybrid_search_with_relevance_scores.<locals>.<listcomp>rN  r'  r`   r"  ra   $ahybrid_search_with_relevance_scores  s
    z0AzureSearch.ahybrid_search_with_relevance_scoresc          	      K  s:   |  |}| j|||fd|i|}t|t|||dS )  Return docs most similar to query with a hybrid query
            and reorder results by MMR.

        Args:
            query (str): Text to look up documents similar to.
            k (int, optional): Number of Documents to return. Defaults to 4.
            fetch_k (int, optional): Total results to select k from.
                Defaults to 20.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5
            filters (str, optional): Filtering expression. Defaults to None.

        Returns:
            List of Documents most similar to the query and score for each
        r,  rC  rE  rG  r`   r`   ra   /hybrid_max_marginal_relevance_search_with_score  s    
z;AzureSearch.hybrid_max_marginal_relevance_search_with_scorec          	        sL   |  |I dH }| j|||fd|i|I dH }t|t|||dI dH S )rR  Nr,  rC  rI  rG  r`   r`   ra   0ahybrid_max_marginal_relevance_search_with_score"  s    z<AzureSearch.ahybrid_max_marginal_relevance_search_with_scorezSearchItemPaged[dict])r   
text_queryr   r,  rg   rH   c                K  sD   ddl m} | jjf ||tj|tjd |tdg||d|S )  Perform vector or hybrid search in the Azure search index.

        Args:
            embedding: A vector embedding to search in the vector space.
            text_query: A full-text search query expression;
                Use "*" or omit this parameter to perform only vector search.
            k: Number of documents to return.
            filters: Filtering expression.
        Returns:
            Search items
        r   VectorizedQueryr   vectorZk_nearest_neighborsr<   search_textvector_queriesfiltertop)	azure.search.documents.modelsrX  r   searchr   r   r   r   r   r^   r   rU  r   r,  rg   rX  r`   r`   ra   r6  J  s    zAzureSearch._simple_searchzAsyncSearchItemPaged[dict]c                  sJ   ddl m} | jjf ||tj|tjd |tdg||d|I dH S )rV  r   rW  r   rY  r[  N)	r`  rX  r   ra  r   r   r   r   r   rb  r`   r`   ra   r;  n  s    zAzureSearch._asimple_searchc                 K  s$   | j |fd|i|}dd |D S )  
        Returns the most similar indexed documents to the query text.

        Args:
            query (str): The query text for which to find similar documents.
            k (int): The number of documents to return. Default is 4.
            filters: Filtering expression.

        Returns:
            List[Document]: A list of documents that are most similar to the query text.
        r   c                 S  s   g | ]\}}}|qS r`   r`   r/  r`   r`   ra   r     rv   z6AzureSearch.semantic_hybrid_search.<locals>.<listcomp>,semantic_hybrid_search_with_score_and_rerankrM  r`   r`   ra   r    s    z"AzureSearch.semantic_hybrid_searchc                   s*   | j |fd|i|I dH }dd |D S )rc  r   Nc                 S  s   g | ]\}}}|qS r`   r`   r/  r`   r`   ra   r     rv   z7AzureSearch.asemantic_hybrid_search.<locals>.<listcomp>-asemantic_hybrid_search_with_score_and_rerankrM  r`   r`   ra   r    s    z#AzureSearch.asemantic_hybrid_searchscorez"Literal['score', 'reranker_score'])r  r   
score_typer#  rg   rH   c                  sN   | j |fd|i|}|dkr0 fdd|D S |dkrJ fdd|D S dS )  
        Returns the most similar indexed documents to the query text.

        Args:
            query (str): The query text for which to find similar documents.
            k (int): The number of documents to return. Default is 4.
            score_type: Must either be "score" or "reranker_score".
                Defaulted to "score".
            filters: Filtering expression.

        Returns:
            List[Tuple[Document, float]]: A list of documents and their
                corresponding scores.
        r   rh  c                   s*   g | ]"\}}} d u s| kr||fqS rh   r`   rs   r   rh  r0  r"  r`   ra   r     s   zAAzureSearch.semantic_hybrid_search_with_score.<locals>.<listcomp>reranker_scorec                   s*   g | ]"\}}} d u s| kr||fqS rh   r`   rs   r   r0  rl  r"  r`   ra   r     s   Nrd  r^   r  r   ri  r#  rg   r2  r`   r"  ra   r    s    

z-AzureSearch.semantic_hybrid_search_with_scorec                  sT   | j |fd|i|I dH }|dkr6 fdd|D S |dkrP fdd|D S dS )rj  r   Nrh  c                   s*   g | ]"\}}} d u s| kr||fqS rh   r`   rk  r"  r`   ra   r     s   zBAzureSearch.asemantic_hybrid_search_with_score.<locals>.<listcomp>rl  c                   s*   g | ]"\}}} d u s| kr||fqS rh   r`   rm  r"  r`   ra   r      s   rf  rn  r`   r"  ra   r     s    

z.AzureSearch.asemantic_hybrid_search_with_scorez#List[Tuple[Document, float, float]]c          
        s   ddl m} | jjf ||tj| |tjd |t	dg|d| j
dd|d|}| p^g }i  |D ]}|j|jd |j< qh fd	d
|D }	|	S )L  Return docs most similar to query with a hybrid query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filters: Filtering expression.

        Returns:
            List of Documents most similar to the query and score for each
        r   rW  r   rY  semantic
extractiver\  r]  r^  Z
query_typer;   Zquery_captionZquery_answerr_  r   
highlightsc                   s   g | ]}t |ti t|v r*t|tini t|v rDt|t nd d | D |dr|di gd j	|di gd j
dni  |tddddt|d t|d	 fqS )
c                 S  s   i | ]\}}|t kr||qS r`   r   r   r`   r`   ra   ru   <  s   zWAzureSearch.semantic_hybrid_search_with_score_and_rerank.<locals>.<listcomp>.<dictcomp>@search.captionsr   rs  r4  ZcaptionsZanswersZpage_contentr+   @search.score@search.reranker_scorer   r  r   r   r   r   loadsr   r}   r   rt  r?  rs   r(  Zsemantic_answers_dictr`   ra   r   /  sD   *	
%

zLAzureSearch.semantic_hybrid_search_with_score_and_rerank.<locals>.<listcomp>)r`  rX  r   ra  r   r   r   r   r   r   r;   get_answersr   rt  r(   )
r^   r  r   r,  rg   rX  r9  semantic_answerssemantic_answerr  r`   r~  ra   re    s8    
*,z8AzureSearch.semantic_hybrid_search_with_score_and_rerankc                  s   ddl m} | |I dH }| jjf ||tj|tjd |t	dg|d| j
dd|d|I dH }| I dH ptg }i  |D ]}	|	j|	jd	 |	j< q~ fd
d|2 I dH }
|
S )ro  r   rW  Nr   rY  rp  rq  rr  rs  c                   s   g | z3 d H W }t |ti t|v r2t|tini t|v rLt|t ndd | D |dr|di gd j	|di gd j
dni  |tddddt|d	 t|d
 fq6 S )Nc                 S  s   i | ]\}}|t kr||qS r`   ru  r   r`   r`   ra   ru     s   zXAzureSearch.asemantic_hybrid_search_with_score_and_rerank.<locals>.<listcomp>.<dictcomp>rv  r   rs  r4  rw  rx  ry  rz  r{  r}  r~  r`   ra   r     sD   *	
%

zMAzureSearch.asemantic_hybrid_search_with_score_and_rerank.<locals>.<listcomp>)r`  rX  r   r   ra  r   r   r   r   r   r;   r  r   rt  r(   )r^   r  r   r,  rg   rX  rZ  r9  r  r  r  r`   r~  ra   rg  ]  s:    
*,z9AzureSearch.asemantic_hybrid_search_with_score_and_rerankr4  langchain-indexzType[AzureSearch]r   )clsr   r   r   r   r   r:   r9   r<   rg   rH   c	                 K  s4   | ||||f||d|	}
|
j ||fi |	 |
S N)r<   r:   )r   r  r   r   r   r   r   r:   r9   r<   rg   azure_searchr`   r`   ra   
from_texts  s    	zAzureSearch.from_textsc	                   s:   | ||||f||d|	}
|
j ||fi |	I d H  |
S r  )r   r  r`   r`   ra   afrom_texts  s    	zAzureSearch.afrom_texts)r   r   r9   r<   )
r  r   r   r   r   r   r9   r<   rg   rH   c             	     sb   t |\}}	|	d u rtdt|	d }
| f ||||||
d|}|j||fi |I d H  |S Nz0Cannot create AzureSearch from empty embeddings.r%  )r   r   r9   r   r<   r   )_peekr   r   r   r  r   r   r   r   r   r9   r<   rg   Zfirst_text_embeddingr   r  r`   r`   ra   afrom_embeddings  s     	zAzureSearch.afrom_embeddingsc             	   K  s\   t |\}}	|	d u rtdt|	d }
| f ||||||
d|}|j||fi | |S r  )r  r   r   r   r  r`   r`   ra   from_embeddings  s     	zAzureSearch.from_embeddingsAzureSearchVectorStoreRetriever)rg   rH   c                 K  sN   | d| j}||d< |ddp$g }||   tf d| i|d|iS )a  Return AzureSearchVectorStoreRetriever initialized from this VectorStore.

        Args:
            search_type (Optional[str]): Overrides the type of search that
                the Retriever should perform. Defaults to `self.search_type`.
                Can be "similarity", "hybrid", or "semantic_hybrid".
            search_kwargs (Optional[Dict]): Keyword arguments to pass to the
                search function. Can include things like:
                    score_threshold: Minimum relevance threshold
                        for similarity_score_threshold
                    fetch_k: Amount of documents to pass to MMR algorithm (Default: 20)
                    lambda_mult: Diversity of results returned by MMR;
                        1 for minimum diversity and 0 for maximum. (Default: 0.5)
                    filter: Filter by document metadata

        Returns:
            AzureSearchVectorStoreRetriever: Retriever class for VectorStore.
        r   tagsNvectorstore)r}   r   r  extendZ_get_retriever_tagsr  )r^   rg   r   r  r`   r`   ra   as_retriever&  s
    zAzureSearch.as_retriever)r   NNNNNNN)N)N)N)N)N)N)r   )r   )r   )r   )r   )r   )r   N)r   N)r   r=  r>  )r   r=  r>  )r   )r   )r   N)r   N)r   )r   )r   r=  r>  )r   r=  r>  )r   )r   )r   rh  )r   rh  )r   )r   )Nr4  r4  Nr  N)Nr4  r4  Nr  N)N)N)1rj   rk   rl   __doc__rb   r   propertyr   r   r   r   r   r   r  r  r  r  r  r!  r)  r+  r=   r  r  r  rH  rK  r  r  r  r  rP  rQ  rS  rT  r6  r;  r  r  r  r   re  rg  classmethodr  r  r  r  r  r`   r`   r`   ra   r     sX          4}	 ! ! @ 9             %   '          (   .*%    *  ( X X      &      & & &r   c                   @  s   e Zd ZU dZded< dZded< dZded	< i Zd
ed< dZded< e	ddZ
eddedddddZdddddddZdddddddZd S )!r  z-Retriever that uses `Azure Cognitive Search`.r   r  r   r-   r   r   r[   r   dictsearch_kwargs)r	  similarity_score_thresholdr   hybrid_score_thresholdr
  semantic_hybrid_score_thresholdzClassVar[Collection[str]]allowed_search_typesT)Zarbitrary_types_allowedbefore)moder   r   )valuesrH   c                 C  s4   d|v r0|d }|| j vr0td| d| j  |S )zValidate search type.r   r  z  not allowed. Valid values are: )r  r   )r  r  r   r`   r`   ra   validate_search_typec  s    
z4AzureSearchVectorStoreRetriever.validate_search_typer   r  )r  run_managerrg   rH   c                 K  s(  i | j |}| jdkr4| jj|fd| ji|}n| jdkrddd | jj|fd| ji|D }n| jdkr| jj|fd| ji|}n| jdkrdd | jj|fd| ji|D }nj| jd	kr| jj|fd| ji|}nD| jd
krdd | jj	|fd| ji|D }nt
d| j d|S )Nr	  r   r  c                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r   {  s   zKAzureSearchVectorStoreRetriever._get_relevant_documents.<locals>.<listcomp>r   r  c                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     s   r
  r  c                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     s   r  r  )r  r   r  r=   r   r)  r  rP  r  r  r   )r^   r  r  rg   paramsr  r`   r`   ra   _get_relevant_documentsp  sN    




z7AzureSearchVectorStoreRetriever._get_relevant_documentsr   c                  sX  i | j |}| jdkr<| jj|fd| ji|I d H }n| jdkrv| jj|fd| ji|I d H }dd |D }n| jdkr| jj|fd| ji|I d H }n| jdkr| jj|fd| ji|I d H }dd |D }nx| jd	kr
| jj|fd| ji|I d H }nJ| jd
krBdd | jj	|fd| ji|I d H D }nt
d| j d|S )Nr	  r   r  c                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     rv   zLAzureSearchVectorStoreRetriever._aget_relevant_documents.<locals>.<listcomp>r   r  c                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     rv   r
  r  c                 S  s   g | ]\}}|qS r`   r`   r/  r`   r`   ra   r     s   r  r  )r  r   r  r  r   r+  r  rQ  r  r   r   )r^   r  r  rg   r  r  r2  r`   r`   ra   _aget_relevant_documents  sZ    
$


"


z8AzureSearchVectorStoreRetriever._aget_relevant_documentsN)rj   rk   rl   r  __annotations__r   r   r  r  r   Zmodel_configr   r  r  r  r  r`   r`   r`   ra   r  A  s   

	'r  zSearchItemPaged[Dict]r  )r9  rH   c                 C  s   dd | D }|S )Nc                 S  s    g | ]}t |t|d  fqS ry  _result_to_documentr?  r}  r`   r`   ra   r     s   
z)_results_to_documents.<locals>.<listcomp>r`   r9  r  r`   r`   ra   r7    s    r7  zAsyncSearchItemPaged[Dict]c                   s   dd | 2 I d H }|S )Nc                   s*   g | z 3 d H W }t |t|d fq6 S Nry  r  r}  r`   r`   ra   r     s   
z*_aresults_to_documents.<locals>.<listcomp>r`   r  r`   r`   ra   r<    s    r<  r>  r   z
np.ndarrayr?  r[   )r9  rD  rA  r   rH   c                   sl   dd | 2 I d H }t tt| \}}}t||||d}g }	|D ]&}
|
dkrP qh|	||
 ||
 f q@|	S )Nc                   s0   g | z&3 d H W }t |t|d |t fq6 S r  r  r?  r   r}  r`   r`   ra   r     s
   
zE_areorder_results_with_maximal_marginal_relevance.<locals>.<listcomp>r   rA  mapr   r   r   r   r9  rD  rA  r   r  r   ZscoresZvectorsZnew_orderingretrz   r`   r`   ra   rJ    s    rJ  c                 C  sn   dd | D }|sg S t tt| \}}}t||||d}g }	|D ]&}
|
dkrR qj|	||
 ||
 f qB|	S )Nc                 S  s&   g | ]}t |t|d  |t fqS r  r  r}  r`   r`   ra   r     s
   
zD_reorder_results_with_maximal_marginal_relevance.<locals>.<listcomp>r  r  r  r  r`   r`   ra   rF    s    rF  r   r   )r(  rH   c                 C  sv   t | v r0t| t  tr | t  }qBt| t  }ndd |  D }t| v rZt| ti}ni }t| t	 i ||dS )Nc                 S  s"   i | ]\}}|t tfvr||qS r`   )r   r   rw   r`   r`   ra   ru   (  s   z'_result_to_document.<locals>.<dictcomp>rx  )
r   r   r  r   r|  r   r   r  r   r   )r(  Zfields_metadataZ	fields_idr`   r`   ra   r     s$    
r  r	   zOptional[Any]zTuple[Iterable, Any])iterabler)   rH   c                 C  sH   z(t | }t|}t|g|} | |fW S  tyB   | |f Y S 0 d S rh   )iternext	itertoolschainStopIteration)r  r)   iteratorrx   r`   r`   ra   r  ;  s    
r  )NNNNNNNNNr,   NFNNN)r>  r   )r>  r   )N)N
__future__r   r   r   r  r   loggingr\   r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   numpyr   Zlangchain_core.callbacksr   r   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.exceptionsr   Zlangchain_core.retrieversr   Zlangchain_core.utilsr   Zlangchain_core.vectorstoresr   Zpydanticr   r   Z&langchain_community.vectorstores.utilsr   	getLoggerr   r   r   Zazure.core.credentials_asyncr   r   r   r   r   r    r   r   r"   r#   r$   r%   r&   r   r   r   r   r   r   r   r  r7  r<  rJ  rF  r  r  r`   r`   r`   ra   <module>   s   @	               2 K          .   $  #