Skip to main content
Plugin google-meet dołącza do spotkań pod wyraźnie podanymi adresami URL Meet w imieniu agenta OpenClaw. Jego zakres jest celowo ograniczony:
  • Dołącza wyłącznie przy użyciu adresów URL https://meet.google.com/...; nigdy nie łączy się ze spotkaniem za pomocą samodzielnie wykrytego numeru telefonu.
  • googlemeet create może utworzyć nowy adres URL Meet za pomocą interfejsu Google Meet API (lub rozwiązania zastępczego opartego na przeglądarce) i domyślnie do niego dołączyć.
  • Uczestnictwo przez Chrome korzysta z zalogowanego profilu Chrome, opcjonalnie na sparowanym węźle. Uczestnictwo przez Twilio polega na wybraniu numeru telefonu wraz z kodem PIN/DTMF za pośrednictwem pluginu połączeń głosowych; nie może ono bezpośrednio wybrać adresu URL Meet.
  • mode: "agent" (domyślnie) transkrybuje wypowiedzi uczestników za pomocą dostawcy działającego w czasie rzeczywistym, przekazuje je do skonfigurowanego agenta OpenClaw i odczytuje odpowiedź przy użyciu standardowego TTS OpenClaw. mode: "bidi" umożliwia bezpośrednie odpowiadanie przez model głosowy działający w czasie rzeczywistym. mode: "transcribe" dołącza wyłącznie w celu obserwacji, bez możliwości odpowiadania głosowego.
  • Plugin nie odtwarza automatycznego komunikatu o zgodzie po dołączeniu do rozmowy.
  • Polecenie CLI to googlemeet; meet jest zarezerwowane dla szerszych przepływów telekonferencyjnych agenta.

Szybki start

Zainstaluj lokalne zależności audio, a następnie ustaw klucz dostawcy działającego w czasie rzeczywistym. OpenAI jest domyślnym dostawcą transkrypcji w trybie agent; Google Gemini Live jest dostępny jako dostawca głosu w trybie bidi:
blackhole-2ch instaluje wirtualne urządzenie audio BlackHole 2ch, przez które Chrome kieruje dźwięk. Instalator Homebrew wymaga ponownego uruchomienia systemu, zanim macOS udostępni urządzenie:
Po ponownym uruchomieniu zweryfikuj oba elementy:
Włącz plugin:
Sprawdź konfigurację, a następnie dołącz:
Dane wyjściowe setup są czytelne dla agenta i uwzględniają tryb oraz transport: raportują profil Chrome, przypięcie węzła, a w przypadku połączeń Chrome w czasie rzeczywistym także most audio BlackHole/SoX i kontrolę opóźnionego wprowadzenia. Połączenia wyłącznie obserwacyjne pomijają wymagania wstępne trybu czasu rzeczywistego:
Gdy skonfigurowano delegowanie do Twilio, setup informuje również, czy voice-call, dane uwierzytelniające Twilio i publiczne udostępnienie Webhooka są gotowe. Każdą kontrolę ok: false należy traktować jako blokadę danego transportu lub trybu, zanim agent dołączy. Użyj --json, aby uzyskać dane wyjściowe przeznaczone do przetwarzania maszynowego, oraz --transport chrome|chrome-node|twilio, aby wcześniej sprawdzić konkretny transport:
Można też pozwolić agentowi dołączyć za pomocą narzędzia google_meet:
Na hostach Gateway innych niż macOS google_meet pozostaje dostępne dla artefaktów, kalendarza, konfiguracji, transkrypcji, Twilio i działań chrome-node, ale lokalne odpowiadanie głosowe przez Chrome (transport: "chrome" z mode: "agent" lub "bidi") jest blokowane przed dotarciem do mostu audio, ponieważ ta ścieżka obecnie zależy od BlackHole 2ch systemu macOS. Zamiast tego użyj mode: "transcribe", połączenia telefonicznego Twilio lub hosta chrome-node z systemem macOS.

Tworzenie spotkania

create ma dwie ścieżki, wskazywane w polu source wyniku:
  • api: używana, gdy skonfigurowano dane uwierzytelniające OAuth Google Meet. Jest deterministyczna i nie zależy od stanu interfejsu przeglądarki.
  • browser: używana bez danych uwierzytelniających OAuth. OpenClaw otwiera https://meet.google.com/new na przypiętym węźle Chrome i czeka, aż Google przekieruje do rzeczywistego adresu URL z kodem spotkania; profil Chrome OpenClaw na tym węźle musi być już zalogowany w Google. Zarówno dołączanie, jak i tworzenie ponownie wykorzystuje istniejącą kartę Meet (lub kartę z trwającym .../new albo monitem dotyczącym konta Google) przed otwarciem nowej; dopasowywanie kart ignoruje nieistotne ciągi zapytania, takie jak authuser.
create domyślnie dołącza i zwraca joined: true wraz z sesją dołączenia. Przekaż --no-join (CLI) lub "join": false (narzędzie), aby tylko utworzyć adres URL. W przypadku pokojów utworzonych przez API ustaw jawną zasadę dostępu zamiast dziedziczyć ustawienie domyślne konta Google:
Dotyczy to wyłącznie pokojów utworzonych przez API, dlatego OAuth musi być skonfigurowane. Jeśli uwierzytelnienie wykonano przed wprowadzeniem tej opcji, uruchom ponownie openclaw googlemeet auth login --json po dodaniu zakresu meetings.space.settings do ekranu zgody OAuth. Jeśli rozwiązanie zastępcze oparte na przeglądarce napotka blokadę logowania do Google lub uprawnień Meet, narzędzie zwróci manualActionRequired: true z manualActionReason, manualActionMessage oraz browser.nodeId/browser.targetId/browserUrl. Zgłoś ten komunikat i przestań otwierać nowe karty Meet, dopóki operator nie ukończy czynności w przeglądarce.

Dołączenie wyłącznie obserwacyjne

