Skip to content

fix(microsoft,elevenlabs): add enabledByDefault so speech providers register at runtime#62846

Merged
obviyus merged 5 commits intoopenclaw:mainfrom
stainlu:fix/issue-62574-microsoft-tts-enabledByDefault
Apr 16, 2026
Merged

fix(microsoft,elevenlabs): add enabledByDefault so speech providers register at runtime#62846
obviyus merged 5 commits intoopenclaw:mainfrom
stainlu:fix/issue-62574-microsoft-tts-enabledByDefault

Conversation

@stainlu
Copy link
Copy Markdown
Contributor

@stainlu stainlu commented Apr 8, 2026

Summary

  • Problem 1 (registration): Microsoft TTS and ElevenLabs providers are not available at runtime — /tts provider only shows OpenAI, and /tts status reports microsoft (not configured) with skipped(no_provider_registered). Users configuring Microsoft voices (e.g. zh-CN-XiaoxiaoNeural) or ElevenLabs get no TTS output despite correct config; the gateway silently falls back to OpenAI.
  • Problem 2 (parser regression): Once Microsoft and ElevenLabs participate in directive parsing, parseTtsDirectives walks providers in autoSelectOrder with first-match-wins and does not honor an explicit provider=X token when routing generic tokens. Inputs like [[tts:provider=minimax speed=1.2]] would silently route speed to whichever provider comes first in order, not to the declared MiniMax.
  • What changed:
    • Added "enabledByDefault": true to extensions/microsoft/openclaw.plugin.json and extensions/elevenlabs/openclaw.plugin.json, matching the pattern of other working bundled speech provider plugins (openai, minimax, vydra).
    • parseTtsDirectives now pre-scans for provider=X and routes generic tokens to the declared provider first, falling back to autoSelectOrder only when the declared provider doesn't handle the key. Token order inside the directive no longer matters.
    • Added src/tts/directives.test.ts covering the ElevenLabs/MiniMax speed collision and fallback, mixed-token, last-wins, and allowProvider-disabled cases. parseTtsDirectives previously had no test coverage.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 8, 2026

Greptile Summary

Adds "enabledByDefault": true to the openclaw.plugin.json manifests for the microsoft and elevenlabs speech provider plugins, bringing them in line with the three other bundled speech providers (openai, minimax, vydra) that already carry this flag. Without it, resolveEffectivePluginActivationState treats these plugins as disabled at gateway startup, so their providers are never registered and TTS silently falls through to OpenAI.

Confidence Score: 5/5

Safe to merge — purely declarative fix with no logic changes, matching the established pattern for all other bundled speech providers.

The change is exactly two added lines across two JSON manifests. It corrects an omission (missing enabledByDefault: true) that is clearly verified against the three working speech provider manifests and the activation gate in src/plugins/config-policy.ts. No code was modified, no new logic introduced, and the PR author confirmed pnpm build, pnpm lint, and both extension test suites pass.

No files require special attention.

Vulnerabilities

No security concerns identified. The change is limited to declarative JSON manifests, adds no new network calls, secrets handling, or permission grants, and matches the existing activation pattern for all other bundled speech providers.

Reviews (1): Last reviewed commit: "fix(microsoft,elevenlabs): add enabledBy..." | Re-trigger Greptile

@stainlu
Copy link
Copy Markdown
Contributor Author

stainlu commented Apr 8, 2026

CI failures are pre-existing and unrelated to this manifest change:

  • check-additional: TypeScript lint errors in discord/imessage/openshell extensions (same failures seen on other PRs)
  • checks-node-test: Missing env vars (VOLCANO_ENGINE_API_KEY, NVIDIA_API_KEY), Gemini model ID normalization drift, auth test drift
  • checks-windows-node-test: Timed out (1h+)

Extension-specific tests for both microsoft and elevenlabs pass cleanly.

@stainlu stainlu force-pushed the fix/issue-62574-microsoft-tts-enabledByDefault branch 2 times, most recently from de84361 to 661cc9d Compare April 14, 2026 13:41
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 661cc9dd36

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/elevenlabs/openclaw.plugin.json
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9a042170ee

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/elevenlabs/openclaw.plugin.json
stainlu added a commit to stainlu/openclaw that referenced this pull request Apr 14, 2026
…rovider

