
    NgH"                        d Z ddlmZ ddl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 ddlmZmZ ddlmZ ddlmZ ddlm Z   G d de          Z! G d dee          Z"dS )zMChain that makes API calls and summarizes the responses to answer a question.    )annotationsN)AnyDictList
NamedTupleOptionalcast)APIRequesterChain)APIResponderChain)Chain)LLMChain)CallbackManagerForChainRun	Callbacks)BaseLanguageModel)	BaseModelField)Response)APIOperation)Requestsc                  2    e Zd ZU dZded<   ded<   ded<   dS )_ParamMappingz/Mapping from parameter name to parameter value.	List[str]query_paramsbody_paramspath_paramsN)__name__
__module____qualname____doc____annotations__     d/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chains/openapi/chain.pyr   r      s<         99r"   r   c                  n   e Zd ZU dZded<   dZded<   ded<    ed	e
          Zded<    ed          Z	ded<   dZ
ded<   dZded<   dZded<    ed          Zded<   ed@d            Zed@d            ZdAd"ZdBd#ZdCd%ZdDd(ZdEd*Z	 dFdGd/Ze	 	 dHdId9            Ze	 	 	 	 	 dJdKd?            ZdS )LOpenAPIEndpointChainz@Chain interacts with an OpenAPI endpoint using natural language.r   api_request_chainNzOptional[LLMChain]api_response_chainr   api_operationT)excludedefault_factoryr   requestsparam_mapping)aliasr   Fboolreturn_intermediate_stepsinstructionsstrinstructions_keyoutput
output_keyr   )gezOptional[int]max_text_lengthreturnr   c                    | j         gS )z2Expect input key.

        :meta private:
        )r2   selfs    r#   
input_keyszOpenAPIEndpointChain.input_keys*   s     %&&r"   c                2    | j         s| j        gS | j        dgS )z3Expect output key.

        :meta private:
        intermediate_stepsr/   r4   r9   s    r#   output_keysz OpenAPIEndpointChain.output_keys2   s(     - 	;O$$O%9::r"   argsDict[str, str]c           
         | j         j        | j         j        z   }| j        j        D ]=}|                    d| dt          |                    |d                              }>|S )z/Construct the path from the deserialized input.{} )r(   base_urlpathr,   r   replacer1   pop)r:   r@   rG   params       r#   _construct_pathz$OpenAPIEndpointChain._construct_path=   sg    !*T-?-DD'3 	J 	JE<<UDHHUB4G4G0H0HIIDDr"   c                `    i }| j         j        D ]}||v r|                    |          ||<   |S )z5Extract the query params from the deserialized input.)r,   r   rI   )r:   r@   r   rJ   s       r#   _extract_query_paramsz*OpenAPIEndpointChain._extract_query_paramsD   s@    '4 	6 	6E}}&*hhuooU#r"   Optional[Dict[str, str]]c                |    d}| j         j        r-i }| j         j        D ]}||v r|                    |          ||<   |S )z<Extract the request body params from the deserialized input.N)r,   r   rI   )r:   r@   r   rJ   s       r#   _extract_body_paramsz)OpenAPIEndpointChain._extract_body_paramsL   sS    ) 	9K+7 9 9D==)-%K&r"   serialized_argsdictc                    t          j        |          }|                     |          }|                     |          }|                     |          }|||dS )zUse the serialized typescript dictionary.

        Resolve the path, query params dict, and optional requestBody dict.
        )urldataparams)jsonloadsrK   rP   rM   )r:   rQ   r@   rG   r   r   s         r#   deserialize_json_inputz+OpenAPIEndpointChain.deserialize_json_inputV   sd    
 Z00##D))//5511$77"
 
 	
r"   r=   c                8    | j         r| j        |d|iS | j        |iS )z$Return the output from the API call.r=   r>   )r:   r3   r=   s      r#   _get_outputz OpenAPIEndpointChain._get_outpute   s3    ) 	-$&8 
 OV,,r"   inputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]c                P   |pt          j                    }i }|| j                 }|d | j                 }| j                            ||                                          }t          t          |          }||d<   |	                    |dd| j
                   |                    d          r|                     ||          S |                    d          r+|                     |t          d          d          |          S 	 |                     |          }t          | j        | j        j        j                  }	 |	di |}