Ustaw "mode": "transcribe", aby pominąć dwukierunkowy most czasu rzeczywistego (bez wymagania BlackHole/SoX i bez odpowiadania głosowego). Połączenia Chrome w trybie transkrypcji pomijają także przyznawanie przez OpenClaw uprawnień do mikrofonu i kamery oraz ścieżkę Meet Use microphone; jeśli Meet wyświetli ekran wyboru dźwięku, automatyzacja najpierw spróbuje użyć opcji Continue without microphone. Zarządzane transporty Chrome w tym trybie instalują obserwator napisów Meet działający w miarę możliwości. googlemeet status --json i googlemeet doctor raportują captioning, captionsEnabledAttempted, transcriptLines, lastCaptionAt, lastCaptionSpeaker, lastCaptionText oraz końcowy fragment recentTranscript. Aby odczytać ograniczoną transkrypcję sesji, użyj dokładnie śledzonej karty Meet:
Obserwator przechowuje na stronie Meet maksymalnie 2 000 ukończonych wierszy napisów. Widoczny, stopniowo pojawiający się tekst pozostaje w końcowym fragmencie stanu kondycji do czasu ukończenia wiersza napisów, dlatego zapisanie nextIndex nie może pominąć późniejszego rozszerzenia tekstu; opuszczenie spotkania finalizuje widoczne wiersze przed wykonaniem migawki. droppedLines raportuje wiersze utracone z początku po przekroczeniu limitu. Transkrypcje czterech ostatnio zakończonych sesji pozostają dostępne do odczytu aż do ponownego uruchomienia gatewaya. Starsze zakończone transkrypcje zwracają evicted: true. Jest to celowo pamięć środowiska uruchomieniowego, a nie trwały magazyn historii spotkań: ponowne uruchomienie gatewaya, zamknięcie karty przed wykonaniem migawki lub przekroczenie udokumentowanych limitów może spowodować utratę napisów. Aby wykonać próbę nasłuchiwania z wynikiem tak/nie:
Polecenie dołącza w trybie transkrypcji, czeka na nową zmianę napisów lub transkrypcji i zwraca listenVerified, listenTimedOut, pola czynności ręcznych oraz bieżący stan kondycji napisów.

Stan sesji czasu rzeczywistego

Podczas sesji z odpowiadaniem głosowym stan google_meet raportuje kondycję Chrome i mostu audio: inCall, manualActionRequired, providerConnected, realtimeReady, audioInputActive, audioOutputActive, znaczniki czasu ostatnich danych wejściowych i wyjściowych, liczniki bajtów oraz stan zamknięcia mostu. Zarządzane sesje Chrome wypowiadają frazę wprowadzającą lub testową dopiero wtedy, gdy stan kondycji raportuje inCall: true; w przeciwnym razie speechReady: false, a próba odtworzenia mowy jest blokowana zamiast bezgłośnie niczego nie robić. Lokalne połączenia Chrome korzystają z zalogowanego profilu przeglądarki OpenClaw i wymagają BlackHole 2ch dla ścieżki mikrofonu i głośnika. Jedno urządzenie BlackHole wystarczy do pierwszego testu podstawowego, ale może powodować echo; aby uzyskać czysty dźwięk dwukierunkowy, użyj oddzielnych urządzeń wirtualnych lub grafu w stylu Loopback.

Lokalny Gateway i Chrome w Parallels

Pełny Gateway ani klucz API modelu nie są wymagane wewnątrz maszyny wirtualnej macOS, jeśli ma ona tylko udostępniać Chrome. Uruchom Gateway i agenta lokalnie, a host węzła w maszynie wirtualnej. Zainstaluj zależności maszyny wirtualnej, uruchom ją ponownie i zweryfikuj:
Włącz plugin w maszynie wirtualnej i uruchom host węzła:
Jeśli <gateway-host> jest adresem IP sieci LAN bez TLS, zezwól na użycie tej zaufanej sieci prywatnej:
Użyj tej samej flagi podczas instalowania jako LaunchAgent (jest to środowisko procesu, zapisywane w środowisku LaunchAgent, jeśli występuje w poleceniu instalacji, a nie ustawienie openclaw.json):
Zatwierdź węzeł na hoście Gateway, a następnie potwierdź, że ogłasza zarówno googlemeet.chrome, jak i funkcję przeglądarki/browser.proxy:
Skieruj Meet przez ten węzeł:
Teraz dołącz w zwykły sposób z hosta Gateway:
Aby przeprowadzić test podstawowy za pomocą jednego polecenia, które tworzy sesję lub używa istniejącej, wypowiada znaną frazę i wyświetla stan sesji:
Podczas dołączania w czasie rzeczywistym automatyzacja przeglądarki wypełnia nazwę gościa, klika Join/Ask to join i akceptuje monit Meet „Use microphone” wyświetlany przy pierwszym uruchomieniu (lub „Continue without microphone” podczas dołączania wyłącznie obserwacyjnego i tworzenia spotkania wyłącznie w przeglądarce). Jeśli profil jest wylogowany, Meet czeka na wpuszczenie przez gospodarza, Chrome wymaga uprawnień do mikrofonu lub kamery albo Meet zatrzymał się na nierozwiązanym monicie, wynik raportuje manualActionRequired: true wraz z manualActionReason i manualActionMessage. Przestań ponawiać próby, zgłoś ten komunikat wraz z browserUrl/browserTitle i spróbuj ponownie dopiero po ukończeniu czynności ręcznej. Jeśli pominięto chromeNode.node, OpenClaw dokonuje automatycznego wyboru tylko wtedy, gdy dokładnie jeden połączony Node udostępnia zarówno googlemeet.chrome, jak i sterowanie przeglądarką; gdy połączonych jest kilka odpowiednich Node’ów, przypnij chromeNode.node (identyfikator Node’a, nazwę wyświetlaną lub zdalny adres IP).

Sprawdzanie typowych błędów

Uwagi dotyczące instalacji

Domyślna funkcja zwrotnego przesyłania głosu w Chrome korzysta z dwóch zewnętrznych narzędzi, których OpenClaw nie dołącza ani nie rozpowszechnia; zainstaluj je jako zależności hosta za pomocą Homebrew:
  • sox: narzędzie audio wiersza poleceń. Plugin wydaje jawne polecenia urządzenia CoreAudio dla domyślnego mostu audio PCM16 24 kHz.
  • blackhole-2ch: wirtualny sterownik audio systemu macOS udostępniający urządzenie BlackHole 2ch, przez które przebiega trasa Chrome/Meet.
