mvp-factory-openhands/test-scripts/openhands-phase3-wrapper.py

130 lines
3.5 KiB
Python

#!/usr/bin/env python3
"""
OpenHands SDK Wrapper for Phase 3 - With Bash Execution
Creates project files and can run commands
"""
import sys
import os
import json
import argparse
import subprocess
from datetime import datetime
from pathlib import Path
SDK_PATH = '/tmp/software-agent-sdk'
sys.path.insert(0, SDK_PATH)
try:
from openhands.sdk import LLM, Agent, Conversation, Tool
from openhands.tools.file_editor import FileEditorTool
from openhands.tools.task_tracker import TaskTrackerTool
from openhands.tools.bash import BashTool
except ImportError as e:
print(f"❌ Failed to import OpenHands SDK: {e}")
sys.exit(1)
def run_openhands_task(task, workspace, verbose=True):
"""Execute an OpenHands task with bash capability"""
results = {
'success': False,
'task': task,
'workspace': workspace,
'timestamp': datetime.now().isoformat(),
'error': None,
'output': []
}
try:
if verbose:
print(f"🚀 Starting OpenHands SDK execution...")
print(f"📋 Task: {task}")
print(f"📁 Workspace: {workspace}")
print("-" * 50)
workspace_path = Path(workspace)
workspace_path.mkdir(parents=True, exist_ok=True)
os.chdir(workspace)
# Load environment
env_file = '/home/bam/openhands/.env'
if os.path.exists(env_file):
with open(env_file, 'r') as f:
for line in f:
if '=' in line and not line.startswith('#'):
key, value = line.strip().split('=', 1)
os.environ[key] = value
# Configure LLM
api_key = os.getenv('MINIMAX_API_KEY')
if not api_key:
raise ValueError("MINIMAX_API_KEY not found")
llm = LLM(
model="openai/MiniMax-M2",
api_key=api_key,
base_url="https://api.minimax.io/v1"
)
if verbose:
print("✅ LLM configured")
# Create agent with file editor, task tracker, AND bash tools
agent = Agent(
llm=llm,
tools=[
Tool(name=FileEditorTool.name),
Tool(name=TaskTrackerTool.name),
Tool(name=BashTool.name),
],
)
if verbose:
print("✅ Agent created with bash, file_editor, task_tracker tools")
# Start conversation
conversation = Conversation(agent=agent, workspace=str(workspace_path))
conversation.send_message(task)
if verbose:
print("📤 Task sent, running...")
conversation.run()
results['success'] = True
if verbose:
print("✅ Task completed!")
except Exception as e:
results['error'] = str(e)
if verbose:
print(f"❌ Failed: {e}")
import traceback
traceback.print_exc()
return results
def main():
parser = argparse.ArgumentParser()
parser.add_argument('task', help='Task description')
parser.add_argument('--workspace', default='/home/bam', help='Working directory')
parser.add_argument('--quiet', action='store_true')
args = parser.parse_args()
results = run_openhands_task(
task=args.task,
workspace=args.workspace,
verbose=not args.quiet
)
if results['success']:
print("SUCCESS")
else:
print(f"FAILED: {results['error']}")
sys.exit(0 if results['success'] else 1)
if __name__ == "__main__":
main()