Skip to content

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

Merged
obviyus merged 5 commits into
openclaw: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 into
openclaw:mainfrom
stainlu:fix/issue-62574-microsoft-tts-enabledByDefault

Conversation

@stainlu

@stainlu stainlu commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

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

greptile-apps Bot commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

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

stainlu commented Apr 8, 2026

Copy link
Copy Markdown
Contributor Author

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

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

Copy link
Copy Markdown
Contributor

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

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

Copy link
Copy Markdown
Contributor

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
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
@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.

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

Copy link
Copy Markdown
Contributor

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

@obviyus obviyus left a comment

Copy link
Copy Markdown
Contributor

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

obviyus commented Apr 16, 2026

Copy link
Copy Markdown
Contributor

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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
Mquarmoc pushed a commit to Mquarmoc/openclaw that referenced this pull request Apr 20, 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 <[email protected]>
lovewanwan pushed a commit to lovewanwan/openclaw that referenced this pull request Apr 28, 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 <[email protected]>
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 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 <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 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 <[email protected]>
globalcaos pushed a commit to globalcaos/tinkerclaw that referenced this pull request May 13, 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 <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 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 <[email protected]>
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 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 <[email protected]>
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