SoX jest objęty licencją LGPL-2.0-only AND GPL-2.0-only; BlackHole jest objęty licencją GPL-3.0. Jeśli tworzysz instalator lub urządzenie, które dołącza BlackHole do OpenClaw, zapoznaj się z warunkami licencji projektu BlackHole albo uzyskaj oddzielną licencję od Existential Audio.

Transporty

Chrome

Otwiera adres URL Meet za pomocą sterowania przeglądarką OpenClaw i dołącza jako zalogowany profil przeglądarki OpenClaw. W systemie macOS Plugin sprawdza przed uruchomieniem obecność BlackHole 2ch, a jeśli jest skonfigurowane, uruchamia polecenie kontroli stanu/uruchamiania mostu audio przed otwarciem Chrome. W przypadku lokalnego Chrome wybierz profil za pomocą browser.defaultProfile; parametr chrome.browserProfile jest przekazywany zamiast tego do hostów chrome-node.
Dźwięk mikrofonu/głośnika Chrome jest kierowany przez lokalny most audio OpenClaw. Jeśli BlackHole 2ch nie jest zainstalowane, próba dołączenia kończy się błędem konfiguracji zamiast dołączeniem bez ścieżki audio.

Twilio

Ścisły plan wybierania delegowany do Pluginu Voice Call. Nie analizuje stron Meet w poszukiwaniu numerów telefonów; Google Meet musi udostępniać numer telefoniczny i kod PIN do spotkania. Włącz Voice Call na hoście Gateway, a nie na Node Chrome:
Przekaż dane uwierzytelniające Twilio przez zmienne środowiskowe, aby nie przechowywać sekretów w openclaw.json:
Jeśli dostawcą głosu w czasie rzeczywistym jest OpenAI, użyj zamiast tego realtime.provider: "openai" z OPENAI_API_KEY. Po włączeniu voice-call uruchom ponownie lub przeładuj Gateway; zmiany konfiguracji Pluginu nie zaczną obowiązywać przed przeładowaniem. Sprawdź:
Gdy delegowanie Twilio jest podłączone, googlemeet setup obejmuje kontrole twilio-voice-call-plugin, twilio-voice-call-credentials i twilio-voice-call-webhook.
Aby użyć niestandardowej sekwencji, zastosuj --dtmf-sequence, dodając na początku w lub przecinki, aby wprowadzić pauzę przed kodem PIN:

OAuth i kontrola wstępna

OAuth jest opcjonalny podczas tworzenia linku Meet, ponieważ googlemeet create może użyć automatyzacji przeglądarki jako rozwiązania zapasowego. Skonfiguruj OAuth na potrzeby tworzenia przez oficjalne API, rozpoznawania przestrzeni lub kontroli wstępnej Meet Media API. Dołączanie przez Chrome/Chrome-node nigdy nie zależy od OAuth; zawsze korzysta z zalogowanego profilu Chrome, BlackHole/SoX oraz — w przypadku chrome-node — połączonego Node’a.

Tworzenie danych uwierzytelniających Google

W Google Cloud Console:
1

Utwórz lub wybierz projekt

2

Włącz Google Meet REST API

3

Skonfiguruj ekran zgody OAuth

Opcja Internal jest najprostsza dla organizacji Google Workspace. Opcja External działa w konfiguracjach osobistych/testowych; gdy aplikacja ma stan Testing, dodaj jako użytkownika testowego każde konto Google, które będzie ją autoryzować.
4

Dodaj wymagane zakresy

  • https://www.googleapis.com/auth/meetings.space.created
  • https://www.googleapis.com/auth/meetings.space.readonly
  • https://www.googleapis.com/auth/meetings.space.settings
  • https://www.googleapis.com/auth/meetings.conference.media.readonly
  • https://www.googleapis.com/auth/calendar.events.readonly (wyszukiwanie w Kalendarzu)
  • https://www.googleapis.com/auth/drive.meet.readonly (eksport treści dokumentu transkrypcji/inteligentnej notatki)
5

Utwórz identyfikator klienta OAuth

Typ aplikacji Web application. Autoryzowany identyfikator URI przekierowania:
6

Skopiuj identyfikator klienta i sekret klienta

meetings.space.created jest wymagane przez spaces.create. meetings.space.readonly rozpoznaje adresy URL/kody Meet jako przestrzenie. meetings.space.settings umożliwia OpenClaw przekazywanie ustawień SpaceConfig, takich jak accessType, podczas tworzenia pokoju przez API. meetings.conference.media.readonly służy do kontroli wstępnej Meet Media API i operacji na multimediach; Google może wymagać rejestracji w programie Developer Preview w celu faktycznego korzystania z Media API. calendar.events.readonly jest potrzebne tylko do wyszukiwania w kalendarzu za pomocą --today/--event. drive.meet.readonly jest potrzebne tylko do eksportu --include-doc-bodies. Jeśli potrzebne jest wyłącznie dołączanie przez Chrome oparte na przeglądarce, całkowicie pomiń OAuth.

Generowanie tokenu odświeżania

Skonfiguruj oauth.clientId i opcjonalnie oauth.clientSecret (lub przekaż je jako zmienne środowiskowe), a następnie uruchom:
Uruchamia to przepływ PKCE z lokalnym wywołaniem zwrotnym na http://localhost:8085/oauth2callback i wyświetla blok konfiguracji oauth z tokenem odświeżania. Dodaj --manual, aby użyć przepływu kopiowania i wklejania, gdy przeglądarka nie może uzyskać dostępu do lokalnego wywołania zwrotnego:
Dane wyjściowe JSON:
Zapisz obiekt oauth w konfiguracji Pluginu:
Jeśli token odświeżania nie powinien znajdować się w konfiguracji, preferuj zmienne środowiskowe; najpierw rozpoznawana jest konfiguracja, a następnie jako rozwiązanie zapasowe środowisko. Jeśli uwierzytelnienie przeprowadzono, zanim dostępna była obsługa tworzenia spotkań, wyszukiwania w kalendarzu lub eksportu treści dokumentów, uruchom ponownie openclaw googlemeet auth login --json, aby token odświeżania obejmował aktualny zestaw zakresów.

Weryfikowanie OAuth za pomocą narzędzia doctor

