























@@ -3,6 +3,7 @@ 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";
67import {
78getRealtimeVoiceProvider,
89listRealtimeVoiceProviders,
@@ -59,69 +60,49 @@ function splitCommand(argv: string[]): { command: string; args: string[] } {
5960return { command, args };
6061}
616262-function rawProviderConfig(params: {
63-config: GoogleMeetConfig;
64-providerId: string;
65-configuredProviderId?: string;
66-}): Record<string, unknown> {
67-const raw =
68-params.config.realtime.providers[params.configuredProviderId ?? ""] ??
69-params.config.realtime.providers[params.providerId] ??
70-{};
71-if (params.config.realtime.model && raw.model === undefined) {
72-return { ...raw, model: params.config.realtime.model };
73-}
74-return raw;
75-}
76-7763export function resolveGoogleMeetRealtimeProvider(params: {
7864config: GoogleMeetConfig;
7965fullConfig: OpenClawConfig;
8066providers?: RealtimeVoiceProviderPlugin[];
8167}): ResolvedRealtimeProvider {
8268const configuredProviderId = params.config.realtime.provider;
8369const providers = params.providers ?? listRealtimeVoiceProviders(params.fullConfig);
84-const provider = configuredProviderId
85- ? (params.providers?.find((entry) => entry.id === configuredProviderId) ??
86-getRealtimeVoiceProvider(configuredProviderId, params.fullConfig))
87- : providers
88-.toSorted((left, right) => (left.autoSelectOrder ?? 1000) - (right.autoSelectOrder ?? 1000))
89-.find((entry) => {
90-const rawConfig = rawProviderConfig({
91-config: params.config,
92-providerId: entry.id,
93-});
94-const providerConfig =
95-entry.resolveConfig?.({
96-cfg: params.fullConfig,
97- rawConfig,
98-}) ?? rawConfig;
99-return entry.isConfigured({ cfg: params.fullConfig, providerConfig });
100-});
101-102-if (!provider) {
70+const resolution = resolveConfiguredCapabilityProvider({
71+ configuredProviderId,
72+providerConfigs: params.config.realtime.providers,
73+cfg: params.fullConfig,
74+cfgForResolve: params.fullConfig,
75+getConfiguredProvider: (providerId) =>
76+params.providers?.find((entry) => entry.id === providerId) ??
77+getRealtimeVoiceProvider(providerId, params.fullConfig),
78+listProviders: () => providers,
79+resolveProviderConfig: ({ provider, cfg, rawConfig }) => {
80+const withModel =
81+params.config.realtime.model && rawConfig.model === undefined
82+ ? { ...rawConfig, model: params.config.realtime.model }
83+ : rawConfig;
84+return provider.resolveConfig?.({ cfg, rawConfig: withModel }) ?? withModel;
85+},
86+isProviderConfigured: ({ provider, cfg, providerConfig }) =>
87+provider.isConfigured({ cfg, providerConfig }),
88+});
89+90+if (!resolution.ok && resolution.code === "missing-configured-provider") {
10391throw new Error(
104-configuredProviderId
105- ? `Realtime voice provider "${configuredProviderId}" is not registered`
106- : "No configured realtime voice provider registered",
92+`Realtime voice provider "${resolution.configuredProviderId}" is not registered`,
10793);
10894}
109-110-const rawConfig = rawProviderConfig({
111-config: params.config,
112-providerId: provider.id,
113- configuredProviderId,
114-});
115-const providerConfig =
116-provider.resolveConfig?.({
117-cfg: params.fullConfig,
118- rawConfig,
119-}) ?? rawConfig;
120-if (!provider.isConfigured({ cfg: params.fullConfig, providerConfig })) {
121-throw new Error(`Realtime voice provider "${provider.id}" is not configured`);
95+if (!resolution.ok && resolution.code === "no-registered-provider") {
96+throw new Error("No configured realtime voice provider registered");
97+}
98+if (!resolution.ok) {
99+throw new Error(`Realtime voice provider "${resolution.provider?.id}" is not configured`);
122100}
123101124-return { provider, providerConfig };
102+return {
103+provider: resolution.provider,
104+providerConfig: resolution.providerConfig,
105+};
125106}
126107127108export async function startCommandRealtimeAudioBridge(params: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。