codekingpro/portable-devtools
114k
1"""request parser."""2 3import json4import re5from typing import Any6 7from langchain_classic.chains.api.openapi.prompts import REQUEST_TEMPLATE8from langchain_classic.chains.llm import LLMChain9from langchain_core.language_models import BaseLanguageModel10from langchain_core.output_parsers import BaseOutputParser11from langchain_core.prompts.prompt import PromptTemplate12 13 14class APIRequesterOutputParser(BaseOutputParser):15 """Parse the request and error tags."""16 17 def _load_json_block(self, serialized_block: str) -> str:18 try:19 return json.dumps(json.loads(serialized_block, strict=False))20 except json.JSONDecodeError:21 return "ERROR serializing request."22 23 def parse(self, llm_output: str) -> str:24 """Parse the request and error tags."""25 26 json_match = re.search(r"```json(.*?)```", llm_output, re.DOTALL)27 if json_match:28 return self._load_json_block(json_match.group(1).strip())29 message_match = re.search(r"```text(.*?)```", llm_output, re.DOTALL)30 if message_match:31 return f"MESSAGE: {message_match.group(1).strip()}"32 return "ERROR making request"33 34 @property35 def _type(self) -> str:36 return "api_requester"37 38 39class APIRequesterChain(LLMChain):40 """Get the request parser."""41 42 @classmethod43 def is_lc_serializable(cls) -> bool:44 return False45 46 @classmethod47 def from_llm_and_typescript(48 cls,49 llm: BaseLanguageModel,50 typescript_definition: str,51 verbose: bool = True,52 **kwargs: Any,53 ) -> LLMChain:54 """Get the request parser."""55 output_parser = APIRequesterOutputParser()56 prompt = PromptTemplate(57 template=REQUEST_TEMPLATE,58 output_parser=output_parser,59 partial_variables={"schema": typescript_definition},60 input_variables=["instructions"],61 )62 return cls(prompt=prompt, llm=llm, verbose=verbose, **kwargs)63 