feat(config): enhance terminal environment variable management
- Updated .env.example to clarify terminal backend configuration and its relationship with config.yaml. - Modified gateway/run.py to ensure terminal settings from config.yaml take precedence over .env, improving consistency in environment variable handling. - Added mapping for terminal configuration options to corresponding environment variables for better integration.
This commit is contained in:
parent
0a231c0783
commit
f0458ebdb8
2 changed files with 34 additions and 10 deletions
17
.env.example
17
.env.example
|
|
@ -33,17 +33,16 @@ FAL_KEY=
|
||||||
# TERMINAL TOOL CONFIGURATION (mini-swe-agent backend)
|
# TERMINAL TOOL CONFIGURATION (mini-swe-agent backend)
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Backend type: "local", "singularity", "docker", "modal", or "ssh"
|
# Backend type: "local", "singularity", "docker", "modal", or "ssh"
|
||||||
# - local: Runs directly on your machine (fastest, no isolation)
|
# Terminal backend is configured in ~/.hermes/config.yaml (terminal.backend).
|
||||||
# - ssh: Runs on remote server via SSH (great for sandboxing - agent can't touch its own code)
|
# Use 'hermes setup' or 'hermes config set terminal.backend docker' to change.
|
||||||
# - singularity: Runs in Apptainer/Singularity containers (HPC clusters, no root needed)
|
# Supported: local, docker, singularity, modal, ssh
|
||||||
# - docker: Runs in Docker containers (isolated, requires Docker + docker group)
|
#
|
||||||
# - modal: Runs in Modal cloud sandboxes (scalable, requires Modal account)
|
# Only override here if you need to force a backend without touching config.yaml:
|
||||||
TERMINAL_ENV=local
|
# TERMINAL_ENV=local
|
||||||
|
|
||||||
|
|
||||||
# Container images (for singularity/docker/modal backends)
|
# Container images (for singularity/docker/modal backends)
|
||||||
TERMINAL_DOCKER_IMAGE=nikolaik/python-nodejs:python3.11-nodejs20
|
# TERMINAL_DOCKER_IMAGE=nikolaik/python-nodejs:python3.11-nodejs20
|
||||||
TERMINAL_SINGULARITY_IMAGE=docker://nikolaik/python-nodejs:python3.11-nodejs20
|
# TERMINAL_SINGULARITY_IMAGE=docker://nikolaik/python-nodejs:python3.11-nodejs20
|
||||||
TERMINAL_MODAL_IMAGE=nikolaik/python-nodejs:python3.11-nodejs20
|
TERMINAL_MODAL_IMAGE=nikolaik/python-nodejs:python3.11-nodejs20
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,16 +43,41 @@ if _env_path.exists():
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
# Bridge config.yaml values into the environment so os.getenv() picks them up.
|
# Bridge config.yaml values into the environment so os.getenv() picks them up.
|
||||||
# Values already set in the environment (from .env or shell) take precedence.
|
# config.yaml is authoritative for terminal settings — overrides .env.
|
||||||
_config_path = _hermes_home / 'config.yaml'
|
_config_path = _hermes_home / 'config.yaml'
|
||||||
if _config_path.exists():
|
if _config_path.exists():
|
||||||
try:
|
try:
|
||||||
import yaml as _yaml
|
import yaml as _yaml
|
||||||
with open(_config_path) as _f:
|
with open(_config_path) as _f:
|
||||||
_cfg = _yaml.safe_load(_f) or {}
|
_cfg = _yaml.safe_load(_f) or {}
|
||||||
|
# Top-level simple values (fallback only — don't override .env)
|
||||||
for _key, _val in _cfg.items():
|
for _key, _val in _cfg.items():
|
||||||
if isinstance(_val, (str, int, float, bool)) and _key not in os.environ:
|
if isinstance(_val, (str, int, float, bool)) and _key not in os.environ:
|
||||||
os.environ[_key] = str(_val)
|
os.environ[_key] = str(_val)
|
||||||
|
# Terminal config is nested — bridge to TERMINAL_* env vars.
|
||||||
|
# config.yaml overrides .env for these since it's the documented config path.
|
||||||
|
_terminal_cfg = _cfg.get("terminal", {})
|
||||||
|
if _terminal_cfg and isinstance(_terminal_cfg, dict):
|
||||||
|
_terminal_env_map = {
|
||||||
|
"backend": "TERMINAL_ENV",
|
||||||
|
"cwd": "TERMINAL_CWD",
|
||||||
|
"timeout": "TERMINAL_TIMEOUT",
|
||||||
|
"lifetime_seconds": "TERMINAL_LIFETIME_SECONDS",
|
||||||
|
"docker_image": "TERMINAL_DOCKER_IMAGE",
|
||||||
|
"singularity_image": "TERMINAL_SINGULARITY_IMAGE",
|
||||||
|
"modal_image": "TERMINAL_MODAL_IMAGE",
|
||||||
|
"ssh_host": "TERMINAL_SSH_HOST",
|
||||||
|
"ssh_user": "TERMINAL_SSH_USER",
|
||||||
|
"ssh_port": "TERMINAL_SSH_PORT",
|
||||||
|
"ssh_key": "TERMINAL_SSH_KEY",
|
||||||
|
"container_cpu": "TERMINAL_CONTAINER_CPU",
|
||||||
|
"container_memory": "TERMINAL_CONTAINER_MEMORY",
|
||||||
|
"container_disk": "TERMINAL_CONTAINER_DISK",
|
||||||
|
"container_persistent": "TERMINAL_CONTAINER_PERSISTENT",
|
||||||
|
}
|
||||||
|
for _cfg_key, _env_var in _terminal_env_map.items():
|
||||||
|
if _cfg_key in _terminal_cfg:
|
||||||
|
os.environ[_env_var] = str(_terminal_cfg[_cfg_key])
|
||||||
except Exception:
|
except Exception:
|
||||||
pass # Non-fatal; gateway can still run with .env values
|
pass # Non-fatal; gateway can still run with .env values
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue