Spaces:
Runtime error
Runtime error
import json | |
import re | |
from abc import abstractmethod | |
from typing import Dict, NamedTuple | |
from langchain.schema import BaseOutputParser | |
class AutoGPTAction(NamedTuple): | |
"""Action returned by AutoGPTOutputParser.""" | |
name: str | |
args: Dict | |
class BaseAutoGPTOutputParser(BaseOutputParser): | |
"""Base Output parser for AutoGPT.""" | |
def parse(self, text: str) -> AutoGPTAction: | |
"""Return AutoGPTAction""" | |
def preprocess_json_input(input_str: str) -> str: | |
"""Preprocesses a string to be parsed as json. | |
Replace single backslashes with double backslashes, | |
while leaving already escaped ones intact. | |
Args: | |
input_str: String to be preprocessed | |
Returns: | |
Preprocessed string | |
""" | |
corrected_str = re.sub( | |
r'(?<!\\)\\(?!["\\/bfnrt]|u[0-9a-fA-F]{4})', r"\\\\", input_str | |
) | |
return corrected_str | |
class AutoGPTOutputParser(BaseAutoGPTOutputParser): | |
"""Output parser for AutoGPT.""" | |
def parse(self, text: str) -> AutoGPTAction: | |
try: | |
parsed = json.loads(text, strict=False) | |
except json.JSONDecodeError: | |
preprocessed_text = preprocess_json_input(text) | |
try: | |
parsed = json.loads(preprocessed_text, strict=False) | |
except Exception: | |
return AutoGPTAction( | |
name="ERROR", | |
args={"error": f"Could not parse invalid json: {text}"}, | |
) | |
try: | |
return AutoGPTAction( | |
name=parsed["command"]["name"], | |
args=parsed["command"]["args"], | |
) | |
except (KeyError, TypeError): | |
# If the command is null or incomplete, return an erroneous tool | |
return AutoGPTAction( | |
name="ERROR", args={"error": f"Incomplete command args: {parsed}"} | |
) | |