§
    è˜ºhÐ"  ã                  óÚ   — d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZ ddl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d
lmZmZ ddlmZ ddlmZ dd„Zdd„Z  G d„ de¦  «        Z!dS )zMChain that makes API calls and summarizes the responses to answer a question.é    )Úannotations)ÚAnyÚDictÚListÚOptionalÚSequenceÚTuple)Úurlparse)ÚTextRequestsWrapper)ÚBaseLanguageModel)ÚBasePromptTemplate)ÚFieldÚroot_validator)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRun)ÚAPI_RESPONSE_PROMPTÚAPI_URL_PROMPT)ÚChain)ÚLLMChainÚurlÚstrÚreturnúTuple[str, str]c                ó<   — t          | ¦  «        }|j        |j        fS )z›Extract the scheme + domain from a given URL.

    Args:
        url (str): The input URL.

    Returns:
        return a 2-tuple of scheme and domain
    )r
   ÚschemeÚnetloc)r   Ú
parsed_uris     úa/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/chains/api/base.pyÚ_extract_scheme_and_domainr      s    € õ ˜#‘”€JØÔ˜jÔ/Ð/Ð/ó    Úlimit_to_domainsúSequence[str]Úboolc                óv   — t          | ¦  «        \  }}|D ]#}t          |¦  «        \  }}||k    r	||k    r dS Œ$dS )zòCheck if a URL is in the allowed domains.

    Args:
        url (str): The input URL.
        limit_to_domains (Sequence[str]): The allowed domains.

    Returns:
        bool: True if the URL is in the allowed domains, False otherwise.
    TF)r   )r   r!   r   ÚdomainÚallowed_domainÚallowed_schemes         r   Ú_check_in_allowed_domainr(   "   sX   € õ 0°Ñ4Ô4�N€FˆFà*ð ð ˆÝ)CÀNÑ)SÔ)SÑ&ˆ˜Ø�^Ò#Ð#¨°.Ò(@Ð(@Ø�4�4øØˆ5r    c                  ó’  — e Zd ZU dZded<   ded<    ed¬¦  «        Zded<   d	ed
<   dZd	ed<   dZd	ed<   ded<   	 e	d/d„¦   «         Z
e	d/d„¦   «         Z ed¬¦  «        d0d„¦   «         Z ed¬¦  «        d0d„¦   «         Z ed¬¦  «        d0d„¦   «         Z	 d1d2d!„Z	 d1d3d#„Zedee e¦   «         fd4d-„¦   «         Ze	d5d.„¦   «         ZdS )6ÚAPIChainaé  Chain that makes API calls and summarizes the responses to answer a question.

    *Security Note*: This API chain uses the requests toolkit
        to make GET, POST, PATCH, PUT, and DELETE requests to an API.

        Exercise care in who is allowed to use this chain. If exposing
        to end users, consider that users will be able to make arbitrary
        requests on behalf of the server hosting the code. For example,
        users could ask the server to make a request to a private API
        that is only accessible from the server.

        Control access to who can submit issue requests using this toolkit and
        what network access it has.

        See https://python.langchain.com/docs/security for more information.
    r   Úapi_request_chainÚapi_answer_chainT)Úexcluder   Úrequests_wrapperr   Úapi_docsÚquestionÚquestion_keyÚoutputÚ
output_keyúOptional[Sequence[str]]r!   r   ú	List[str]c                ó   — | j         gS )z2Expect input key.

        :meta private:
        )r1   ©Úselfs    r   Ú
input_keyszAPIChain.input_keys[   s   € ð Ô!Ð"Ð"r    c                ó   — | j         gS )z3Expect output key.

        :meta private:
        )r3   r7   s    r   Úoutput_keyszAPIChain.output_keysc   s   € ð ”Ð Ð r    )ÚpreÚvaluesr   c                ó‚   — |d         j         j        }ddh}t          |¦  «        |k    rt          d|› d|› �¦  «        ‚|S )z:Check that api request prompt expects the right variables.r+   r0   r/   úInput variables should be ú, got ©ÚpromptÚinput_variablesÚsetÚ
