NousResearch/hermes-agent
Deduplicating plugin tools against built-in toolsets
Cluster 13640 · skills. Data as of
Nothing open on GitHub. Fix merged in #15634 on 25 Apr 2026. Check it covers your case.
The short answer
0open issues
0open PRs
4items grouped
- Known?
- Yes. 4 related items grouped here, 1 issue already closed.
- Fix event
- A fix was merged to main in PR #15634. Check it covers your case. No release data is tracked.
- Tracker
- The maintainers' tracker marks this
unresolved. That is separate from the fix event. - Still open
- Nothing open on GitHub.
These issues and pull requests address duplicate entries appearing when plugin toolsets overlap with built-in toolset keys in the hermes tools output. Multiple fix attempts target the same deduplication problem from different angles.
Open issues0
Open PRs0
Fixes on record
-
#15634 fix(tools): dedupe bundled plugin toolsets with built-in entries
files:
hermes_cli/tools_config.py,tests/hermes_cli/test_tools_config.pyShow the diff
-
hermes_cli/tools_config.py@@ -103,13 +103,23 @@ def _get_effective_configurable_toolsets(): """Return CONFIGURABLE_TOOLSETS + any plugin-provided toolsets. Plugin toolsets are appended at the end so they appear after the - built-in toolsets in the TUI checklist. + built-in toolsets in the TUI checklist. A plugin whose toolset key + already appears in ``CONFIGURABLE_TOOLSETS`` is skipped — bundled + plugins (e.g. ``plugins/spotify``) share their toolset key with the + built-in entry, and we want the built-in label/description to win. + Without the dedupe, ``hermes tools`` → "reconfigure existing" would + list the same toolset twice. """ result = list(CONFIGURABLE_TOOLSETS) + seen = {ts_key for ts_key, _, _ in result} try: from hermes_cli.plugins import discover_plugins, get_plugin_toolsets discover_plugins() # idempotent — ensures plugins are loaded - result.extend(get_plugin_toolsets()) + for entry in get_plugin_toolsets(): + if entry[0] in seen: + continue + seen.add(entry[0]) + result.append(entry) except Exception: pass return result -
tests/hermes_cli/test_tools_config.py@@ -766,3 +766,24 @@ def test_get_platform_tools_feishu_tools_not_on_other_platforms(): enabled = _get_platform_tools({}, plat) assert "feishu_doc" not in enabled, f"feishu_doc leaked onto {plat}" assert "feishu_drive" not in enabled, f"feishu_drive leaked onto {plat}" + + +def test_get_effective_configurable_toolsets_dedupes_bundled_plugins(): + """Bundled plugins (plugins/spotify) share their toolset key with the + built-in CONFIGURABLE_TOOLSETS entry. The effective list must not list + them twice — otherwise `hermes tools` → "reconfigure existing" shows + the same toolset two rows in a row. + """ + from hermes_cli.tools_config import _get_effective_configurable_toolsets + + all_ts = _get_effective_configurable_toolsets() + keys = [ts_key for ts_key, _, _ in all_ts] + assert len(keys) == len(set(keys)), ( + f"duplicate toolset keys in effective list: " + f"{[k for k in keys if keys.count(k) > 1]}" + ) + # Spotify specifically — the bug that motivated the dedupe. + spotify_rows = [t for t in all_ts if t[0] == "spotify"] + assert len(spotify_rows) == 1, spotify_rows + # Built-in label wins over the plugin label. + assert spotify_rows[0][1] == "🎵 Spotify"
-
2 PRs closed without merging
From the close comments: done elsewhere 2
Closed issues · 1
- Closed#13640hermes tools duplicates built-in toolset rows for plugins attached to existing toolsets
How this cluster was grouped
-
Link evidence (
structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference. -
Pairwise link density
0.50: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36.1.00means every pair is linked.
Pick up a Lab task
Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.
Open the LabAt a glance
- Subsystem
- skills
- Merged PRs
- #15634
- Closed issues
- 1
- Attempts
- 2 PRs closed without merging
- Fix link checked
- 25 Apr 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.