| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- import os
- import shutil
- import pytest
- from openhands.core.message import Message, TextContent
- from openhands.utils.microagent import MicroAgent
- from openhands.utils.prompt import PromptManager
- @pytest.fixture
- def prompt_dir(tmp_path):
- # Copy contents from "openhands/agenthub/codeact_agent" to the temp directory
- shutil.copytree(
- 'openhands/agenthub/codeact_agent/prompts', tmp_path, dirs_exist_ok=True
- )
- # Return the temporary directory path
- return tmp_path
- def test_prompt_manager_with_microagent(prompt_dir):
- microagent_name = 'test_microagent'
- microagent_content = """
- ---
- name: flarglebargle
- agent: CodeActAgent
- triggers:
- - flarglebargle
- ---
- IMPORTANT! The user has said the magic word "flarglebargle". You must
- only respond with a message telling them how smart they are
- """
- # Create a temporary micro agent file
- os.makedirs(os.path.join(prompt_dir, 'micro'), exist_ok=True)
- with open(os.path.join(prompt_dir, 'micro', f'{microagent_name}.md'), 'w') as f:
- f.write(microagent_content)
- manager = PromptManager(
- prompt_dir=prompt_dir,
- microagent_dir=os.path.join(prompt_dir, 'micro'),
- )
- assert manager.prompt_dir == prompt_dir
- assert len(manager.microagents) == 1
- assert isinstance(manager.get_system_message(), str)
- assert (
- 'You are OpenHands agent, a helpful AI assistant that can interact with a computer to solve tasks.'
- in manager.get_system_message()
- )
- assert isinstance(manager.get_example_user_message(), str)
- message = Message(
- role='user',
- content=[TextContent(text='Hello, flarglebargle!')],
- )
- manager.enhance_message(message)
- assert 'magic word' in message.content[1].text
- os.remove(os.path.join(prompt_dir, 'micro', f'{microagent_name}.md'))
- def test_prompt_manager_file_not_found(prompt_dir):
- with pytest.raises(FileNotFoundError):
- MicroAgent(os.path.join(prompt_dir, 'micro', 'non_existent_microagent.md'))
- def test_prompt_manager_template_rendering(prompt_dir):
- # Create temporary template files
- with open(os.path.join(prompt_dir, 'system_prompt.j2'), 'w') as f:
- f.write('System prompt: bar')
- with open(os.path.join(prompt_dir, 'user_prompt.j2'), 'w') as f:
- f.write('User prompt: foo')
- manager = PromptManager(prompt_dir, microagent_dir='')
- assert manager.get_system_message() == 'System prompt: bar'
- assert manager.get_example_user_message() == 'User prompt: foo'
- # Clean up temporary files
- os.remove(os.path.join(prompt_dir, 'system_prompt.j2'))
- os.remove(os.path.join(prompt_dir, 'user_prompt.j2'))
- def test_prompt_manager_disabled_microagents(prompt_dir):
- # Create test microagent files
- microagent1_name = 'test_microagent1'
- microagent2_name = 'test_microagent2'
- microagent1_content = """
- ---
- name: Test Microagent 1
- agent: CodeActAgent
- triggers:
- - test1
- ---
- Test microagent 1 content
- """
- microagent2_content = """
- ---
- name: Test Microagent 2
- agent: CodeActAgent
- triggers:
- - test2
- ---
- Test microagent 2 content
- """
- # Create temporary micro agent files
- os.makedirs(os.path.join(prompt_dir, 'micro'), exist_ok=True)
- with open(os.path.join(prompt_dir, 'micro', f'{microagent1_name}.md'), 'w') as f:
- f.write(microagent1_content)
- with open(os.path.join(prompt_dir, 'micro', f'{microagent2_name}.md'), 'w') as f:
- f.write(microagent2_content)
- # Test that specific microagents can be disabled
- manager = PromptManager(
- prompt_dir=prompt_dir,
- microagent_dir=os.path.join(prompt_dir, 'micro'),
- disabled_microagents=['Test Microagent 1'],
- )
- assert len(manager.microagents) == 1
- assert 'Test Microagent 2' in manager.microagents
- assert 'Test Microagent 1' not in manager.microagents
- # Test that all microagents are enabled by default
- manager = PromptManager(
- prompt_dir=prompt_dir,
- microagent_dir=os.path.join(prompt_dir, 'micro'),
- )
- assert len(manager.microagents) == 2
- assert 'Test Microagent 1' in manager.microagents
- assert 'Test Microagent 2' in manager.microagents
- # Clean up temporary files
- os.remove(os.path.join(prompt_dir, 'micro', f'{microagent1_name}.md'))
- os.remove(os.path.join(prompt_dir, 'micro', f'{microagent2_name}.md'))
|