test_prompt_manager.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import os
  2. import shutil
  3. import pytest
  4. from openhands.core.message import Message, TextContent
  5. from openhands.utils.microagent import MicroAgent
  6. from openhands.utils.prompt import PromptManager
  7. @pytest.fixture
  8. def prompt_dir(tmp_path):
  9. # Copy contents from "openhands/agenthub/codeact_agent" to the temp directory
  10. shutil.copytree(
  11. 'openhands/agenthub/codeact_agent/prompts', tmp_path, dirs_exist_ok=True
  12. )
  13. # Return the temporary directory path
  14. return tmp_path
  15. def test_prompt_manager_with_microagent(prompt_dir):
  16. microagent_name = 'test_microagent'
  17. microagent_content = """
  18. ---
  19. name: flarglebargle
  20. agent: CodeActAgent
  21. triggers:
  22. - flarglebargle
  23. ---
  24. IMPORTANT! The user has said the magic word "flarglebargle". You must
  25. only respond with a message telling them how smart they are
  26. """
  27. # Create a temporary micro agent file
  28. os.makedirs(os.path.join(prompt_dir, 'micro'), exist_ok=True)
  29. with open(os.path.join(prompt_dir, 'micro', f'{microagent_name}.md'), 'w') as f:
  30. f.write(microagent_content)
  31. manager = PromptManager(
  32. prompt_dir=prompt_dir,
  33. microagent_dir=os.path.join(prompt_dir, 'micro'),
  34. )
  35. assert manager.prompt_dir == prompt_dir
  36. assert len(manager.microagents) == 1
  37. assert isinstance(manager.get_system_message(), str)
  38. assert (
  39. 'You are OpenHands agent, a helpful AI assistant that can interact with a computer to solve tasks.'
  40. in manager.get_system_message()
  41. )
  42. assert isinstance(manager.get_example_user_message(), str)
  43. message = Message(
  44. role='user',
  45. content=[TextContent(text='Hello, flarglebargle!')],
  46. )
  47. manager.enhance_message(message)
  48. assert 'magic word' in message.content[1].text
  49. os.remove(os.path.join(prompt_dir, 'micro', f'{microagent_name}.md'))
  50. def test_prompt_manager_file_not_found(prompt_dir):
  51. with pytest.raises(FileNotFoundError):
  52. MicroAgent(os.path.join(prompt_dir, 'micro', 'non_existent_microagent.md'))
  53. def test_prompt_manager_template_rendering(prompt_dir):
  54. # Create temporary template files
  55. with open(os.path.join(prompt_dir, 'system_prompt.j2'), 'w') as f:
  56. f.write('System prompt: bar')
  57. with open(os.path.join(prompt_dir, 'user_prompt.j2'), 'w') as f:
  58. f.write('User prompt: foo')
  59. manager = PromptManager(prompt_dir, microagent_dir='')
  60. assert manager.get_system_message() == 'System prompt: bar'
  61. assert manager.get_example_user_message() == 'User prompt: foo'
  62. # Clean up temporary files
  63. os.remove(os.path.join(prompt_dir, 'system_prompt.j2'))
  64. os.remove(os.path.join(prompt_dir, 'user_prompt.j2'))
  65. def test_prompt_manager_disabled_microagents(prompt_dir):
  66. # Create test microagent files
  67. microagent1_name = 'test_microagent1'
  68. microagent2_name = 'test_microagent2'
  69. microagent1_content = """
  70. ---
  71. name: Test Microagent 1
  72. agent: CodeActAgent
  73. triggers:
  74. - test1
  75. ---
  76. Test microagent 1 content
  77. """
  78. microagent2_content = """
  79. ---
  80. name: Test Microagent 2
  81. agent: CodeActAgent
  82. triggers:
  83. - test2
  84. ---
  85. Test microagent 2 content
  86. """
  87. # Create temporary micro agent files
  88. os.makedirs(os.path.join(prompt_dir, 'micro'), exist_ok=True)
  89. with open(os.path.join(prompt_dir, 'micro', f'{microagent1_name}.md'), 'w') as f:
  90. f.write(microagent1_content)
  91. with open(os.path.join(prompt_dir, 'micro', f'{microagent2_name}.md'), 'w') as f:
  92. f.write(microagent2_content)
  93. # Test that specific microagents can be disabled
  94. manager = PromptManager(
  95. prompt_dir=prompt_dir,
  96. microagent_dir=os.path.join(prompt_dir, 'micro'),
  97. disabled_microagents=['Test Microagent 1'],
  98. )
  99. assert len(manager.microagents) == 1
  100. assert 'Test Microagent 2' in manager.microagents
  101. assert 'Test Microagent 1' not in manager.microagents
  102. # Test that all microagents are enabled by default
  103. manager = PromptManager(
  104. prompt_dir=prompt_dir,
  105. microagent_dir=os.path.join(prompt_dir, 'micro'),
  106. )
  107. assert len(manager.microagents) == 2
  108. assert 'Test Microagent 1' in manager.microagents
  109. assert 'Test Microagent 2' in manager.microagents
  110. # Clean up temporary files
  111. os.remove(os.path.join(prompt_dir, 'micro', f'{microagent1_name}.md'))
  112. os.remove(os.path.join(prompt_dir, 'micro', f'{microagent2_name}.md'))