import asyncio
import os
from datetime import timedelta
from opensandbox import Sandbox
from opensandbox.config import ConnectionConfig
async def main() -> None:
# Configuration
domain = os.getenv("SANDBOX_DOMAIN", "localhost:8080")
api_key = os.getenv("SANDBOX_API_KEY")
gemini_api_key = os.getenv("GEMINI_API_KEY")
if not gemini_api_key:
raise RuntimeError("GEMINI_API_KEY is required")
gemini_model = os.getenv("GEMINI_MODEL", "gemini-2.5-flash")
image = os.getenv(
"SANDBOX_IMAGE",
"sandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/code-interpreter:v1.0.1",
)
config = ConnectionConfig(
domain=domain,
api_key=api_key,
request_timeout=timedelta(seconds=60),
)
# Inject Gemini settings into container environment
env = {
"GEMINI_API_KEY": gemini_api_key,
"GEMINI_BASE_URL": os.getenv("GEMINI_BASE_URL"),
"GEMINI_MODEL": gemini_model,
}
# Drop None values
env = {k: v for k, v in env.items() if v is not None}
# Create sandbox with environment variables
sandbox = await Sandbox.create(
image,
connection_config=config,
env=env,
)
async with sandbox:
# Install Gemini CLI
install_exec = await sandbox.commands.run(
"npm install -g @google/gemini-cli@latest"
)
# Print installation logs
for msg in install_exec.logs.stdout:
print(f"[stdout] {msg.text}")
# Use Gemini CLI to send a message
run_exec = await sandbox.commands.run(
'gemini "Compute 1+1=?."'
)
# Print Gemini's response
for msg in run_exec.logs.stdout:
print(f"[stdout] {msg.text}")
if run_exec.error:
print(f"[error] {run_exec.error.name}: {run_exec.error.value}")
await sandbox.kill()
if __name__ == "__main__":
asyncio.run(main())