130 lines
3.5 KiB
Python
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()
|