Visual multi-pick HITL gate for Hermes Agent on Slack (Block Kit buttons).
Project description
hermes-button-gate
A visual, multi-pick human-in-the-loop (HITL) gate for Hermes Agent, delivered as Slack Block Kit image buttons.
It adds one tool — button_gate — that posts choices as clickable buttons (with optional images) and blocks the agent until the user picks. It's a drop-in upgrade over the built-in clarify tool for Slack/gateway sessions.
Why
On Slack, the core clarify tool degrades to a numbered-text prompt ("type 2"). It can't:
- show images alongside options,
- offer more than 4 options,
- ask for several independent picks in one message.
button_gate does all three. One call can be a single-select gate, an approve/revise gate, or a per-row A/B gate.
single group, N options → single-select gate
single group, approve/revise → approval gate
many groups, 2 options each → one pick per row (e.g. A/B per cut)
Each option can carry a public image_url, so it's well suited to picking between generated images (the gate this was originally built for: an image-content pipeline's candidate-pick / approve / A-B-per-cut steps).
Scope (read this)
Slack only, gateway mode. The handler posts via the Slack Web API and resolves picks through Hermes' Slack action-handler hook. It does not support Discord/Telegram or CLI sessions — in a non-Slack session the tool returns a clear error instead of blocking.
Generalizing to Discord/Telegram is blocked on Hermes core, not on this plugin: PluginContext only exposes register_slack_action_handler. The Telegram and Discord adapters route interaction callbacks through closed dispatchers, so a plugin can send buttons but can't receive the clicks. A cross-platform register_interactive_handler(platform, pattern, callback) extension point in Hermes core would unblock it.
The bridge uses a threading.Event keyed by a per-call token, so it works in gateway mode (unlike the CLI-only inject_message). Buttons lock after a pick (chat_update removes them), and a stale-token guard prevents a leftover button from an earlier gate resolving a later one.
Install
pip install hermes-button-gate # once published
hermes plugins enable button-gate
Or for local development, drop the package into ~/.hermes/plugins/ (directory discovery) or pip install -e . from a clone (entry-point discovery via the hermes_agent.plugins group).
Requirements
- Hermes Agent with the Slack platform enabled and running in gateway mode.
SLACK_BOT_TOKENin the environment (Hermes' Slack adapter already sets this).- The Slack app must have interactivity enabled so button clicks reach the gateway.
Usage
The agent calls the tool; you don't call it by hand. Schema:
{
"question": "인물 골라줘", // optional header
"groups": [ // required: one entry per independent pick
{
"key": "choice", // unique id, returned as the result key
"label": "후보", // optional row label
"options": [
{ "label": "A", "value": "cand_a", "image_url": "https://.../a.png" },
{ "label": "B", "value": "cand_b", "image_url": "https://.../b.png" }
]
}
],
"timeout_sec": 1800 // optional, default 1800
}
Returns:
{ "picks": { "choice": "cand_a" }, "complete": true }
On timeout, complete is false and the response includes missing (unpicked group keys).
Development
pip install -e ".[dev]"
pytest -q
Tests are stdlib + pytest only and make no network calls (Slack and Hermes internals are stubbed / avoided), so they run in a bare environment.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
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