Sprawdza to, czy istnieje konfiguracja OAuth i czy token odświeżania może wygenerować token dostępu, bez ładowania środowiska wykonawczego Chrome ani wymagania połączonego Node’a. Raport zawiera wyłącznie pola stanu (ok, configured, tokenSource, expiresAt, komunikaty kontroli) i nigdy nie wyświetla tokenu dostępu, tokenu odświeżania ani sekretu klienta. Potwierdź włączenie Meet API i zakres spaces.create za pomocą testu tworzenia powodującego efekt uboczny:
Potwierdź dostęp do odczytu istniejącej przestrzeni:
Błąd 403 zwracany przez te testy zwykle oznacza, że Meet REST API jest wyłączone, token odświeżania nie ma wymaganego zakresu albo konto Google nie ma dostępu do tej przestrzeni. Błąd tokenu odświeżania oznacza, że należy ponownie uruchomić openclaw googlemeet auth login --json i zapisać nowy blok oauth. OAuth nie jest potrzebne w przypadku mechanizmu zastępczego opartego na przeglądarce; uwierzytelnianie Google pochodzi wtedy z profilu Chrome zalogowanego na wybranym węźle, a nie z konfiguracji OpenClaw. Następujące zmienne środowiskowe są akceptowane jako wartości zastępcze:
  • OPENCLAW_GOOGLE_MEET_CLIENT_ID lub GOOGLE_MEET_CLIENT_ID
  • OPENCLAW_GOOGLE_MEET_CLIENT_SECRET lub GOOGLE_MEET_CLIENT_SECRET
  • OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN lub GOOGLE_MEET_REFRESH_TOKEN
  • OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN lub GOOGLE_MEET_ACCESS_TOKEN
  • OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT lub GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT
  • OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING lub GOOGLE_MEET_DEFAULT_MEETING
  • OPENCLAW_GOOGLE_MEET_PREVIEW_ACK lub GOOGLE_MEET_PREVIEW_ACK

Rozwiązywanie, kontrola wstępna i odczytywanie artefaktów

Po utworzeniu przez Meet rekordów konferencji:
W przypadku --meeting, artifacts i attendance domyślnie używany jest najnowszy rekord konferencji; należy przekazać --all-conference-records, aby uwzględnić każdy zachowany rekord. Wyszukiwanie w kalendarzu rozwiązuje adres URL spotkania za pomocą Google Calendar przed odczytaniem artefaktów (wymaga tokenu odświeżania obejmującego zakres tylko do odczytu wydarzeń Kalendarza):
--today przeszukuje dzisiejszy kalendarz primary w celu znalezienia wydarzenia z linkiem Meet; --event <query> wyszukuje pasujący tekst wydarzenia; --calendar <id> wskazuje kalendarz inny niż główny. calendar-events wyświetla podgląd pasujących wydarzeń i oznacza, które z nich wybiorą latest/artifacts/attendance/export. Jeśli identyfikator rekordu konferencji jest już znany, można odwołać się do niego bezpośrednio:
Zamknij pokój przestrzeni utworzonej przez API:
Wywołuje spaces.endActiveConference i wymaga OAuth z zakresem meetings.space.created dla przestrzeni, którą autoryzowane konto może zarządzać. Akceptuje adres URL Meet, kod spotkania lub spaces/{id}, a następnie najpierw rozwiązuje go do zasobu przestrzeni API. Jest to niezależne od googlemeet leave: leave kończy lokalny udział OpenClaw lub udział w sesji; end-active-conference zleca Google Meet zakończenie aktywnej konferencji w tej przestrzeni. Zapisz czytelny raport:
artifacts zwraca metadane rekordu konferencji oraz metadane zasobów uczestników, nagrań, transkrypcji, ustrukturyzowanych wpisów transkrypcji i inteligentnych notatek, gdy Google je udostępnia. --no-transcript-entries pomija wyszukiwanie wpisów w przypadku dużych spotkań. attendance rozwija uczestników do wierszy sesji uczestników zawierających czas pierwszej i ostatniej obecności, łączny czas trwania sesji, flagi spóźnienia i wcześniejszego opuszczenia oraz scala zduplikowane zasoby uczestników według zalogowanego użytkownika lub nazwy wyświetlanej; --no-merge-duplicates zachowuje nieprzetworzone zasoby oddzielnie, a --late-after-minutes/--early-before-minutes dostosowują wartości progowe. export zapisuje folder zawierający summary.md, attendance.csv, transcript.md, artifacts.json, attendance.json i manifest.json. manifest.json rejestruje wybrane dane wejściowe, opcje eksportu, rekordy konferencji, pliki wyjściowe, liczby, źródło tokenu, użyte wydarzenie Kalendarza oraz ostrzeżenia o częściowym pobraniu. --zip zapisuje również przenośne archiwum obok folderu. --include-doc-bodies eksportuje tekst powiązanych Dokumentów Google z transkrypcjami i inteligentnymi notatkami za pośrednictwem Drive files.export (wymaga zakresu Drive Meet tylko do odczytu); bez niego eksport obejmuje wyłącznie metadane Meet i ustrukturyzowane wpisy transkrypcji. Częściowy błąd artefaktu (błąd wyświetlania listy inteligentnych notatek, wpisu transkrypcji lub treści dokumentu) zachowuje ostrzeżenie w podsumowaniu/manifeście zamiast powodować niepowodzenie całego eksportu. --dry-run pobiera te same dane i wyświetla manifest w formacie JSON bez tworzenia folderu ani pliku ZIP. Agenci korzystają z tych samych działań za pośrednictwem narzędzia google_meet (export, create z accessType, end_active_conference, test_listen); zobacz Narzędzie.

Test dymny na żywo

Podstawowy test dymny artefaktów/obecności wymaga meetings.space.readonly i meetings.conference.media.readonly. Wyszukiwanie w kalendarzu wymaga calendar.events.readonly. Eksport treści dokumentów z Drive wymaga drive.meet.readonly.

Przykłady tworzenia