Addresses the P2 Codex review on openclaw#62846 that flagged auto-enabling
ElevenLabs as a product regression for MiniMax users. Both providers
claim the generic `speed` token, and parseTtsDirectives walked
providers in autoSelectOrder with first-match-wins, so inputs like
`[[tts:provider=minimax speed=1.2]]` silently routed speed to
providerOverrides.elevenlabs once elevenlabs participated in every
parse pass.

The parser now pre-scans for `provider=` (honoring legacy last-wins
semantics) and routes generic tokens with the declared provider tried
first, falling back to autoSelectOrder when it doesn't handle the key.
Token order inside the directive no longer matters: `speed=1.2` before
or after `provider=minimax` both resolve to MiniMax.

Adds a regression test suite covering the exact ElevenLabs/MiniMax
speed collision plus fallback, mixed-token, last-wins, and
allowProvider-disabled cases. parseTtsDirectives had no prior test
coverage.
@stainlu stainlu force-pushed the fix/issue-62574-microsoft-tts-enabledByDefault branch 2 times, most recently from cc2d801 to ed6f581 Compare April 16, 2026 05:18
stainlu added a commit to stainlu/openclaw that referenced this pull request Apr 16, 2026
…rovider

Addresses the P2 Codex review on openclaw#62846 that flagged auto-enabling
ElevenLabs as a product regression for MiniMax users. Both providers
claim the generic `speed` token, and parseTtsDirectives walked
providers in autoSelectOrder with first-match-wins, so inputs like
`[[tts:provider=minimax speed=1.2]]` silently routed speed to
providerOverrides.elevenlabs once elevenlabs participated in every
parse pass.

The parser now pre-scans for `provider=` (honoring legacy last-wins
semantics) and routes generic tokens with the declared provider tried
first, falling back to autoSelectOrder when it doesn't handle the key.
Token order inside the directive no longer matters: `speed=1.2` before
or after `provider=minimax` both resolve to MiniMax.

Adds a regression test suite covering the exact ElevenLabs/MiniMax
speed collision plus fallback, mixed-token, last-wins, and
allowProvider-disabled cases. parseTtsDirectives had no prior test
coverage.
@openclaw-barnacle openclaw-barnacle bot added the channel: discord Channel integration: discord label Apr 16, 2026
@obviyus obviyus self-assigned this Apr 16, 2026
stainlu and others added 3 commits April 16, 2026 15:05
…rovider

Addresses the P2 Codex review on openclaw#62846 that flagged auto-enabling
ElevenLabs as a product regression for MiniMax users. Both providers
claim the generic `speed` token, and parseTtsDirectives walked
providers in autoSelectOrder with first-match-wins, so inputs like
`[[tts:provider=minimax speed=1.2]]` silently routed speed to
providerOverrides.elevenlabs once elevenlabs participated in every
parse pass.

The parser now pre-scans for `provider=` (honoring legacy last-wins
semantics) and routes generic tokens with the declared provider tried
first, falling back to autoSelectOrder when it doesn't handle the key.
Token order inside the directive no longer matters: `speed=1.2` before
or after `provider=minimax` both resolve to MiniMax.

Adds a regression test suite covering the exact ElevenLabs/MiniMax
speed collision plus fallback, mixed-token, last-wins, and
allowProvider-disabled cases. parseTtsDirectives had no prior test
coverage.
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f7bffe3656

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread extensions/discord/src/voice/manager.ts Outdated
@obviyus obviyus force-pushed the fix/issue-62574-microsoft-tts-enabledByDefault branch from f7bffe3 to 80061e0 Compare April 16, 2026 09:42
Copy link
Copy Markdown
Contributor

@obviyus obviyus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified the Microsoft and ElevenLabs bundled speech providers now register by default, and confirmed TTS directive routing prefers the explicit or active provider so speed overrides stop landing on the wrong provider.

Maintainer follow-up: fixed the Discord voice runtime import to use an exported Plugin SDK seam and resolved the package-exports review thread on the latest head.

Local gate: pnpm test src/tts/directives.test.ts; pnpm test extensions/speech-core/src/tts.test.ts; pnpm build; pnpm check.

@obviyus obviyus merged commit 6ea3cdd into openclaw:main Apr 16, 2026
46 checks passed
@obviyus
Copy link
Copy Markdown
Contributor

obviyus commented Apr 16, 2026

Landed on main.

Thanks @stainlu.

ayteks pushed a commit to ayteks/openclaw that referenced this pull request Apr 16, 2026
…enclaw#62846) (thanks @stainlu)

