From a90bc434dd0898c30f85e1b223415eb7adf90bd1 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 3 May 2026 20:22:23 -0700 Subject: [PATCH] fix(google-meet): preserve realtime provider fallback --- CHANGELOG.md | 1 + extensions/google-meet/index.test.ts | 23 +++++++++++++++++++++++ extensions/google-meet/src/config.ts | 9 ++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd68d02d47c..b3c712ff2d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ Docs: https://docs.openclaw.ai - Google Meet: add `chrome.audioBufferBytes` for generated command-pair SoX audio commands and lower the default buffer from SoX's 8192 bytes to 4096 bytes to reduce Chrome talk-back latency. - Google Meet: split realtime provider config into agent-mode transcription and bidi-mode voice providers, and migrate legacy Gemini Live bidi configs with `doctor --fix`, so Gemini Live can back direct bidi fallback without breaking the default OpenClaw agent talk-back path. - Google Meet: expose `voiceCall.postDtmfSpeechDelayMs` in the plugin manifest schema and setup hints, so manifest-based config editing accepts the runtime-supported Twilio delay key. Thanks @vincentkoc. +- Google Meet: keep explicit non-Google `realtime.provider` values as the transcription provider compatibility fallback when `realtime.transcriptionProvider` is unset. Thanks @vincentkoc. - Telegram: render shared interactive reply buttons in reply delivery so plugin approval messages show inline keyboards. (#76238) Thanks @keshavbotagent. - Agents/cli-runner: drop a saved `claude-cli` resume sessionId at preparation time when its on-disk transcript no longer exists in `~/.claude/projects/`, so a stale binding from a half-installed `update.run` cannot trap follow-up runs (auto-reply / Telegram direct) in a `claude --resume` timeout loop; the run starts fresh and the new sessionId is written back through the existing post-run flow. (#77030; refs #77011) Thanks @openperf. - Release validation: install the cross-OS TypeScript harness through Windows-safe Node/npm shims so native Windows package checks reach the OpenClaw smoke suites instead of exiting before artifact capture. Thanks @vincentkoc. diff --git a/extensions/google-meet/index.test.ts b/extensions/google-meet/index.test.ts index fd62355bc01..bf25c84084b 100644 --- a/extensions/google-meet/index.test.ts +++ b/extensions/google-meet/index.test.ts @@ -417,6 +417,29 @@ describe("google-meet plugin", () => { }); }); + it("keeps realtime.provider as the transcription compatibility fallback", () => { + expect( + resolveGoogleMeetConfig({ + realtime: { + provider: "custom-stt", + }, + }).realtime, + ).toMatchObject({ + provider: "custom-stt", + transcriptionProvider: "custom-stt", + }); + expect( + resolveGoogleMeetConfig({ + realtime: { + provider: "google", + }, + }).realtime, + ).toMatchObject({ + provider: "google", + transcriptionProvider: "openai", + }); + }); + it("uses voiceProvider for bidi and transcriptionProvider for agent mode resolution", () => { const voiceProviders: RealtimeVoiceProviderPlugin[] = [ { diff --git a/extensions/google-meet/src/config.ts b/extensions/google-meet/src/config.ts index 327ed0d27fb..6fb80ee7093 100644 --- a/extensions/google-meet/src/config.ts +++ b/extensions/google-meet/src/config.ts @@ -443,6 +443,8 @@ export function resolveGoogleMeetConfigWithEnv( const twilio = asRecord(raw.twilio); const voiceCall = asRecord(raw.voiceCall); const realtime = asRecord(raw.realtime); + const realtimeProvider = normalizeOptionalString(realtime.provider); + const resolvedRealtimeProvider = realtimeProvider ?? DEFAULT_GOOGLE_MEET_CONFIG.realtime.provider; const oauth = asRecord(raw.oauth); const auth = asRecord(raw.auth); @@ -537,11 +539,12 @@ export function resolveGoogleMeetConfigWithEnv( realtime.strategy, DEFAULT_GOOGLE_MEET_CONFIG.realtime.strategy, ), - provider: - normalizeOptionalString(realtime.provider) ?? DEFAULT_GOOGLE_MEET_CONFIG.realtime.provider, + provider: resolvedRealtimeProvider, transcriptionProvider: normalizeOptionalString(realtime.transcriptionProvider) ?? - DEFAULT_GOOGLE_MEET_CONFIG.realtime.transcriptionProvider, + (realtimeProvider && realtimeProvider !== "google" + ? resolvedRealtimeProvider + : DEFAULT_GOOGLE_MEET_CONFIG.realtime.transcriptionProvider), voiceProvider: normalizeOptionalString(realtime.voiceProvider), model: normalizeOptionalString(realtime.model) ?? DEFAULT_GOOGLE_MEET_CONFIG.realtime.model, instructions: