




















@@ -3,11 +3,9 @@ import type { Writable } from "node:stream";
33import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
44import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
55import type { RuntimeLogger } from "openclaw/plugin-sdk/plugin-runtime";
6-import { resolveConfiguredCapabilityProvider } from "openclaw/plugin-sdk/provider-selection-runtime";
76import {
87createRealtimeVoiceBridgeSession,
9-getRealtimeVoiceProvider,
10-listRealtimeVoiceProviders,
8+resolveConfiguredRealtimeVoiceProvider,
119type RealtimeVoiceBridgeSession,
1210type RealtimeVoiceProviderConfig,
1311type RealtimeVoiceProviderPlugin,
@@ -59,44 +57,14 @@ export function resolveGoogleMeetRealtimeProvider(params: {
5957fullConfig: OpenClawConfig;
6058providers?: RealtimeVoiceProviderPlugin[];
6159}): ResolvedRealtimeProvider {
62-const configuredProviderId = params.config.realtime.provider;
63-const providers = params.providers ?? listRealtimeVoiceProviders(params.fullConfig);
64-const resolution = resolveConfiguredCapabilityProvider({
65- configuredProviderId,
60+return resolveConfiguredRealtimeVoiceProvider({
61+configuredProviderId: params.config.realtime.provider,
6662providerConfigs: params.config.realtime.providers,
6763cfg: params.fullConfig,
68-cfgForResolve: params.fullConfig,
69-getConfiguredProvider: (providerId) =>
70-params.providers?.find((entry) => entry.id === providerId) ??
71-getRealtimeVoiceProvider(providerId, params.fullConfig),
72-listProviders: () => providers,
73-resolveProviderConfig: ({ provider, cfg, rawConfig }) => {
74-const withModel =
75-params.config.realtime.model && rawConfig.model === undefined
76- ? { ...rawConfig, model: params.config.realtime.model }
77- : rawConfig;
78-return provider.resolveConfig?.({ cfg, rawConfig: withModel }) ?? withModel;
79-},
80-isProviderConfigured: ({ provider, cfg, providerConfig }) =>
81-provider.isConfigured({ cfg, providerConfig }),
64+providers: params.providers,
65+defaultModel: params.config.realtime.model,
66+noRegisteredProviderMessage: "No configured realtime voice provider registered",
8267});
83-84-if (!resolution.ok && resolution.code === "missing-configured-provider") {
85-throw new Error(
86-`Realtime voice provider "${resolution.configuredProviderId}" is not registered`,
87-);
88-}
89-if (!resolution.ok && resolution.code === "no-registered-provider") {
90-throw new Error("No configured realtime voice provider registered");
91-}
92-if (!resolution.ok) {
93-throw new Error(`Realtime voice provider "${resolution.provider?.id}" is not configured`);
94-}
95-96-return {
97-provider: resolution.provider,
98-providerConfig: resolution.providerConfig,
99-};
10068}
1016910270export async function startCommandRealtimeAudioBridge(params: {
@@ -172,14 +140,12 @@ export async function startCommandRealtimeAudioBridge(params: {
172140provider: resolved.provider,
173141providerConfig: resolved.providerConfig,
174142instructions: params.config.realtime.instructions,
143+markStrategy: "ack-immediately",
175144audioSink: {
176145isOpen: () => !stopped,
177146sendAudio: (muLaw) => {
178147outputProcess.stdin?.write(muLaw);
179148},
180-sendMark: () => {
181-bridge?.acknowledgeMark();
182-},
183149},
184150onTranscript: (role, text, isFinal) => {
185151if (isFinal) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。