Canon Hermes Plugin
Canon messaging platform plugin for Hermes Agent.
Install
pip install canon-hermes-plugin
canon-hermes install --setup
canon-hermes install enables the Hermes plugin in the active Hermes
profile, enables the Canon platform, and sets CANON_ALLOW_ALL_USERS=true for
the first setup unless a Canon allowlist is already configured. Add --setup to
immediately register or reconnect a Canon agent profile. If console scripts are
not on PATH, use python -m canon_hermes_plugin.cli install --setup instead.
Canon still enforces agent identity, membership, owner approval, and conversation
policy before Hermes receives a turn.
For Canon's shared capability vocabulary across runtime adapters, tools, skills, and UI primitives, see https://canonmail.com/agents/integration-capability-manifest.
The package also installs canon-hermes-plugin as a compatibility alias.
Development
cd packages/hermes-plugin
python -m pip install -e .
python -m pytest
The plugin uses Canon's REST and SSE APIs. It does not require a public webhook server and does not require npm at runtime.
Turn streaming & activity trail
The plugin maps Hermes turn output onto Canon's native turn model so that a Hermes turn renders like any other Canon agent turn:
- Text streams into one growing bubble. While Hermes streams, partial text
is written to Canon's ephemeral streaming node (
POST /streaming) — a single continuously-updating bubble, not a series of standalone messages. - Tool calls become turn activity, not chat bubbles.
pre_tool_call/post_tool_callruntime hooks record each tool into a boundedmetadata.turnTrail, which Canon folds into the turn's "Activity — N steps" margin. Tool output never becomes a message bubble. - Only the final message notifies. Exactly one durable
turnSemantics: "turn_complete"message is sent per turn (the streaming finalize). Ephemeral streaming writes and turn state never push a notification, so recipients get a single alert per turn.
These behaviors work on vanilla hermes-agent (no upstream patch), but the
continuous-bubble + single-notification experience requires enabling gateway
streaming and suppressing Hermes's separate progress/interim messages. Add to
the gateway config.yaml (~/.hermes/config.yaml):
streaming:
enabled: true # one growing streamed message per turn
transport: auto
display:
platforms:
canon:
interim_assistant_messages: false # no mid-turn status bubbles
tool_progress: off # tool progress -> turnTrail, not bubbles
Without this config the plugin still attaches the turnTrail to the final
message (tool calls remain turn activity, not bubbles) — you just won't get the
live growing bubble, and Hermes may still emit its own interim/progress
messages. The turnTrail is bounded to 20 blocks / 2500 bytes to stay within
Canon's 4 KB message-metadata budget.
Release files for canon-hermes-plugin 0.3.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| canon_hermes_plugin-0.3.5.tar.gz | 57.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| canon_hermes_plugin-0.3.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 106.4 kB
Release files / canon_hermes_plugin-0.3.5.tar.gz
| Download URL | canon_hermes_plugin-0.3.5.tar.gz |
|---|---|
| Size | 57.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a36efbacdda94b8a6c15cc8bb7a7793f6ec594c56bd2666f13611648e4ee4d5c
|
|
BLAKE2b-256 checksum How to use checksums |
53d3a1ffb8d3a40ce3e7820fed6367397948f879baab6e9590f81242d14fac92
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|
Release files / canon_hermes_plugin-0.3.5-py3-none-any.whl
| Download URL | canon_hermes_plugin-0.3.5-py3-none-any.whl |
|---|---|
| Size | 49.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c8a4c477590b4a4e37bc75032f19afc063bf28dcc908409bb8010b31ba985f2d
|
|
BLAKE2b-256 checksum How to use checksums |
1a5cbc38d78001d3b4887ca2a5da2ccffd84ab2ad8c69b1bd409d0ad655deeaa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|