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.3
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.3.tar.gz | 54.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| canon_hermes_plugin-0.3.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 100.9 kB
Release files / canon_hermes_plugin-0.3.3.tar.gz
| Download URL | canon_hermes_plugin-0.3.3.tar.gz |
|---|---|
| Size | 54.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
993072cf7332b984ccbc766605d9884858cf771d0cd7e94f5eafceb3792cb2e8
|
|
BLAKE2b-256 checksum How to use checksums |
4d671abe5a0daf363328537b75f6c7d5078a1a9b5f9f2f49b85791dad19dba72
|
| 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.3-py3-none-any.whl
| Download URL | canon_hermes_plugin-0.3.3-py3-none-any.whl |
|---|---|
| Size | 46.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
39da39ce886d2a9b2104baa3ac2651a5ed80355438e15f24cfb8034eeb5da5a2
|
|
BLAKE2b-256 checksum How to use checksums |
7ac2717e60efccc533603f9644b78e41eced47df1ac32d6216b16a0cbc62f3ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.12
|