





















@@ -3,11 +3,14 @@ import type {
33ChannelDoctorLegacyConfigRule,
44} from "openclaw/plugin-sdk/channel-contract";
55import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
6+import {
7+isSupportedRealtimeVoiceActivationName,
8+normalizeRealtimeVoiceActivationNamePrefix,
9+} from "openclaw/plugin-sdk/realtime-voice";
610import { asObjectRecord, normalizeLegacyChannelAliases } from "openclaw/plugin-sdk/runtime-doctor";
711import { resolveDiscordPreviewStreamMode } from "./preview-streaming.js";
812913const LEGACY_TTS_PROVIDER_KEYS = ["openai", "elevenlabs", "microsoft", "edge"] as const;
10-const DISCORD_REALTIME_WAKE_NAME_MAX_WORDS = 2;
1114type AgentBindingConfig = NonNullable<OpenClawConfig["bindings"]>[number];
12151316function hasLegacyTtsProviderKeys(value: unknown): boolean {
@@ -78,31 +81,15 @@ function hasLegacyDiscordAccountGuildChannelAgentId(value: unknown): boolean {
7881return Object.values(accounts).some((account) => hasLegacyDiscordGuildChannelAgentId(account));
7982}
808381-function realtimeWakeNameWordCount(value: string): number {
82-return Array.from(value.matchAll(/[a-z0-9]+/gi)).length;
83-}
84-85-function normalizeRealtimeWakeName(value: string): string | undefined {
86-const words = Array.from(value.matchAll(/[a-z0-9]+/gi), (match) => match[0]);
87-if (words.length === 0) {
88-return undefined;
89-}
90-return words.slice(0, DISCORD_REALTIME_WAKE_NAME_MAX_WORDS).join(" ");
91-}
92-93-function isSupportedRealtimeWakeName(value: string): boolean {
94-const wordCount = realtimeWakeNameWordCount(value);
95-return wordCount >= 1 && wordCount <= DISCORD_REALTIME_WAKE_NAME_MAX_WORDS;
96-}
97-9884function hasUnsupportedRealtimeWakeNamesInVoice(value: unknown): boolean {
9985const voice = asObjectRecord(value);
10086const realtime = asObjectRecord(voice?.realtime);
10187const wakeNames = realtime?.wakeNames;
10288return Array.isArray(wakeNames)
10389 ? wakeNames.length === 0 ||
10490wakeNames.some(
105-(wakeName) => typeof wakeName === "string" && !isSupportedRealtimeWakeName(wakeName),
91+(wakeName) =>
92+typeof wakeName === "string" && !isSupportedRealtimeVoiceActivationName(wakeName),
10693)
10794 : false;
10895}
@@ -231,10 +218,10 @@ function normalizeUnsupportedRealtimeWakeNames(
231218let normalized = 0;
232219let removed = 0;
233220const nextWakeNames = wakeNames.flatMap((wakeName) => {
234-if (typeof wakeName !== "string" || isSupportedRealtimeWakeName(wakeName)) {
221+if (typeof wakeName !== "string" || isSupportedRealtimeVoiceActivationName(wakeName)) {
235222return [wakeName];
236223}
237-const nextWakeName = normalizeRealtimeWakeName(wakeName);
224+const nextWakeName = normalizeRealtimeVoiceActivationNamePrefix(wakeName);
238225if (!nextWakeName) {
239226removed += 1;
240227return [];
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。