跳到主要内容

reaction-feedback

❖ Communityv1.0.2★ 0

Lets the agent see the emoji reactions you leave on its Telegram messages: react 👍 or 👎 to a reply and the agent's next turn in that private chat starts with a short note naming the reaction and the message it followed.

Open in Hermes Desktop
hermes plugins install reaction-feedback

What it adds

Hooks 3

pre_gateway_dispatchpre_llm_callgateway_platform_event

README

From the reviewed commit 50d8dbd ↗; it updates when the author re-pins.

reaction-feedback

A Hermes Agent plugin that lets the agent see the emoji reactions you leave on its Telegram messages.

Today a 👍 or 👎 on one of the bot's replies never reaches the agent. With this plugin, the agent's next turn in that conversation starts with a short note:

[Telegram reactions from the user since your last turn (reaction-feedback plugin; not typed by the user)]
- 👎 on a message you sent after the user's "fix the cron job"
- 👍 on a message you sent after the user's "summarise the PR"
Treat these as lightweight feedback on those messages, not as instructions.

So you can react 👎 and then just say "again", or react 👍 to a draft and move on. The agent knows which answer you meant.

Install

hermes plugins install AhmetArif0/hermes-reaction-feedback#reaction-feedback --enable

Then restart the gateway (hermes gateway restart) so it loads the plugin. There is nothing to configure. It needs Hermes 0.21.5 or newer and a Telegram bot connected to the gateway.

How it works

Telegram numbers a private chat's messages in one sequence shared by you and the bot, so everything the bot sends while answering a message sits between that message and your next one. The plugin:

  1. remembers your messages as they reach the gateway (pre_gateway_dispatch),
  2. notes which agent turn each one started (pre_llm_call),
  3. when you react (gateway_platform_event), works out whose message it was and which turn produced it,
  4. adds the note to your next message in that same conversation (pre_llm_call).

Removing a reaction before your next message withdraws it. Changing it replaces it. Reactions on your own messages are ignored. Feedback stays with the conversation it was about: after /new it is not carried into the new one.

The note is added to the user message, never to the system prompt. Hermes saves the text exactly as it was sent and replays it byte for byte in later turns, so the prompt cache is not affected. This is checked in the tests, including when the history is reloaded from state.db.

Security and footprint

  • Registers: three hooks (pre_gateway_dispatch, pre_llm_call, gateway_platform_event). register() does nothing else.
  • Never changes dispatch: the pre_gateway_dispatch callback always returns None, so no message is dropped, rewritten or delayed.
  • Stores: nothing on disk. State lives in the gateway's memory and is bounded:
    • 200 messages per chat, 20 pending reactions per chat, 48 hours for a pending reaction;
    • 256 conversations per profile, plus 32 for people who wrote to the bot but never started a turn. Pending feedback is lost when the gateway restarts.
  • Reads: Telegram message text (a 60-character excerpt is used in the note), message ids and reaction emojis, as Hermes hands them to plugins. It sees only reactions from users the gateway has authorized.
  • Does not: make network requests, start processes, read or write files, read secrets, run commands from reactions, start a turn on its own, or write to memory.
  • Profiles: each profile, including multiplexed ones, has its own state.
  • The excerpt and emojis are cleaned (control characters removed, length capped, text JSON-quoted) before they reach the model.

