# NousResearch/hermes-agent · Missing platform registrations causing KeyErrors

## Open now

- Nothing open on GitHub.

Multiple platforms (SMS/Twilio, webhook, Mattermost, Matrix, DingTalk) are absent from the PLATFORMS registry or toolset registration, causing KeyErrors and configuration failures at runtime. Members include both bug reports and proposed fixes for these missing registrations.

## TL;DR

- 10 member(s): 0 open issue(s), 3 closed issue(s), 0 open PR(s), 2 merged PR(s), 5 PR(s) closed without merging.
- A fix was merged to main in PR #3583. Verify it addresses your case.
- **Recommended:** read PR #3583 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `unresolved`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_PARTIAL`): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
- Members outside that structural core may belong to a different underlying problem.
- Pairwise link density `0.18`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #3511: \[Bug\]: Mattermost configuration parsing fails
- #3773: \[Bug\]: Webhook-triggered agent runs crash with KeyError: 'webhook' due to missing platform/toolset registration
- #9789: KeyError: 'sms' when SMS gateway receives a message — platform missing from PLATFORMS registry

## Prior & competing PRs

- **#3583: fix: add missing mattermost/matrix/dingtalk toolsets + platform consistency tests (salvage #3512)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `hermes_cli/skills_config.py`, `hermes_cli/tools_config.py`, `tests/hermes_cli/test_tools_config.py`, `toolsets.py`
- **#4660: fix: webhook platform support — skip home channel prompt, disable tool progress (salvage #4363)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `gateway/run.py`, `hermes_cli/skills_config.py`, `hermes_cli/tools_config.py`, `toolsets.py`
  - fix hunks:
  - `gateway/run.py`

    ```diff
    @@ -2449,7 +2449,8 @@ async def _handle_message_with_agent(self, event, source, _quick_key: str):
                 )
             
             # One-time prompt if no home channel is set for this platform
    -        if not history and source.platform and source.platform != Platform.LOCAL:
    +        # Skip for webhooks - they deliver directly to configured targets (github_comment, etc.)
    +        if not history and source.platform and source.platform != Platform.LOCAL and source.platform != Platform.WEBHOOK:
                 platform_name = source.platform.value
                 env_key = f"{platform_name.upper()}_HOME_CHANNEL"
                 if not os.getenv(env_key):
    ```

    ```diff
    @@ -5356,7 +5357,10 @@ async def _run_agent(
                 or os.getenv("HERMES_TOOL_PROGRESS_MODE")
                 or "all"
             )
    -        tool_progress_enabled = progress_mode != "off"
    +        # Disable tool progress for webhooks - they don't support message editing,
    +        # so each progress line would be sent as a separate message.
    +        from gateway.config import Platform
    +        tool_progress_enabled = progress_mode != "off" and source.platform != Platform.WEBHOOK
             
             # Queue for progress messages (thread-safe)
             progress_queue = queue.Queue() if tool_progress_enabled else None
    ```
  - `hermes_cli/skills_config.py`

    ```diff
    @@ -30,6 +30,7 @@
         "dingtalk": "💬 DingTalk",
         "feishu": "🪽 Feishu",
         "wecom": "💬 WeCom",
    +    "webhook": "🔗 Webhook",
     }
     
     # ─── Config Helpers ───────────────────────────────────────────────────────────
    ```
  - `hermes_cli/tools_config.py`

    ```diff
    @@ -150,6 +150,7 @@ def _get_plugin_toolset_keys() -> set:
         "wecom": {"label": "💬 WeCom", "default_toolset": "hermes-wecom"},
         "api_server": {"label": "🌐 API Server", "default_toolset": "hermes-api-server"},
         "mattermost": {"label": "💬 Mattermost", "default_toolset": "hermes-mattermost"},
    +    "webhook": {"label": "🔗 Webhook", "default_toolset": "hermes-webhook"},
     }
     
     
    ```
  - `toolsets.py`

    ```diff
    @@ -369,10 +369,16 @@
             "includes": []
         },
     
    +    "hermes-webhook": {
    +        "description": "Webhook toolset - receive and process external webhook events",
    +        "tools": _HERMES_CORE_TOOLS,
    +        "includes": []
    +    },
    +
         "hermes-gateway": {
             "description": "Gateway toolset - union of all messaging platform tools",
             "tools": [],
    -        "includes": ["hermes-telegram", "hermes-discord", "hermes-whatsapp", "hermes-slack", "hermes-signal", "hermes-homeassistant", "hermes-email", "hermes-sms", "hermes-mattermost", "hermes-matrix", "hermes-dingtalk", "hermes-feishu", "hermes-wecom"]
    +        "includes": ["hermes-telegram", "hermes-discord", "hermes-whatsapp", "hermes-slack", "hermes-signal", "hermes-homeassistant", "hermes-email", "hermes-sms", "hermes-mattermost", "hermes-matrix", "hermes-dingtalk", "hermes-feishu", "hermes-wecom", "hermes-webhook"]
         }
     }
     
    ```
- **#9967: fix: add SMS to PLATFORMS registry to fix KeyError on inbound message (#9789)**. closed without merge · fix tier `suggested`
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `a696bceafaa24c68e2598eab65a7eb043af3ed8e`
  - _suggested-tier fix detail withheld; re-request with `?tier=all` to include it._
- **#3512: fix: mattermost configuration parsing bugs**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#3583`
- **#3775: fix(gateway): register webhook platform and toolset to fix KeyError on agent runs **. closed without merge
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `e0b2bdb089dd86adc74298f22b649d684785a616`, `#4660`, `#4363`
- **#13833: fix(platforms): add missing SMS platform to PLATFORMS registry**. closed without merge
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `a696bceafaa24c68e2598eab65a7eb043af3ed8e`
- **#14112: fix(cli): register sms platform toolset**. closed without merge
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `a696bceafaa24c68e2598eab65a7eb043af3ed8e`

## Fix status

- Merged to main in PR #3583 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-04-02`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
- Subsystem: `gateway`
