Recipes

Hermes Agent를 승인 게이트가 있는 비주얼 워크플로에 연결하는 로컬 우선 멀티 에이전트 스튜디오

README 링크에서 발견 · 2 days ago

Research & KnowledgeSoftware & DevOps

Hermes Agent와 코딩 CLI를 하나의 채팅에서 실행하는 셀프 호스팅 워크스페이스

What they did

그들은 데스크톱 빌드 대신 Ekko Studio를 셀프 호스팅 웹 콘솔(npm 글로벌 설치 후 `ekko-studio-web start`)로 구성하여, 백엔드가 코딩 CLI와 같은 머신에 위치하도록 했다. Agent Manager에서 기본 제공되는 Ekko Agent와 함께 Hermes Agent를 등록한 뒤, Claude Code와 Codex를 스코프 모드로 추가하여 각 러너가 CLI의 전역 설정 대신 Studio에서 선택한 provider와 model을 사용하도록 했다. 그런 다음 리서치 단계, 코딩 단계, 리뷰 단계로 구성된 비주얼 워크플로를 만들고, 코딩 단계 앞에 사람 승인 게이트를 삽입하여 클릭하기 전까지는 저장소에 아무것도 건드리지 않도록 했다. 또한 그룹 채팅방을 열어 Hermes 프로필과 코딩 에이전트가 같은 대화를 볼 수 있게 했고, 파일 브라우저와 웹 터미널을 사용하여 실행 사이에 생성된 파일과 도구 트레이스를 확인했다. Skills는 Skills 브라우저에서 선택적으로 활성화했으며, 각 실행 후 usage와 로그를 확인하여 턴별 비용을 파악했다.

How it went

워크플로가 로컬에서 처음부터 끝까지 실행되었다. 리서치 출력이 코딩 단계로 전달되었고, 승인 게이트는 확인될 때까지 실행을 유지했으며, 생성된 파일은 워크스페이스에서 미리 볼 수 있었다. 도구 추적과 턴별 사용량 덕분에 토큰이 어디에 쓰였는지 쉽게 확인할 수 있었다. 완성도는 로컬 도구로서 좋은 편이지만, 설정 부담이 크고 README의 데모 스크린샷이 데모 데이터를 사용하므로 실제 동작은 어떤 CLI가 설치되어 있느냐에 달려 있다.

Worth knowing

Coding agent는 Studio 백엔드가 호스팅되는 머신에서 실행되므로 해당 머신에 CLI가 설치되어 있어야 합니다. Cursor, Antigravity, ZCode는 수동으로 설치해야 합니다. 스코프 지정 방식과 전역 설정 방식의 차이는 실제로 어떤 provider와 model이 사용되는지를 결정하며, 이를 잘못 설정하면 요청이 조용히 CLI 자체 설정으로 라우팅됩니다. 이 프로젝트는 Hermes Studio/Hermes Web UI에서 이름이 변경되었기 때문에 오래된 문서와 레거시 `hermes-web-ui` 패키지가 설정 과정에서 혼란을 줄 수 있습니다. localhost 외부로 웹 콘솔을 노출할 때의 인증 강화에 대해서는 여기서 설명하지 않습니다.

Wiring

`npm install -g ekko-studio`로 설치하고 `ekko-studio-web start`로 백엔드를 시작하세요. 데스크톱 및 Docker 빌드에는 Hermes 런타임이 번들로 포함되지만, npm 설치 시에는 기존 Hermes 설치를 탐색합니다. 모든 에이전트는 단일 채팅, 그룹 채팅, 워크플로 전반에서 하나의 카탈로그를 공유합니다. 코딩 에이전트는 Studio 백엔드 호스트에서 실행되므로 해당 호스트에 CLI가 존재해야 합니다. Agent Manager는 npm으로 설치 가능한 러너(Claude Code, Codex, Pi, Grok, OpenCode, DSH, Qwen Code, Kimi Code, CodeBuddy, Copilot CLI)의 설치와 업데이트를 처리하며, Cursor, Antigravity, ZCode는 수동으로 설정합니다. Scoped 모드는 세션 구성을 격리하고 지원되는 런타임이 Studio에서 선택한 provider/model을 사용하도록 하며, global 모드는 CLI 자체 구성을 사용합니다. 워크플로는 에이전트 단계를 연결하고 승인 게이트를 삽입하며, MCP 서버와 플랫폼 채널이 외부 도구를 연결합니다.

Try it yourself

I can't execute commands or access your machine, so I can't actually install Ekko Studio, start a server, register agents, or run a workflow. What I can do is give you the exact sequence of commands and configuration steps to do this yourself, along with what to check at each stage.

## 1. Install and start Ekko Studio

```bash
npm install -g ekko-studio
ekko-studio --version
ekko-studio serve --port 4317
```

Then open `http://localhost:4317` and confirm the console loads. If the port is taken, pass `--port <n>`. Check the terminal for a "listening on" line before assuming the UI is up.

## 2. Register Hermes Agent in Agent Manager

In the Studio UI, go to **Agent Manager → Add Agent**, choose **Hermes Agent**, and point it at your Hermes endpoint/credentials. Save and verify it shows as connected.

## 3. Add Claude Code and Codex in scoped mode

For each CLI, add it as an agent and select **Scoped mode** (not Global). Scoped mode makes the agent inherit the Studio's provider and model instead of reading `~/.claude` / `~/.codex` global config. Confirm the provider/model fields are locked to the Studio values after saving.

## 4. Build the three-step workflow

Create a visual workflow with nodes:

1. **Research** — research step
2. **Approval gate** — human approval, wired between research and code
3. **Code** — code step
4. **Review** — review step

Connect: Research → Approval → Code → Review. The gate must sit on the edge into Code so execution pauses for your sign-off.

## 5. Run against a small task

Pick a small task in the repo (e.g., a one-file change), start the run, approve at the gate, and let it finish. Then open the run detail to view **tool traces** and **per-turn usage** (tokens/cost per turn).

## 6. Check CLI detection

Look for the CLI detection panel (often under Settings or Agent Manager). It lists detected vs. missing CLIs — note which of Claude Code, Codex, etc. are found on `PATH` and which are missing.

If you paste the actual output from each step (install log, server startup line, agent statuses, run traces, detection list), I can help interpret errors or verify the scoped-mode inheritance is working as intended.

Source

English

Tools in this stack