
    7|hH"                        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"y)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                  0    e Zd ZU dZded<   ded<   ded<   y)_ParamMappingz/Mapping from parameter name to parameter value.	List[str]query_paramsbody_paramspath_paramsN)__name__
__module____qualname____doc____annotations__     g/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chains/openapi/chain.pyr   r      s    9r"   r   c                     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d'dZd(dZd)d Zd*d!Zd+d"Z	 d,	 	 	 	 	 d-d#Ze	 	 d.	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d/d$       Ze	 	 	 	 	 d0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d%       Zy)2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_lengthc                    | j                   gS )z2Expect input key.

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

        :meta private:
        intermediate_stepsr/   r4   r8   s    r#   output_keysz OpenAPIEndpointChain.output_keys2   s*     --OO$$OO%9::r"   c           
         | j                   j                  | j                   j                  z   }| j                  j                  D ]1  }|j                  d| dt        |j                  |d                  }3 |S )z/Construct the path from the deserialized input.{} )r(   base_urlpathr,   r   replacer1   pop)r9   argsrD   params       r#   _construct_pathz$OpenAPIEndpointChain._construct_path=   sn    !!**T-?-?-D-DD''33 	JE<<"UG2DHHUB4G0HID	Jr"   c                r    i }| j                   j                  D ]  }||v s|j                  |      ||<    |S )z5Extract the query params from the deserialized input.)r,   r   rF   )r9   rG   r   rH   s       r#   _extract_query_paramsz*OpenAPIEndpointChain._extract_query_paramsD   sC    ''44 	6E}&*hhuoU#	6 r"   c                    d}| j                   j                  r6i }| j                   j                  D ]  }||v s|j                  |      ||<    |S )z<Extract the request body params from the deserialized input.N)r,   r   rF   )r9   rG   r   rH   s       r#   _extract_body_paramsz)OpenAPIEndpointChain._extract_body_paramsL   sW    ))K++77 9D=)-%K&9 r"   c                    t        j                  |      }| j                  |      }| j                  |      }| j	                  |      }|||dS )zUse the serialized typescript dictionary.

        Resolve the path, query params dict, and optional requestBody dict.
        )urldataparams)jsonloadsrI   rM   rK   )r9   serialized_argsrG   rD   r   r   s         r#   deserialize_json_inputz+OpenAPIEndpointChain.deserialize_json_inputV   sU    
 ZZ0##D)//511$7"
 	
r"   c                V    | j                   r| j                  |d|iS | j                  |iS )z$Return the output from the API call.r<   r=   )r9   r3   r<   s      r#   _get_outputz OpenAPIEndpointChain._get_outpute   s5    ))$&8 
 OOV,,r"   c                <   |xs t        j                         }i }|| j                     }|d | j                   }| j                  j                  ||j                               }t        t        |      }||d<   |j                  |dd| j                         |j                  d      r| j                  ||      S |j                  d      r| j                  |t        d      d  |      S 	 | j                  |      }t        | j                   | j"                  j$                  j&                        }	 |	di |}
|
j(                  dk7  rit        | j"                  j$                  j&                        }|
j(                   d	|
j*                   d
|j-                          d|d    dz   d|d    z   }n|
j.                  }|d | j                   }||d<   |j                  |dd| j                         | j2                  m| j2                  j                  |||j                               }t        t        |      }|j                  |dd| j                         | j                  ||      S | j                  ||      S # t0        $ r}dt        |       }Y d }~d }~ww xY w)N)r0   	callbacksrequest_argsgreen
)colorendverboseERRORzMESSAGE:   z: z
For z  rO   zCalled with args: rQ   zError with message response_textblue)responser0   rY   yellowr!   )r   get_noop_managerr2   r6   r&   predict_and_parse	get_childr	   r1   on_textr_   
startswithrW   lenrU   getattrr+   r(   methodvaluestatus_codereasonuppertext	Exceptionr'   )r9   inputsrun_manager_run_managerr<   r0   _api_argumentsapi_argumentsrZ   rm   api_response
method_strrb   e_answeranswers                   r#   _callzOpenAPIEndpointChain._callo   s   
 #S&@&Q&Q&Sd334#$:d&:&:;//AA%1G1G1I B 
 S.1-:>*dDLL 	 	
 ##G,##M3EFF%%j1##c*o/02D 	;66}ELT]]D,>,>,E,E,K,KLF%+%;l%;L''3. !3!3!:!:!@!@A
#//0<3F3F2GHz//12"\%5H4ILM*<+A*BCD  !- 1 1 &&<(<(<=.;?+T4<< 	 	
 "".--??&)&002 @ G
 #w'F  xT4<< X##F,>??##M3EFF#  	;1#a&:M	;s   +CI: :	JJJc                ^    t        j                  |||      } | j                  |f|||d|S )z;Create an OpenAPIEndpoint from a spec at the specified url.)r+   llmr/   )r   from_openapi_urlfrom_api_operation)	clsspec_urlrD   rm   r   r+   r/   kwargs	operations	            r#   from_url_and_methodz(OpenAPIEndpointChain.from_url_and_method   sH     !11(D&I	%s%%
&?	

 
 	
r"   c                    t        |j                  |j                  |j                        }	t	        j
                  ||j                         ||      }
|rd}nt        j                  |||      }|xs
 t               } | d|
||||	|||d|S )z<Create an OpenAPIEndpointChain from an operation and a spec.)r   r   r   )typescript_definitionr_   rY   N)r_   rY   )r&   r'   r(   r+   r,   r_   r/   rY   r!   )
r   r   r   r   r
   from_llm_and_typescriptto_typescriptr   from_llmr   )r   r   r   r+   r_   r/   raw_responserY   r   r,   requests_chainresponse_chain	_requestss                r#   r   z'OpenAPIEndpointChain.from_api_operation   s     &"//!--!--

 +BB"+"9"9";	
 !N.77W	N *
	 

,-#'&?

 

 
	
r"   )returnr   )rG   Dict[str, str]r   r1   )rG   r   r   r   )rG   r   r   zOptional[Dict[str, str]])rT   r1   r   dict)r3   r1   r<   r   r   r   )N)rt   zDict[str, Any]ru   z$Optional[CallbackManagerForChainRun]r   r   )NF)r   r1   rD   r1   rm   r1   r   r   r+   Optional[Requests]r/   r.   r   r   r   'OpenAPIEndpointChain')NFFFN)r   r   r   r   r+   r   r_   r.   r/   r.   r   r.   rY   r   r   r   r   r   )r   r   r   r   r    r'   r   r   r+   r,   r/   r2   r4   r6   propertyr:   r>   rI   rK   rM   rU   rW   r~   classmethodr   r   r!   r"   r#   r%   r%      s   J-1*1tXFHhF#(#?M=?&+t+*c*J%*a[O]0' ' ; ;
- =A5G5G :5G 
	5Gn  (,*/

 
 	

 
 %
 $(
 
 
 
 
* 
 (,*/"#)
)
 )
 %	)

 )
 $()
 )
 )
 )
 
 )
 )
r"   r%   )#r   
__future__r   rR   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      sN    S "  > > I I ' ) J < %  K ;J I
5) I
r"   