Skip to content

Commit

Permalink
Guardrails output parser: Pass LLM api for reasking (#6089)
Browse files Browse the repository at this point in the history
<!--
Thank you for contributing to LangChain! Your PR will appear in our
release under the title you set. Please make sure it highlights your
valuable contribution.

Replace this with a description of the change, the issue it fixes (if
applicable), and relevant context. List any dependencies required for
this change.

After you're done, someone will review your PR. They may suggest
improvements. If no one reviews your PR within a few days, feel free to
@-mention the same people again, as notifications can get lost.

Finally, we'd love to show appreciation for your contribution - if you'd
like us to shout you out on Twitter, please also include your handle!
-->

<!-- Remove if not applicable -->

Fixes guardrails-ai/guardrails#155 

Enables guardrails reasking by specifying an LLM api in the output
parser.
  • Loading branch information
irgolic committed Jun 18, 2023
1 parent ec850e6 commit ebfffaa
Showing 1 changed file with 31 additions and 6 deletions.
37 changes: 31 additions & 6 deletions langchain/output_parsers/rail_parser.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,51 @@
from __future__ import annotations

from typing import Any, Dict
from typing import Any, Callable, Dict, Optional

from langchain.schema import BaseOutputParser


class GuardrailsOutputParser(BaseOutputParser):
guard: Any
api: Optional[Callable]
args: Any
kwargs: Any

@property
def _type(self) -> str:
return "guardrails"

@classmethod
def from_rail(cls, rail_file: str, num_reasks: int = 1) -> GuardrailsOutputParser:
def from_rail(
cls,
rail_file: str,
num_reasks: int = 1,
api: Optional[Callable] = None,
*args: Any,
**kwargs: Any,
) -> 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))
return cls(
guard=Guard.from_rail(rail_file, num_reasks=num_reasks),
api=api,
args=args,
kwargs=kwargs,
)

@classmethod
def from_rail_string(
cls, rail_str: str, num_reasks: int = 1
cls,
rail_str: str,
num_reasks: int = 1,
api: Optional[Callable] = None,
*args: Any,
**kwargs: Any,
) -> GuardrailsOutputParser:
try:
from guardrails import Guard
Expand All @@ -34,10 +54,15 @@ def from_rail_string(
"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))
return cls(
guard=Guard.from_rail_string(rail_str, num_reasks=num_reasks),
api=api,
args=args,
kwargs=kwargs,
)

def get_format_instructions(self) -> str:
return self.guard.raw_prompt.format_instructions

def parse(self, text: str) -> Dict:
return self.guard.parse(text)
return self.guard.parse(text, llm_api=self.api, *self.args, **self.kwargs)

0 comments on commit ebfffaa

Please sign in to comment.