
    Ng                        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e          Z G 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                  *   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          Z ed          ed)d                        Zd*dZed+d            Zd,d!Zd,d"Zd-d&Zd.d(Zd	S )/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]filterTforbid)arbitrary_types_allowedextrabefore)modevaluesr   returnr   c                ~    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   AZURE_AI_SEARCH_SERVICE_NAMEr   AZURE_AI_SEARCH_INDEX_NAMEr   AZURE_AI_SEARCH_API_KEY)r   )clsr"   s     j/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/retrievers/azure_ai_search.pyvalidate_environmentz+AzureAISearchRetriever.validate_environmento   sc     "6N$B"
 "
~  4L"> 
  
| 1I8
 
y     queryc                   t          ddt                    }|| j        v rd| j        v r| j         d}nf|| j        v rd| j        vrd| j         d}nH|| j        vrd| j        v r| j         d| d}n(|| j        vrd| j        vrd| j         d| d}n| j        }d| j         d| j         }| j        r
d| j         nd}| j        r
d	| j         nd}||z   d
| z   |z   |z   S )Nr   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,   
url_suffixbase_urlendpoint_path	top_paramfilter_params          r)   _build_search_urlz(AzureAISearchRetriever._build_search_url~   s`   !"&BDVWW
***zT=N/N/N+...HH4,,,4CT1T1T6$"3666HHt000Z4CT5T5T+;;j;;;HHd///JdFW4W4WC$"3CCjCCCHH (HX4?XXdFVXX-1Z?)TZ)))R	48KG04;000R-'*<U*<*<<yH<WWr+   Dict[str, str]c                    d| j         dS )Nzapplication/json)zContent-Typezapi-key)r   )r2   s    r)   _headerszAzureAISearchRetriever._headers   s     /|
 
 	
r+   
List[dict]c                    |                      |          }t          j        || j                  }|j        dk    rt          d|           t          j        |j                  d         S )Nheaders   zError in search request: value)	r8   requestsgetr;   status_code	Exceptionjsonloadstext)r2   r,   
search_urlresponses       r)   _searchzAzureAISearchRetriever._search   sg    ++E22
<
DMBBB3&&BBBCCCz(-((11r+   c                V  K   |                      |          }| j        st          j                    4 d {V }|                    || j                  4 d {V }|                                 d {V }d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  n# 1 d {V swxY w Y   nf| j                            || j                  4 d {V 	 }|                                 d {V }d d d           d {V  n# 1 d {V swxY w Y   |d         S )Nr>   rA   )r8   r   aiohttpClientSessionrC   r;   rF   )r2   r,   rI   sessionrJ   response_jsons         r)   _asearchzAzureAISearchRetriever._asearch   s     ++E22
 	6,.. : : : : : : :'";;z4=;II : : : : : : :X*2--//$9$9$9$9$9$9M: : : : : : : : : : : : : : : : : : : : : : : : : : :: : : : : : : : : : : : : : : : : : : : : : : : : : : **DM +   6 6 6 6 6 6 6 6&.mmoo 5 5 5 5 5 56 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 W%%sG   #B+B6B+
B	B+B	B++
B58B5%D
DDrun_managerr	   List[Document]c               J                           |          } fd|D             S )Nc                b    g | ]+}t          |                    j                  |           ,S )page_contentmetadatar
   popr   .0resultr2   s     r)   
<listcomp>zBAzureAISearchRetriever._get_relevant_documents.<locals>.<listcomp>   E     
 
 
 &**T-=">">PPP
 
 
r+   )rK   r2   r,   rR   search_resultss   `   r)   _get_relevant_documentsz.AzureAISearchRetriever._get_relevant_documents   sA     e,,
 
 
 
(
 
 
 	
r+   r   c               Z    K                         |           d {V } fd|D             S )Nc                b    g | ]+}t          |                    j                  |           ,S rV   rY   r[   s     r)   r^   zCAzureAISearchRetriever._aget_relevant_documents.<locals>.<listcomp>   r_   r+   )rQ   r`   s   `   r)   _aget_relevant_documentsz/AzureAISearchRetriever._aget_relevant_documents   sW        $}}U33333333
 
 
 
(
 
 
 	
r+   )r"   r   r#   r   )r,   r   r#   r   )r#   r9   )r,   r   r#   r<   )r,   r   rR   r	   r#   rS   )r,   r   rR   r   r#   rS   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   r   model_configr   classmethodr*   r8   propertyr;   rK   rQ   rb   re    r+   r)   r   r      s        @ @D L)J6G'#K####26J6666T K    HEM F    @: $  L
 _(###   [ $#X X X X( 
 
 
 X
2 2 2 2& & & &
 
 
 

 
 
 
 
 
r+   r   c                      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)rf   rg   rh   ri   rn   r+   r)   rp   rp      s           r+   rp   )
__future__r   rF   typingr   r   r   r   rM   rB   langchain_core.callbacksr   r	   langchain_core.documentsr
   langchain_core.retrieversr   langchain_core.utilsr   r   pydanticr   r   r1   r   rp   rn   r+   r)   <module>rx      sE   " " " " " "  , , , , , , , , , , , ,          . - - - - - 3 3 3 3 3 3 C C C C C C C C 0 0 0 0 0 0 0 0)  Cl
 l
 l
 l
 l
] l
 l
 l
`    $:     r+   