|
j        dk    r^t          | j        j        j                  }|
j         d	|
j         d
|                                 d|d          dz   d|d          z   }n|
j        }n)# t0          $ r}dt          |           }Y d }~nd }~ww xY w|d | j                 }||d<   |	                    |dd| j
                   | j        x| j                            |||                                          }t          t          |          }|	                    |dd| j
                   |                     ||          S |                     ||          S )N)r0   	callbacksrequest_argsgreen
)colorendverboseERRORzMESSAGE:   z: z
For z  rT   zCalled with args: rV   zError with message response_textblue)responser0   ra   yellowr!   )r   get_noop_managerr2   r6   r&   predict_and_parse	get_childr	   r1   on_textrg   
startswithr[   lenrY   getattrr+   r(   methodvaluestatus_codereasonuppertext	Exceptionr'   )r:   r\   r^   _run_managerr=   r0   _api_argumentsapi_argumentsrb   ru   api_response
method_strrj   e_answeranswers                   r#   _callzOpenAPIEndpointChain._callo   s   
 #S&@&Q&S&Sd34#$:d&:$:;/AA%1G1G1I1I B 
 
 S.11-:>*dDL 	 	
 	
 	
 ##G,, 	##M3EFFF%%j11 	##c*oo//02D  	;66}EELT]D,>,E,KLLF%+V%;%;l%;%;L'3.. !3!:!@AA
#/HH<3FHHLz//11LL\%5HLLLMC<+ACCD  !- 1 	; 	; 	;:#a&&::MMMMMM	;%&<(<&<=.;?+T4< 	 	
 	
 	
 ".-??&)&0022 @  G
 #w''F  xT4< XXX##F,>???##M3EFFFs   B1F8 8
GGGspec_urlrG   ru   llmr   Optional[Requests]kwargsr   'OpenAPIEndpointChain'c                R    t          j        |||          } | j        |f|||d|S )z;Create an OpenAPIEndpoint from a spec at the specified url.)r+   r   r/   )r   from_openapi_urlfrom_api_operation)	clsr   rG   ru   r   r+   r/   r   	operations	            r#   from_url_and_methodz(OpenAPIEndpointChain.from_url_and_method   sO     !1(D&II	%s%
&?	
 

 
 
 	
r"   r   rg   raw_responsera   r   c                   t          |j        |j        |j                  }	t	          j        ||                                ||          }
|rd}nt          j        |||          }|pt                      } | d|
||||	|||d|S )z<Create an OpenAPIEndpointChain from an operation and a spec.)r   r   r   )typescript_definitionrg   ra   N)rg   ra   )r&   r'   r(   r+   r,   rg   r/   ra   r!   )
r   r   r   r   r
   from_llm_and_typescriptto_typescriptr   from_llmr   )r   r   r   r+   rg   r/   r   ra   r   r,   requests_chainresponse_chain	_requestss                r#   r   z'OpenAPIEndpointChain.from_api_operation   s     &"/!-!-
 
 

 +B"+"9"9";";	
 
 
  	!NN.7W	  N *

	s 

,-#'&?

 

 

 

 
	
r"   )r7   r   )r@   rA   r7   r1   )r@   rA   r7   rA   )r@   rA   r7   rN   )rQ   r1   r7   rR   )r3   r1   r=   rR   r7   rR   )N)r\   r]   r^   r_   r7   rA   )NF)r   r1   rG   r1   ru   r1   r   r   r+   r   r/   r.   r   r   r7   r   )NFFFN)r   r   r   r   r+   r   rg   r.   r/   r.   r   r.   ra   r   r   r   r7   r   )r   r   r   r   r    r'   r   r   r+   r,   r/   r2   r4   r6   propertyr;   r?   rK   rM   rP   rY   r[   r   classmethodr   r   r!   r"   r#   r%   r%      s        JJ-11111tXFFFHFFFF#(5#?#?#?M????&+++++*****J%*Ua[[[O0000' ' ' X' ; ; ; X;         
 
 
 
- - - - =A5G 5G 5G 5G 5Gn  (,*/
 
 
 
 [
* 
 (,*/"#)
 )
 )
 )
 [)
 )
 )
r"   r%   )#r   
__future__r   rW   typingr   r   r   r   r   r	   +langchain.chains.api.openapi.requests_chainr
   +langchain.chains.api.openapi.response_chainr   langchain.chains.baser   langchain.chains.llmr   langchain_core.callbacksr   r   langchain_core.language_modelsr   pydanticr   r   r+   r   2langchain_community.tools.openapi.utils.api_modelsr   &langchain_community.utilities.requestsr   r   r%   r!   r"   r#   <module>r      s   S S " " " " " "  > > > > > > > > > > > > > > > > I I I I I I I I I I I I ' ' ' ' ' ' ) ) ) ) ) ) J J J J J J J J < < < < < < % % % % % % % %       K K K K K K ; ; ; ; ; ;    J   I
 I
 I
 I
 I
5) I
 I
 I
 I
 I
r"   