ValueError©Úclsr=   Ú
input_varsÚexpected_varss       r   Úvalidate_api_request_promptz$APIChain.validate_api_request_promptk   s\   € ð Ð/Ô0Ô7ÔGˆ
Ø# ZÐ0ˆÝˆz‰?Œ?˜mÒ+Ð+ÝØN¨]ÐNÐNÀ*ÐNÐNñô ð ð ˆr    c                ój   — d|vrt          d¦  «        ‚|d         s|d         �t          d¦  «        ‚|S )z%Check that allowed domains are valid.r!   zKYou must specify a list of domains to limit access using `limit_to_domains`NzJPlease provide a list of domains to limit access using `limit_to_domains`.)rE   )rG   r=   s     r   Úvalidate_limit_to_domainsz"APIChain.validate_limit_to_domainsv   s_   € ð  VÐ+Ð+Ýð%ñô ð ð Ð(Ô)ð 	¨fÐ5GÔ.HÐ.TÝð&ñô ð ð ˆr    c                ó‚   — |d         j         j        }h d£}t          |¦  «        |k    rt          d|› d|› �¦  «        ‚|S )z9Check that api answer prompt expects the right variables.r,   >   Úapi_urlr/   r0   Úapi_responser?   r@   rA   rF   s       r   Úvalidate_api_answer_promptz#APIChain.validate_api_answer_prompt…   s]   € ð Ð.Ô/Ô6ÔFˆ
ØKÐKÐKˆÝˆz‰?Œ?˜mÒ+Ð+ÝØN¨]ÐNÐNÀ*ÐNÐNñô ð ð ˆr    NÚinputsúDict[str, Any]Úrun_managerú$Optional[CallbackManagerForChainRun]úDict[str, str]c                ój  — |pt          j        ¦   «         }|| j                 }| j                             || j        |                     ¦   «         ¬¦  «        }|                     |dd| j        ¬¦  «         | 	                    ¦   «         }| j
        r.t          || j
        ¦  «        st          |› d| j
        › �¦  «        ‚| j                             |¦  «        }|                     |dd| j        ¬¦  «         | j                             || j        |||                     ¦   «         ¬¦  «        }| j        |iS ©N)r0   r/   Ú	callbacksÚgreenú
)ÚcolorÚendÚverbosez  is not in the allowed domains: Úyellow)r0   r/   rN   rO   rX   )r   Úget_noop_managerr1   r+   Úpredictr/   Ú	get_childÚon_textr]   Ústripr!   r(   rE   r.   Úgetr,   r3   ©r8   rQ   rS   Ú_run_managerr0   rN   rO   Úanswers           r   Ú_callzAPIChain._call�   s_  € ð
 #ÐSÕ&@Ô&QÑ&SÔ&SˆØ˜$Ô+Ô,ˆØÔ(×0Ò0ØØ”]Ø"×,Ò,Ñ.Ô.ð 1ñ 
ô 
ˆð
 	×Ò˜W¨G¸ÀtÄ|ÐÑTÔTÐTØ—-’-‘/”/ˆØÔ ð 	Õ)AØ�TÔ*ñ*
ô *
ð 	õ ØÐSÐS¸DÔ<QÐSÐSñô ð ð Ô,×0Ò0°Ñ9Ô9ˆØ×ÒØ ¨d¸D¼Lð 	ñ 	
ô 	
ð 	
ð Ô&×.Ò.ØØ”]ØØ%Ø"×,Ò,Ñ.Ô.ð /ñ 
ô 
ˆð ” Ð(Ð(r    ú)Optional[AsyncCallbackManagerForChainRun]c              ƒ  óª  K  — |pt          j        ¦   «         }|| j                 }| j                             || j        |                     ¦   «         ¬¦  «        ƒ d {V —†}|                     |dd| j        ¬¦  «        ƒ d {V —† | 	                    ¦   «         }| j
        r.t          || j
        ¦  «        st          |› d| j
        › �¦  «        ‚| j                             |¦  «        ƒ d {V —†}|                     |dd| j        ¬¦  «        ƒ d {V —† | j                             || j        |||                     ¦   «         ¬¦  «        ƒ d {V —†}| j        |iS rW   )r   r_   r1   r+   Úapredictr/   ra   rb   r]   rc   r!   r(   rE   r.   Úagetr,   r3   re   s           r   Ú_acallzAPIChain._acall±   sø  è è € ð
 #ÐXÕ&EÔ&VÑ&XÔ&XˆØ˜$Ô+Ô,ˆØÔ.×7Ò7ØØ”]Ø"×,Ò,Ñ.Ô.ð 8ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð
 ×"Ò"Ø˜7¨°d´lð #ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð —-’-‘/”/ˆØÔ ð 	Õ)AØ�TÔ*ñ*
ô *
ð 	õ ØÐSÐS¸DÔ<QÐSÐSñô ð ð "Ô2×7Ò7¸Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@ˆØ×"Ò"Ø ¨d¸D¼Lð #ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð Ô,×5Ò5ØØ”]ØØ%Ø"×,Ò,Ñ.Ô.ð 6ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ” Ð(Ð(r    Úllmr   ÚheadersúOptional[dict]Úapi_url_promptr   Úapi_response_promptÚkwargsr   c           	     ó‚   — t          ||¬¦  «        }t          |¬¦  «        }	t          ||¬¦  «        }
 | d||