Wyświetla identyfikator URI nowego spotkania, źródło i sesję dołączania. Z OAuth używa Meet API; bez niego korzysta z zalogowanego profilu przypiętego węzła Chrome. JSON mechanizmu zastępczego przeglądarki:
Jeśli mechanizm zastępczy przeglądarki najpierw napotka ekran logowania Google lub blokadę uprawnień Meet, google_meet zwraca ustrukturyzowane szczegóły zamiast zwykłego ciągu znaków:
JSON tworzenia przez API:
Tworzenie domyślnie dołącza do spotkania, ale Chrome/Chrome-node nadal wymaga zalogowanego profilu Google, aby dołączyć przez przeglądarkę; jeśli profil jest wylogowany, OpenClaw zgłasza manualActionRequired: true lub błąd mechanizmu zastępczego przeglądarki i prosi operatora o dokończenie logowania do Google przed ponowną próbą. Ustaw preview.enrollmentAcknowledged: true dopiero po potwierdzeniu, że projekt Cloud, podmiot OAuth i uczestnicy spotkania są zarejestrowani w programie Google Workspace Developer Preview Program dla interfejsów Meet Media API.

Konfiguracja

Typowa ścieżka agenta Chrome wymaga jedynie włączonego pluginu, BlackHole, SoX, klucza dostawcy czasu rzeczywistego oraz skonfigurowanego dostawcy TTS OpenClaw:

Wartości domyślne

chrome.audioBridgeCommand i chrome.audioBridgeHealthCommand pozwalają zewnętrznemu mostowi zarządzać całą lokalną ścieżką dźwiękową zamiast chrome.audioInputCommand/chrome.audioOutputCommand; ograniczenie dotyczące trybu, w którym można ich używać, opisano w sekcji Uwagi. Istnieje migracja openclaw doctor --fix dla starszej struktury realtime.provider: "google": przenosi ona tę intencję do realtime.voiceProvider: "google" oraz realtime.transcriptionProvider: "openai", jeśli te pola nie są jeszcze ustawione.

Opcjonalne nadpisania

ElevenLabs do słuchania i mówienia w trybie agenta:
Stały głos Meet pochodzi z messages.tts.providers.elevenlabs.speakerVoiceId. Odpowiedzi agenta mogą również używać dyrektyw [[tts:speakerVoiceId=... model=eleven_v3]] dla poszczególnych odpowiedzi, gdy włączone jest nadpisywanie modelu TTS, ale konfiguracja stanowi deterministyczną wartość domyślną dla spotkań. Podczas dołączania dzienniki pokazują transcriptionProvider=elevenlabs, a każda odpowiedź głosowa jest rejestrowana jako provider=elevenlabs model=eleven_v3 speakerVoiceId=<voiceId>. Konfiguracja wyłącznie dla Twilio:
Przy voiceCall.enabled: true (wartości domyślnej) i transporcie Twilio plugin Voice Call wysyła sekwencję DTMF przed otwarciem strumienia multimediów czasu rzeczywistego, a następnie używa zapisanego tekstu wprowadzenia jako początkowego powitania w czasie rzeczywistym. Jeśli voice-call nie jest włączone, Google Meet nadal może sprawdzić i zarejestrować plan wybierania, ale nie może nawiązać połączenia Twilio. Pozostaw voiceCall.gatewayUrl bez ustawienia, aby używać lokalnego zaufanego środowiska uruchomieniowego Gateway, które zachowuje agenta wywołującego przez cały czas trwania wywołania. Skonfigurowany adres URL Gateway pozostaje jawnym celem WebSocket i nie może uwierzytelnić pochodzenia pluginu; dołączenie agenta innego niż domyślny kończy się bezpiecznym niepowodzeniem zamiast cichego użycia innego agenta. Gdy wymagane jest kierowanie według agentów, uruchom Google Meet i Voice Call w tym samym procesie Gateway.

Narzędzie

Agenci używają narzędzia google_meet:
test_speech zawsze wymusza mode: "agent" lub "bidi" i kończy się niepowodzeniem przy próbie uruchomienia w trybie mode: "transcribe", ponieważ sesje wyłącznie obserwacyjne nie mogą emitować mowy. Wynik speechOutputVerified opiera się na wzroście liczby bajtów wyjściowego dźwięku czasu rzeczywistego podczas tego wywołania, dlatego ponownie użyta sesja ze starszym dźwiękiem nie jest uznawana za nową kontrolę. W przypadku transportów Chrome leave pozostawia otwartą ponownie używaną kartę należącą do użytkownika po kliknięciu przycisku opuszczenia rozmowy w Meet. Karty otwarte przez OpenClaw są zamykane po opuszczeniu spotkania. Użyj transport: "chrome", gdy Chrome działa na hoście Gateway, a transport: "chrome-node", gdy działa na sparowanym Node. W obu przypadkach dostawcy modeli i openclaw_agent_consult działają na hoście Gateway, więc dane uwierzytelniające modeli pozostają na nim. Dzienniki trybu agenta zawierają rozpoznanego dostawcę/model transkrypcji podczas uruchamiania mostka oraz dostawcę/model/głos/format wyjściowy/częstotliwość próbkowania TTS po każdej zsyntetyzowanej odpowiedzi. Surowa wartość mode: "realtime" jest nadal akceptowana jako starszy alias zgodności dla mode: "agent", ale nie jest już ogłaszana w wyliczeniu mode narzędzia. create z pokojem obsługiwanym przez API i jawną polityką dostępu:
Kończenie aktywnej konferencji w znanym pokoju:
Walidacja najpierw przez nasłuchiwanie przed uznaniem spotkania za użyteczne:
Mówienie na żądanie:
status zawiera stan Chrome, gdy jest dostępny:

Tryby agenta i bidi

