from __future__ import annotations from abc import ABC, abstractmethod from pydantic import BaseModel, Extra, Field, root_validator class BaseOutputParser(BaseModel, ABC, Generic[T]): """Class to parse the output of an LLM call. Output parsers help structure language model responses. """ @abstractmethod def parse(self, text: str) -> T: """Parse the output of an LLM call. A method which takes in a string (assumed output of language model ) and parses it into some structure. Args: text: output of language model Returns: structured output """ def parse_with_prompt(self, completion: str, prompt: PromptValue) -> Any: """Optional method to parse the output of an LLM call with a prompt. The prompt is largely provided in the event the OutputParser wants to retry or fix the output in some way, and needs information from the prompt to do so. Args: completion: output of language model prompt: prompt value Returns: structured output """ return self.parse(completion) def get_format_instructions(self) -> str: """Instructions on how the LLM output should be formatted.""" raise NotImplementedError @property def _type(self) -> str: """Return the type key.""" raise NotImplementedError( f"_type property is not implemented in class {self.__class__.__name__}." " This is required for serialization." ) def dict(self, **kwargs: Any) -> Dict: """Return dictionary representation of output parser.""" output_parser_dict = super().dict() output_parser_dict["_type"] = self._type return output_parser_dict class OutputParserException(Exception): """Exception that output parsers should raise to signify a parsing error. This exists to differentiate parsing errors from other code or execution errors that also may arise inside the output parser. OutputParserExceptions will be available to catch and handle in ways to fix the parsing error, while other errors will be raised. """ pass