hermes - 💡(How to fix) Fix [Bug]: `piper` missing from `hermes setup tts` menu — TTS provider list drift across CLI surfaces [2 pull requests]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Root Cause

Each provider was added to the runtime + one CLI surface, but the other surface was missed; no comment in either file documents an intentional exclusion.

  • piper missing from setup tts: added in 8d302e37a8 (feat(tts): add Piper as a native local TTS provider, #17885). That commit touched tools/tts_tool.py (added to BUILTIN_TTS_PROVIDERS), hermes_cli/tools_config.py (picker row), docs and config.yaml — but never hermes_cli/setup.py. The picker is the only install path it wired up.
  • minimax missing from picker: added in f5c212f69b (feat: add MiniMax TTS provider support) — touched setup.py + tts_tool.py + docs, not tools_config.py. Needs only MINIMAX_API_KEY, same class as elevenlabs/openai/gemini/mistral which are all in the picker.
  • neutts missing from picker: added in d50e0711c2 (refactor(tts): replace NeuTTS optional skill with built-in provider + setup flow) — touched setup.py + tts_tool.py, not tools_config.py. Note neutts also needs the system package espeak-ng, which the picker's pip-only post_setup flow doesn't install — so its picker row would need a post_setup handler that warns about espeak-ng (mirroring _install_neutts_deps in setup.py).

Relevant lines on main: tools/tts_tool.py:357 (BUILTIN_TTS_PROVIDERS), hermes_cli/setup.py:1089 (setup menu list), hermes_cli/tools_config.py:204 (TOOL_CATEGORIES["tts"]).

Why it went unnoticed: the only sync test, tests/agent/test_tts_registry.py::TestBuiltinSync, checks runtime-internal consistency (_BUILTIN_NAMESBUILTIN_TTS_PROVIDERS). Nothing ties the setup tts menu or the picker's built-in rows back to BUILTIN_TTS_PROVIDERS, so a provider added to one surface but not the other passes CI.

Fix Action

Fixed

RAW_BUFFERClick to expand / collapse

Bug Description

The set of built-in TTS providers has drifted between the three places that should agree on it. Most visibly, piper is a native built-in provider (in BUILTIN_TTS_PROVIDERS) and appears in the hermes tools picker, but is NOT offered in the interactive hermes setup tts menu — so users running the classic setup flow can't select Piper at all and have to hand-edit config.yaml.

While confirming this I found the drift goes both ways:

providerruntime BUILTIN_TTS_PROVIDERShermes setup tts (setup.py)hermes tools picker (tools_config.py)
edge / elevenlabs / openai / xai / mistral / gemini / kittentts
minimax
neutts
piper

The runtime registry is complete (10 providers); only the two CLI selection surfaces are inconsistent.

The missing piper entry in hermes setup tts is the worst of these drifts, because setup is exactly where a user picks their TTS provider in the first place — since Piper isn't listed there, they'll never discover it exists and can't select it without hand-editing config.yaml (minimax/neutts at least have the setup tts fallback, whereas Piper has no path at all in the setup flow).

Steps to Reproduce

  1. Run hermes setup tts
  2. Look at the provider list
  3. Piper is absent (only edge/elevenlabs/openai/xai/minimax/mistral/gemini/neutts/kittentts are listed)
  4. Conversely, run hermes tools → Text-to-Speech: MiniMax and NeuTTS are absent there, even though both are selectable in hermes setup tts.

Expected Behavior

All 10 native built-in providers (BUILTIN_TTS_PROVIDERS) are offered consistently in both hermes setup tts and the hermes tools picker. Picking a provider should be possible from either surface without editing config.yaml by hand.

Actual Behavior

piper cannot be chosen via hermes setup tts; minimax and neutts cannot be chosen via hermes tools.

Affected Component

Setup / Installation, Configuration (config.yaml, .env, hermes setup)

Operating System

macOS (Darwin 25.5.0). Note: this is a source-level inconsistency on main, not OS-dependent — it reproduces on every platform.

Debug Report

This is a source-level inconsistency identified by reading the code on main (commit e481b1533); it is not runtime- or environment-dependent, so a hermes debug share upload adds nothing here. Happy to attach one if a maintainer wants it.

Root Cause Analysis

Each provider was added to the runtime + one CLI surface, but the other surface was missed; no comment in either file documents an intentional exclusion.

  • piper missing from setup tts: added in 8d302e37a8 (feat(tts): add Piper as a native local TTS provider, #17885). That commit touched tools/tts_tool.py (added to BUILTIN_TTS_PROVIDERS), hermes_cli/tools_config.py (picker row), docs and config.yaml — but never hermes_cli/setup.py. The picker is the only install path it wired up.
  • minimax missing from picker: added in f5c212f69b (feat: add MiniMax TTS provider support) — touched setup.py + tts_tool.py + docs, not tools_config.py. Needs only MINIMAX_API_KEY, same class as elevenlabs/openai/gemini/mistral which are all in the picker.
  • neutts missing from picker: added in d50e0711c2 (refactor(tts): replace NeuTTS optional skill with built-in provider + setup flow) — touched setup.py + tts_tool.py, not tools_config.py. Note neutts also needs the system package espeak-ng, which the picker's pip-only post_setup flow doesn't install — so its picker row would need a post_setup handler that warns about espeak-ng (mirroring _install_neutts_deps in setup.py).

Relevant lines on main: tools/tts_tool.py:357 (BUILTIN_TTS_PROVIDERS), hermes_cli/setup.py:1089 (setup menu list), hermes_cli/tools_config.py:204 (TOOL_CATEGORIES["tts"]).

Why it went unnoticed: the only sync test, tests/agent/test_tts_registry.py::TestBuiltinSync, checks runtime-internal consistency (_BUILTIN_NAMESBUILTIN_TTS_PROVIDERS). Nothing ties the setup tts menu or the picker's built-in rows back to BUILTIN_TTS_PROVIDERS, so a provider added to one surface but not the other passes CI.

Proposed Fix

  1. Add piper to the hermes setup tts menu (label + choice + a piper-tts install branch, mirroring kittentts).
  2. Add minimax (API-key row) and neutts (row + post_setup that pip-installs neutts[all] and warns about espeak-ng) to TOOL_CATEGORIES["tts"] in tools_config.py.
  3. Add a regression test asserting both surfaces cover BUILTIN_TTS_PROVIDERS (requires lifting the hardcoded list at setup.py:1089 into an importable module-level constant).

Happy to send a focused PR if the maintainers agree on the direction (especially the neutts/espeak-ng picker handling).

Are you willing to submit a PR

If maintainers want.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - 💡(How to fix) Fix [Bug]: `piper` missing from `hermes setup tts` menu — TTS provider list drift across CLI surfaces [2 pull requests]