o
    Zh                     @  s   d dl mZ d dlZd dlmZmZmZmZ d dl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mZ d dlmZmZ d	Z	 G d
d deZG dd deZdS )    )annotationsN)AnyDictListOptional)#AsyncCallbackManagerForRetrieverRunCallbackManagerForRetrieverRun)Document)BaseRetriever)get_from_dict_or_envget_from_env)
ConfigDictmodel_validatorzsearch.windows.netc                   @  s   e Zd ZU dZdZded< 	 dZded< 	 dZded< 	 dZded< 	 d	Z	d
ed< 	 dZ
ded< 	 d	Zded< 	 d	Zded< 	 edddZedded0ddZd1ddZed2d!d"Zd3d$d%Zd3d&d'Zd4d+d,Zd5d.d/Zd	S )6AzureAISearchRetrievera  `Azure AI Search` service retriever.

    Setup:
        See here for more detail: https://python.langchain.com/docs/integrations/retrievers/azure_ai_search/

        We will need to install the below dependencies and set the required
        environment variables:

        .. code-block:: bash

            pip install -U langchain-community azure-identity azure-search-documents
            export AZURE_AI_SEARCH_SERVICE_NAME="<YOUR_SEARCH_SERVICE_NAME>"
            export AZURE_AI_SEARCH_INDEX_NAME="<YOUR_SEARCH_INDEX_NAME>"
            export AZURE_AI_SEARCH_API_KEY="<YOUR_API_KEY>"

    Key init args:
        content_key: str
        top_k: int
        index_name: str

    Instantiate:
        .. code-block:: python

            from langchain_community.retrievers import AzureAISearchRetriever

            retriever = AzureAISearchRetriever(
                content_key="content", top_k=1, index_name="langchain-vector-demo"
            )

    Usage:
        .. code-block:: python

            retriever.invoke("here is my unstructured query string")

    Use within a chain:
        .. code-block:: python

            from langchain_core.output_parsers import StrOutputParser
            from langchain_core.prompts import ChatPromptTemplate
            from langchain_core.runnables import RunnablePassthrough
            from langchain_openai import AzureChatOpenAI

            prompt = ChatPromptTemplate.from_template(
                """Answer the question based only on the context provided.

            Context: {context}

            Question: {question}"""
            )

            llm = AzureChatOpenAI(azure_deployment="gpt-35-turbo")

            def format_docs(docs):
                return "\n\n".join(doc.page_content for doc in docs)

            chain = (
                {"context": retriever | format_docs, "question": RunnablePassthrough()}
                | prompt
                | llm
                | StrOutputParser()
            )

            chain.invoke("...")

     strservice_name
index_nameapi_keyz
2023-11-01api_versionNzOptional[aiohttp.ClientSession]
aiosessioncontentcontent_keyzOptional[int]top_kzOptional[str]filterTZforbid)Zarbitrary_types_allowedextrabefore)modevaluesr   returnr   c                 C  s4   t |dd|d< t |dd|d< t |dd|d< |S )zIValidate that service name, index name and api key exists in environment.r   ZAZURE_AI_SEARCH_SERVICE_NAMEr   ZAZURE_AI_SEARCH_INDEX_NAMEr   ZAZURE_AI_SEARCH_API_KEY)r   )clsr    r!   e/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/retrievers/azure_ai_search.pyvalidate_environmento   s   z+AzureAISearchRetriever.validate_environmentqueryc                 C  s  t ddt}|| jv rd| jv r| j d}n>|| jv r)d| jvr)d| j d}n,|| jvr=d| jv r=| j d| d}n|| jvrRd| jvrRd| j d| d}n| j}d| j d| j }| jrhd| j nd}| jrsd	| j nd}|| d
|  | | S )Nr   ZAZURE_AI_SEARCH_URL_SUFFIXzhttps:///.zindexes/z/docs?api-version=z&$top=z	&$filter=z&search=)r   DEFAULT_URL_SUFFIXr   r   r   r   r   )selfr$   Z
url_suffixbase_urlZendpoint_pathZ	top_paramZfilter_paramr!   r!   r"   _build_search_url~   s   z(AzureAISearchRetriever._build_search_urlDict[str, str]c                 C  s   d| j dS )Nzapplication/json)zContent-Typezapi-key)r   r(   r!   r!   r"   _headers   s   zAzureAISearchRetriever._headers
List[dict]c                 C  sB   |  |}tj|| jd}|jdkrtd| t|jd S )Nheaders   zError in search request: value)	r*   requestsgetr-   status_code	Exceptionjsonloadstext)r(   r$   
search_urlresponser!   r!   r"   _search   s
   

zAzureAISearchRetriever._searchc              
     s  |  |}| jsWt 4 I d H 7}|j|| jd4 I d H }| I d H }W d   I d H  n1 I d H s6w   Y  W d   I d H  |d S 1 I d H sNw   Y  |d S | jj|| jd4 I d H }| I d H }W d   I d H  |d S 1 I d H sw   Y  |d S )Nr/   r2   )r*   r   aiohttpZClientSessionr4   r-   r7   )r(   r$   r:   sessionr;   Zresponse_jsonr!   r!   r"   _asearch   s(   
*		zAzureAISearchRetriever._asearchrun_managerr   List[Document]c                  s     |} fdd|D S )Nc                       g | ]}t | j|d qS )Zpage_contentmetadatar	   popr   .0resultr,   r!   r"   
<listcomp>       zBAzureAISearchRetriever._get_relevant_documents.<locals>.<listcomp>)r<   r(   r$   r@   Zsearch_resultsr!   r,   r"   _get_relevant_documents   s   

z.AzureAISearchRetriever._get_relevant_documentsr   c                  s$     |I d H } fdd|D S )Nc                   rB   rC   rE   rG   r,   r!   r"   rJ      rK   zCAzureAISearchRetriever._aget_relevant_documents.<locals>.<listcomp>)r?   rL   r!   r,   r"   _aget_relevant_documents   s
   
z/AzureAISearchRetriever._aget_relevant_documents)r   r   r   r   )r$   r   r   r   )r   r+   )r$   r   r   r.   )r$   r   r@   r   r   rA   )r$   r   r@   r   r   rA   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   r   Zmodel_configr   classmethodr#   r*   propertyr-   r<   r?   rM   rN   r!   r!   r!   r"   r      s@   
 B




r   c                   @  s   e Zd ZdZdS )AzureCognitiveSearchRetrieverz`Azure Cognitive Search` service retriever.
    This version of the retriever will soon be
    depreciated. Please switch to AzureAISearchRetriever
    N)rO   rP   rQ   rR   r!   r!   r!   r"   rV      s    rV   )
__future__r   r7   typingr   r   r   r   r=   r3   Zlangchain_core.callbacksr   r   Zlangchain_core.documentsr	   Zlangchain_core.retrieversr
   Zlangchain_core.utilsr   r   Zpydanticr   r   r'   r   rV   r!   r!   r!   r"   <module>   s     1