diff --git a/langchain/output_parsers/__init__.py b/langchain/output_parsers/__init__.py index a5d64840..268f62a5 100644 --- a/langchain/output_parsers/__init__.py +++ b/langchain/output_parsers/__init__.py @@ -3,6 +3,7 @@ from langchain.output_parsers.list import ( CommaSeparatedListOutputParser, ListOutputParser, ) +from langchain.output_parsers.rail_parser import GuardrailsOutputParser from langchain.output_parsers.regex import RegexParser from langchain.output_parsers.regex_dict import RegexDictParser from langchain.output_parsers.structured import ResponseSchema, StructuredOutputParser @@ -15,4 +16,5 @@ __all__ = [ "BaseOutputParser", "StructuredOutputParser", "ResponseSchema", + "GuardrailsOutputParser", ] diff --git a/langchain/output_parsers/rail_parser.py b/langchain/output_parsers/rail_parser.py new file mode 100644 index 00000000..432ea851 --- /dev/null +++ b/langchain/output_parsers/rail_parser.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +from typing import Any, Dict + +from langchain.output_parsers.base import BaseOutputParser + + +class GuardrailsOutputParser(BaseOutputParser): + guard: Any + + @property + def _type(self) -> str: + return "guardrails" + + @classmethod + def from_rail(cls, rail_file: str, num_reasks: int = 1) -> GuardrailsOutputParser: + try: + from guardrails import Guard + except ImportError: + raise ValueError( + "guardrails-ai package not installed. " + "Install it by running `pip install guardrails-ai`." + ) + return cls(guard=Guard.from_rail(rail_file, num_reasks=num_reasks)) + + @classmethod + def from_rail_string( + cls, rail_str: str, num_reasks: int = 1 + ) -> GuardrailsOutputParser: + try: + from guardrails import Guard + except ImportError: + raise ValueError( + "guardrails-ai package not installed. " + "Install it by running `pip install guardrails-ai`." + ) + return cls(guard=Guard.from_rail_string(rail_str, num_reasks=num_reasks)) + + def get_format_instructions(self) -> str: + return self.guard.raw_prompt.format_instructions + + def parse(self, text: str) -> Dict: + return self.guard.parse(text)