Run agents in isolated Daytona sandboxes for true parallelism and safety
Daytona provides isolated sandbox environments for running each agent implementation. This ensures true isolation, prevents resource conflicts, and enables safe execution of untrusted code.
from src.daytona_runner import is_daytona_configuredif is_daytona_configured(): print("Daytona is ready!")else: print("Daytona not configured, will use local execution")
The forge automatically falls back to local execution if Daytona is not configured.
The forge automatically detects and reports the execution mode:
# From forge.py:222-227daytona_available = is_daytona_configured()execution_mode = "daytona" if (use_daytona and daytona_available) else "local"print(f"Execution: {execution_mode.upper()}")if use_daytona and not daytona_available: print(" (Daytona not configured, falling back to local)")
You’ll see output like:
Execution: DAYTONA
or
Execution: LOCAL (Daytona not configured, falling back to local)
# From daytona_runner.py:211-248def run_all_candidates_in_daytona( candidates: list[dict], objective: str, artifacts_dir: Path, log_callback: Optional[Callable[[str, str], None]] = None,) -> list[DaytonaResult]: """ Run all candidates in Daytona sandboxes. Each candidate runs in its own isolated sandbox. """ results = [] for candidate in candidates: candidate_id = candidate["id"] script_path = candidate["script"] # Local output path (we'll copy artifact here after) output_dir = artifacts_dir / candidate_id output_dir.mkdir(parents=True, exist_ok=True) output_file = output_dir / "discord_post.md" # Run in Daytona result = run_candidate_in_daytona( candidate_id=candidate_id, script_path=script_path, objective=objective, output_file=str(output_file), log_callback=log_callback, ) # Save artifact locally if we got one if result.artifact_content: output_file.write_text(result.artifact_content) results.append(result) return results
# From daytona_runner.py:38-47@dataclassclass DaytonaResult: """Result from running a candidate in Daytona.""" candidate_id: str sandbox_id: Optional[str] success: bool output: str artifact_content: Optional[str] runtime_seconds: float error_message: Optional[str] = None
Example result:
DaytonaResult( candidate_id="gamma", sandbox_id="sb_kj4h2k3j4", success=True, output="[Gamma] Found 10 events\n[Gamma] Done!", artifact_content="# AI Events in the Bay Area\n...", runtime_seconds=3.2, error_message=None)
# From daytona_runner.py:97-106if not api_key: return DaytonaResult( candidate_id=candidate_id, sandbox_id=None, success=False, output="", artifact_content=None, runtime_seconds=0, error_message="Daytona API key not configured", )
Customize sandbox behavior via environment variables:
# From daytona_runner.py:50-59def get_daytona_config() -> tuple[Optional[str], Optional[str]]: """Get Daytona API key and base URL from environment.""" api_key = os.getenv("DAYTONA_API_KEY") base_url = os.getenv("DAYTONA_BASE_URL", "https://api.daytona.io/v1") # Filter out placeholder values if api_key and api_key.startswith("your_"): api_key = None return api_key, base_url