#!/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()