Pump Up × Hermes plugin — request human approvals/elicitations and resume agent work on the decision.
Project description
Pump Up × Hermes plugin
Lets a Hermes agent request a human approval/elicitation
from Pump Up and act on the human decision in its original conversation —
hours later, with no inbound network access. Design: this repo's
tech-docs/current/hermes-plugin.md.
It's also the first real consumer of the Pump Up Python SDK (AsyncPumpUp), so it doubles as an
SDK smoke test.
How it works
- The agent calls
pumpup_request_approval(or_elicitation). The tool resolves a Pump Up task (one per Hermes session), creates the request, writes a durable breadcrumb{request_id → session_id}, and returns{request_id, status: "pending"}immediately. The turn ends — nothing blocks (HITL takes hours; Hermes tools hard-timeout at 300s). - A human decides in the Pump Up web app.
- The plugin's
pumpupgateway platform runs a background poll loop (outbound only). For each open breadcrumb it asks Pump Up whether the request is decided. - On a decision it POSTs the formatted result to the local API server
(
/api/sessions/{session_id}/chat), which replays the full transcript and runs a real agent turn in the origin session — so the agent continues the task it started. The breadcrumb is cleared.
Because the poll is outbound and the resume is localhost, this works for every deployment shape, including a fully NAT'd host with no inbound access (a webhook could never reach it).
Requirements
The plugin needs an always-on Hermes gateway with the API server enabled — that gateway hosts the poll loop and is the target of the resume. A purely-ephemeral CLI Hermes can't resume an hours-old conversation (no process to return to).
export API_SERVER_ENABLED=true
export API_SERVER_KEY=$(openssl rand -hex 32) # required; the resume call authenticates with it
# optional: API_SERVER_HOST (default 127.0.0.1), API_SERVER_PORT (default 8642)
Install
From PyPI (recommended):
pip install pumpup-hermes-plugin
hermes plugins enable pumpup
Hermes auto-discovers it via the hermes_agent.plugins entry point, and pip pulls its deps (incl.
pumpup-sdk). Then enable the pumpup gateway platform.
From the OSS repo (no PyPI):
hermes plugins install pumpupai/pumpup/hermes-plugin --enable
hermes plugins install accepts a subdirectory, so this works even though the plugin lives under
hermes-plugin/ in the mirror.
Local development: uv sync — the Pump Up SDK resolves from the SDK repo's dev branch via
[tool.uv.sources] (mise run fern:sdk:dev regenerates it); a built wheel instead depends on
pumpup-sdk from PyPI, as uv strips the dev source. Then enable the pumpup gateway platform.
Config (env)
| Var | Required | Notes |
|---|---|---|
PUMPUP_BASE_URL |
yes | Pump Up agent API base URL |
PUMPUP_API_KEY |
yes | Pump Up agent API key (read natively by the SDK) |
PUMPUP_POLL_INTERVAL_SEC |
no | Decision poll interval (default 30 — HITL is hours) |
API_SERVER_KEY / API_SERVER_HOST / API_SERVER_PORT |
— | Hermes's own gateway env; reused for resume |
The pumpup tools and platform self-enable when PUMPUP_BASE_URL + PUMPUP_API_KEY are present.
Tools
| Tool | What |
|---|---|
pumpup_request_approval |
Request human sign-off; returns pending, resumes on decision |
pumpup_request_elicitation |
Ask a human for structured fields; returns pending, resumes on answer |
pumpup_record_action |
Record agent activity on the task timeline (attach files, patch metadata, transition) |
pumpup_report_exception |
Report an agent error/exception |
pumpup_add_note |
Add a freeform note |
pumpup_get_decision |
One-shot, non-blocking check whether a request was decided |
pumpup_guide |
Read how and when to use the Pump Up tools (also a pumpup:guide skill) |
Develop
uv sync # dev venv (pytest, ruff)
uv run pytest # unit tests
uv run ruff check .
The contract schemas in pumpup_hermes/generated/contract_schemas.json (the Field union etc.) are a
committed, generated artifact — produced from the Pump Up SDK types by the shared generator in the
OpenClaw plugin (cd ../openclaw-plugin && npm run gen:schemas). One generator, two consumers; don't
hand-edit. Regenerate after a contract-type change.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pumpup_hermes_plugin-0.0.10.tar.gz.
File metadata
- Download URL: pumpup_hermes_plugin-0.0.10.tar.gz
- Upload date:
- Size: 45.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83cdef06ad07d9d13657f04dc5369adda9a1c098002a27861f59131e7e5ef2f0
|
|
| MD5 |
fca70ad4c8112dde0770d4757edd0ca8
|
|
| BLAKE2b-256 |
18581a857caa337ec2cde67eb6b2adbaecbd30dd7abcbb018ff3f1c72f291ceb
|
File details
Details for the file pumpup_hermes_plugin-0.0.10-py3-none-any.whl.
File metadata
- Download URL: pumpup_hermes_plugin-0.0.10-py3-none-any.whl
- Upload date:
- Size: 24.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
10ac96ed95fd06ca54235636f08ba609b323b7c5576e0eab291c1a5ded96fc47
|
|
| MD5 |
0427c02db68aed1a65c8fbdcc036c294
|
|
| BLAKE2b-256 |
836cc3f0ed47208f3b87c02392c5995eefe8b5828e26007486a7a20a98a653da
|