water3 / agent /tools /execute_code_tool.py
onewayto's picture
Upload 187 files
070daf8 verified
"""
Local Code Execution Tool - Execute Python and bash scripts locally
Operations: run Python or bash commands with real-time output streaming
"""
import asyncio
import logging
from typing import Any, Dict
logger = logging.getLogger(__name__)
EXECUTE_CODE_TOOL_SPEC = {
"name": "execute_code",
"description": (
"Execute Python or bash commands locally. This is YOUR PRIMARY TOOL for running code. "
"Use this to: write files, run Python scripts, install packages, process data, and execute any commands. "
"Examples: "
"- Write a file: echo 'print(1+1)' > test.py OR cat > test.py << 'EOF'\\nprint(1+1)\\nEOF; "
"- Run Python: python test.py; "
"- Install packages: pip install numpy sympy; "
"- List files: ls -la; "
"- Read files: cat file.txt"
),
"parameters": {
"type": "object",
"properties": {
"command": {
"type": "string",
"description": "The command to execute. Can be any bash or Python command. Examples: 'python script.py', 'pip install sympy', 'cat > file.py << \\'EOF\\'\\ncode\\nEOF'",
},
"timeout": {
"type": "number",
"description": "Maximum execution time in seconds (default: 3600 = 1 hour)",
},
},
"required": ["command"],
},
}
async def execute_code_handler(arguments: Dict[str, Any]) -> tuple[str, bool]:
"""Handler for execute_code tool - calls backend endpoint."""
from agent.utils.api_client import api_client
try:
command = arguments.get("command")
timeout = arguments.get("timeout", 3600)
if not command:
return "Error: 'command' is required", False
# Call the backend execute endpoint
result = await api_client.post(
"/execute",
json={"command": command, "timeout": timeout}
)
if result.get("success"):
output = result.get("output", "")
return f"✅ Execution completed\n{output}", True
else:
error = result.get("error", "Unknown error")
return f"❌ Execution failed: {error}", False
except Exception as e:
logger.error(f"Execute code error: {e}")
return f"Error: {str(e)}", False