mirror of
https://github.com/Mintplex-Labs/langchain-python.git
synced 2026-07-24 02:05:29 -04:00
629fda3957
Evaluation so far has shown that agents do a reasonable job of emitting `json` blocks as arguments when cued (instead of typescript), and `json` permits the `strict=False` flag to permit control characters, which are likely to appear in the response in particular. This PR makes this change to the request and response synthesizer chains, and fixes the temperature to the OpenAI agent in the eval notebook. It also adds a `raise_error = False` flag in the notebook to facilitate debugging
47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""Response parser."""
|
|
|
|
import json
|
|
import re
|
|
|
|
from langchain.chains.api.openapi.prompts import RESPONSE_TEMPLATE
|
|
from langchain.chains.llm import LLMChain
|
|
from langchain.llms.base import BaseLLM
|
|
from langchain.prompts.prompt import PromptTemplate
|
|
from langchain.schema import BaseOutputParser
|
|
|
|
|
|
class APIResponderOutputParser(BaseOutputParser):
|
|
"""Parse the response and error tags."""
|
|
|
|
def _load_json_block(self, serialized_block: str) -> str:
|
|
try:
|
|
response_content = json.loads(serialized_block, strict=False)
|
|
return response_content.get("response", "ERROR parsing response.")
|
|
except json.JSONDecodeError:
|
|
return "ERROR parsing response."
|
|
except:
|
|
raise
|
|
|
|
def parse(self, llm_output: str) -> str:
|
|
"""Parse the response and error tags."""
|
|
json_match = re.search(r"```json(.*?)```", llm_output, re.DOTALL)
|
|
if json_match:
|
|
return self._load_json_block(json_match.group(1).strip())
|
|
else:
|
|
raise ValueError(f"No response found in output: {llm_output}.")
|
|
|
|
|
|
class APIResponderChain(LLMChain):
|
|
"""Get the response parser."""
|
|
|
|
@classmethod
|
|
def from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:
|
|
"""Get the response parser."""
|
|
output_parser = APIResponderOutputParser()
|
|
prompt = PromptTemplate(
|
|
template=RESPONSE_TEMPLATE,
|
|
output_parser=output_parser,
|
|
input_variables=["response", "instructions"],
|
|
)
|
|
return cls(prompt=prompt, llm=llm, verbose=verbose)
|