From 4fc66861e3dcdcdc0e95d0f46ca9e7d5a669eb71 Mon Sep 17 00:00:00 2001 From: chaodu-agent Date: Fri, 4 Sep 2026 11:44:54 -0400 Subject: [PATCH] chore(agents): remove Hermes agent support and drop it from CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hermes has become high-maintenance in CI — its image build fetches an install script from raw.githubusercontent.com, which frequently 429s on shared runners and fails the Docker Smoke Test — for a backend whose ROI no longer justifies that cost. Remove Hermes as a supported/built agent. Removed: - Dockerfile.hermes and docs/hermes.md - hermes target from Dockerfile.unified, Dockerfile.package, docker-bake.hcl - hermes from all CI: docker-smoke-test(.unified), pr-preview, build-images, pre-beta-build, snapshot-build, build-operator, nightly-build (variant strings + the nightly hermes) release-resolver case block). Also dropped the now-dead retry-curl assertions in docker-smoke-test.yml (the retried curl lived only in the removed hermes Dockerfile block). - hermes from charts/openab/values.yaml, config.toml.example, docs/config-reference.md, docs/image-tags.md agent list - hermes from README.md / README.zh-TW.md (CLI list, feature bullet, Other Agents table row, and the architecture diagram cell) - the Dockerfile.hermes comparison section in docs/grok.md Left intentionally: historical ADRs and code comments that cite Hermes as prior art, and CONTRIBUTING/steering references that point contributors to Hermes as a reference project — these are not agent-support wiring. --- .github/workflows/build-images.yml | 2 +- .github/workflows/build-operator.yml | 2 +- .../workflows/docker-smoke-test-unified.yml | 1 - .github/workflows/docker-smoke-test.yml | 4 - .github/workflows/nightly-build.yml | 32 +-- .github/workflows/pr-preview.yml | 1 - .github/workflows/pre-beta-build.yml | 2 +- .github/workflows/snapshot-build.yml | 2 +- Dockerfile.hermes | 69 ------- Dockerfile.package | 38 ---- Dockerfile.unified | 38 ---- README.md | 7 +- README.zh-TW.md | 7 +- charts/openab/values.yaml | 21 -- config.toml.example | 7 - docker-bake.hcl | 8 +- docs/config-reference.md | 5 - docs/grok.md | 12 -- docs/hermes.md | 195 ------------------ docs/image-tags.md | 2 +- 20 files changed, 14 insertions(+), 441 deletions(-) delete mode 100644 Dockerfile.hermes delete mode 100644 docs/hermes.md diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml index 1449e2436..3ecc5c507 100644 --- a/.github/workflows/build-images.yml +++ b/.github/workflows/build-images.yml @@ -62,7 +62,7 @@ jobs: fi # Resolve variants - ALLOWED="kiro,claude,codex,copilot,cursor,devin,gemini,grok,hermes,kimi,mimocode,opencode,antigravity,pi,native,agentcore" + ALLOWED="kiro,claude,codex,copilot,cursor,devin,gemini,grok,kimi,mimocode,opencode,antigravity,pi,native,agentcore" if [ "$VARIANTS_INPUT" = "all" ] || [ -z "$VARIANTS_INPUT" ]; then VARIANTS="$ALLOWED" else diff --git a/.github/workflows/build-operator.yml b/.github/workflows/build-operator.yml index 4a7556eba..b8285eb24 100644 --- a/.github/workflows/build-operator.yml +++ b/.github/workflows/build-operator.yml @@ -30,7 +30,7 @@ env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} # All agent variants built from Dockerfile.unified targets. - AGENTS: "kiro,claude,codex,copilot,cursor,devin,gemini,grok,hermes,kimi,mimocode,opencode,antigravity,pi,native,agentcore" + AGENTS: "kiro,claude,codex,copilot,cursor,devin,gemini,grok,kimi,mimocode,opencode,antigravity,pi,native,agentcore" jobs: resolve-tag: diff --git a/.github/workflows/docker-smoke-test-unified.yml b/.github/workflows/docker-smoke-test-unified.yml index 43b58f07d..d1e701ddd 100644 --- a/.github/workflows/docker-smoke-test-unified.yml +++ b/.github/workflows/docker-smoke-test-unified.yml @@ -56,7 +56,6 @@ jobs: - { name: devin, agent: "devin" } - { name: gemini, agent: "gemini" } - { name: grok, agent: "grok" } - - { name: hermes, agent: "hermes-acp" } - { name: kimi, agent: "kimi" } - { name: mimocode, agent: "mimo" } - { name: opencode, agent: "opencode" } diff --git a/.github/workflows/docker-smoke-test.yml b/.github/workflows/docker-smoke-test.yml index c61b15a34..3773c0d4e 100644 --- a/.github/workflows/docker-smoke-test.yml +++ b/.github/workflows/docker-smoke-test.yml @@ -30,7 +30,6 @@ jobs: - { dockerfile: Dockerfile.cursor, suffix: "-cursor", agent: "cursor-agent", agent_args: "acp", build_args: "" } - { dockerfile: Dockerfile.kimi, suffix: "-kimi", agent: "kimi", agent_args: "acp", build_args: "" } - { dockerfile: Dockerfile.mimocode, suffix: "-mimocode", agent: "mimo", agent_args: "acp", build_args: "" } - - { dockerfile: Dockerfile.hermes, suffix: "-hermes", agent: "hermes-acp", agent_args: "", build_args: "" } - { dockerfile: Dockerfile.grok, suffix: "-grok", agent: "grok", agent_args: "agent stdio", build_args: "" } - { dockerfile: Dockerfile.devin, suffix: "-devin", agent: "devin", agent_args: "acp", build_args: "" } - { dockerfile: Dockerfile.antigravity, suffix: "-antigravity", agent: "agy-acp", agent_args: "", build_args: "" } @@ -179,9 +178,6 @@ jobs: assert_line 'ARG DEVIN_VERSION=3000.2.17' Dockerfile.devin Dockerfile.package Dockerfile.unified assert_line 'ARG DEVIN_SHA256_AMD64=f0e1e9363afc6ee68c4ef87bab4aeb7ff5cc08a5fa838350ef3ceefdbb2a2be2' Dockerfile.devin Dockerfile.package Dockerfile.unified assert_line 'ARG DEVIN_SHA256_ARM64=116dc71ef085a922bc3ff0ea0377d4b26c529a431d58246e36572913e2d25624' Dockerfile.devin Dockerfile.package Dockerfile.unified - assert_occurrences 1 '--retry 6 --retry-all-errors --retry-delay 10 --retry-max-time 120' Dockerfile.hermes - assert_occurrences 1 '--retry 6 --retry-all-errors --retry-delay 10 --retry-max-time 120' Dockerfile.package - assert_occurrences 1 '--retry 6 --retry-all-errors --retry-delay 10 --retry-max-time 120' Dockerfile.unified assert_line 'ENV AGY_VERSION=1.1.13' Dockerfile.antigravity Dockerfile.unified Dockerfile.final Dockerfile.ci assert_line 'ARG AGY_VERSION=1.1.13' Dockerfile.package assert_line 'ENV AGY_VERSION="${AGY_VERSION}"' Dockerfile.package diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 51af09d96..0c0edac13 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -50,7 +50,7 @@ env: # OPENAB_AGENT_COMMAND=openab-agent but does not ship that binary (a # pre-existing bug across all lanes — see follow-up issue), so a nightly-pi # tag would publish a runtime-broken image. Re-add once the pi target is fixed. - ALL_VARIANTS: 'kiro,claude,codex,copilot,cursor,devin,gemini,grok,hermes,kimi,mimocode,opencode,antigravity' + ALL_VARIANTS: 'kiro,claude,codex,copilot,cursor,devin,gemini,grok,kimi,mimocode,opencode,antigravity' jobs: # --------------------------------------------------------------------------- @@ -182,7 +182,7 @@ jobs: steps: - name: Resolve the vendor's latest CLI version env: - # Used for the cross-repo GitHub API requests (hermes, antigravity). + # Used for the cross-repo GitHub API requests (antigravity). # An authenticated fetch avoids the shared-runner 429s seen on # api/raw.githubusercontent.com, while the resolved commit/tag keeps # the installer immutable. @@ -319,34 +319,6 @@ jobs: AGY_SHA256_AMD64= AGY_SHA256_ARM64= ALLOW_UNVERIFIED_NIGHTLY_DOWNLOADS=true" ;; - hermes) - # Resolve the release, dereference an annotated tag to its immutable - # commit, then pin both the install commit and the installer SHA so - # the Dockerfile's SHA check stays enabled. - RELEASE=$(github_api https://api.github.com/repos/NousResearch/hermes-agent/releases/latest) - TAG=$(echo "$RELEASE" | jq -r .tag_name) - REF=$(github_api "https://api.github.com/repos/NousResearch/hermes-agent/git/ref/tags/${TAG}") - REF_TYPE=$(echo "$REF" | jq -r .object.type) - COMMIT=$(echo "$REF" | jq -r .object.sha) - for _ in 1 2 3; do - [ "$REF_TYPE" = "tag" ] || break - REF=$(github_api "https://api.github.com/repos/NousResearch/hermes-agent/git/tags/${COMMIT}") - REF_TYPE=$(echo "$REF" | jq -r .object.type) - COMMIT=$(echo "$REF" | jq -r .object.sha) - done - [ "$REF_TYPE" = "commit" ] || { echo "::error::hermes $TAG did not resolve to a commit"; exit 1; } - echo "$COMMIT" | grep -qE '^[0-9a-f]{40}$' || { echo "::error::invalid hermes commit: $COMMIT"; exit 1; } - # Hash the installer via the authenticated Contents API (raw+json) - # for the resolved commit — same reason as the release fetch above: - # dodges the shared-runner 429s on raw.githubusercontent.com. The - # Dockerfile still fetches+verifies against this SHA at build time. - INSTALL_SHA=$(github_api -H 'Accept: application/vnd.github.raw+json' \ - "https://api.github.com/repos/NousResearch/hermes-agent/contents/scripts/install.sh?ref=${COMMIT}" \ - | sha256sum | cut -d' ' -f1) - echo "$INSTALL_SHA" | grep -qE '^[0-9a-f]{64}$' || { echo "::error::could not hash hermes installer"; exit 1; } - REPORT="hermes $TAG @ $COMMIT" - BUILD_ARGS="HERMES_INSTALL_COMMIT=$COMMIT - HERMES_INSTALL_SHA256=$INSTALL_SHA" ;; *) echo "::error::no resolver for variant $VARIANT"; exit 1 ;; esac diff --git a/.github/workflows/pr-preview.yml b/.github/workflows/pr-preview.yml index d18255bb0..a6b6864a5 100644 --- a/.github/workflows/pr-preview.yml +++ b/.github/workflows/pr-preview.yml @@ -24,7 +24,6 @@ on: - devin - gemini - grok - - hermes - kimi - mimocode - native diff --git a/.github/workflows/pre-beta-build.yml b/.github/workflows/pre-beta-build.yml index d793f938c..529b06a7d 100644 --- a/.github/workflows/pre-beta-build.yml +++ b/.github/workflows/pre-beta-build.yml @@ -14,7 +14,7 @@ on: env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} - ALL_AGENTS: 'kiro,claude,codex,copilot,cursor,devin,gemini,grok,hermes,kimi,mimocode,opencode,antigravity,pi,native,agentcore' + ALL_AGENTS: 'kiro,claude,codex,copilot,cursor,devin,gemini,grok,kimi,mimocode,opencode,antigravity,pi,native,agentcore' jobs: gate: diff --git a/.github/workflows/snapshot-build.yml b/.github/workflows/snapshot-build.yml index 1f6f82807..5dc5e4e0a 100644 --- a/.github/workflows/snapshot-build.yml +++ b/.github/workflows/snapshot-build.yml @@ -21,7 +21,7 @@ on: env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} - ALL_VARIANTS: 'default,agentcore,antigravity,claude,codex,copilot,cursor,devin,gemini,grok,hermes,kimi,mimocode,native,opencode,pi' + ALL_VARIANTS: 'default,agentcore,antigravity,claude,codex,copilot,cursor,devin,gemini,grok,kimi,mimocode,native,opencode,pi' jobs: matrix: diff --git a/Dockerfile.hermes b/Dockerfile.hermes deleted file mode 100644 index 7fc292faa..000000000 --- a/Dockerfile.hermes +++ /dev/null @@ -1,69 +0,0 @@ -# --- Build stage --- -FROM rust:1-bookworm AS builder -WORKDIR /build -COPY Cargo.toml Cargo.lock ./ -COPY crates/openab-core/Cargo.toml crates/openab-core/Cargo.toml -COPY crates/openab-gateway/Cargo.toml crates/openab-gateway/Cargo.toml -COPY crates/openab-mcp/Cargo.toml crates/openab-mcp/Cargo.toml -COPY crates/openab-cp/Cargo.toml crates/openab-cp/Cargo.toml -RUN mkdir -p src crates/openab-core/src crates/openab-gateway/src crates/openab-mcp/src crates/openab-cp/src \ - && echo 'fn main() {}' > src/main.rs \ - && echo '' > crates/openab-core/src/lib.rs \ - && echo '' > crates/openab-gateway/src/lib.rs \ - && echo '' > crates/openab-mcp/src/lib.rs \ - && echo '' > crates/openab-cp/src/lib.rs \ - && cargo build --release \ - && rm -rf src crates/openab-core/src crates/openab-gateway/src crates/openab-mcp/src crates/openab-cp/src -COPY crates/ crates/ -COPY src/ src/ -RUN touch src/main.rs crates/openab-core/src/lib.rs crates/openab-gateway/src/lib.rs crates/openab-mcp/src/lib.rs crates/openab-cp/src/lib.rs && cargo build --release - -# --- Runtime stage --- -FROM python:3.12-slim-trixie - -# Create agent user first so WORKDIR gets correct ownership -RUN useradd -m -u 1000 agent - -RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates curl procps ripgrep tini git ffmpeg unzip xz-utils && \ - rm -rf /var/lib/apt/lists/* - -# Install Hermes Agent — pinned to known commit with checksum verification -# Root install uses FHS layout: binary at /usr/local/bin/hermes, code at /usr/local/lib/hermes-agent -# HERMES_HOME points to agent user's data dir for OAuth tokens and config -ARG HERMES_INSTALL_COMMIT=2bd1977d8fad185c9b4be47884f7e87f1add0ce3 -ARG HERMES_INSTALL_SHA256=dbd9d555ed4ac67bd1fc71ba6a39b410cf2af0ebcfd8f4889e086af78c9ddcaa -# Shared CI runners can be throttled by raw.githubusercontent.com; retry -# transient failures while the pinned SHA256 still verifies the response body. -RUN curl -fsSL --retry 6 --retry-all-errors --retry-delay 10 --retry-max-time 120 \ - "https://raw.githubusercontent.com/NousResearch/hermes-agent/${HERMES_INSTALL_COMMIT}/scripts/install.sh" \ - -o /tmp/install-hermes.sh && \ - echo "${HERMES_INSTALL_SHA256} /tmp/install-hermes.sh" | sha256sum -c - && \ - HERMES_HOME=/home/agent/.hermes bash /tmp/install-hermes.sh && \ - rm /tmp/install-hermes.sh && \ - (test -d /root/.local/share/uv && chmod -R a+rX /root/.local/share/uv && chmod a+rx /root /root/.local /root/.local/share || true) && \ - ln -sf /usr/local/lib/hermes-agent/venv/bin/hermes-acp /usr/local/bin/hermes-acp - -# Install gh CLI -RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \ - -o /usr/share/keyrings/githubcli-archive-keyring.gpg && \ - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \ - > /etc/apt/sources.list.d/github-cli.list && \ - apt-get update && apt-get install -y --no-install-recommends gh && \ - rm -rf /var/lib/apt/lists/* - -ENV HOME=/home/agent -WORKDIR /home/agent - -COPY --from=builder --chown=1000:1000 /build/target/release/openab /usr/local/bin/openab - -RUN chown -R agent:agent /home/agent - -USER agent -HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ - CMD pgrep -x openab || exit 1 -ENV OPENAB_AGENT_COMMAND="hermes-acp" -ENV OPENAB_AGENT_AUTH_COMMAND="hermes auth add" - -ENTRYPOINT ["tini", "--"] -CMD ["openab", "run", "-c", "/etc/openab/config.toml"] diff --git a/Dockerfile.package b/Dockerfile.package index b3536b72d..d52f29891 100644 --- a/Dockerfile.package +++ b/Dockerfile.package @@ -256,44 +256,6 @@ ENV OPENAB_AGENT_AUTH_COMMAND="grok login --device-auth" ENTRYPOINT ["tini", "--"] CMD ["openab", "run", "-c", "/etc/openab/config.toml"] -# ============================================================================= -# Target: hermes -# ============================================================================= -FROM python:3.12-slim-trixie AS hermes -RUN useradd -m -u 1000 agent -RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates curl procps ripgrep tini git ffmpeg unzip xz-utils \ - && rm -rf /var/lib/apt/lists/* -ARG HERMES_INSTALL_COMMIT=2bd1977d8fad185c9b4be47884f7e87f1add0ce3 -ARG HERMES_INSTALL_SHA256=dbd9d555ed4ac67bd1fc71ba6a39b410cf2af0ebcfd8f4889e086af78c9ddcaa -# Shared CI runners can be throttled by raw.githubusercontent.com; retry -# transient failures while the pinned SHA256 still verifies the response body. -RUN curl -fsSL --retry 6 --retry-all-errors --retry-delay 10 --retry-max-time 120 \ - "https://raw.githubusercontent.com/NousResearch/hermes-agent/${HERMES_INSTALL_COMMIT}/scripts/install.sh" \ - -o /tmp/install-hermes.sh && \ - echo "${HERMES_INSTALL_SHA256} /tmp/install-hermes.sh" | sha256sum -c - && \ - HERMES_HOME=/home/agent/.hermes bash /tmp/install-hermes.sh && \ - rm /tmp/install-hermes.sh && \ - (test -d /root/.local/share/uv && chmod -R a+rX /root/.local/share/uv && chmod a+rx /root /root/.local /root/.local/share || true) && \ - ln -sf /usr/local/lib/hermes-agent/venv/bin/hermes-acp /usr/local/bin/hermes-acp -RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \ - -o /usr/share/keyrings/githubcli-archive-keyring.gpg && \ - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \ - > /etc/apt/sources.list.d/github-cli.list && \ - apt-get update && apt-get install -y --no-install-recommends gh && \ - rm -rf /var/lib/apt/lists/* -ENV HOME=/home/agent -WORKDIR /home/agent -COPY --from=bins --chown=agent:agent /openab /usr/local/bin/openab -RUN chown -R agent:agent /home/agent -USER agent -HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ - CMD pgrep -x openab || exit 1 -ENV OPENAB_AGENT_COMMAND="hermes-acp" -ENV OPENAB_AGENT_AUTH_COMMAND="hermes auth add" -ENTRYPOINT ["tini", "--"] -CMD ["openab", "run", "-c", "/etc/openab/config.toml"] - # ============================================================================= # Target: mimocode # ============================================================================= diff --git a/Dockerfile.unified b/Dockerfile.unified index 67ee0463c..c3e56d6b1 100644 --- a/Dockerfile.unified +++ b/Dockerfile.unified @@ -284,44 +284,6 @@ ENV OPENAB_AGENT_AUTH_COMMAND="grok login --device-auth" ENTRYPOINT ["tini", "--"] CMD ["openab", "run", "-c", "/etc/openab/config.toml"] -# ============================================================================= -# Target: hermes -# ============================================================================= -FROM python:3.12-slim-trixie AS hermes -RUN useradd -m -u 1000 agent -RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates curl procps ripgrep tini git ffmpeg unzip xz-utils \ - && rm -rf /var/lib/apt/lists/* -ARG HERMES_INSTALL_COMMIT=2bd1977d8fad185c9b4be47884f7e87f1add0ce3 -ARG HERMES_INSTALL_SHA256=dbd9d555ed4ac67bd1fc71ba6a39b410cf2af0ebcfd8f4889e086af78c9ddcaa -# Shared CI runners can be throttled by raw.githubusercontent.com; retry -# transient failures while the pinned SHA256 still verifies the response body. -RUN curl -fsSL --retry 6 --retry-all-errors --retry-delay 10 --retry-max-time 120 \ - "https://raw.githubusercontent.com/NousResearch/hermes-agent/${HERMES_INSTALL_COMMIT}/scripts/install.sh" \ - -o /tmp/install-hermes.sh && \ - echo "${HERMES_INSTALL_SHA256} /tmp/install-hermes.sh" | sha256sum -c - && \ - HERMES_HOME=/home/agent/.hermes bash /tmp/install-hermes.sh && \ - rm /tmp/install-hermes.sh && \ - (test -d /root/.local/share/uv && chmod -R a+rX /root/.local/share/uv && chmod a+rx /root /root/.local /root/.local/share || true) && \ - ln -sf /usr/local/lib/hermes-agent/venv/bin/hermes-acp /usr/local/bin/hermes-acp -RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \ - -o /usr/share/keyrings/githubcli-archive-keyring.gpg && \ - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \ - > /etc/apt/sources.list.d/github-cli.list && \ - apt-get update && apt-get install -y --no-install-recommends gh && \ - rm -rf /var/lib/apt/lists/* -ENV HOME=/home/agent -WORKDIR /home/agent -COPY --from=builder --chown=agent:agent /build/target/release/openab /usr/local/bin/openab -RUN chown -R agent:agent /home/agent -USER agent -HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ - CMD pgrep -x openab || exit 1 -ENV OPENAB_AGENT_COMMAND="hermes-acp" -ENV OPENAB_AGENT_AUTH_COMMAND="hermes auth add" -ENTRYPOINT ["tini", "--"] -CMD ["openab", "run", "-c", "/etc/openab/config.toml"] - # ============================================================================= # Target: mimocode # ============================================================================= diff --git a/README.md b/README.md index a9628a824..99c3e5730 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ English | [繁體中文](README.zh-TW.md) ![OpenAB banner](images/banner.jpg) -A lightweight, secure, cloud-native ACP harness that bridges **Discord, Slack**, and any [Agent Client Protocol](https://github.com/anthropics/agent-protocol)-compatible coding CLI (Kiro CLI, Claude Code, Codex, Gemini, OpenCode, MiMo-Code, Kimi Code, Copilot CLI, Hermes, Grok Build, Devin, Antigravity, Pi, etc.) over stdio JSON-RPC — delivering the next-generation development experience. **Telegram, LINE, Feishu/Lark, Google Chat, WeCom, and Microsoft Teams** are available through gateway adapters, either compiled into the unified binary or deployed as the standalone [Custom Gateway](crates/openab-gateway/). +A lightweight, secure, cloud-native ACP harness that bridges **Discord, Slack**, and any [Agent Client Protocol](https://github.com/anthropics/agent-protocol)-compatible coding CLI (Kiro CLI, Claude Code, Codex, Gemini, OpenCode, MiMo-Code, Kimi Code, Copilot CLI, Grok Build, Devin, Antigravity, Pi, etc.) over stdio JSON-RPC — delivering the next-generation development experience. **Telegram, LINE, Feishu/Lark, Google Chat, WeCom, and Microsoft Teams** are available through gateway adapters, either compiled into the unified binary or deployed as the standalone [Custom Gateway](crates/openab-gateway/). 🪼 **Join our community!** Come say hi on Discord — we'd love to have you: **[🪼 OpenAB — Official](https://openab.dev/discord)** 🎉 @@ -22,7 +22,7 @@ A lightweight, secure, cloud-native ACP harness that bridges **Discord, Slack**, │ User │ │ │ WebSocket │ gemini --acp │ ├──────────────┤ │ │ (standalone) │ copilot --acp │ │ LINE │◄webhook/API─►┤ │ or in-process │ cursor-agent acp │ -│ User │ │ │ (unified) │ hermes-acp │ +│ User │ │ │ (unified) │ │ ├──────────────┤ │ ┌──────┴───────────┐ │ opencode acp │ │ Feishu/Lark │◄─WS/webhook─►┼►│ gateway adapters │ │ mimo acp │ │ User │ │ │ standalone or │ │ kimi acp │ @@ -54,7 +54,7 @@ webhook platforms and `WS/webhook` for Feishu/Lark. - **Multi-platform** — supports Discord and Slack, run one or both simultaneously - **Gateway adapters** — extend to Telegram, LINE, Feishu/Lark, Google Chat, WeCom, and Microsoft Teams through the standalone [gateway](crates/openab-gateway/) or an opt-in unified build -- **Pluggable agent backend** — swap between Kiro CLI, Claude Code, Codex, Gemini, OpenCode, MiMo-Code, Kimi Code, Copilot CLI, Hermes, Grok Build, Devin, Antigravity, Pi via config +- **Pluggable agent backend** — swap between Kiro CLI, Claude Code, Codex, Gemini, OpenCode, MiMo-Code, Kimi Code, Copilot CLI, Grok Build, Devin, Antigravity, Pi via config - **@mention trigger** — mention the bot in an allowed channel to start a conversation - **Thread-based multi-turn** — auto-creates threads; no @mention needed for follow-ups - **Multi-agent collaboration** — bot-to-bot messaging for coordinated workflows ([docs/multi-agent.md](docs/multi-agent.md)) @@ -189,7 +189,6 @@ The bot creates a thread. After that, just type in the thread — no @mention ne | Kimi Code | `kimi acp` | Native | [docs/kimi.md](docs/kimi.md) | | Copilot CLI ⚠️ | `copilot --acp --stdio` | Native | [docs/copilot.md](docs/copilot.md) | | Cursor | `cursor-agent acp` | Native | [docs/cursor.md](docs/cursor.md) | -| Hermes Agent | `hermes-acp` | Native | [docs/hermes.md](docs/hermes.md) | | Grok Build | `grok agent stdio` | Native | [docs/grok.md](docs/grok.md) | | Devin | `devin acp` | Native | [docs/devin.md](docs/devin.md) | | Antigravity | `agy-acp` | [agy-acp](agy-acp/) | [docs/antigravity.md](docs/antigravity.md) | diff --git a/README.zh-TW.md b/README.zh-TW.md index c429cdb42..ade1c38d0 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -6,7 +6,7 @@ ![OpenAB banner](images/banner.jpg) -一個輕量、安全、雲端原生的 ACP harness,透過 stdio JSON-RPC 將 **Discord、Slack** 與任何相容於 [Agent Client Protocol](https://github.com/anthropics/agent-protocol) 的程式開發 CLI(Kiro CLI、Claude Code、Codex、Gemini、OpenCode、MiMo-Code、Kimi Code、Copilot CLI、Hermes、Grok Build、Devin、Antigravity、Pi 等)連接起來,帶來新一代的開發體驗。**Telegram、LINE、Feishu/Lark、Google Chat、WeCom 與 Microsoft Teams** 則由 gateway adapters 支援;可將 adapters 編入 unified binary,或部署為獨立的 [Custom Gateway](crates/openab-gateway/)。 +一個輕量、安全、雲端原生的 ACP harness,透過 stdio JSON-RPC 將 **Discord、Slack** 與任何相容於 [Agent Client Protocol](https://github.com/anthropics/agent-protocol) 的程式開發 CLI(Kiro CLI、Claude Code、Codex、Gemini、OpenCode、MiMo-Code、Kimi Code、Copilot CLI、Grok Build、Devin、Antigravity、Pi 等)連接起來,帶來新一代的開發體驗。**Telegram、LINE、Feishu/Lark、Google Chat、WeCom 與 Microsoft Teams** 則由 gateway adapters 支援;可將 adapters 編入 unified binary,或部署為獨立的 [Custom Gateway](crates/openab-gateway/)。 🪼 **加入我們的社群!** 歡迎到 Discord 和大家打招呼:**[🪼 OpenAB — Official](https://openab.dev/discord)** 🎉 @@ -22,7 +22,7 @@ │ User │ │ │ WebSocket │ gemini --acp │ ├──────────────┤ │ │ (standalone) │ copilot --acp │ │ LINE │◄webhook/API─►┤ │ or in-process │ cursor-agent acp │ -│ User │ │ │ (unified) │ hermes-acp │ +│ User │ │ │ (unified) │ │ ├──────────────┤ │ ┌──────┴───────────┐ │ opencode acp │ │ Feishu/Lark │◄─WS/webhook─►┼►│ gateway adapters │ │ mimo acp │ │ User │ │ │ standalone or │ │ kimi acp │ @@ -54,7 +54,7 @@ platforms 使用 `webhook/API`,Feishu/Lark 則使用 `WS/webhook`。 - **多平台支援** — 支援 Discord 與 Slack,可單獨或同時執行 - **Gateway adapters** — 可透過獨立的 [gateway](crates/openab-gateway/) 或 opt-in unified build 擴充至 Telegram、LINE、Feishu/Lark、Google Chat、WeCom 與 Microsoft Teams -- **可替換的 agent backend** — 可透過設定在 Kiro CLI、Claude Code、Codex、Gemini、OpenCode、MiMo-Code、Kimi Code、Copilot CLI、Hermes、Grok Build、Devin、Antigravity、Pi 之間切換 +- **可替換的 agent backend** — 可透過設定在 Kiro CLI、Claude Code、Codex、Gemini、OpenCode、MiMo-Code、Kimi Code、Copilot CLI、Grok Build、Devin、Antigravity、Pi 之間切換 - **@mention 觸發** — 在允許的頻道中 mention bot,即可開始對話 - **以討論串進行多輪對話** — 自動建立討論串;後續訊息不需再次 @mention - **多 agent 協作** — 支援 bot-to-bot 訊息,實現協調式工作流程([docs/multi-agent.md](docs/multi-agent.md)) @@ -189,7 +189,6 @@ bot 會建立一個討論串。之後只要直接在討論串中輸入即可, | Kimi Code | `kimi acp` | Native | [docs/kimi.md](docs/kimi.md) | | Copilot CLI ⚠️ | `copilot --acp --stdio` | Native | [docs/copilot.md](docs/copilot.md) | | Cursor | `cursor-agent acp` | Native | [docs/cursor.md](docs/cursor.md) | -| Hermes Agent | `hermes-acp` | Native | [docs/hermes.md](docs/hermes.md) | | Grok Build | `grok agent stdio` | Native | [docs/grok.md](docs/grok.md) | | Devin | `devin acp` | Native | [docs/devin.md](docs/devin.md) | | Antigravity | `agy-acp` | [agy-acp](agy-acp/) | [docs/antigravity.md](docs/antigravity.md) | diff --git a/charts/openab/values.yaml b/charts/openab/values.yaml index fd37b023c..ce1ac7409 100644 --- a/charts/openab/values.yaml +++ b/charts/openab/values.yaml @@ -232,27 +232,6 @@ agents: # storageClass: "" # size: 1Gi # image: "" # leave empty → auto-resolves to openab:-cursor - # hermes: - # command: hermes-acp - # discord: - # enabled: true - # allowedChannels: - # - "YOUR_CHANNEL_ID" - # allowedUsers: [] - # allowBotMessages: "off" - # trustedBotIds: [] - # workingDir: /home/agent - # env: {} - # envFrom: [] - # secretEnv: [] - # pool: - # maxSessions: 10 - # sessionTtlHours: 24 - # persistence: - # enabled: true - # storageClass: "" - # size: 1Gi - # image: "" # leave empty → auto-resolves to openab:-hermes # grok: # command: grok # args: diff --git a/config.toml.example b/config.toml.example index 00add1a9b..12d0eee80 100644 --- a/config.toml.example +++ b/config.toml.example @@ -248,13 +248,6 @@ working_dir = "/home/agent" # working_dir = "/home/agent" # env = {} # Auth via: kubectl exec -it -- cursor-agent login -# [agent] -# command = "hermes-acp" -# working_dir = "/home/agent" -# # Auth via: kubectl exec -it -- hermes auth add xai-oauth -# # Supports 30+ providers (xAI Grok OAuth, Anthropic, OpenAI Codex, Gemini, etc.) -# # Provider switching: kubectl exec -it -- hermes model - # [agent] # command = "grok" # args = ["agent", "stdio"] diff --git a/docker-bake.hcl b/docker-bake.hcl index aa6c7d6f3..18ffdd380 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -16,7 +16,7 @@ group "default" { targets = [ "kiro", "claude", "codex", "copilot", "cursor", - "devin", "gemini", "grok", "hermes", "kimi", "mimocode", + "devin", "gemini", "grok", "kimi", "mimocode", "opencode", "antigravity", "pi", "gateway", ] } @@ -83,12 +83,6 @@ target "grok" { contexts = { builder = "target:builder" } } -target "hermes" { - dockerfile = "Dockerfile.hermes" - tags = ["openab:hermes"] - contexts = { builder = "target:builder" } -} - target "kimi" { dockerfile = "Dockerfile.kimi" tags = ["openab:kimi"] diff --git a/docs/config-reference.md b/docs/config-reference.md index af30e0940..3e0a29af5 100644 --- a/docs/config-reference.md +++ b/docs/config-reference.md @@ -402,11 +402,6 @@ working_dir = "/home/node" command = "cursor-agent" args = ["acp", "--model", "auto", "--workspace", "/home/agent"] working_dir = "/home/agent" - -# Hermes Agent -[agent] -command = "hermes-acp" -working_dir = "/home/agent" ``` --- diff --git a/docs/grok.md b/docs/grok.md index 2dfe7a02f..28ec794f3 100644 --- a/docs/grok.md +++ b/docs/grok.md @@ -138,15 +138,3 @@ docker build -f Dockerfile.grok \ --build-arg GROK_SHA256_ARM64=... \ -t openab-grok:latest . ``` - -## Comparison with Hermes - -| Property | `Dockerfile.grok` | `Dockerfile.hermes` | -|----------|-------------------|---------------------| -| Provider | xAI Grok only | xAI + 30 others via Nous gateway | -| ACP | Native (`grok agent stdio`) | Via `hermes-acp` wrapper | -| Headless auth | API key env or device-code | Loopback OAuth (needs port-forward / ECS curl trick) | -| Supply chain | xAI only | xAI + Nous Research install script | -| Image size | Smaller (single static binary, no Python venv) | Larger (Python + uv + ffmpeg) | - -Pick `Dockerfile.grok` if Grok is the only model you need. Pick `Dockerfile.hermes` if you want multi-provider switching or fallback chains. diff --git a/docs/hermes.md b/docs/hermes.md deleted file mode 100644 index 84f48fe28..000000000 --- a/docs/hermes.md +++ /dev/null @@ -1,195 +0,0 @@ -# Hermes Agent - -[Hermes Agent](https://github.com/NousResearch/hermes-agent) by Nous Research supports ACP natively via the `hermes acp` subcommand (or the `hermes-acp` binary). - -Hermes acts as a multi-provider inference gateway — it handles OAuth token lifecycle, credential storage, and provider routing so OAB agents don't need to manage auth directly. - -## Docker Image - -```bash -docker build -f Dockerfile.hermes -t openab-hermes:latest . -``` - -The image installs Hermes Agent via the official install script. - -## Helm Install - -```bash -helm install openab openab/openab \ - --set agents.kiro.enabled=false \ - --set agents.hermes.discord.enabled=true \ - --set agents.hermes.discord.botToken="$DISCORD_BOT_TOKEN" \ - --set-string 'agents.hermes.discord.allowedChannels[0]=YOUR_CHANNEL_ID' \ - --set agents.hermes.command=hermes-acp \ - --set agents.hermes.workingDir=/home/agent \ - --set image.tag=beta -``` - -> Set `agents.kiro.enabled=false` to disable the default Kiro agent. - -### Image Tag - -Use `--set image.tag=` to set the image version globally. -The chart auto-appends `-` to produce the final tag (see [image-tags.md](image-tags.md) for full details). - -| Tag | Resolves to | Description | -|-----|-------------|-------------| -| `beta` | `beta-hermes` | Floating beta channel (latest pre-release) | -| `0.9.0-beta.2` | `0.9.0-beta.2-hermes` | Pinned to exact version | -| `0.9` | `0.9-hermes` | Latest patch in minor (floating) | -| `stable` | `stable-hermes` | Floating stable channel | - -To override a single agent's image instead of the global tag: -```bash ---set agents.hermes.image=ghcr.io/openabdev/openab:beta-hermes -``` - -> ⚠️ There is no `latest` tag. Use `beta` or `stable`, or pin to an exact version. - -## Manual config.toml - -```toml -[agent] -# command defaults from OPENAB_AGENT_COMMAND="hermes-acp" -# working_dir = "/home/agent" # optional — defaults to $HOME -``` - -## Authentication - -Hermes supports 30+ providers. Authenticate inside the pod: - -```bash -kubectl exec -it -- hermes auth add xai-oauth # xAI Grok (SuperGrok $30/mo) -kubectl exec -it -- hermes auth add nous # Nous Portal -kubectl exec -it -- hermes model # Interactive provider picker -``` - -### xAI Grok OAuth (Recommended) - -> ⚠️ **Requires an active [SuperGrok paid subscription](https://x.ai/grok) ($30/mo).** Auth will succeed without one, but the API silently returns empty responses — the bot appears to work but never replies. - -xAI Grok OAuth uses a loopback redirect flow — the callback listener binds `127.0.0.1:56121` inside the pod/container. - -#### Option A: Kubernetes (port-forward) - -```bash -# Terminal 1: port-forward -kubectl port-forward deployment/ 56121:56121 - -# Terminal 2: run auth -kubectl exec -it deployment/ -- hermes auth add xai-oauth --no-browser -``` - -1. Copy the printed authorize URL → open in your local browser -2. Approve access on accounts.x.ai -3. Browser redirects to `127.0.0.1:56121/callback` → port-forward delivers it to the pod -4. Terminal shows `Added xai-oauth OAuth credential #1: "xai-oauth-oauth-1"` - -#### Option B: ECS / Remote (curl-the-callback) - -ECS Fargate doesn't support port-forward. Use two exec sessions instead: - -```bash -# Terminal 1: start the auth listener -aws ecs execute-command --cluster openab --task --container openab --interactive --command bash -hermes auth add xai-oauth --no-browser -# → prints authorize URL with &state=XXXXX in it -# → "Waiting for callback on http://127.0.0.1:56121/callback" -``` - -Open the authorize URL in your browser and approve. The browser will redirect to -`http://127.0.0.1:56121/callback?code=...` and fail ("Could not establish connection"). -**Copy the `code` value** from the page or URL bar. The `state` value comes from the -authorize URL printed in Terminal 1. - -```bash -# Terminal 2: exec into the SAME container -aws ecs execute-command --cluster openab --task --container openab --interactive --command bash -curl "http://127.0.0.1:56121/callback?code=&state=" -``` - -Terminal 1 should print: -``` -Added xai-oauth OAuth credential #1: "xai-oauth-oauth-1" -``` - -> ⚠️ The code expires in seconds — be fast. If you get `invalid_grant`, re-run `hermes auth add` and try again. - -#### After auth: set the default model - -```bash -hermes config set model.provider xai-oauth -hermes config set model.default grok-4.3 -``` - -#### Fix file ownership (important for exec-based auth) - -When running auth/config commands via `kubectl exec` or ECS exec (which runs as root), -fix ownership so the `agent` user can read the files: - -```bash -chown -R agent:agent /home/agent/.hermes/ -``` - -### Providers That Don't Need Port-Forward - -| Provider | Auth Method | -|----------|-------------| -| Anthropic (Claude Pro/Max) | Paste-the-code flow | -| OpenAI Codex (ChatGPT Plus/Pro) | Device code flow | -| MiniMax, Nous Portal | Device code flow | -| xAI Grok, Spotify | Loopback OAuth (port-forward required) | - -### Supported Providers (via OAuth) - -| Provider | Auth Command | Cost Model | -|----------|-------------|------------| -| xAI Grok | `hermes auth add xai-oauth` | SuperGrok subscription ($30/mo) | -| OpenAI Codex | `hermes model` → OpenAI Codex | ChatGPT subscription | -| GitHub Copilot | `hermes model` → GitHub Copilot | Copilot subscription | -| Google Gemini | `hermes model` → Google Gemini (OAuth) | Free tier available | -| Anthropic | `hermes model` → Anthropic | Claude Max + extra credits | -| Nous Portal | `hermes auth add nous` | Nous subscription | - -### Supported Providers (via API Key) - -Any provider can also be configured with an API key via environment variables: - -```toml -[agent] -# command defaults from OPENAB_AGENT_COMMAND="hermes-acp" -# working_dir = "/home/agent" # optional — defaults to $HOME -env = { XAI_API_KEY = "${XAI_API_KEY}" } -``` - -## Provider Switching - -Switch providers without restarting the pod: - -```bash -kubectl exec -it -- hermes model -``` - -## Credential Persistence - -Hermes stores OAuth tokens in `~/.hermes/`. The OpenAB Helm chart's default persistence covers this automatically (PVC mounted at `workingDir`). - -If deploying manually (without the Helm chart), mount persistent storage at `/home/agent` or `/home/agent/.hermes`: - -```yaml -volumes: - - name: hermes-credentials - persistentVolumeClaim: - claimName: hermes-credentials-pvc -volumeMounts: - - name: hermes-credentials - mountPath: /home/agent/.hermes -``` - -## Advantages - -- **Cost**: SuperGrok $30/mo flat rate vs pay-per-token API pricing -- **Multi-provider**: 30+ providers accessible through one agent -- **Zero auth complexity**: Hermes handles OAuth + token refresh -- **Multi-modal**: TTS, image gen, video gen via the same OAuth token -- **Fallback chains**: Auto-switch providers on failure diff --git a/docs/image-tags.md b/docs/image-tags.md index 103fc8dab..820d49c34 100644 --- a/docs/image-tags.md +++ b/docs/image-tags.md @@ -22,7 +22,7 @@ ghcr.io/openabdev/openab:- > **No `latest` tag.** Use `beta-` or `stable-` for floating tags, > or pin to an exact version like `0.9.0-beta.1-kiro`. -Available agents: `kiro`, `claude`, `codex`, `copilot`, `cursor`, `gemini`, `grok`, `hermes`, `kimi`, `mimocode`, `opencode`, `antigravity`, `pi`, `native`, `agentcore` +Available agents: `kiro`, `claude`, `codex`, `copilot`, `cursor`, `gemini`, `grok`, `kimi`, `mimocode`, `opencode`, `antigravity`, `pi`, `native`, `agentcore` ### Migration from per-repo images (deprecated)