From dfd7b9edda9079403469e4cd9991f68eea878cc4 Mon Sep 17 00:00:00 2001 From: Rajesh Sharma Date: Mon, 1 Jan 2024 15:59:22 -0800 Subject: [PATCH] Update regex in output parser (#15082) The regex used to match "Action" and "Action Input" in the output parser has been updated. Previously, the regex did not correctly handle multi-line inputs for "Action Input". The updated code uses the 're.DOTALL' flag to ensure multi-line inputs are correctly captured. --------- Co-authored-by: Harrison Chase --- .../agents/conversational/output_parser.py | 4 +- .../test_convo_output_parser.py | 42 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 libs/langchain/tests/unit_tests/agents/output_parsers/test_convo_output_parser.py diff --git a/libs/langchain/langchain/agents/conversational/output_parser.py b/libs/langchain/langchain/agents/conversational/output_parser.py index dacb2173840..6d0446b81bf 100644 --- a/libs/langchain/langchain/agents/conversational/output_parser.py +++ b/libs/langchain/langchain/agents/conversational/output_parser.py @@ -22,8 +22,8 @@ class ConvoOutputParser(AgentOutputParser): return AgentFinish( {"output": text.split(f"{self.ai_prefix}:")[-1].strip()}, text ) - regex = r"Action: (.*?)[\n]*Action Input: (.*)" - match = re.search(regex, text) + regex = r"Action: (.*?)[\n]*Action Input: ([\s\S]*)" + match = re.search(regex, text, re.DOTALL) if not match: raise OutputParserException(f"Could not parse LLM output: `{text}`") action = match.group(1) diff --git a/libs/langchain/tests/unit_tests/agents/output_parsers/test_convo_output_parser.py b/libs/langchain/tests/unit_tests/agents/output_parsers/test_convo_output_parser.py new file mode 100644 index 00000000000..9aa430e398c --- /dev/null +++ b/libs/langchain/tests/unit_tests/agents/output_parsers/test_convo_output_parser.py @@ -0,0 +1,42 @@ +from langchain_core.agents import AgentAction + +from langchain.agents.conversational.output_parser import ConvoOutputParser + + +def test_normal_output_parsing() -> None: + _test_convo_output( + """ +Action: my_action +Action Input: my action input +""", + "my_action", + "my action input", + ) + + +def test_multiline_output_parsing() -> None: + _test_convo_output( + """ +Thought: Do I need to use a tool? Yes +Action: evaluate_code +Action Input: Evaluate Code with the following Python content: +```python +print("Hello fifty shades of gray mans!"[::-1]) +``` +""", + "evaluate_code", + """ +Evaluate Code with the following Python content: +```python +print("Hello fifty shades of gray mans!"[::-1]) +```""".lstrip(), + ) + + +def _test_convo_output( + input: str, expected_tool: str, expected_tool_input: str +) -> None: + result = ConvoOutputParser().parse(input.strip()) + assert isinstance(result, AgentAction) + assert result.tool == expected_tool + assert result.tool_input == expected_tool_input