* fix(microsoft,elevenlabs): add enabledByDefault so speech providers register at runtime

* fix(tts): route generic directive tokens to the explicitly declared provider

Addresses the P2 Codex review on openclaw#62846 that flagged auto-enabling
ElevenLabs as a product regression for MiniMax users. Both providers
claim the generic `speed` token, and parseTtsDirectives walked
providers in autoSelectOrder with first-match-wins, so inputs like
`[[tts:provider=minimax speed=1.2]]` silently routed speed to
providerOverrides.elevenlabs once elevenlabs participated in every
parse pass.

The parser now pre-scans for `provider=` (honoring legacy last-wins
semantics) and routes generic tokens with the declared provider tried
first, falling back to autoSelectOrder when it doesn't handle the key.
Token order inside the directive no longer matters: `speed=1.2` before
or after `provider=minimax` both resolve to MiniMax.

Adds a regression test suite covering the exact ElevenLabs/MiniMax
speed collision plus fallback, mixed-token, last-wins, and
allowProvider-disabled cases. parseTtsDirectives had no prior test
coverage.

* fix(tts): prefer active provider for generic directives

* fix: register bundled TTS providers safely (openclaw#62846) (thanks @stainlu)

* fix: use exported TTS SDK seam (openclaw#62846) (thanks @stainlu)

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
xudaiyanzi pushed a commit to xudaiyanzi/openclaw that referenced this pull request Apr 17, 2026
…enclaw#62846) (thanks @stainlu)

* fix(microsoft,elevenlabs): add enabledByDefault so speech providers register at runtime

* fix(tts): route generic directive tokens to the explicitly declared provider

Addresses the P2 Codex review on openclaw#62846 that flagged auto-enabling
ElevenLabs as a product regression for MiniMax users. Both providers
claim the generic `speed` token, and parseTtsDirectives walked
providers in autoSelectOrder with first-match-wins, so inputs like
`[[tts:provider=minimax speed=1.2]]` silently routed speed to
providerOverrides.elevenlabs once elevenlabs participated in every
parse pass.

The parser now pre-scans for `provider=` (honoring legacy last-wins
semantics) and routes generic tokens with the declared provider tried
first, falling back to autoSelectOrder when it doesn't handle the key.
Token order inside the directive no longer matters: `speed=1.2` before
or after `provider=minimax` both resolve to MiniMax.

Adds a regression test suite covering the exact ElevenLabs/MiniMax
speed collision plus fallback, mixed-token, last-wins, and
allowProvider-disabled cases. parseTtsDirectives had no prior test
coverage.

* fix(tts): prefer active provider for generic directives

* fix: register bundled TTS providers safely (openclaw#62846) (thanks @stainlu)

* fix: use exported TTS SDK seam (openclaw#62846) (thanks @stainlu)

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
kvnkho pushed a commit to kvnkho/openclaw that referenced this pull request Apr 17, 2026
…enclaw#62846) (thanks @stainlu)

* fix(microsoft,elevenlabs): add enabledByDefault so speech providers register at runtime

* fix(tts): route generic directive tokens to the explicitly declared provider

Addresses the P2 Codex review on openclaw#62846 that flagged auto-enabling
ElevenLabs as a product regression for MiniMax users. Both providers
claim the generic `speed` token, and parseTtsDirectives walked
providers in autoSelectOrder with first-match-wins, so inputs like
`[[tts:provider=minimax speed=1.2]]` silently routed speed to
providerOverrides.elevenlabs once elevenlabs participated in every
parse pass.

The parser now pre-scans for `provider=` (honoring legacy last-wins
semantics) and routes generic tokens with the declared provider tried
first, falling back to autoSelectOrder when it doesn't handle the key.
Token order inside the directive no longer matters: `speed=1.2` before
or after `provider=minimax` both resolve to MiniMax.

Adds a regression test suite covering the exact ElevenLabs/MiniMax
speed collision plus fallback, mixed-token, last-wins, and
allowProvider-disabled cases. parseTtsDirectives had no prior test
coverage.

* fix(tts): prefer active provider for generic directives

* fix: register bundled TTS providers safely (openclaw#62846) (thanks @stainlu)

* fix: use exported TTS SDK seam (openclaw#62846) (thanks @stainlu)

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: discord Channel integration: discord size: M

Projects

None yet

2 participants