Tryb agent: dostawca transkrypcji czasu rzeczywistego odbiera dźwięk spotkania, końcowe transkrypcje uczestników są kierowane przez skonfigurowanego agenta OpenClaw, a odpowiedź jest wypowiadana za pomocą standardowego TTS OpenClaw. Sąsiadujące fragmenty końcowej transkrypcji są scalane przed konsultacją, aby jedna wypowiedź nie generowała kilku nieaktualnych częściowych odpowiedzi; wejście czasu rzeczywistego jest wstrzymywane, dopóki dźwięk asystenta w kolejce nadal jest odtwarzany, a niedawne echa transkrypcji przypominające wypowiedzi asystenta są ignorowane przed konsultacją, aby pętla zwrotna BlackHole nie powodowała odpowiadania agenta na własną mowę. Tryb bidi: model głosowy czasu rzeczywistego odpowiada bezpośrednio i może wywołać openclaw_agent_consult, aby uzyskać pogłębione rozumowanie, aktualne informacje lub zwykłe narzędzia OpenClaw. Narzędzie konsultacyjne uruchamia w tle zwykłego agenta OpenClaw z kontekstem niedawnej transkrypcji spotkania i zwraca zwięzłą odpowiedź do wypowiedzenia; w trybie agent OpenClaw wysyła tę odpowiedź bezpośrednio do TTS, a w trybie bidi model głosowy czasu rzeczywistego może ją wypowiedzieć. Używa tego samego współdzielonego mechanizmu konsultacji co Voice Call. Domyślnie konsultacje są uruchamiane względem agenta main; ustaw realtime.agentId, aby skierować kanał Meet do dedykowanego obszaru roboczego agenta, domyślnych modeli, polityki narzędzi, pamięci i historii sesji. Konsultacje w trybie agenta używają klucza sesji agent:<id>:subagent:google-meet:<session> przypisanego do spotkania, dzięki czemu pytania uzupełniające zachowują kontekst spotkania, a jednocześnie dziedziczą zwykłą politykę agenta. Gdy agent wywołuje google_meet w trybie agenta, sesja konsultanta tworzy odgałęzienie bieżącej transkrypcji wywołującego przed odpowiedzią na wypowiedź uczestnika; sesja Meet pozostaje oddzielna, więc pytania uzupełniające ze spotkania nie modyfikują bezpośrednio transkrypcji wywołującego. realtime.toolPolicy steruje przebiegiem konsultacji: Klucz sesji konsultacji ma zakres pojedynczej sesji Meet, dlatego kolejne wywołania konsultacji podczas tego samego spotkania ponownie wykorzystują wcześniejszy kontekst konsultacji. Wymuszenie głosowej kontroli gotowości po pełnym dołączeniu Chrome:
Pełny test dymny dołączenia i mówienia:

Lista kontrolna testu na żywo

Przed przekazaniem spotkania agentowi działającemu bez nadzoru:
Oczekiwany stan Chrome-node:
  • googlemeet setup ma wszystkie wskaźniki zielone i zawiera chrome-node-connected, gdy Chrome-node jest domyślnym transportem lub przypięto Node.
  • nodes status pokazuje wybrany połączony Node, ogłaszający zarówno googlemeet.chrome, jak i browser.proxy.
  • Karta Meet dołącza, a test-speech zwraca stan Chrome z inCall: true.
W przypadku zdalnego hosta Chrome, takiego jak maszyna wirtualna Parallels z macOS, najkrótsza bezpieczna kontrola po aktualizacji Gateway lub maszyny wirtualnej:
Dowodzi to, że plugin Gateway został załadowany, Node maszyny wirtualnej jest połączony z użyciem bieżącego tokenu, a mostek dźwiękowy Meet jest dostępny, zanim agent otworzy kartę rzeczywistego spotkania. W przypadku testu dymnego Twilio użyj spotkania udostępniającego dane telefoniczne do dołączenia:
Oczekiwany stan Twilio:
  • googlemeet setup obejmuje pomyślne testy twilio-voice-call-plugin, twilio-voice-call-credentials i twilio-voice-call-webhook.
  • voicecall jest dostępne w CLI po ponownym wczytaniu Gateway.
  • Zwrócona sesja ma transport: "twilio" oraz twilio.voiceCallId.
  • openclaw logs --follow pokazuje, że TwiML DTMF jest udostępniany przed TwiML czasu rzeczywistego, a następnie ustanawiany jest most czasu rzeczywistego z powitaniem dodanym do kolejki.
  • googlemeet leave <sessionId> rozłącza delegowane połączenie głosowe.

Rozwiązywanie problemów

Agent nie widzi narzędzia Google Meet

Należy potwierdzić, że plugin jest włączony, i ponownie wczytać Gateway; działający agent widzi tylko narzędzia pluginów zarejestrowane przez bieżący proces Gateway:
Na hostach Gateway innych niż macOS opcja google_meet pozostaje widoczna, ale lokalne działania zwrotnego przesyłania mowy w Chrome są blokowane, zanim dotrą do mostu audio. Zamiast domyślnej ścieżki lokalnego agenta Chrome należy użyć mode: "transcribe", połączenia telefonicznego Twilio lub hosta macOS chrome-node.

Brak połączonego węzła obsługującego Google Meet

Na hoście węzła:
Na hoście Gateway:
Węzeł musi być połączony i zawierać na liście googlemeet.chrome oraz browser.proxy; konfiguracja Gateway musi zezwalać na oba polecenia:
Jeśli googlemeet setup nie przechodzi chrome-node-connected lub dziennik Gateway zgłasza gateway token mismatch, należy ponownie zainstalować lub uruchomić węzeł z bieżącym tokenem Gateway:
Następnie należy ponownie wczytać usługę węzła i ponownie uruchomić:

Przeglądarka się otwiera, ale agent nie może dołączyć

Należy uruchomić googlemeet test-listen w celu dołączenia wyłącznie w trybie obserwacji lub googlemeet test-speech w celu dołączenia w czasie rzeczywistym, a następnie sprawdzić zwrócony stan Chrome. Jeśli którekolwiek zgłasza manualActionRequired: true, należy pokazać operatorowi manualActionMessage i nie ponawiać prób do czasu ukończenia działania w przeglądarce. Typowe działania ręczne: zalogowanie się w profilu Chrome; wpuszczenie gościa z konta gospodarza Meet; przyznanie Chrome uprawnień do mikrofonu i kamery po wyświetleniu natywnego monitu; zamknięcie lub naprawienie zablokowanego okna uprawnień Meet. Nie należy zgłaszać „braku zalogowania” tylko dlatego, że Meet pyta „Do you want people to hear you in the meeting?”; jest to ekran pośredni wyboru dźwięku w Meet. OpenClaw klika Use microphone za pomocą automatyzacji przeglądarki, gdy jest to możliwe, i nadal oczekuje na właściwy stan spotkania; w przypadku awaryjnego użycia przeglądarki wyłącznie do utworzenia spotkania może zamiast tego kliknąć Continue without microphone, ponieważ wygenerowanie adresu URL nie wymaga ścieżki dźwięku w czasie rzeczywistym.

