a
    bg                     @  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dddddZdddddZedd d!d"Zdd#dd$d%Zdd#dd&d'Zdd(d)d*d+d,Zdd-d)d*d.d/Zd	S )0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)moder   r   )valuesreturnc                 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!   |/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/retrievers/azure_ai_search.pyvalidate_environmento   s    z+AzureAISearchRetriever.validate_environment)queryr   c                 C  s  t ddt}|| jv r.d| jv r.| j d}n||| jv rRd| jvrRd| j d}nX|| jvrzd| jv rz| j d| d}n0|| jvrd| jvrd| j d| d}n| j}d| j d| j }| jrd| j nd}| jrd	| 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_urlzDict[str, str])r   c                 C  s   d| j dS )Nzapplication/json)zContent-Typezapi-key)r   r(   r!   r!   r"   _headers   s    zAzureAISearchRetriever._headersz
List[dict]c                 C  sB   |  |}tj|| jd}|jdkr2t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st 4 I d H h}|j|| jd4 I d H $}| I d H }W d   I d H  qt1 I d H sj0    Y  W d   I d H  q1 I d H s0    Y  nT| jj|| jd4 I d H $}| I d H }W d   I d H  q1 I d H s0    Y  |d S )Nr-   r0   )r*   r   aiohttpZClientSessionr2   r,   r5   )r(   r$   r8   sessionr9   Zresponse_jsonr!   r!   r"   _asearch   s    
d8zAzureAISearchRetriever._asearchr   zList[Document])r$   run_managerr   c                  s     |} fdd|D S )Nc                   s    g | ]}t | j|d qS )Zpage_contentmetadatar	   popr   .0resultr+   r!   r"   
<listcomp>   s   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                   s    g | ]}t | j|d qS r?   rA   rC   r+   r!   r"   rF      s   zCAzureAISearchRetriever._aget_relevant_documents.<locals>.<listcomp>)r=   rG   r!   r+   r"   _aget_relevant_documents   s    
z/AzureAISearchRetriever._aget_relevant_documents)__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   r   Zmodel_configr   classmethodr#   r*   propertyr,   r:   r=   rH   rI   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)rJ   rK   rL   rM   r!   r!   r!   r"   rQ      s   rQ   )
__future__r   r5   typingr   r   r   r   r;   r1   Zlangchain_core.callbacksr   r   Zlangchain_core.documentsr	   Zlangchain_core.retrieversr
   Zlangchain_core.utilsr   r   Zpydanticr   r   r'   r   rQ   r!   r!   r!   r"   <module>   s    1