Full-featured Hermes Chatto Plugin. So you can use Chatto to talk to your Hermes Agent. https://gogs.netdome.biz/paul/hermes-chatto-plugin

Paul Klumpp ea66d97e87 Ignore a local .hermes-agent checkout 1 주 전
vendor d0478772ee Refresh vendored wheels: protobuf, httpx and idna rebuilds 1 주 전
.gitignore ea66d97e87 Ignore a local .hermes-agent checkout 1 주 전
AGENTS.md 2fbe8ccca6 Ask for typed access over dynamic lookups 1 주 전
DOCS.md 9007723a33 Keep refreshing presence so the bot stays online 1 주 전
LICENSE 81982d335b Add the MIT LICENSE file 1 주 전
PLAN.md b561ab7c71 Add a plan for the missing BasePlatformAdapter overrides 1 주 전
README.md d3d5125c8a Call the outbound API ConnectRPC, not REST 1 개월 전
VENDORING.md 7f5c36cab3 Stop shadowing the host's pinned dependencies 1 주 전
__init__.py 59af37cf57 Make the test suite collectable 1 주 전
adapter.py acb2cc7408 Bring adapter.py back to PEP 8 1 주 전
after-install.md 624ff4f230 Add agent guidelines and align docs and dev dependencies 1 주 전
platform_config.py e01f0c204e Align the emoji shortcode map with names Chatto accepts 1 주 전
plugin.yaml 3e10f86bd8 Make dispatch robust: room-kind cache, unified dedup, explicit config defaults 2 주 전
pyproject.toml 59af37cf57 Make the test suite collectable 1 주 전
test_adapter.py 9c4cc5a136 Cover messages that name several people 1 주 전
test_platform_config.py 3fc1e43abb Fix the drifted tests, and the bug one of them was pointing at 1 주 전
uv.lock 23a141c5c8 Add uv.lock and ignore local venv/test artifacts 1 주 전
vendor_chattolib.sh e89d9a5d99 Vendor dependencies per platform instead of Linux-x86_64 only 1 주 전
vendor_path.py 7f5c36cab3 Stop shadowing the host's pinned dependencies 1 주 전
vendor_split.py e89d9a5d99 Vendor dependencies per platform instead of Linux-x86_64 only 1 주 전

README.md

Hermes Chatto Plugin

A Chatto platform adapter plugin for Hermes Agent. Connects your self-hosted Chatto server to Hermes so you can interact with the agent through chat rooms and DMs.

Install

hermes plugins install jrimmer/hermes-chatto-plugin

Or with the full URL:

hermes plugins install https://github.com/jrimmer/hermes-chatto-plugin.git

Then add your Chatto credentials to ~/.hermes/.env:

CHATTO_URL=https://chat.example.com
CHATTO_LOGIN=max
CHATTO_PASSWORD=your-password
CHATTO_HOME_CHANNEL=REljMv5Pgolo6Y9

Enable the plugin (if not auto-enabled during install):

hermes plugins enable chatto-platform

Restart the gateway:

hermes gateway restart

Configuration

Environment Variables

Variable Required Description
CHATTO_URL Yes Base URL of your Chatto server
CHATTO_LOGIN Yes Chatto username
CHATTO_PASSWORD Yes Chatto password
CHATTO_HOME_CHANNEL No Cron-Job-Zielkanal: Legt den Standard-Raum fest, in den geplante Cron-Jobs (z. B. „tägliche Nachricht um 9 Uhr“) ihre Ergebnisse ausliefern. Wenn nicht gesetzt, nimmt der Bot die erste Room-ID, in der er gelistet ist. Beispiel: CHATTO_HOME_CHANNEL=RbmwiHk4vs9a3Ql
CHATTO_CHANNELS No Comma-separated room IDs to watch (default: all joined rooms)
CHATTO_REQUIRE_MENTION No Only respond to @mentions in rooms (default: true). DMs always respond.
CHATTO_AUTO_THREAD No Auto-create threads for replies in rooms (default: true)
CHATTO_FREE_RESPONSE_CHANNELS No Comma-separated room IDs where bot responds without being tagged
CHATTO_ALLOWED_USERS No Comma-separated Chatto logins allowed to talk to the bot
CHATTO_ALLOW_ALL_USERS No Allow any Chatto user to talk to the bot (true/false)

YAML Config (optional)

You can also configure via ~/.hermes/config.yaml instead of env vars:

gateway:
  platforms:
    chatto:
      enabled: true
      extra:
        url: https://chat.example.com
        require_mention: true
        home_channel: REljMv5Pgolo6Y9
        free_response_channels: []

Features

  • Realtime via chattolib — uses the chattolib library for WebSocket realtime connections
  • ConnectRPC via chattolib — uses chattolib's high-level API for all outbound operations over ConnectRPC
  • Thread supportGetThreadEvents for thread replies, auto-thread creation, proper threadRootEventId handling
  • DM support — DMs always get a response, no threading in DM rooms
  • Mention filteringrequire_mention (default true) with free_response_channels for no-tag rooms
  • Dynamic room discovery — auto-joins new rooms without gateway restart (watches room_created / user_joined_room events)
  • Event handlingmessage_posted, mention_notification, new_dm_notification, session_terminated (force reconnect), message_retracted, user_left_room
  • Presence broadcasting — periodic presence refresh
  • Standalone cron delivery — works outside the gateway process

How It Works

The adapter uses the chattolib library to connect to Chatto, which handles both WebSocket realtime connections for inbound events and ConnectRPC over HTTP for outbound operations.

When a message is received, chattolib processes the event, the message is dispatched to the Hermes agent, and the response is sent back via chattolib's messaging API with proper threading.

Tested Against

Chatto v0.4.19 with chattolib >=0.4.19.

License

MIT — see LICENSE.