Nie można utworzyć spotkania

googlemeet create używa interfejsu Meet API spaces.create, gdy skonfigurowano OAuth, a w przeciwnym razie przypiętej przeglądarki Chrome węzła. Należy potwierdzić:
  • Tworzenie przez API: dostępne są oauth.clientId i oauth.refreshToken (lub odpowiadające im zmienne środowiskowe OPENCLAW_GOOGLE_MEET_*), a token odświeżania został wygenerowany po dodaniu obsługi tworzenia; starsze tokeny mogą nie mieć meetings.space.created, dlatego należy ponownie uruchomić openclaw googlemeet auth login --json.
  • Awaryjne użycie przeglądarki: defaultTransport: "chrome-node" i chromeNode.node wskazują połączony węzeł z browser.proxy oraz googlemeet.chrome; profil OpenClaw w Chrome na tym węźle jest zalogowany i może otworzyć https://meet.google.com/new.
  • Ponawianie awaryjnego użycia przeglądarki: przed otwarciem nowej karty należy ponownie użyć istniejącej karty .../new lub monitu konta Google; należy ponowić wywołanie narzędzia zamiast ręcznie otwierać kolejną kartę.
  • Działanie ręczne: jeśli narzędzie zwróci manualActionRequired: true, należy użyć browser.nodeId, browser.targetId, browserUrl i manualActionMessage, aby pokierować operatorem; nie należy ponawiać prób w pętli.
  • Ekran pośredni wyboru dźwięku: jeśli Meet wyświetla „Do you want people to hear you in the meeting?”, należy pozostawić kartę otwartą. OpenClaw powinien kliknąć Use microphone lub — tylko podczas tworzenia — Continue without microphone i nadal oczekiwać na wygenerowany adres URL; jeśli nie może tego zrobić, błąd powinien wskazywać meet-audio-choice-required, a nie google-login-required.

Agent dołącza, ale nie mówi

Należy użyć mode: "agent" dla ścieżki STT -> agent OpenClaw -> TTS, a mode: "bidi" dla bezpośredniego awaryjnego trybu głosowego czasu rzeczywistego. mode: "transcribe" celowo nie uruchamia mostu zwrotnego przesyłania mowy. Podczas debugowania wyłącznie w trybie obserwacji należy uruchomić openclaw googlemeet status --json <session-id>, gdy uczestnicy zaczną mówić, i sprawdzić captioning, transcriptLines, lastCaptionText. Jeśli inCall ma wartość true, ale transcriptLines pozostaje 0, napisy w Meet mogą być wyłączone, nikt nie odezwał się od czasu zainstalowania obserwatora, interfejs Meet mógł się zmienić albo napisy na żywo mogą być niedostępne dla danego języka spotkania lub konta. googlemeet test-speech zawsze sprawdza ścieżkę czasu rzeczywistego i informuje, czy dla danego wywołania zaobserwowano bajty wyjściowe mostu. Jeśli speechOutputVerified ma wartość false, a speechOutputTimedOut ma wartość true, dostawca czasu rzeczywistego mógł zaakceptować wypowiedź, ale OpenClaw nie wykrył nowych bajtów wyjściowych docierających do mostu audio Chrome. Należy również sprawdzić: klucz dostawcy czasu rzeczywistego (OPENAI_API_KEY lub GEMINI_API_KEY) jest dostępny na hoście Gateway; BlackHole 2ch jest widoczny na hoście Chrome; istnieje tam sox; mikrofon i głośnik Meet są kierowane przez wirtualną ścieżkę audio (doctor powinien pokazywać meet output routed: yes dla lokalnych połączeń Chrome w czasie rzeczywistym). googlemeet doctor [session-id] wyświetla sesję, węzeł, stan połączenia, przyczynę konieczności ręcznego działania, połączenie z dostawcą czasu rzeczywistego, realtimeReady, aktywność wejścia i wyjścia audio, znaczniki czasu ostatniej aktywności audio, liczniki bajtów oraz adres URL przeglądarki. Należy użyć googlemeet status [session-id] --json dla nieprzetworzonego formatu JSON oraz googlemeet doctor --oauth (z dodatkiem --meeting lub --create-space), aby zweryfikować odświeżanie OAuth bez ujawniania tokenów. Jeśli agent przekroczył limit czasu, a karta Meet jest już otwarta, należy ją sprawdzić bez otwierania kolejnej:
Odpowiadającym działaniem narzędzia jest recover_current_tab: aktywuje ono i sprawdza istniejącą kartę Meet dla wybranego transportu (lokalne sterowanie przeglądarką dla chrome, skonfigurowany węzeł dla chrome-node) bez otwierania nowej karty ani sesji oraz zgłasza bieżącą przeszkodę (logowanie, wpuszczenie, uprawnienia, stan wyboru dźwięku). Polecenie CLI komunikuje się ze skonfigurowanym Gateway, który musi być uruchomiony; chrome-node wymaga również połączenia węzła.

Testy konfiguracji Twilio kończą się niepowodzeniem

twilio-voice-call-plugin kończy się niepowodzeniem, gdy voice-call nie jest dozwolone lub włączone: należy dodać je do plugins.allow, włączyć plugins.entries.voice-call i ponownie wczytać Gateway. twilio-voice-call-credentials kończy się niepowodzeniem, gdy backend Twilio nie ma identyfikatora SID konta, tokenu uwierzytelniającego lub numeru wywołującego:
twilio-voice-call-webhook kończy się niepowodzeniem, gdy voice-call nie ma publicznie dostępnego Webhooka lub publicUrl wskazuje przestrzeń adresową pętli zwrotnej albo sieci prywatnej. Nie należy używać localhost, 127.0.0.1, 0.0.0.0, 10.x, 172.16.x-172.31.x, 192.168.x, 169.254.x, fc00::/7 ani fd00::/8 jako publicUrl; wywołania zwrotne operatora nie mogą dotrzeć do tych adresów. Należy ustawić plugins.entries.voice-call.config.publicUrl na publiczny adres URL lub skonfigurować udostępnienie przez tunel/Tailscale:
W przypadku programowania lokalnego należy użyć tunelu lub udostępnienia Tailscale zamiast adresu URL prywatnego hosta:
Należy ponownie uruchomić lub wczytać Gateway, a następnie wykonać:
Domyślnie voicecall smoke służy wyłącznie do sprawdzania gotowości. Aby przeprowadzić próbę bez wykonywania połączenia dla określonego numeru:
Opcję --yes należy dodać tylko w celu świadomego wykonania rzeczywistego połączenia wychodzącego:

