
    dh                         S SK Jr  S SKrS SKJrJrJrJr  S SKrS SK	r	S SK
JrJr  S SKJr  S SKJr  S SKJrJr  S SKJrJr  S	r  " S
 S\5      r " S S\5      rg)    )annotationsN)AnyDictListOptional)#AsyncCallbackManagerForRetrieverRunCallbackManagerForRetrieverRun)Document)BaseRetriever)get_from_dict_or_envget_from_env)
ConfigDictmodel_validatorzsearch.windows.netc                  <   \ rS rSr% SrSrS\S'    SrS\S'    SrS\S'    Sr	S\S	'    S
r
S\S'    SrS\S'    SrS\S'    S
rS\S'    S
rS\S'    \" SSS9r\" SS9\S!S j5       5       rS"S jr\S#S j5       rS$S jrS$S jr      S%S jr      S&S jrS rg
)'AzureAISearchRetriever   a  `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                    [        USS5      US'   [        USS5      US'   [        USSSS9US'   [        US	S
SS9US	'   US   S:X  a  US	   S:X  a  [        S5      eU$ )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     f/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/retrievers/azure_ai_search.pyvalidate_environment+AzureAISearchRetriever.validate_environmentz   s     "6N$B"
~  4L"> 
| $8$&@"$
  1I8"
y "#r)fY.?2.E)      c                   [        SS[        5      nX R                  ;   a   SU R                  ;   a  U R                   S3nOX R                  ;   a!  SU R                  ;  a  SU R                   S3nOqX R                  ;  a#  SU R                  ;   a  U R                   SU S3nO?X R                  ;  a$  SU R                  ;  a  SU R                   SU S3nOU R                  nSU R                   SU R                   3nU R
                  (       a  SU R
                   3OSnU R                  (       a  S	U R                   3OSnX4-   S
U 3-   U-   U-   $ )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_url(AzureAISearchRetriever._build_search_url   sM   !"&BDVW
***zT=N=N/N++,A.H,,,4CTCT1T!$"3"3!4A6H000Z4CTCT5T++,Aj\;H///JdFWFW4W!$"3"3!4Aj\CH ((H"4??"33EdFVFVEWX-1ZZfTZZL)R	48KK4;;-0R'HUG*<<yH<WWr0   c                    SS0nU R                   (       a  SU R                    3US'   U$ U R                  (       a  U R                   US'   U$ )NzContent-Typezapplication/jsonzBearer Authorizationzapi-key)r   r   )r6   headerss     r-   _headersAzureAISearchRetriever._headers   sY     .
 )01D1D0E'FGO$  \\$(LL>GIr0   c                    U R                  U5      n[        R                  " X R                  S9nUR                  S:w  a  [        SU 35      e[        R                  " UR                  5      S   $ )NrA      zError in search request: value)	r=   requestsgetrB   status_code	Exceptionjsonloadstext)r6   r7   
search_urlresponses       r-   _searchAzureAISearchRetriever._search   s]    ++E2
<<
MMB3&7zBCCzz(--(11r0   c                  #    U R                  U5      nU R                  (       d}  [        R                  " 5        IS h  vN nUR	                  X R
                  S9 IS h  vN nUR                  5       I S h  vN nS S S 5      IS h  vN   S S S 5      IS h  vN   WS   $ U R                  R	                  X R
                  S9 IS h  vN nUR                  5       I S h  vN nS S S 5      IS h  vN   US   $  N N N Nx! , IS h  vN  (       d  f       N= f N! , IS h  vN  (       d  f       WS   $ = f Ns N] NO! , IS h  vN  (       d  f       WS   $ = f7f)NrE   rG   )r=   r   aiohttpClientSessionrI   rB   rL   )r6   r7   rO   sessionrP   response_jsons         r-   _asearchAzureAISearchRetriever._asearch   s    ++E2
,,..'";;z==;IIX*2--/$9M JI /. W%% **MM +  &.mmo 5 
 W%% /I$9 JIII /.. W%% !6  
 W%%s   <E!C;E!D C=!D$D8C?9D=DD	DE!D0E!	D=
E!E!D?"E&E!1E2
E!=D?DDD		D
D	DE!D:%D(&D:2E!?EE!E	E
EE!c                   U R                  U5      nU Vs/ sH&  n[        UR                  U R                  5      US9PM(     sn$ s  snf N)page_contentmetadata)rQ   r
   popr   r6   r7   run_managersearch_resultsresults        r-   _get_relevant_documents.AzureAISearchRetriever._get_relevant_documents   sO     e, )
( &**T-=-=">P(
 	
 
s   ,Ac                  #    U R                  U5      I S h  vN nU Vs/ sH&  n[        UR                  U R                  5      US9PM(     sn$  N7s  snf 7fr[   )rX   r
   r^   r   r_   s        r-   _aget_relevant_documents/AzureAISearchRetriever._aget_relevant_documents   sZ       $}}U33 )
( &**T-=-=">P(
 	
 4
s    AAA,AAA )r,   r   returnr   )r7   r   ri   r   )ri   zDict[str, str])r7   r   ri   z
List[dict])r7   r   r`   r	   ri   List[Document])r7   r   r`   r   ri   rj   )__name__
__module____qualname____firstlineno____doc__r   __annotations__r   r   r   r   r   r   r   r   r   model_configr   classmethodr.   r=   propertyrB   rQ   rX   rc   rf   __static_attributes__rh   r0   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
	
r0   r   c                      \ rS rSrSrSrg)AzureCognitiveSearchRetriever   z`Azure Cognitive Search` service retriever.
This version of the retriever will soon be
depreciated. Please switch to AzureAISearchRetriever
rh   N)rk   rl   rm   rn   ro   rt   rh   r0   r-   rv   rv      s    r0   rv   )
__future__r   rL   typingr   r   r   r   rT   rH   langchain_core.callbacksr   r	   langchain_core.documentsr
   langchain_core.retrieversr   langchain_core.utilsr   r   pydanticr   r   r5   r   rv   rh   r0   r-   <module>r      sO    "  , ,   . 3 C 0)  CE
] E
R$: r0   