
    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                  2   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<   	 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	)%AzureAISearchRetrievera9  `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>"
            or
            export AZURE_AI_SEARCH_BEARER_TOKEN="<YOUR_BEARER_TOKEN>"

    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azure_ad_tokencontentcontent_keyzOptional[int]top_kzOptional[str]filterTforbid)arbitrary_types_allowedextrabefore)modec                    t        |dd      |d<   t        |dd      |d<   t        |ddd      |d<   t        |d	d
d      |d	<   |d   dk(  r|d	   dk(  rt        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_AD_TOKENr   )defaultr   AZURE_AI_SEARCH_API_KEYzMissing credentials. Please pass one of `api_key`, `azure_ad_token`, or the `AZURE_AI_SEARCH_API_KEY` or `AZURE_AI_SEARCH_AD_TOKEN` environment variables.)r   
ValueError)clsvaluess     l/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/retrievers/azure_ai_search.pyvalidate_environmentz+AzureAISearchRetriever.validate_environmentz   s     "6N$B"
~  4L"> 
| $8$&@"$
  1I8"
y "#r)fY.?2.E)      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di}| j                   rd| j                    |d<   |S | j                  r| j                   |d<   |S )NzContent-Typezapplication/jsonzBearer Authorizationzapi-key)r   r   )r4   headerss     r,   _headerszAzureAISearchRetriever._headers   sY     .
 )01D1D0E'FGO$  \\$(LL>GIr.   c                    | j                  |      }t        j                  || j                        }|j                  dk7  rt        d|       t        j                  |j                        d   S )Nr>      zError in search request: value)	r;   requestsgetr?   status_code	Exceptionjsonloadstext)r4   r5   
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)NrA   rC   )r;   r   aiohttpClientSessionrE   r?   rH   )r4   r5   rK   sessionrL   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)rM   r
   popr   r4   r5   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rU   )rS   r
   rX   r   rY   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   )r5   r   r`   r   )r`   zDict[str, str])r5   r   r`   z
List[dict])r5   r   rZ   r	   r`   List[Document])r5   r   rZ   r   r`   ra   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   r   r   model_configr   classmethodr-   r;   propertyr?   rM   rS   r]   r_    r.   r,   r   r      s   CJ L#)J6GS'#K#26J/6TNC !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)rb   rc   rd   re   rj   r.   r,   rl   rl      s    r.   rl   )
__future__r   rH   typingr   r   r   r   rO   rD   langchain_core.callbacksr   r	   langchain_core.documentsr
   langchain_core.retrieversr   langchain_core.utilsr   r   pydanticr   r   r3   r   rl   rj   r.   r,   <module>rt      sO    "  , ,   . 3 C 0)  CE
] E
R$: r.   