Bläddra i källkod

AgentDelegateAction: make delegate start with the task in execute tags, not the rest of the parent LLM response (#4327)

Engel Nyst 1 år sedan
förälder
incheckning
df23168c10

+ 9 - 2
openhands/agenthub/codeact_agent/action_parser.py

@@ -158,8 +158,15 @@ class CodeActActionParserAgentDelegate(ActionParser):
         ), 'self.agent_delegate should not be None when parse is called'
         thought = action_str.replace(self.agent_delegate.group(0), '').strip()
         browse_actions = self.agent_delegate.group(1).strip()
-        task = f'{thought}. I should start with: {browse_actions}'
-        return AgentDelegateAction(agent='BrowsingAgent', inputs={'task': task})
+        thought = (
+            f'{thought}\nI should start with: {browse_actions}'
+            if thought
+            else f'I should start with: {browse_actions}'
+        )
+
+        return AgentDelegateAction(
+            agent='BrowsingAgent', thought=thought, inputs={'task': browse_actions}
+        )
 
 
 class CodeActActionParserMessage(ActionParser):

+ 1 - 1
tests/integration/mock/eventstream_runtime/CodeActAgent/test_browse_internet/prompt_002.log

@@ -4,7 +4,7 @@ possible next action to accomplish your goal. Your answer will be interpreted
 and executed by a program, make sure to follow the formatting instructions.
 
 # Goal:
-. I should start with: Get the content on "http://localhost:8000"
+Get the content on "http://localhost:8000"
 
 # Action Space
 

+ 1 - 1
tests/integration/mock/eventstream_runtime/CodeActAgent/test_browse_internet/prompt_003.log

@@ -4,7 +4,7 @@ possible next action to accomplish your goal. Your answer will be interpreted
 and executed by a program, make sure to follow the formatting instructions.
 
 # Goal:
-. I should start with: Get the content on "http://localhost:8000"
+Get the content on "http://localhost:8000"
 
 # Action Space
 

+ 1 - 1
tests/integration/mock/eventstream_runtime/CodeActAgent/test_browse_internet/prompt_004.log

@@ -4,7 +4,7 @@ possible next action to accomplish your goal. Your answer will be interpreted
 and executed by a program, make sure to follow the formatting instructions.
 
 # Goal:
-. I should start with: Get the content on "http://localhost:8000"
+Get the content on "http://localhost:8000"
 
 # Action Space
 

+ 2 - 2
tests/integration/mock/eventstream_runtime/CodeActAgent/test_browse_internet/prompt_005.log

@@ -406,9 +406,9 @@ Browse localhost:8000, and tell me the ultimate answer to life. Do not ask me fo
 
 ----------
 
-
+I should start with: Get the content on "http://localhost:8000"
 <execute_browse>
-. I should start with: Get the content on "http://localhost:8000"
+Get the content on "http://localhost:8000"
 </execute_browse>
 
 ----------

+ 53 - 0
tests/unit/test_codeact_agent_parser.py

@@ -0,0 +1,53 @@
+import pytest
+
+from openhands.agenthub.codeact_agent.action_parser import (
+    CodeActActionParserAgentDelegate,
+)
+from openhands.events.action import AgentDelegateAction
+
+
+@pytest.mark.parametrize(
+    'action_str, expected_agent, expected_thought, expected_task',
+    [
+        (
+            'I need to search for information.\n<execute_browse>Tell me who is the Vice President of the USA</execute_browse>',
+            'BrowsingAgent',
+            'I need to search for information.\nI should start with: Tell me who is the Vice President of the USA',
+            'Tell me who is the Vice President of the USA',
+        ),
+        (
+            '<execute_browse>Search for recent climate change data</execute_browse>',
+            'BrowsingAgent',
+            'I should start with: Search for recent climate change data',
+            'Search for recent climate change data',
+        ),
+        (
+            "Let's use the browsing agent to find this information.\n<execute_browse>Find the population of Tokyo in 2023</execute_browse>\nThis will help us answer the question.",
+            'BrowsingAgent',
+            "Let's use the browsing agent to find this information.\n\nThis will help us answer the question.\nI should start with: Find the population of Tokyo in 2023",
+            'Find the population of Tokyo in 2023',
+        ),
+    ],
+)
+def test_codeact_action_parser_agent_delegate(
+    action_str, expected_agent, expected_thought, expected_task
+):
+    parser = CodeActActionParserAgentDelegate()
+    assert parser.check_condition(action_str)
+
+    action = parser.parse(action_str)
+
+    assert isinstance(action, AgentDelegateAction)
+    assert action.agent == expected_agent
+    assert action.thought == expected_thought
+    assert action.inputs['task'] == expected_task
+
+
+def test_codeact_action_parser_agent_delegate_no_match():
+    parser = CodeActActionParserAgentDelegate()
+    action_str = 'This is a regular message without any browse command.'
+
+    assert not parser.check_condition(action_str)
+
+    with pytest.raises(AssertionError):
+        parser.parse(action_str)