From 2f39e6df5991a7bdc1458614e72124ed4282e042 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 25 Apr 2026 05:39:01 +0100 Subject: [PATCH] fix(tts): prefer active speech provider lookup --- CHANGELOG.md | 1 + src/tts/provider-registry.ts | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4220eb94662..ec2e261675a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- Talk/TTS: resolve configured extension speech providers from the active runtime registry before provider-list discovery, so Talk mode no longer rejects valid plugin speech providers as unsupported. - Sessions/subagents: stop stale ended runs and old store-only child reverse links from reappearing in `childSessions`, while keeping live descendants and recently-ended children visible. Fixes #57920. - Subagents: stop stale unended runs from counting as active or pending forever, while preserving restart-aborted recovery for recoverable child sessions. Fixes #71252. Thanks @hclsys. - Gateway/tools: allow `POST /tools/invoke` to reach plugin-backed catalog tools such as `browser` when no core implementation exists, while still preferring built-in tools for real core names. Thanks @chat2way. diff --git a/src/tts/provider-registry.ts b/src/tts/provider-registry.ts index c145727047c..f43a746fd87 100644 --- a/src/tts/provider-registry.ts +++ b/src/tts/provider-registry.ts @@ -1,5 +1,8 @@ import type { OpenClawConfig } from "../config/types.js"; -import { resolvePluginCapabilityProviders } from "../plugins/capability-provider-runtime.js"; +import { + resolvePluginCapabilityProvider, + resolvePluginCapabilityProviders, +} from "../plugins/capability-provider-runtime.js"; import { buildCapabilityProviderMaps, normalizeCapabilityProviderId, @@ -39,7 +42,13 @@ export function getSpeechProvider( if (!normalized) { return undefined; } - return buildProviderMaps(cfg).aliases.get(normalized); + return ( + resolvePluginCapabilityProvider({ + key: "speechProviders", + providerId: normalized, + cfg, + }) ?? buildProviderMaps(cfg).aliases.get(normalized) + ); } export function canonicalizeSpeechProviderId(