
    {h                        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y)    )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y	)$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)modec                f    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   )clsvaluess     h/var/www/html/engine/venv/lib/python3.12/site-packages/langchain_community/retrievers/azure_ai_search.pyvalidate_environmentz+AzureAISearchRetriever.validate_environmento   sT     "6N$B"
~  4L"> 
| 1I8
y     c                z   t        ddt              }|| j                  v rd| j                  v r| j                   d}n|| j                  v rd| j                  vrd| j                   d}nk|| 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   )selfquery
url_suffixbase_urlendpoint_path	top_paramfilter_params          r(   _build_search_urlz(AzureAISearchRetriever._build_search_url~   sW   !"&BDVW
***zT=N=N/N++,A.H4,,,4CTCT1T!$"3"3!4A6Ht000Z4CTCT5T++,Aj\;Hd///JdFWFW4W!$"3"3!4Aj\CH ((H"4??"33EdFVFVEWX-1ZZfTZZL)R	48KK4;;-0R-'HUG*<<yH<WWr*   c                     d| j                   dS )Nzapplication/json)zContent-Typezapi-key)r   )r0   s    r(   _headerszAzureAISearchRetriever._headers   s     /||
 	
r*   c                    | j                  |      }t        j                  || j                        }|j                  dk7  rt        d|       t        j                  |j                        d   S )Nheaders   zError in search request: value)	r7   requestsgetr9   status_code	Exceptionjsonloadstext)r0   r1   
search_urlresponses       r(   _searchzAzureAISearchRetriever._search   s_    ++E2
<<
DMMB3&7zBCCzz(--(11r*   c                  K   | j                  |      }| j                  st        j                         4 d {   }|j	                  || j
                        4 d {   }|j                          d {   }d d d       d {    d d d       d {    d   S | j                  j	                  || j
                        4 d {   }|j                          d {   }d d d       d {    |d   S 7 7 7 7 |# 1 d {  7  sw Y   xY w7 # 1 d {  7  sw Y   d   S xY w7 i7 S7 E# 1 d {  7  sw Y   d   S xY ww)Nr;   r>   )r7   r   aiohttpClientSessionr@   r9   rC   )r0   r1   rF   sessionrG   response_jsons         r(   _asearchzAzureAISearchRetriever._asearch   sO    ++E2
,,. : :'";;z4==;I : :X*2--/$9M: :: : W%% **DMM +  6 6&.mmo 56 6
 W%%::$9: : : :: : : : W%%6 !66 6 6 6
 W%%s   6EC=E"DC?D"D6D7D;DDDED4ED5ED;#D7$D;(E3D94
E?DDDD	DD	DED2"D%#D2*E7D;9E;EEE	Ec                   | j                  |      }|D cg c](  }t        |j                  | j                        |      * c}S c c}w N)page_contentmetadata)rH   r
   popr   r0   r1   run_managersearch_resultsresults        r(   _get_relevant_documentsz.AzureAISearchRetriever._get_relevant_documents   sJ     e, )
 &**T-=-=">P
 	
 
s   -Ac                  K   | j                  |       d {   }|D cg c](  }t        |j                  | j                        |      * c}S 7 8c c}w wrP   )rN   r
   rS   r   rT   s        r(   _aget_relevant_documentsz/AzureAISearchRetriever._aget_relevant_documents   sV       $}}U33 )
 &**T-=-=">P
 	
 4
s    AAA-AAA)r'   r   returnr   )r1   r   r[   r   )r[   zDict[str, str])r1   r   r[   z
List[dict])r1   r   rU   r	   r[   List[Document])r1   r   rU   r   r[   r\   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   r   model_configr   classmethodr)   r7   propertyr9   rH   rN   rX   rZ    r*   r(   r   r      s   @D L#)J6GS'#K#26J/6T K HE=M FM @ $L
 (#  $X( 
 
2&

*H
	


*M
	
r*   r   c                      e Zd ZdZy)AzureCognitiveSearchRetrieverz`Azure Cognitive Search` service retriever.
    This version of the retriever will soon be
    depreciated. Please switch to AzureAISearchRetriever
    N)r]   r^   r_   r`   re   r*   r(   rg   rg      s    r*   rg   )
__future__r   rC   typingr   r   r   r   rJ   r?   langchain_core.callbacksr   r	   langchain_core.documentsr
   langchain_core.retrieversr   langchain_core.utilsr   r   pydanticr   r   r/   r   rg   re   r*   r(   <module>ro      sO    "  , ,   . 3 C 0)  Cl
] l
`$: r*   