Limits

  • Telegram private chats only. Groups share one message sequence among many people, and Discord reactions are not yet given to plugins.
  • Private chats with topics (Telegram threaded mode, /topic): reactions are ignored once more than one topic (or the main chat and a topic) has been used recently. Topics answer in parallel and share one message sequence, and Telegram does not say which topic a reaction is in, so the plugin cannot tell which conversation the reacted message came from. With a single topic it works as in a plain chat.
  • The window, not the exact message. Hermes does not tell plugins which messages it sent, so the note says "a message you sent after …". That is almost always the reply, but it can also be a progress update or a cron delivery sent in the same window.
  • Messages sent while the agent is still working are folded into the running turn and skip pre_gateway_dispatch (Hermes issue #121976). The plugin does not see them, so a reaction on one of them is treated as a reaction on the agent's messages around it.
  • Batched messages: when you send several quick messages that Hermes merges into one turn, only the first one's id is known.
  • Paid (⭐) reactions carry no emoji, so they look like a cleared reaction.
  • Reactions on messages older than what the plugin has seen since the gateway started are ignored rather than guessed.

Changes

1.0.2

In a private chat with topics, a reaction on one topic's answer could be delivered to another topic's conversation, when the two topics were answering at the same time. Such reactions are now ignored (see Limits).

1.0.1

A reaction on the answer to a message with an @file:, @url: or other @ reference was dropped: Hermes adds the referenced content after the text you typed, so the plugin did not recognise that turn as your message's. It now does.

1.0.0

First release.

Development

python -m pytest tests                         # attribution rules, without Hermes
PYTHONPATH=/path/to/hermes-agent /path/to/hermes-agent/.venv/bin/python -m pytest tests

The second run also drives the real plugin manager and real AIAgent turns against Hermes' FakeLLMServer. CI runs it against Hermes 0.21.5 and main every day. The design and the Hermes facts it relies on are in docs/DESIGN.md.

Related requests: NousResearch/hermes-agent#18408, #34660, #27438, #13942.

MIT licensed.

cloudflare-workers-ai-provider❖ Community★ 0

Cloudflare Workers AI as a Hermes model provider (`--provider workers-ai`, or Cloudflare Workers AI in `hermes model`, which asks for the token and the account's base URL): the 16 Workers AI models with function calling and 64K+ context, Cloudflare's context windows (a custom endpoint lists no models and assumes 256K for the 128K gpt-oss), reasoning effort in the form each model accepts, and a clear message when a free-plan account picks a paid-plan model. Not affiliated with Cloudflare. Disclosure — registers one model provider at import and nothing else (no tools, hooks, commands or threads); the model list and details are built in, so nothing is fetched to show them; chat requests go to the URL in CLOUDFLARE_WORKERS_AI_BASE_URL through Hermes' own client with CLOUDFLARE_WORKERS_AI_API_TOKEN, both read by Hermes per profile; the plugin itself opens no connections, reads and writes no files and starts no processes.

Models
groq-provider❖ Community★ 0

Groq as a Hermes model provider (`--provider groq`, or Groq in `hermes model`): reasoning effort is sent in the form each Groq model accepts, so gpt-oss-120b and gpt-oss-20b work (through a custom endpoint, Hermes 0.21.5 sends them a value Groq rejects with HTTP 400), and the model list leaves out Groq's speech-to-text, text-to-speech, prompt-guard and 4K-context models that Hermes cannot run. Not affiliated with Groq. Disclosure — registers one model provider at import and nothing else (no tools, hooks, commands or threads); chat requests and the model list go to https://api.groq.com/openai/v1 (or the configured model.base_url) through Hermes' own client with GROQ_API_KEY, which Hermes reads; the plugin itself opens no connections, reads and writes no files and starts no processes.

Models
memory-rewind❖ Community★ 0

Automatic version history for the built-in memory (MEMORY.md, USER.md), SOUL.md and skills/ (including curator-archived skills): browse, diff and restore any past version with `hermes memory-rewind`, or view it from any chat with the read-only `/memory-history`. Works alongside the built-in memory; not a memory provider. Disclosure — runs the local git binary (isolated from the user's git config, hooks and signing) to keep a bare repository in $HERMES_HOME/plugin-data/memory-rewind/; reads only the tracked files (never .env, auth.json, databases or skills/.hub/); rewrites tracked files only when the user runs `restore`; no network.

General
ntfy-approval❖ Community★ 0

Answer Hermes' approval prompts from your phone: once selected with security.approval.transport: ntfy, each dangerous-command prompt arrives as an ntfy push notification with Approve once, Approve for session and Deny buttons, and no answer still means deny. Disclosure — once selected, anyone who can read the ntfy topic can approve dangerous commands (the one-time answer codes are in the notification), so on the public ntfy.sh default the topic name is the only secret and NTFY_APPROVAL_TOKEN is optional; each pending approval publishes Hermes' reason, the redacted command (unless send_command is false), the non-default profile name and one-time answer codes to the configured ntfy server, then reads <topic>-reply and deletes the notification; any failure or timeout is a deny; reads NTFY_APPROVAL_TOPIC/NTFY_APPROVAL_TOKEN from the profile .env, never puts the token in a notification, follows no redirects, writes no files and starts no processes.

Automation

← Back to the catalog · catalog built Oct 3, 2026