Połączenie Twilio się rozpoczyna, ale nigdy nie dołącza do spotkania

Należy potwierdzić, że wydarzenie Meet udostępnia dane telefonicznego dołączania, i przekazać dokładny numer telefoniczny oraz PIN lub niestandardową sekwencję DTMF:
Aby dodać pauzę przed kodem PIN, należy użyć początkowych znaków w lub przecinków w --dtmf-sequence. Jeśli połączenie zostało utworzone, ale uczestnik telefoniczny nigdy nie pojawia się na liście Meet:
  • openclaw googlemeet doctor <session-id>: należy potwierdzić identyfikator delegowanego połączenia Twilio, sprawdzić, czy DTMF został dodany do kolejki i czy zażądano powitania.
  • openclaw voicecall status --call-id <id>: należy potwierdzić, że połączenie jest nadal aktywne.
  • openclaw voicecall tail: należy potwierdzić, że Webhooki Twilio docierają do Gateway.
  • openclaw logs --follow: należy odszukać sekwencję Twilio Meet: Google Meet deleguje dołączenie, Voice Call zapisuje i udostępnia TwiML DTMF przed połączeniem, Voice Call udostępnia TwiML czasu rzeczywistego dla połączenia Twilio, a następnie Google Meet żąda odtworzenia powitania za pomocą voicecall.speak.
  • Należy ponownie uruchomić openclaw googlemeet setup --transport twilio; pomyślny wynik testu konfiguracji jest wymagany, ale nie dowodzi poprawności sekwencji PIN spotkania.
  • Należy potwierdzić, że numer telefoniczny należy do tego samego zaproszenia i regionu Meet co kod PIN.
  • Należy zwiększyć voiceCall.dtmfDelayMs względem domyślnych 12 sekund, jeśli Meet odpowiada powoli lub transkrypcja połączenia nadal zawiera monit o PIN po wysłaniu DTMF przed połączeniem.
  • Jeśli uczestnik dołącza, ale powitanie nie jest słyszalne, należy sprawdzić openclaw logs --follow pod kątem żądania voicecall.speak po DTMF oraz odtwarzania TTS przez strumień multimedialny albo awaryjnego mechanizmu Twilio <Say>. Jeśli transkrypcja nadal zawiera komunikat „enter the meeting PIN”, telefoniczna część połączenia nie dołączyła jeszcze do pokoju Meet, dlatego uczestnicy nie usłyszą mowy.
Jeśli Webhooki nie docierają, należy najpierw debugować plugin Voice Call: dostawca musi mieć dostęp do plugins.entries.voice-call.config.publicUrl lub skonfigurowanego tunelu. Zobacz Rozwiązywanie problemów z połączeniami głosowymi.

Uwagi

Oficjalny interfejs API multimediów Google Meet jest ukierunkowany na odbieranie, dlatego przesyłanie mowy do połączenia nadal wymaga ścieżki uczestnika. Ten plugin wyraźnie zachowuje tę granicę: Chrome obsługuje uczestnictwo przez przeglądarkę i lokalne kierowanie dźwięku; Twilio obsługuje uczestnictwo przez połączenie telefoniczne. Tryby zwrotnego przesyłania mowy w Chrome wymagają BlackHole 2ch oraz jednego z następujących elementów:
  • chrome.audioInputCommand oraz chrome.audioOutputCommand: OpenClaw zarządza mostem i przesyła dźwięk w chrome.audioFormat między tymi poleceniami a wybranym dostawcą. Tryb agent korzysta z transkrypcji w czasie rzeczywistym oraz zwykłego TTS; tryb bidi korzysta z dostawcy głosu działającego w czasie rzeczywistym. Domyślna ścieżka to PCM16 24 kHz z chrome.audioBufferBytes: 4096; G.711 mu-law 8 kHz pozostaje dostępny dla starszych par poleceń.
  • chrome.audioBridgeCommand: zewnętrzne polecenie mostu zarządza całą lokalną ścieżką dźwięku i musi zakończyć działanie po uruchomieniu lub zweryfikowaniu swojego demona. Obowiązuje tylko dla bidi, ponieważ tryb agent wymaga bezpośredniego dostępu do pary poleceń na potrzeby TTS.
W przypadku mostu Chrome opartego na parze poleceń chrome.bargeInInputCommand może nasłuchiwać z oddzielnego lokalnego mikrofonu i wyciszać odtwarzanie odpowiedzi asystenta, gdy człowiek zaczyna mówić, dzięki czemu mowa człowieka ma pierwszeństwo przed dźwiękiem asystenta, nawet gdy współdzielone wejście pętli zwrotnej BlackHole jest tymczasowo wyciszone podczas odtwarzania odpowiedzi asystenta. Podobnie jak chrome.audioInputCommand/chrome.audioOutputCommand, jest to lokalne polecenie konfigurowane przez operatora: należy używać jawnej, zaufanej ścieżki polecenia lub listy argumentów, nigdy skryptu z niezaufanej lokalizacji. Aby uzyskać czysty dźwięk dupleksowy, należy kierować wyjście Meet i mikrofon Meet przez oddzielne urządzenia wirtualne lub graf urządzeń wirtualnych w stylu Loopback; pojedyncze współdzielone urządzenie BlackHole może powodować przesyłanie echa innych uczestników z powrotem do połączenia. googlemeet speak uruchamia aktywny most dźwiękowy odpowiedzi głosowej dla sesji Chrome; googlemeet leave go zatrzymuje (a w przypadku sesji Twilio delegowanych przez Voice Call rozłącza połączenie bazowe). Użyj googlemeet end-active-conference, aby zamknąć również aktywną konferencję Google Meet dla przestrzeni zarządzanej przez API.

Powiązane