Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ You give it a codebase. It discovers metrics to optimize, sets up the evaluation
- **Benchmark discovery.** The `discover` skill explores the repo, figures out what to measure, and instruments the evaluation.


Runs on Claude Code, Codex, Cursor, Kimi, OpenClaw, Hermes, Opencode, or Pi. Experiments run locally or on remote sandboxes — Modal, E2B, Daytona, AWS, Azure, SSH.
Runs on Claude Code, Codex, Cursor, Kimi, OpenClaw, Hermes, Opencode, or Pi. Experiments run locally or on remote sandboxes — Modal, E2B, Daytona, Tenki, AWS, Azure, SSH.


<p align="center">
Expand Down Expand Up @@ -81,7 +81,7 @@ npm install -g @anthropic-ai/claude-code # or @openai/codex, openclaw, @eare
evo install <host> # claude-code | codex | cursor | hermes | kimi | opencode | openclaw | pi
```

For remote backends, install with the matching provider extra: `uv tool install 'evo-hq-cli[modal]'` (or `[e2b]`, `[daytona]`, `[aws]`, `[azure]`, `[all]`).
For remote backends, install with the matching provider extra: `uv tool install 'evo-hq-cli[modal]'` (or `[e2b]`, `[daytona]`, `[tenki]`, `[aws]`, `[azure]`, `[all]`).

### Codex hook trust

Expand Down Expand Up @@ -127,6 +127,7 @@ When `discover` builds a benchmark from scratch, it attaches a held-out-slice sc
| **modal** | Modal serverless cloud | `uv tool install 'evo-hq-cli[modal]'` |
| **e2b** | E2B cloud sandboxes | `uv tool install 'evo-hq-cli[e2b]'` |
| **daytona** | Daytona cloud workspaces | `uv tool install 'evo-hq-cli[daytona]'` |
| **tenki** | Tenki cloud sandboxes | `uv tool install 'evo-hq-cli[tenki]'` |
| **aws** | AWS EC2 sandboxes | `uv tool install 'evo-hq-cli[aws]'` |
| **azure** | Azure VMs | `uv tool install 'evo-hq-cli[azure]'` |

Expand Down
4 changes: 3 additions & 1 deletion plugins/evo/npm/skills/infra-setup/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ evo_version: 0.8.0

# Infra Setup

Use this when the user wants to change where experiments run: local worktrees, pool slots, or a remote provider such as Modal, E2B, Daytona, AWS, Azure, SSH, manual, or a custom dotted-path provider.
Use this when the user wants to change where experiments run: local worktrees, pool slots, or a remote provider such as Modal, E2B, Daytona, Tenki, AWS, Azure, SSH, manual, or a custom dotted-path provider.

## Goals

Expand All @@ -25,6 +25,7 @@ Use this when the user wants to change where experiments run: local worktrees, p
- `modal`
- `e2b`
- `daytona`
- `tenki`
- `aws`
- `azure`
- `manual`
Expand Down Expand Up @@ -72,6 +73,7 @@ Before trying to switch a workspace to a remote provider, confirm the basics:
- `modal`: auth + optional config
- `e2b`: API key + optional config
- `daytona`: API key and API URL/target if needed
- `tenki`: API key + project id + optional config
- `aws`: creds, region, image, SSH key pair/private key, and usually network config
- `azure`: subscription, resource group, region, SSH key/private key, and VM/image choices
- `ssh`: reachable host, working SSH user, and key/port if needed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Use this as the compact summary. This is setup guidance, not a runtime dependenc
| `modal` | Modal Python SDK | If missing, install `evo-hq-cli[modal]` (or inject `modal` with `pipx`); then run `modal token new` | `app_name`, `gpu`, `region`, `timeout_seconds`, `health_timeout_seconds`, `apt_install`, `pip_install` |
| `e2b` | E2B Python SDK | If missing, install `evo-hq-cli[e2b]` (or inject `e2b` with `pipx`); then `export E2B_API_KEY=...` | `template`, `api_key`, `domain`, `root`, `timeout_seconds`, `health_timeout_seconds`, `allow_internet_access`, `secure` |
| `daytona` | Daytona Python SDK | If missing, install `evo-hq-cli[daytona]` (or inject `daytona` with `pipx`); then `export DAYTONA_API_KEY=...` | `api_key`, `api_url`, `target`, `timeout_seconds`, `health_timeout_seconds`, `ssh_host`, `ssh_port`, `ssh_token_ttl_minutes`, `sandbox_timeout_seconds` |
| `tenki` | Tenki Python SDK (`tenki`) | If missing, install `evo-hq-cli[tenki]` (or inject `tenki` with `pipx`); then `export TENKI_API_KEY=tk_...` | `auth_token` (or `api_key`), `workspace_id`, `base_url`, `name_prefix`, `image`, `snapshot_id`, `cpu_cores`, `memory_mb`, `disk_size_gb`, `idle_timeout_minutes`, `root`, `timeout_seconds`, `create_timeout_seconds`, `bootstrap_timeout_seconds`, `health_timeout_seconds` |
| `aws` | `boto3` | If missing, install `evo-hq-cli[aws]` (or inject `boto3` with `pipx`); then export AWS creds and region | `region`, `image_id`, `key_name`, `key`, `instance_type`, `subnet_id`, `security_group_ids`, `ssh_user`, `ssh_port`, `timeout_seconds`, `health_timeout_seconds`, `keep_warm` |
| `azure` | Azure Python SDK (`azure-identity`, `azure-mgmt-resource`, `azure-mgmt-network`, `azure-mgmt-compute`) | If missing, install `evo-hq-cli[azure]`; then use `az login` or Azure env creds, and provide subscription/resource-group config | `subscription_id`, `resource_group`, `location`, `vm_size`, `image`, `key`, `ssh_public_key`, `ssh_user`, `ssh_cidr`, `vnet_cidr`, `subnet_cidr`, `ssh_port`, `timeout_seconds`, `health_timeout_seconds`, `keep_warm` |
| `ssh` | local `ssh` transport | `ssh user@host` must work first; then add `-i` / `-p` if needed | `host`, `key`, `port`, `tunnel_port`, `keep_warm`, `health_timeout_seconds` |
Expand Down
6 changes: 5 additions & 1 deletion plugins/evo/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ e2b = [
daytona = [
"daytona>=0.170.0",
]
tenki = [
"tenki>=0.5.1",
]
aws = [
"boto3>=1.42.66",
]
Expand All @@ -40,6 +43,7 @@ all = [
"modal>=0.62.0",
"e2b>=2.20.0",
"daytona>=0.170.0",
"tenki>=0.5.1",
"boto3>=1.42.66",
"azure-identity>=1.17.1",
"azure-mgmt-resource>=23.1.1",
Expand Down Expand Up @@ -77,4 +81,4 @@ script-files = []
where = ["src"]

[tool.setuptools.package-data]
evo = ["static/*", "opencode_plugin/*.js", "openclaw_plugin/*.js", "openclaw_plugin/native/*.js", "openclaw_plugin/native/*.json", "openclaw_plugin/native/*.md"]
evo = ["static/*", "static/logos/*", "opencode_plugin/*.js", "openclaw_plugin/*.js", "openclaw_plugin/native/*.js", "openclaw_plugin/native/*.json", "openclaw_plugin/native/*.md"]
4 changes: 3 additions & 1 deletion plugins/evo/skills/infra-setup/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ evo_version: 0.8.0

# Infra Setup

Use this when the user wants to change where experiments run: local worktrees, pool slots, or a remote provider such as Modal, E2B, Daytona, AWS, Azure, SSH, manual, or a custom dotted-path provider.
Use this when the user wants to change where experiments run: local worktrees, pool slots, or a remote provider such as Modal, E2B, Daytona, Tenki, AWS, Azure, SSH, manual, or a custom dotted-path provider.

## Goals

Expand All @@ -25,6 +25,7 @@ Use this when the user wants to change where experiments run: local worktrees, p
- `modal`
- `e2b`
- `daytona`
- `tenki`
- `aws`
- `azure`
- `manual`
Expand Down Expand Up @@ -72,6 +73,7 @@ Before trying to switch a workspace to a remote provider, confirm the basics:
- `modal`: auth + optional config
- `e2b`: API key + optional config
- `daytona`: API key and API URL/target if needed
- `tenki`: API key + project id + optional config
- `aws`: creds, region, image, SSH key pair/private key, and usually network config
- `azure`: subscription, resource group, region, SSH key/private key, and VM/image choices
- `ssh`: reachable host, working SSH user, and key/port if needed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Use this as the compact summary. This is setup guidance, not a runtime dependenc
| `modal` | Modal Python SDK | If missing, install `evo-hq-cli[modal]` (or inject `modal` with `pipx`); then run `modal token new` | `app_name`, `gpu`, `region`, `timeout_seconds`, `health_timeout_seconds`, `apt_install`, `pip_install` |
| `e2b` | E2B Python SDK | If missing, install `evo-hq-cli[e2b]` (or inject `e2b` with `pipx`); then `export E2B_API_KEY=...` | `template`, `api_key`, `domain`, `root`, `timeout_seconds`, `health_timeout_seconds`, `allow_internet_access`, `secure` |
| `daytona` | Daytona Python SDK | If missing, install `evo-hq-cli[daytona]` (or inject `daytona` with `pipx`); then `export DAYTONA_API_KEY=...` | `api_key`, `api_url`, `target`, `timeout_seconds`, `health_timeout_seconds`, `ssh_host`, `ssh_port`, `ssh_token_ttl_minutes`, `sandbox_timeout_seconds` |
| `tenki` | Tenki Python SDK (`tenki`) | If missing, install `evo-hq-cli[tenki]` (or inject `tenki` with `pipx`); then `export TENKI_API_KEY=tk_...` | `auth_token` (or `api_key`), `workspace_id`, `base_url`, `name_prefix`, `image`, `snapshot_id`, `cpu_cores`, `memory_mb`, `disk_size_gb`, `idle_timeout_minutes`, `root`, `timeout_seconds`, `create_timeout_seconds`, `bootstrap_timeout_seconds`, `health_timeout_seconds` |
| `aws` | `boto3` | If missing, install `evo-hq-cli[aws]` (or inject `boto3` with `pipx`); then export AWS creds and region | `region`, `image_id`, `key_name`, `key`, `instance_type`, `subnet_id`, `security_group_ids`, `ssh_user`, `ssh_port`, `timeout_seconds`, `health_timeout_seconds`, `keep_warm` |
| `azure` | Azure Python SDK (`azure-identity`, `azure-mgmt-resource`, `azure-mgmt-network`, `azure-mgmt-compute`) | If missing, install `evo-hq-cli[azure]`; then use `az login` or Azure env creds, and provide subscription/resource-group config | `subscription_id`, `resource_group`, `location`, `vm_size`, `image`, `key`, `ssh_public_key`, `ssh_user`, `ssh_cidr`, `vnet_cidr`, `subnet_cidr`, `ssh_port`, `timeout_seconds`, `health_timeout_seconds`, `keep_warm` |
| `ssh` | local `ssh` transport | `ssh user@host` must work first; then add `-i` / `-p` if needed | `host`, `key`, `port`, `tunnel_port`, `keep_warm`, `health_timeout_seconds` |
Expand Down
15 changes: 15 additions & 0 deletions plugins/evo/src/evo/backends/sandbox_providers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,27 @@ def _load_azure(config: dict[str, Any]) -> SandboxProvider:
return _azure_module.AzureProvider(config)


def _load_tenki(config: dict[str, Any]) -> SandboxProvider:
try:
from . import tenki as _tenki_module
except ImportError as exc:
raise RemoteBackendUnavailable(
"Tenki provider requested but the 'tenki' Python SDK is "
"not installed. Install it with: python -m pip install "
"'evo-hq-cli[tenki]' "
"(or `pipx inject evo-hq-cli tenki` if evo itself was "
"installed with pipx)."
) from exc
return _tenki_module.TenkiProvider(config)


_LOADERS: dict[str, Callable[[dict[str, Any]], SandboxProvider]] = {
"modal": _load_modal,
"manual": _load_manual,
"ssh": _load_ssh,
"e2b": _load_e2b,
"daytona": _load_daytona,
"tenki": _load_tenki,
"aws": _load_aws,
"azure": _load_azure,
}
Expand Down
Loading