Spaces:
Runtime error
Runtime error
"""Base output parser class.""" | |
from string import Formatter | |
from typing import Any, Optional | |
# from langchain.schema import BaseOutputParser as LCOutputParser | |
from gpt_index.output_parsers.base import BaseOutputParser | |
class LangchainOutputParser(BaseOutputParser): | |
"""Langchain output parser.""" | |
def __init__( | |
self, output_parser: 'LCOutputParser', format_key: Optional[str] = None | |
) -> None: | |
"""Init params.""" | |
self._output_parser = output_parser | |
self._format_key = format_key | |
def parse(self, output: str) -> Any: | |
"""Parse, validate, and correct errors programmatically.""" | |
# TODO: this object may be stringified by our upstream llmpredictor, | |
# figure out better | |
# ways to "convert" the object to a proper string format. | |
return self._output_parser.parse(output) | |
def format(self, query: str) -> str: | |
"""Format a query with structured output formatting instructions.""" | |
format_instructions = self._output_parser.get_format_instructions() | |
# TODO: this is a temporary hack. if there's curly brackets in the format | |
# instructions (and query is a string template), we need to | |
# escape the curly brackets in the format instructions to preserve the | |
# overall template. | |
query_tmpl_vars = { | |
v for _, v, _, _ in Formatter().parse(query) if v is not None | |
} | |
if len(query_tmpl_vars) > 0: | |
format_instructions = format_instructions.replace("{", "{{") | |
format_instructions = format_instructions.replace("}", "}}") | |
if self._format_key is not None: | |
fmt_query = query.format(**{self._format_key: format_instructions}) | |
else: | |
fmt_query = query + "\n\n" + format_instructions | |
return fmt_query | |