Closes Phase 3 of Molecule-AI/molecule-core#2054. Phase 1 (canvas, #2092 MERGED) plumbed provision_timeout_ms through the canvas socket → node-data → ProvisioningTimeout resolver. Phase 2 (workspace-server, #2094 MERGED) read the field from template config.yaml and surfaced it in the workspace API response. This commit completes the chain: declare the value HERE so the canvas banner threshold for hermes flows from this template manifest, not from the canvas-side hardcoded RUNTIME_PROFILES map. 720s rationale: hermes installs ripgrep + ffmpeg + node22 + builds hermes-agent from source + pulls Playwright + Chromium (~300MB). Staging EC2 cold boots routinely land at 8-13 min. 720s aligns with the SaaS E2E PROVISION_TIMEOUT_SECS=900 so the UI warning surfaces shortly before the backend itself gives up. Without this declaration, canvas falls back to its 2-min default and false-alarms on every fresh hermes provision. Follow-up (separate canvas PR): remove RUNTIME_PROFILES.hermes from canvas/src/lib/runtimeProfiles.ts now that the value flows server-side. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
228 lines
10 KiB
YAML
228 lines
10 KiB
YAML
name: Hermes Agent
|
|
description: >-
|
|
Nous Research hermes-agent — the self-improving AI agent with built-in
|
|
terminal, file ops, web search, memory, skills, and cross-session recall.
|
|
This workspace runs the real `hermes-agent` (github.com/NousResearch/hermes-agent)
|
|
behind an A2A bridge. The agent exposes its OpenAI-compatible API on
|
|
localhost:8642 and molecule_runtime proxies messages to it on :8000.
|
|
|
|
Supports every provider hermes-agent supports — see docs/CONFIGURATION.md
|
|
for the full list. Any model hermes-agent accepts is selectable at
|
|
runtime via `hermes model`, or from the canvas Config tab.
|
|
version: 2.1.0
|
|
tier: 2
|
|
|
|
runtime: hermes
|
|
runtime_config:
|
|
# Default model. hermes-agent owns provider resolution via the
|
|
# HERMES_INFERENCE_PROVIDER env or its own `hermes model` wizard.
|
|
# Override per-workspace in the canvas Config tab.
|
|
model: nousresearch/hermes-4-70b
|
|
|
|
# Canvas surfaces this list as a Model dropdown and auto-populates
|
|
# Required Env Vars from the selected entry's required_env. Provider
|
|
# names in parentheses mirror hermes-agent's CLI provider field; see
|
|
# docs/CONFIGURATION.md#provider-matrix for the full mapping.
|
|
models:
|
|
# ── Nous Research (Hermes 4) via Nous Portal ──────────────────────
|
|
- id: nousresearch/hermes-4-70b
|
|
name: Hermes 4 70B (Nous Portal)
|
|
required_env: [HERMES_API_KEY]
|
|
- id: nousresearch/hermes-4-405b
|
|
name: Hermes 4 405B (Nous Portal)
|
|
required_env: [HERMES_API_KEY]
|
|
- id: nousresearch/hermes-4-14b
|
|
name: Hermes 4 14B (Nous Portal)
|
|
required_env: [HERMES_API_KEY]
|
|
|
|
# ── Hermes 3 family (via OpenRouter) ─────────────────────────────
|
|
- id: nousresearch/hermes-3-llama-3.1-70b
|
|
name: Hermes 3 70B (OpenRouter)
|
|
required_env: [OPENROUTER_API_KEY]
|
|
- id: nousresearch/hermes-3-llama-3.1-405b
|
|
name: Hermes 3 405B (OpenRouter)
|
|
required_env: [OPENROUTER_API_KEY]
|
|
|
|
# ── Anthropic (native SDK inside hermes-agent) ────────────────────
|
|
- id: anthropic/claude-sonnet-4-5
|
|
name: Claude Sonnet 4.5 (direct)
|
|
required_env: [ANTHROPIC_API_KEY]
|
|
- id: anthropic/claude-opus-4-1
|
|
name: Claude Opus 4.1 (direct)
|
|
required_env: [ANTHROPIC_API_KEY]
|
|
- id: anthropic/claude-haiku-4-5
|
|
name: Claude Haiku 4.5 (direct)
|
|
required_env: [ANTHROPIC_API_KEY]
|
|
|
|
# ── OpenAI (via OpenRouter — hermes has no direct openai provider;
|
|
# openai-codex is OAuth-only for Codex models) ──────────────────
|
|
- id: openai/gpt-5
|
|
name: GPT-5 (via OpenRouter)
|
|
required_env: [OPENROUTER_API_KEY]
|
|
- id: openai/gpt-5-mini
|
|
name: GPT-5 mini (via OpenRouter)
|
|
required_env: [OPENROUTER_API_KEY]
|
|
- id: openai/gpt-4o
|
|
name: GPT-4o (via OpenRouter)
|
|
required_env: [OPENROUTER_API_KEY]
|
|
- id: openai/gpt-4o-mini
|
|
name: GPT-4o mini (via OpenRouter)
|
|
required_env: [OPENROUTER_API_KEY]
|
|
|
|
# ── Google Gemini (native SDK) ────────────────────────────────────
|
|
- id: gemini/gemini-2.5-pro
|
|
name: Gemini 2.5 Pro (direct)
|
|
required_env: [GEMINI_API_KEY]
|
|
- id: gemini/gemini-2.5-flash
|
|
name: Gemini 2.5 Flash (direct)
|
|
required_env: [GEMINI_API_KEY]
|
|
|
|
# ── DeepSeek (direct) ─────────────────────────────────────────────
|
|
- id: deepseek/deepseek-v3.2
|
|
name: DeepSeek V3.2 (direct)
|
|
required_env: [DEEPSEEK_API_KEY]
|
|
- id: deepseek/deepseek-r1
|
|
name: DeepSeek R1 reasoning (direct)
|
|
required_env: [DEEPSEEK_API_KEY]
|
|
|
|
# ── z.ai / GLM ────────────────────────────────────────────────────
|
|
- id: zai/glm-4.6
|
|
name: GLM 4.6 (z.ai)
|
|
required_env: [GLM_API_KEY]
|
|
|
|
# ── Kimi / Moonshot ───────────────────────────────────────────────
|
|
- id: kimi-coding/kimi-k2
|
|
name: Kimi K2 (Moonshot)
|
|
required_env: [KIMI_API_KEY]
|
|
|
|
# ── MiniMax (global + China) ─────────────────────────────────────
|
|
- id: minimax/MiniMax-M2.7
|
|
name: MiniMax M2.7 (direct, coding-tuned)
|
|
required_env: [MINIMAX_API_KEY]
|
|
- id: minimax/MiniMax-M2.7-highspeed
|
|
name: MiniMax M2.7 highspeed (Token Plan only)
|
|
required_env: [MINIMAX_API_KEY]
|
|
- id: minimax/MiniMax-M1
|
|
name: MiniMax M1 (1M ctx)
|
|
required_env: [MINIMAX_API_KEY]
|
|
- id: minimax-cn/abab6.5-chat
|
|
name: MiniMax China (abab6.5)
|
|
required_env: [MINIMAX_CN_API_KEY]
|
|
|
|
# ── Alibaba Cloud / Qwen (DashScope) ─────────────────────────────
|
|
- id: alibaba/qwen3-max
|
|
name: Qwen 3 Max (Alibaba Cloud)
|
|
required_env: [DASHSCOPE_API_KEY]
|
|
- id: alibaba/qwen3-coder
|
|
name: Qwen 3 Coder (Alibaba Cloud)
|
|
required_env: [DASHSCOPE_API_KEY]
|
|
|
|
# ── Xiaomi MiMo ──────────────────────────────────────────────────
|
|
- id: xiaomi/mimo-v1
|
|
name: Xiaomi MiMo v1
|
|
required_env: [XIAOMI_API_KEY]
|
|
|
|
# ── Arcee Trinity ────────────────────────────────────────────────
|
|
- id: arcee/trinity-70b
|
|
name: Arcee Trinity 70B
|
|
required_env: [ARCEEAI_API_KEY]
|
|
|
|
# ── NVIDIA NIM ────────────────────────────────────────────────────
|
|
- id: nvidia/nemotron-70b
|
|
name: Nemotron 70B (NVIDIA NIM)
|
|
required_env: [NVIDIA_API_KEY]
|
|
|
|
# ── Ollama Cloud ─────────────────────────────────────────────────
|
|
- id: ollama-cloud/llama-3.3-70b
|
|
name: Llama 3.3 70B (Ollama Cloud)
|
|
required_env: [OLLAMA_API_KEY]
|
|
|
|
# ── Hugging Face Inference ───────────────────────────────────────
|
|
- id: huggingface/*
|
|
name: Any Hugging Face model (set ID per workspace)
|
|
required_env: [HF_TOKEN]
|
|
|
|
# ── Vercel AI Gateway ────────────────────────────────────────────
|
|
- id: ai-gateway/*
|
|
name: Any Vercel AI Gateway model
|
|
required_env: [AI_GATEWAY_API_KEY]
|
|
|
|
# ── OpenCode Zen / Go ────────────────────────────────────────────
|
|
- id: opencode-zen/*
|
|
name: OpenCode Zen (set model per workspace)
|
|
required_env: [OPENCODE_ZEN_API_KEY]
|
|
- id: opencode-go/*
|
|
name: OpenCode Go (set model per workspace)
|
|
required_env: [OPENCODE_GO_API_KEY]
|
|
|
|
# ── Kilo Code ────────────────────────────────────────────────────
|
|
- id: kilocode/*
|
|
name: Kilo Code (set model per workspace)
|
|
required_env: [KILOCODE_API_KEY]
|
|
|
|
# ── OpenRouter catch-all ─────────────────────────────────────────
|
|
- id: openrouter/*
|
|
name: Any OpenRouter model (200+ available)
|
|
required_env: [OPENROUTER_API_KEY]
|
|
|
|
# ── Custom endpoint (LM Studio / Ollama local / vLLM / llama.cpp) ─
|
|
- id: custom/*
|
|
name: Self-hosted OpenAI-compat endpoint (configure base_url in ~/.hermes/config)
|
|
required_env: []
|
|
|
|
# No single required env — hermes-agent supports 20+ providers and
|
|
# customers pick any one via the canvas Config tab (per-model
|
|
# required_env above drives the real UX). Molecule-runtime's
|
|
# preflight enforces AND-semantics on this list, so a non-empty
|
|
# value here would block workspaces using any non-default provider.
|
|
# hermes-agent itself errors loud at request time if zero providers
|
|
# are configured — that's the safety net.
|
|
required_env: []
|
|
|
|
# 0 = no timeout; hermes-agent sessions can run long when tool-using.
|
|
timeout: 0
|
|
|
|
# Cold-boot expectation surfaced to the canvas ProvisioningTimeout
|
|
# banner (Molecule-AI/molecule-core#2054). Hermes installs ripgrep +
|
|
# ffmpeg + node22 + builds hermes-agent from source + pulls Playwright
|
|
# + Chromium (~300MB), so cold boots routinely land at 8-13 min on
|
|
# staging EC2. 720s aligns with the SaaS E2E PROVISION_TIMEOUT_SECS=900
|
|
# so the UI warning surfaces shortly before the backend itself gives
|
|
# up. Without this declaration, canvas falls back to its 2-min default
|
|
# and false-alarms on every fresh hermes provision.
|
|
provision_timeout_seconds: 720
|
|
|
|
# Tools hermes-agent ships natively. See `hermes tools` inside the
|
|
# container for the interactive toggle — by default all 17 built-in
|
|
# tool families are available (terminal, file read/write/edit,
|
|
# web fetch+search, memory, skills, subagent spawn, etc.).
|
|
skills: []
|
|
|
|
a2a:
|
|
port: 8000
|
|
streaming: true
|
|
push_notifications: true
|
|
|
|
# Bridge config — consumed by executor.py and start.sh.
|
|
bridge:
|
|
# Where the in-container hermes-agent API server listens. Do NOT
|
|
# change unless you also change start.sh / API_SERVER_PORT.
|
|
hermes_api_base: http://127.0.0.1:8642/v1
|
|
# Bearer token is injected by start.sh as API_SERVER_KEY and read by
|
|
# executor.py from the env at request time — not stored in config.
|
|
hermes_api_key_env: API_SERVER_KEY
|
|
# Optional: force a specific hermes provider instead of relying on
|
|
# hermes-agent's `auto` detection. Useful when multiple keys are
|
|
# set and you want deterministic routing. Set via HERMES_INFERENCE_PROVIDER
|
|
# env on the container OR hardcode here. Valid values: see
|
|
# docs/CONFIGURATION.md#provider-matrix.
|
|
provider: ""
|
|
|
|
delegation:
|
|
retry_attempts: 3
|
|
retry_delay: 5
|
|
timeout: 120
|
|
escalate: true
|
|
|
|
template_schema_version: 1
|