|	||dœ|¤ŽS )z-Load chain from just an LLM and the api docs.)rn   rB   )ro   )r+   r,   r.   r/   r!   © )r   r   )rG   rn   r/   ro   rq   rr   r!   rs   Úget_request_chainr.   Úget_answer_chains              r   Úfrom_llm_and_api_docszAPIChain.from_llm_and_api_docsÔ   ss   € õ %¨°^ÐDÑDÔDÐÝ.°wÐ?Ñ?Ô?ÐÝ#¨Ð4GÐHÑHÔHÐØˆsð 
Ø/Ø-Ø-ØØ-ð
ð 
ð ð
ð 
ð 	
r    c                ó   — dS )NÚ	api_chainru   r7   s    r   Ú_chain_typezAPIChain._chain_typeì   s   € àˆ{r    )r   r5   )r=   r   r   r   )N)rQ   rR   rS   rT   r   rU   )rQ   rR   rS   ri   r   rU   )rn   r   r/   r   ro   rp   rq   r   rr   r   r!   r4   rs   r   r   r*   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r.   r1   r3   Úpropertyr9   r;   r   rJ   rL   rP   rh   rm   Úclassmethodr   r   Útuplerx   r{   ru   r    r   r*   r*   5   sù  € € € € € € ðð ð"  ÐÐÑØÐÐÑØ,1¨E¸$Ð,?Ñ,?Ô,?ÐÐ?Ð?Ð?Ñ?Ø€M€M�MØ"€LÐ"Ð"Ð"Ñ"Ø€JÐÐÐÑØ-Ð-Ð-Ñ-ðð ð#ð #ð #ñ „Xð#ð ð!ð !ð !ñ „Xð!ð €^˜ÐÑÔðð ð ñ Ôðð €^˜ÐÑÔðð ð ñ Ôðð €^˜ÐÑÔðð ð ñ Ôðð =Að)ð )ð )ð )ð )ðH BFð!)ð !)ð !)ð !)ð !)ðF ð
 #'Ø-;Ø2EØ49°E±G´Gð
ð 
ð 
ð 
ñ „[ð
ð. ðð ð ñ „Xðð ð r    r*   N)r   r   r   r   )r   r   r!   r"   r   r#   )"r   Ú
__future__r   Útypingr   r   r   r   r   r	   Úurllib.parser
   Ú&langchain_community.utilities.requestsr   Úlangchain_core.language_modelsr   Úlangchain_core.promptsr   Úlangchain_core.pydantic_v1r   r   Úlangchain.callbacks.managerr   r   Úlangchain.chains.api.promptr   r   Úlangchain.chains.baser   Úlangchain.chains.llmr   r   r(   r*   ru   r    r   ú<module>r�      sz  ðØ SÐ SØ "Ð "Ð "Ð "Ð "Ð "à =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø !Ð !Ð !Ð !Ð !Ð !à FÐ FÐ FÐ FÐ FÐ FØ <Ð <Ð <Ð <Ð <Ð <Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ðð ð ð ð ð ð ð ð LÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø )Ð )Ð )Ð )Ð )Ð )ð
0ð 
0ð 
0ð 
0ðð ð ð ð&yð yð yð yð yˆuñ yô yð yð yð yr    