|
|
@@ -0,0 +1,74 @@
|
|
|
+import json
|
|
|
+import os
|
|
|
+from unittest.mock import MagicMock
|
|
|
+
|
|
|
+import yaml
|
|
|
+
|
|
|
+from agenthub.micro.registry import all_microagents
|
|
|
+from opendevin.agent import Agent
|
|
|
+from opendevin.plan import Plan
|
|
|
+from opendevin.state import State
|
|
|
+
|
|
|
+
|
|
|
+def test_all_agents_are_loaded():
|
|
|
+ full_path = os.path.join('agenthub', 'micro')
|
|
|
+ agent_names = set()
|
|
|
+ for root, _, files in os.walk(full_path):
|
|
|
+ for file in files:
|
|
|
+ if file == 'agent.yaml':
|
|
|
+ file_path = os.path.join(root, file)
|
|
|
+ with open(file_path, 'r') as yaml_file:
|
|
|
+ data = yaml.safe_load(yaml_file)
|
|
|
+ agent_names.add(data['name'])
|
|
|
+ assert agent_names == set(all_microagents.keys())
|
|
|
+
|
|
|
+
|
|
|
+def test_coder_agent_with_summary():
|
|
|
+ """
|
|
|
+ Coder agent should render code summary as part of prompt
|
|
|
+ """
|
|
|
+ mock_llm = MagicMock()
|
|
|
+ content = json.dumps({'action': 'finish', 'args': {}})
|
|
|
+ mock_llm.completion.return_value = {
|
|
|
+ 'choices': [{'message': {'content': content}}]
|
|
|
+ }
|
|
|
+
|
|
|
+ coder_agent = Agent.get_cls('CoderAgent')(llm=mock_llm)
|
|
|
+ assert coder_agent is not None
|
|
|
+ task = 'This is a dummy task'
|
|
|
+ plan = Plan(task)
|
|
|
+ summary = 'This is a dummy summary about this repo'
|
|
|
+ state = State(plan, inputs={'summary': summary})
|
|
|
+ coder_agent.step(state)
|
|
|
+
|
|
|
+ mock_llm.completion.assert_called_once()
|
|
|
+ _, kwargs = mock_llm.completion.call_args
|
|
|
+ prompt = kwargs['messages'][0]['content']
|
|
|
+ assert task in prompt
|
|
|
+ assert "Here's a summary of the codebase, as it relates to this task" in prompt
|
|
|
+ assert summary in prompt
|
|
|
+
|
|
|
+
|
|
|
+def test_coder_agent_without_summary():
|
|
|
+ """
|
|
|
+ When there's no codebase_summary available, there shouldn't be any prompt
|
|
|
+ about 'code summary'
|
|
|
+ """
|
|
|
+ mock_llm = MagicMock()
|
|
|
+ content = json.dumps({'action': 'finish', 'args': {}})
|
|
|
+ mock_llm.completion.return_value = {
|
|
|
+ 'choices': [{'message': {'content': content}}]
|
|
|
+ }
|
|
|
+
|
|
|
+ coder_agent = Agent.get_cls('CoderAgent')(llm=mock_llm)
|
|
|
+ assert coder_agent is not None
|
|
|
+ task = 'This is a dummy task'
|
|
|
+ plan = Plan(task)
|
|
|
+ state = State(plan)
|
|
|
+ coder_agent.step(state)
|
|
|
+
|
|
|
+ mock_llm.completion.assert_called_once()
|
|
|
+ _, kwargs = mock_llm.completion.call_args
|
|
|
+ prompt = kwargs['messages'][0]['content']
|
|
|
+ assert task in prompt
|
|
|
+ assert "Here's a summary of the codebase, as it relates to this task" not in prompt
|