Plugin guides
Plugin Google Meet
دعم المشاركين في Google Meet لـ OpenClaw — يكون الـ Plugin صريحًا حسب التصميم:
- لا ينضم إلا إلى عنوان URL صريح بصيغة
https://meet.google.com/.... - يمكنه إنشاء مساحة Meet جديدة عبر Google Meet API، ثم الانضمام إلى عنوان URL المُعاد.
agentهو وضع الرد الصوتي الافتراضي: يستمع النسخ الفوري، ويجيب وكيل OpenClaw المُكوَّن، ويتحدث OpenClaw TTS العادي داخل Meet.- يظل
bidiمتاحًا كوضع احتياطي لنموذج الصوت الفوري المباشر. - تختار الوكلاء سلوك الانضمام باستخدام
mode: استخدمagentللاستماع/الرد الصوتي المباشر، أوbidiكاحتياطي صوت فوري مباشر، أوtranscribeللانضمام/التحكم في المتصفح دون جسر الرد الصوتي. - تبدأ المصادقة كـ Google OAuth شخصي أو كملف Chrome شخصي مسجّل دخوله مسبقًا.
- لا يوجد إعلان موافقة تلقائي.
- واجهة الصوت الافتراضية في Chrome هي
BlackHole 2ch. - يمكن تشغيل Chrome محليًا أو على مضيف Node مقترن.
- يقبل Twilio رقم اتصال هاتفي مع PIN اختياري أو تسلسل DTMF؛ ولا يمكنه الاتصال بعنوان URL لـ Meet مباشرة.
- أمر CLI هو
googlemeet؛ وmeetمحجوز لتدفقات مؤتمرات الوكلاء الأوسع.
البدء السريع
ثبّت تبعيات الصوت المحلية واضبط مزود نسخ فوريًا إضافةً إلى OpenClaw TTS
العادي. OpenAI هو مزود النسخ الافتراضي؛ ويعمل Google Gemini Live أيضًا
كاحتياطي صوت bidi منفصل مع realtime.voiceProvider: "google":
brew install blackhole-2ch soxexport OPENAI_API_KEY=sk-...# only needed when realtime.voiceProvider is "google" for bidi modeexport GEMINI_API_KEY=...يثبّت blackhole-2ch جهاز الصوت الافتراضي BlackHole 2ch. يتطلب مثبّت
Homebrew إعادة تشغيل قبل أن يعرض macOS الجهاز:
sudo rebootبعد إعادة التشغيل، تحقق من الجزأين:
system_profiler SPAudioDataType | grep -i BlackHolecommand -v soxفعّل الـ Plugin:
{ plugins: { entries: { "google-meet": { enabled: true, config: {}, }, }, },}تحقق من الإعداد:
openclaw googlemeet setupمخرجات الإعداد مصممة لتكون قابلة للقراءة من الوكيل ومراعية للوضع. تعرض ملف
Chrome الشخصي، وتثبيت Node، وبالنسبة لانضمامات Chrome الفورية، جسر الصوت
BlackHole/SoX وفحوصات المقدمة الفورية المؤجلة. بالنسبة لانضمامات المراقبة فقط،
تحقق من النقل نفسه باستخدام --mode transcribe؛ يتخطى هذا الوضع متطلبات
الصوت الفوري لأنه لا يستمع عبر الجسر ولا يتحدث عبره:
openclaw googlemeet setup --transport chrome-node --mode transcribeعند ضبط تفويض Twilio، يعرض الإعداد أيضًا ما إذا كان Plugin voice-call
وبيانات اعتماد Twilio وتعرّض الـ Webhook العام جاهزة. تعامل مع أي فحص
ok: false كحاجز للنقل والوضع المفحوصين قبل أن تطلب من وكيل الانضمام.
استخدم openclaw googlemeet setup --json للسكربتات أو المخرجات القابلة
للقراءة آليًا. استخدم --transport chrome أو --transport chrome-node أو
--transport twilio لإجراء فحص مسبق لنقل محدد قبل أن يجربه وكيل.
بالنسبة إلى Twilio، أجرِ دائمًا فحصًا مسبقًا للنقل صراحةً عندما يكون النقل الافتراضي هو Chrome:
openclaw googlemeet setup --transport twilioيلتقط ذلك نقص توصيل voice-call، أو بيانات اعتماد Twilio، أو تعرّض Webhook
غير القابل للوصول قبل أن يحاول الوكيل الاتصال بالاجتماع.
انضم إلى اجتماع:
openclaw googlemeet join https://meet.google.com/abc-defg-hijأو دع وكيلًا ينضم عبر أداة google_meet:
{ "action": "join", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "mode": "agent"}تظل أداة google_meet الموجهة للوكلاء متاحة على مضيفين غير macOS لتدفقات
الأثر، والتقويم، والإعداد، والنسخ، وTwilio، وchrome-node. تُحظر إجراءات
الرد الصوتي المحلية في Chrome هناك لأن مسار صوت Chrome المضمّن يعتمد حاليًا
على BlackHole 2ch في macOS. على Linux، استخدم mode: "transcribe"، أو
الاتصال الهاتفي عبر Twilio، أو مضيف chrome-node يعمل على macOS للمشاركة
بالرد الصوتي عبر Chrome.
أنشئ اجتماعًا جديدًا وانضم إليه:
openclaw googlemeet create --transport chrome-node --mode agentبالنسبة إلى الغرف المنشأة عبر API، استخدم Google Meet SpaceConfig.accessType
عندما تريد أن تكون سياسة عدم الطرق الخاصة بالغرفة صريحة بدلًا من وراثتها من
افتراضات حساب Google:
openclaw googlemeet create --access-type OPEN --transport chrome-node --mode agentيسمح OPEN لأي شخص لديه عنوان URL لـ Meet بالانضمام دون طرق. يسمح TRUSTED
للمستخدمين الموثوقين في مؤسسة المضيف، والمستخدمين الخارجيين المدعوين،
ومستخدمي الاتصال الهاتفي بالانضمام دون طرق. يقيّد RESTRICTED الدخول دون
طرق على المدعوين. تنطبق هذه الإعدادات فقط على مسار الإنشاء الرسمي عبر
Google Meet API، لذلك يجب ضبط بيانات اعتماد OAuth.
إذا صادقت Google Meet قبل إتاحة هذا الخيار، فأعد تشغيل
openclaw googlemeet auth login --json بعد إضافة نطاق
meetings.space.settings إلى شاشة موافقة Google OAuth لديك.
أنشئ عنوان URL فقط دون الانضمام:
openclaw googlemeet create --no-joinلدى googlemeet create مساران:
- إنشاء API: يُستخدم عند ضبط بيانات اعتماد Google Meet OAuth. هذا هو المسار الأكثر حتمية ولا يعتمد على حالة واجهة المتصفح.
- احتياطي المتصفح: يُستخدم عند غياب بيانات اعتماد OAuth. يستخدم OpenClaw
Chrome Node المثبت، ويفتح
https://meet.google.com/new، وينتظر أن يعيد Google التوجيه إلى عنوان URL حقيقي برمز اجتماع، ثم يعيد ذلك العنوان. يتطلب هذا المسار أن يكون ملف Chrome الشخصي الخاص بـ OpenClaw على الـ Node مسجّل الدخول مسبقًا إلى Google. تتعامل أتمتة المتصفح مع مطالبة الميكروفون الأولى الخاصة بـ Meet؛ ولا تُعامل تلك المطالبة كفشل تسجيل دخول إلى Google. تحاول تدفقات الانضمام والإنشاء أيضًا إعادة استخدام تبويب Meet موجود قبل فتح تبويب جديد. تتجاهل المطابقة سلاسل استعلام URL غير الضارة مثلauthuser، لذلك ينبغي أن يركز إعادة المحاولة من الوكيل على الاجتماع المفتوح مسبقًا بدلًا من إنشاء تبويب Chrome ثانٍ.
تتضمن مخرجات الأمر/الأداة حقل source (api أو browser) حتى تتمكن
الوكلاء من شرح المسار المستخدم. ينضم create إلى الاجتماع الجديد افتراضيًا
ويعيد joined: true إضافةً إلى جلسة الانضمام. لاستخراج عنوان URL فقط،
استخدم create --no-join في CLI أو مرر "join": false إلى الأداة.
أو قل لوكيل: "أنشئ Google Meet، وانضم إليه بوضع الرد الصوتي الخاص بالوكيل،
وأرسل لي الرابط." ينبغي للوكيل استدعاء google_meet مع
action: "create" ثم مشاركة meetingUri المُعاد.
{ "action": "create", "transport": "chrome-node", "mode": "agent"}لانضمام مراقبة فقط/تحكم بالمتصفح، اضبط "mode": "transcribe". لا يبدأ ذلك
جسر الصوت الفوري ثنائي الاتجاه، ولا يتطلب BlackHole أو SoX، ولن يرد صوتيًا
داخل الاجتماع. تتجنب انضمامات Chrome في هذا الوضع أيضًا منح إذن
الميكروفون/الكاميرا من OpenClaw وتتجنب مسار Meet Use microphone. إذا عرض
Meet فاصلة اختيار الصوت، تحاول الأتمتة مسار عدم استخدام الميكروفون، وإلا
تبلغ عن إجراء يدوي بدلًا من فتح الميكروفون المحلي. في وضع النسخ، تثبّت
وسائل نقل Chrome المُدارة أيضًا مراقب تسميات توضيحية لـ Meet بأفضل جهد.
يعرض googlemeet status --json وgooglemeet doctor قيم captioning،
وcaptionsEnabledAttempted، وtranscriptLines، وlastCaptionAt،
وlastCaptionSpeaker، وlastCaptionText، وذيل recentTranscript قصيرًا
حتى يتمكن المشغّلون من معرفة ما إذا كان المتصفح قد انضم إلى المكالمة وما إذا
كانت تسميات Meet التوضيحية تنتج نصًا.
استخدم openclaw googlemeet test-listen <meet-url> --transport chrome-node
عندما تحتاج إلى فحص نعم/لا: ينضم في وضع النسخ، وينتظر حركة جديدة في التسمية
التوضيحية أو النص المنسوخ، ويعيد listenVerified، وlistenTimedOut، وحقول
الإجراء اليدوي، وآخر حالة لصحة التسميات التوضيحية.
أثناء الجلسات الفورية، تتضمن حالة google_meet صحة المتصفح وجسر الصوت مثل
inCall، وmanualActionRequired، وproviderConnected، وrealtimeReady،
وaudioInputActive، وaudioOutputActive، والطوابع الزمنية لآخر إدخال/إخراج،
وعدادات البايت، وحالة إغلاق الجسر. إذا ظهرت مطالبة آمنة في صفحة Meet،
تتعامل معها أتمتة المتصفح عندما تستطيع. يُبلغ عن مطالبات تسجيل الدخول،
وقبول المضيف، وأذونات المتصفح/نظام التشغيل كإجراء يدوي مع سبب ورسالة لكي
ينقلها الوكيل. لا تصدر جلسات Chrome المُدارة عبارة المقدمة أو الاختبار إلا
بعد أن تبلغ صحة المتصفح inCall: true؛ وإلا تعرض الحالة speechReady: false
وتُحظر محاولة الكلام بدلًا من التظاهر بأن الوكيل تحدث داخل الاجتماع.
تنضم جلسات Chrome المحلية عبر ملف متصفح OpenClaw الشخصي مسجّل الدخول. يتطلب
الوضع الفوري BlackHole 2ch لمسار الميكروفون/مكبر الصوت الذي يستخدمه
OpenClaw. للحصول على صوت ثنائي الاتجاه نظيف، استخدم أجهزة افتراضية منفصلة
أو رسمًا بيانيًا بنمط Loopback؛ يكفي جهاز BlackHole واحد لاختبار دخان أولي
لكنه قد يسبب صدى.
Gateway محلي + Chrome في Parallels
لا تحتاج إلى Gateway كامل من OpenClaw أو مفتاح model API داخل جهاز macOS افتراضي لمجرد أن تجعل الجهاز الافتراضي يمتلك Chrome. شغّل Gateway والوكيل محليًا، ثم شغّل مضيف Node داخل الجهاز الافتراضي. فعّل الـ Plugin المضمّن على الجهاز الافتراضي مرة واحدة حتى يعلن الـ Node عن أمر Chrome:
ما الذي يعمل وأين:
- مضيف Gateway: OpenClaw Gateway، ومساحة عمل الوكيل، ومفاتيح model/API، ومزود الوقت الفوري، وضبط Plugin Google Meet.
- جهاز Parallels macOS الافتراضي: OpenClaw CLI/مضيف Node، وGoogle Chrome، وSoX، وBlackHole 2ch، وملف Chrome شخصي مسجّل الدخول إلى Google.
- غير مطلوب في الجهاز الافتراضي: خدمة Gateway، أو ضبط الوكيل، أو مفتاح OpenAI/GPT، أو إعداد مزود النموذج.
ثبّت تبعيات الجهاز الافتراضي:
brew install blackhole-2ch soxأعد تشغيل الجهاز الافتراضي بعد تثبيت BlackHole حتى يعرض macOS
BlackHole 2ch:
sudo rebootبعد إعادة التشغيل، تحقق من أن الجهاز الافتراضي يمكنه رؤية جهاز الصوت وأوامر SoX:
system_profiler SPAudioDataType | grep -i BlackHolecommand -v soxثبّت OpenClaw أو حدّثه في الجهاز الافتراضي، ثم فعّل الـ Plugin المضمّن هناك:
openclaw plugins enable google-meetابدأ مضيف Node في الجهاز الافتراضي:
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macosإذا كان <gateway-host> عنوان IP على LAN ولا تستخدم TLS، يرفض الـ Node
اتصال WebSocket غير المشفر ما لم تشترك صراحةً في تلك الشبكة الخاصة الموثوقة:
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macosاستخدم متغير البيئة نفسه عند تثبيت الـ Node كـ LaunchAgent:
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --forceopenclaw node restartOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 هو بيئة العملية، وليس إعدادًا في
openclaw.json. يخزّنه openclaw node install في بيئة LaunchAgent عندما
يكون موجودًا في أمر التثبيت.
وافق على الـ Node من مضيف Gateway:
openclaw devices listopenclaw devices approve <requestId>تأكد من أن Gateway يرى الـ Node وأنه يعلن كلاً من googlemeet.chrome وقدرة
المتصفح/browser.proxy:
openclaw nodes statusوجّه Meet عبر ذلك الـ Node على مضيف Gateway:
{ gateway: { nodes: { allowCommands: ["googlemeet.chrome", "browser.proxy"], }, }, plugins: { entries: { "google-meet": { enabled: true, config: { defaultTransport: "chrome-node", chrome: { guestName: "OpenClaw Agent", autoJoin: true, reuseExistingTab: true, }, chromeNode: { node: "parallels-macos", }, }, }, }, },}الآن انضم بشكل طبيعي من مضيف Gateway:
openclaw googlemeet join https://meet.google.com/abc-defg-hijأو اطلب من الوكيل استخدام أداة google_meet مع transport: "chrome-node".
لاختبار دخان بأمر واحد ينشئ جلسة أو يعيد استخدامها، ويتحدث بعبارة معروفة، ويطبع صحة الجلسة:
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hijأثناء الانضمام الفوري، تملأ أتمتة متصفح OpenClaw اسم الضيف، وتنقر
Join/Ask to join، وتقبل خيار "Use microphone" في التشغيل الأول لـ Meet عندما
تظهر تلك المطالبة. أثناء الانضمام للمراقبة فقط أو إنشاء اجتماع من المتصفح فقط، فإنها
تتجاوز المطالبة نفسها من دون ميكروفون عندما يكون ذلك الخيار متاحًا.
إذا لم يكن ملف تعريف المتصفح مسجل الدخول، أو كان Meet ينتظر قبول المضيف،
أو كان Chrome يحتاج إلى إذن الميكروفون/الكاميرا لانضمام فوري، أو كان Meet عالقًا
على مطالبة تعذرت على الأتمتة معالجتها، فإن نتيجة join/test-speech تعرض
manualActionRequired: true مع manualActionReason و
manualActionMessage. يجب على الوكلاء إيقاف إعادة محاولة الانضمام، والإبلاغ عن تلك
الرسالة بالضبط بالإضافة إلى browserUrl/browserTitle الحاليين، وإعادة المحاولة فقط بعد
اكتمال إجراء المتصفح اليدوي.
إذا حُذف chromeNode.node، فإن OpenClaw يحدد تلقائيًا فقط عندما تعلن عقدة
متصلة واحدة بالضبط عن كل من googlemeet.chrome والتحكم في المتصفح. إذا كانت
عدة عقد قادرة متصلة، فاضبط chromeNode.node على معرف العقدة،
أو اسم العرض، أو عنوان IP البعيد.
فحوصات الفشل الشائعة:
Configured Google Meet node ... is not usable: offline: العقدة المثبتة معروفة لدى Gateway لكنها غير متاحة. يجب على الوكلاء التعامل مع تلك العقدة باعتبارها حالة تشخيصية، لا مضيف Chrome قابلًا للاستخدام، والإبلاغ عن عائق الإعداد بدلًا من الرجوع إلى نقل آخر ما لم يطلب المستخدم ذلك.No connected Google Meet-capable node: شغّلopenclaw node runفي VM، وافق على الاقتران، وتأكد من تشغيلopenclaw plugins enable google-meetوopenclaw plugins enable browserفي VM. تأكد أيضًا من أن مضيف Gateway يسمح بأمري العقدة معًا عبرgateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"].BlackHole 2ch audio device not found: ثبّتblackhole-2chعلى المضيف الذي يجري فحصه وأعد التشغيل قبل استخدام صوت Chrome المحلي.BlackHole 2ch audio device not found on the node: ثبّتblackhole-2chفي VM وأعد تشغيل VM.- يفتح Chrome لكنه لا يستطيع الانضمام: سجّل الدخول إلى ملف تعريف المتصفح داخل VM، أو
أبقِ
chrome.guestNameمضبوطًا لانضمام الضيف. يستخدم الانضمام التلقائي للضيف أتمتة متصفح OpenClaw عبر وكيل متصفح العقدة؛ تأكد من أن إعداد متصفح العقدة يشير إلى ملف التعريف الذي تريده، مثلbrowser.defaultProfile: "user"أو ملف تعريف جلسة قائمة مسمى. - تبويبات Meet مكررة: اترك
chrome.reuseExistingTab: trueمفعّلًا. يفعّل OpenClaw تبويبًا قائمًا لعنوان Meet URL نفسه قبل فتح تبويب جديد، كما أن إنشاء الاجتماع عبر المتصفح يعيد استخدام تبويبhttps://meet.google.com/newقيد التقدم أو تبويب مطالبة حساب Google قبل فتح تبويب آخر. - لا يوجد صوت: في Meet، وجّه صوت الميكروفون/السماعة عبر مسار جهاز الصوت الافتراضي الذي يستخدمه OpenClaw؛ استخدم أجهزة افتراضية منفصلة أو توجيهًا بنمط Loopback للحصول على صوت ثنائي الاتجاه نظيف.
ملاحظات التثبيت
يستخدم الإعداد الافتراضي لرد Chrome الصوتي أداتين خارجيتين:
sox: أداة صوتية لسطر الأوامر. يستخدم Plugin أوامر جهاز CoreAudio صريحة لجسر الصوت الافتراضي PCM16 بتردد 24 كيلوهرتز.blackhole-2ch: مشغل صوت افتراضي لنظام macOS. ينشئ جهاز الصوتBlackHole 2chالذي يمكن لـ Chrome/Meet التوجيه عبره.
لا يضمّن OpenClaw أيًا من الحزمتين ولا يعيد توزيعهما. تطلب الوثائق من المستخدمين
تثبيتهما كتبعيّات مضيف عبر Homebrew. SoX مرخص بموجب
LGPL-2.0-only AND GPL-2.0-only؛ وBlackHole مرخص بموجب GPL-3.0. إذا أنشأت
مثبّتًا أو جهازًا يضمّن BlackHole مع OpenClaw، فراجع شروط ترخيص BlackHole
من المصدر الأصلي أو احصل على ترخيص منفصل من Existential Audio.
وسائل النقل
Chrome
يفتح نقل Chrome عنوان Meet URL عبر تحكم متصفح OpenClaw وينضم
بملف تعريف متصفح OpenClaw المسجل الدخول. على macOS، يفحص Plugin وجود
BlackHole 2ch قبل التشغيل. وإذا كان مهيأً، فإنه يشغّل أيضًا أمر صحة جسر الصوت
وأمر بدء التشغيل قبل فتح Chrome. استخدم chrome عندما يكون Chrome/الصوت
على مضيف Gateway؛ واستخدم chrome-node عندما يكون Chrome/الصوت
على عقدة مقترنة مثل Parallels macOS VM. بالنسبة إلى Chrome المحلي، اختر
ملف التعريف باستخدام browser.defaultProfile؛ ويُمرر chrome.browserProfile إلى
مضيفي chrome-node.
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chromeopenclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-nodeوجّه صوت ميكروفون Chrome وسماعته عبر جسر صوت OpenClaw المحلي.
إذا لم يكن BlackHole 2ch مثبتًا، يفشل الانضمام بخطأ إعداد
بدلًا من الانضمام بصمت من دون مسار صوتي.
Twilio
نقل Twilio هو خطة اتصال صارمة مفوضة إلى Plugin المكالمات الصوتية. وهو لا يحلل صفحات Meet لاستخراج أرقام الهاتف.
استخدم هذا عندما لا تكون مشاركة Chrome متاحة أو عندما تريد خيار رجوع للاتصال الهاتفي. يجب أن يعرض Google Meet رقم اتصال هاتفي ورقم PIN للاجتماع؛ لا يكتشف OpenClaw هذه المعلومات من صفحة Meet.
فعّل Plugin المكالمات الصوتية على مضيف Gateway، وليس على عقدة Chrome:
{ plugins: { allow: ["google-meet", "voice-call", "google"], entries: { "google-meet": { enabled: true, config: { defaultTransport: "chrome-node", // or set "twilio" if Twilio should be the default }, }, "voice-call": { enabled: true, config: { provider: "twilio", inboundPolicy: "allowlist", realtime: { enabled: true, provider: "google", instructions: "Join this Google Meet as an OpenClaw agent. Be brief.", toolPolicy: "safe-read-only", providers: { google: { silenceDurationMs: 500, startSensitivity: "high", }, }, }, }, }, google: { enabled: true, }, }, },}وفّر بيانات اعتماد Twilio عبر البيئة أو الإعداد. تُبقي البيئة
الأسرار خارج openclaw.json:
export TWILIO_ACCOUNT_SID=AC...export TWILIO_AUTH_TOKEN=...export TWILIO_FROM_NUMBER=+15550001234export GEMINI_API_KEY=...استخدم realtime.provider: "openai" مع Plugin مزود OpenAI و
OPENAI_API_KEY بدلًا من ذلك إذا كان هذا هو مزود الصوت الفوري لديك.
أعد تشغيل Gateway أو أعد تحميله بعد تفعيل voice-call؛ لا تظهر تغييرات إعداد Plugin
في عملية Gateway قيد التشغيل بالفعل حتى يُعاد تحميلها.
ثم تحقق:
openclaw config validateopenclaw plugins list | grep -E 'google-meet|voice-call'openclaw googlemeet setupعندما يكون تفويض Twilio موصلًا، يتضمن googlemeet setup فحوصات ناجحة
لـ twilio-voice-call-plugin وtwilio-voice-call-credentials و
twilio-voice-call-webhook.
openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --pin 123456استخدم --dtmf-sequence عندما يحتاج الاجتماع إلى تسلسل مخصص:
openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --dtmf-sequence ww123456#OAuth والفحص المسبق
OAuth اختياري لإنشاء رابط Meet لأن googlemeet create يمكنه الرجوع
إلى أتمتة المتصفح. هيّئ OAuth عندما تريد الإنشاء عبر API الرسمي،
أو حل المساحات، أو فحوصات Meet Media API المسبقة.
يستخدم الوصول إلى Google Meet API OAuth الخاص بالمستخدم: أنشئ عميل Google Cloud OAuth،
واطلب النطاقات المطلوبة، وفوّض حساب Google، ثم خزّن
رمز التحديث الناتج في إعداد Plugin Google Meet أو وفّر
متغيرات البيئة OPENCLAW_GOOGLE_MEET_*.
لا يستبدل OAuth مسار انضمام Chrome. لا تزال وسائل نقل Chrome وChrome-node تنضم عبر ملف تعريف Chrome مسجل الدخول، وBlackHole/SoX، وعقدة متصلة عندما تستخدم مشاركة المتصفح. OAuth مخصص فقط لمسار Google Meet API الرسمي: إنشاء مساحات الاجتماعات، وحل المساحات، وتشغيل فحوصات Meet Media API المسبقة.
إنشاء بيانات اعتماد Google
في Google Cloud Console:
-
أنشئ مشروع Google Cloud أو حدده.
-
فعّل Google Meet REST API لذلك المشروع.
-
هيّئ شاشة موافقة OAuth.
- Internal هو الأبسط لمؤسسة Google Workspace.
- External يعمل لإعدادات الاختبار/الشخصية؛ ما دام التطبيق في Testing، أضف كل حساب Google سيفوّض التطبيق كمستخدم اختبار.
-
أضف النطاقات التي يطلبها OpenClaw:
https://www.googleapis.com/auth/meetings.space.createdhttps://www.googleapis.com/auth/meetings.space.readonlyhttps://www.googleapis.com/auth/meetings.space.settingshttps://www.googleapis.com/auth/meetings.conference.media.readonly
-
أنشئ معرف عميل OAuth.
-
نوع التطبيق: Web application.
-
عنوان URI لإعادة التوجيه المصرح به:
text http://localhost:8085/oauth2callback
-
-
انسخ معرف العميل وسر العميل.
meetings.space.created مطلوب من Google Meet spaces.create.
يتيح meetings.space.readonly لـ OpenClaw حل عناوين/رموز Meet URL إلى مساحات.
يتيح meetings.space.settings لـ OpenClaw تمرير إعدادات SpaceConfig مثل
accessType أثناء إنشاء الغرفة عبر API.
meetings.conference.media.readonly مخصص لفحص Meet Media API المسبق وعمل الوسائط؛
قد تتطلب Google التسجيل في Developer Preview لاستخدام Media API فعليًا.
إذا كنت تحتاج فقط إلى انضمامات Chrome المستندة إلى المتصفح، فتجاوز OAuth بالكامل.
إصدار رمز التحديث
هيّئ oauth.clientId واختياريًا oauth.clientSecret، أو مررهما
كمتغيرات بيئة، ثم شغّل:
openclaw googlemeet auth login --jsonيطبع الأمر كتلة إعداد oauth تحتوي على رمز تحديث. يستخدم PKCE،
واستدعاء localhost على http://localhost:8085/oauth2callback، وتدفق
نسخ/لصق يدويًا مع --manual.
أمثلة:
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \openclaw googlemeet auth login --jsonاستخدم الوضع اليدوي عندما لا يستطيع المتصفح الوصول إلى الاستدعاء المحلي:
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \openclaw googlemeet auth login --json --manualيتضمن خرج JSON:
{ "oauth": { "clientId": "your-client-id", "clientSecret": "your-client-secret", "refreshToken": "refresh-token", "accessToken": "access-token", "expiresAt": 1770000000000 }, "scope": "..."}خزّن كائن oauth ضمن إعداد Plugin Google Meet:
{ plugins: { entries: { "google-meet": { enabled: true, config: { oauth: { clientId: "your-client-id", clientSecret: "your-client-secret", refreshToken: "refresh-token", }, }, }, }, },}فضّل متغيرات البيئة عندما لا تريد وضع رمز التحديث في الإعداد. إذا كانت قيم الإعداد والبيئة موجودة معًا، فإن Plugin يحل الإعداد أولًا ثم يستخدم البيئة كخيار رجوع.
تتضمن موافقة OAuth إنشاء مساحة Meet، ووصول قراءة مساحة Meet، ووصول قراءة
وسائط مؤتمر Meet. إذا صادقت قبل وجود دعم إنشاء الاجتماعات،
فأعد تشغيل openclaw googlemeet auth login --json حتى يحصل رمز التحديث
على نطاق meetings.space.created.
التحقق من OAuth باستخدام doctor
شغّل doctor الخاص بـ OAuth عندما تريد فحص صحة سريعًا بلا أسرار:
openclaw googlemeet doctor --oauth --jsonلا يحمّل هذا وقت تشغيل Chrome ولا يتطلب عقدة Chrome متصلة. إنه
يتحقق من وجود إعداد OAuth وأن رمز التحديث يمكنه إصدار رمز وصول.
يتضمن تقرير JSON حقول الحالة فقط مثل ok وconfigured و
tokenSource وexpiresAt ورسائل الفحص؛ ولا يطبع رمز الوصول
أو رمز التحديث أو سر العميل.
النتائج الشائعة:
| الفحص | المعنى |
|---|---|
oauth-config |
يوجد oauth.clientId مع oauth.refreshToken، أو رمز وصول مخزن مؤقتا. |
oauth-token |
لا يزال رمز الوصول المخزن مؤقتا صالحا، أو أصدر رمز التحديث رمز وصول جديدا. |
meet-spaces-get |
نجح فحص --meeting الاختياري في حل مساحة Meet موجودة. |
meet-spaces-create |
أنشأ فحص --create-space الاختياري مساحة Meet جديدة. |
لإثبات تفعيل Google Meet API ونطاق spaces.create أيضا، شغل فحص الإنشاء ذي
الأثر الجانبي:
openclaw googlemeet doctor --oauth --create-space --jsonopenclaw googlemeet create --no-join --jsonينشئ --create-space عنوان URL مؤقتا لتطبيق Meet. استخدمه عندما تحتاج إلى تأكيد
أن مشروع Google Cloud فعّل Meet API وأن الحساب المصرح له يملك نطاق
meetings.space.created.
لإثبات صلاحية القراءة لمساحة اجتماع موجودة:
openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --jsonopenclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hijيثبت doctor --oauth --meeting وresolve-space صلاحية القراءة لمساحة موجودة
يمكن لحساب Google المصرح له الوصول إليها. تعني استجابة 403 من هذه الفحوص عادة
أن Google Meet REST API معطل، أو أن رمز التحديث الذي تمت الموافقة عليه يفتقد
النطاق المطلوب، أو أن حساب Google لا يستطيع الوصول إلى مساحة Meet تلك. يعني خطأ
رمز التحديث إعادة تشغيل openclaw googlemeet auth login --json وتخزين كتلة oauth الجديدة.
لا حاجة إلى بيانات اعتماد OAuth للبديل عبر المتصفح. في هذا الوضع، تأتي مصادقة Google من ملف Chrome الشخصي المسجل دخوله على العقدة المحددة، وليس من إعدادات OpenClaw.
تقبل متغيرات البيئة هذه كبدائل:
OPENCLAW_GOOGLE_MEET_CLIENT_IDأوGOOGLE_MEET_CLIENT_IDOPENCLAW_GOOGLE_MEET_CLIENT_SECRETأوGOOGLE_MEET_CLIENT_SECRETOPENCLAW_GOOGLE_MEET_REFRESH_TOKENأوGOOGLE_MEET_REFRESH_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKENأوGOOGLE_MEET_ACCESS_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATأوGOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATOPENCLAW_GOOGLE_MEET_DEFAULT_MEETINGأوGOOGLE_MEET_DEFAULT_MEETINGOPENCLAW_GOOGLE_MEET_PREVIEW_ACKأوGOOGLE_MEET_PREVIEW_ACK
حل عنوان URL لتطبيق Meet، أو رمز، أو spaces/{id} عبر spaces.get:
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hijشغل الفحص التمهيدي قبل عمل الوسائط:
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hijاعرض عناصر الاجتماع وسجل الحضور بعد أن ينشئ Meet سجلات المؤتمر:
openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-exportمع --meeting، يستخدم artifacts وattendance أحدث سجل مؤتمر
افتراضيا. مرر --all-conference-records عندما تريد كل السجلات المحتفظ بها
لذلك الاجتماع.
يمكن لبحث التقويم حل عنوان URL للاجتماع من Google Calendar قبل قراءة عناصر Meet:
openclaw googlemeet latest --todayopenclaw googlemeet calendar-events --today --jsonopenclaw googlemeet artifacts --event "Weekly sync"openclaw googlemeet attendance --today --format csv --output attendance.csvيبحث --today في تقويم primary لليوم عن حدث Calendar يحتوي على رابط
Google Meet. استخدم --event <query> للبحث في نص الحدث المطابق، و
--calendar <id> لتقويم غير أساسي. يتطلب بحث التقويم تسجيل دخول OAuth جديدا
يتضمن نطاق القراءة فقط لأحداث Calendar.
يعرض calendar-events معاينة أحداث Meet المطابقة ويميز الحدث الذي سيختاره
latest أو artifacts أو attendance أو export.
إذا كنت تعرف بالفعل معرف سجل المؤتمر، فخاطبه مباشرة:
openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --jsonopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 --jsonأنه مؤتمرا نشطا لمساحة منشأة عبر API عندما تريد إغلاق الغرفة بعد المكالمة:
openclaw googlemeet end-active-conference https://meet.google.com/abc-defg-hijيستدعي هذا Google Meet spaces.endActiveConference ويتطلب OAuth بنطاق
meetings.space.created لمساحة يمكن للحساب المصرح له إدارتها.
يقبل OpenClaw عنوان URL لتطبيق Meet، أو رمز اجتماع، أو إدخال spaces/{id} ويحله
إلى مورد مساحة API قبل إنهاء المؤتمر النشط.
وهو منفصل عن googlemeet leave: يوقف leave مشاركة OpenClaw المحلية/الجلسة،
بينما يطلب end-active-conference من Google Meet إنهاء المؤتمر النشط للمساحة.
اكتب تقريرا قابلا للقراءة:
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 \ --format markdown --output meet-artifacts.mdopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 \ --format markdown --output meet-attendance.mdopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 \ --format csv --output meet-attendance.csvopenclaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --zip --output meet-exportopenclaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --dry-runيعيد artifacts بيانات تعريف سجل المؤتمر إضافة إلى بيانات تعريف موارد المشاركين،
والتسجيل، والنص المنسوخ، ومدخلات النص المنسوخ المنظمة، والملاحظات الذكية عندما
تكشفها Google للاجتماع. استخدم --no-transcript-entries لتخطي
البحث عن المدخلات للاجتماعات الكبيرة. يوسع attendance المشاركين إلى
صفوف جلسات مشارك مع أوقات أول/آخر ظهور، وإجمالي مدة الجلسة،
وعلامات التأخر/المغادرة المبكرة، ودمج موارد المشاركين المكررة بحسب المستخدم
المسجل دخوله أو اسم العرض. مرر --no-merge-duplicates لإبقاء موارد المشاركين
الأولية منفصلة، و--late-after-minutes لضبط اكتشاف التأخر، و
--early-before-minutes لضبط اكتشاف المغادرة المبكرة.
يكتب export مجلدا يحتوي على summary.md وattendance.csv و
transcript.md وartifacts.json وattendance.json وmanifest.json.
يسجل manifest.json الإدخال المختار، وخيارات التصدير، وسجلات المؤتمر،
وملفات الإخراج، والأعداد، ومصدر الرمز، وحدث Calendar عند استخدامه، وأي
تحذيرات استرجاع جزئية. مرر --zip لكتابة أرشيف قابل للنقل أيضا
بجوار المجلد. مرر --include-doc-bodies لتصدير نص Google Docs المرتبط بالنص
المنسوخ والملاحظات الذكية عبر Google Drive files.export؛ يتطلب ذلك
تسجيل دخول OAuth جديدا يتضمن نطاق القراءة فقط لـ Drive Meet. دون
--include-doc-bodies، تتضمن عمليات التصدير بيانات تعريف Meet ومدخلات النص
المنسوخ المنظمة فقط. إذا أعادت Google فشلا جزئيا في العناصر، مثل خطأ في
قائمة ملاحظات ذكية، أو مدخل نص منسوخ، أو جسم مستند Drive، يحتفظ الملخص و
البيان بالتحذير بدلا من إفشال التصدير كله.
استخدم --dry-run لجلب بيانات العناصر/الحضور نفسها وطباعة
JSON الخاص بالبيان دون إنشاء المجلد أو ZIP. يفيد ذلك قبل كتابة
تصدير كبير أو عندما يحتاج الوكيل فقط إلى الأعداد، والسجلات المختارة، و
التحذيرات.
يمكن للوكلاء أيضا إنشاء الحزمة نفسها عبر أداة google_meet:
{ "action": "export", "conferenceRecord": "conferenceRecords/abc123", "includeDocumentBodies": true, "outputDir": "meet-export", "zip": true}عين "dryRun": true لإرجاع بيان التصدير فقط وتخطي كتابة الملفات.
يمكن للوكلاء أيضا إنشاء غرفة مدعومة بـ API بسياسة وصول صريحة:
{ "action": "create", "transport": "chrome-node", "mode": "agent", "accessType": "OPEN"}ويمكنهم إنهاء المؤتمر النشط لغرفة معروفة:
{ "action": "end_active_conference", "meeting": "https://meet.google.com/abc-defg-hij"}للتحقق القائم على الاستماع أولا، ينبغي للوكلاء استخدام test_listen قبل الادعاء بأن
الاجتماع مفيد:
{ "action": "test_listen", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "timeoutMs": 30000}شغل اختبار الدخان الحي المحروس على اجتماع حقيقي محتفظ به:
OPENCLAW_LIVE_TEST=1 \OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \pnpm test:live -- extensions/google-meet/google-meet.live.test.tsشغل مسبار المتصفح الحي للاستماع أولا على اجتماع سيتحدث فيه شخص ما مع توفر تسميات Meet التوضيحية:
openclaw googlemeet setup --transport chrome-node --mode transcribeopenclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000بيئة اختبار الدخان الحي:
- يفعّل
OPENCLAW_LIVE_TEST=1الاختبارات الحية المحروسة. - يشير
OPENCLAW_GOOGLE_MEET_LIVE_MEETINGإلى عنوان URL محتفظ به لتطبيق Meet، أو رمز، أوspaces/{id}. - يوفر
OPENCLAW_GOOGLE_MEET_CLIENT_IDأوGOOGLE_MEET_CLIENT_IDمعرف عميل OAuth. - يوفر
OPENCLAW_GOOGLE_MEET_REFRESH_TOKENأوGOOGLE_MEET_REFRESH_TOKENرمز التحديث. - اختياري: تستخدم
OPENCLAW_GOOGLE_MEET_CLIENT_SECRETوOPENCLAW_GOOGLE_MEET_ACCESS_TOKENوOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATأسماء البدائل نفسها دون بادئةOPENCLAW_.
يحتاج اختبار الدخان الحي الأساسي للعناصر/الحضور إلى
https://www.googleapis.com/auth/meetings.space.readonly و
https://www.googleapis.com/auth/meetings.conference.media.readonly. يحتاج بحث Calendar
إلى https://www.googleapis.com/auth/calendar.events.readonly. يحتاج تصدير
جسم مستند Drive إلى
https://www.googleapis.com/auth/drive.meet.readonly.
أنشئ مساحة Meet جديدة:
openclaw googlemeet createيطبع الأمر meeting uri الجديد، والمصدر، وجلسة الانضمام. باستخدام بيانات اعتماد OAuth
يستخدم Google Meet API الرسمي. ودون بيانات اعتماد OAuth يستخدم
ملف المتصفح الشخصي المسجل دخوله في عقدة Chrome المثبتة كبديل. يمكن للوكلاء
استخدام أداة google_meet مع action: "create" للإنشاء والانضمام في خطوة
واحدة. للإنشاء المقتصر على عنوان URL، مرر "join": false.
مثال على مخرجات JSON من بديل المتصفح:
{ "source": "browser", "meetingUri": "https://meet.google.com/abc-defg-hij", "joined": true, "browser": { "nodeId": "ba0f4e4bc...", "targetId": "tab-1" }, "join": { "session": { "id": "meet_...", "url": "https://meet.google.com/abc-defg-hij" } }}إذا واجه بديل المتصفح تسجيل دخول Google أو حاجب أذونات Meet قبل أن
يتمكن من إنشاء عنوان URL، تعيد طريقة Gateway استجابة فاشلة وتعيد
أداة google_meet تفاصيل منظمة بدلا من سلسلة نصية عادية:
{ "source": "browser", "error": "google-login-required: Sign in to Google in the OpenClaw browser profile, then retry meeting creation.", "manualActionRequired": true, "manualActionReason": "google-login-required", "manualActionMessage": "Sign in to Google in the OpenClaw browser profile, then retry meeting creation.", "browser": { "nodeId": "ba0f4e4bc...", "targetId": "tab-1", "browserUrl": "https://accounts.google.com/signin", "browserTitle": "Sign in - Google Accounts" }}عندما يرى الوكيل manualActionRequired: true، ينبغي له الإبلاغ عن
manualActionMessage مع سياق عقدة/تبويب المتصفح والتوقف عن فتح تبويبات
Meet جديدة حتى يكمل المشغل خطوة المتصفح.
مثال على مخرجات JSON من إنشاء API:
{ "source": "api", "meetingUri": "https://meet.google.com/abc-defg-hij", "joined": true, "space": { "name": "spaces/abc-defg-hij", "meetingCode": "abc-defg-hij", "meetingUri": "https://meet.google.com/abc-defg-hij" }, "join": { "session": { "id": "meet_...", "url": "https://meet.google.com/abc-defg-hij" } }}يؤدي إنشاء Meet إلى الانضمام افتراضيا. ما زال نقل Chrome أو Chrome-node
يحتاج إلى ملف شخصي في Google Chrome مسجل الدخول للانضمام عبر المتصفح. إذا كان
الملف الشخصي مسجل الخروج، فسيبلغ OpenClaw عن manualActionRequired: true أو
خطأ رجوع للمتصفح، ويطلب من المشغل إكمال تسجيل الدخول إلى Google قبل
إعادة المحاولة.
عيّن preview.enrollmentAcknowledged: true فقط بعد التأكد من أن مشروع Cloud
وكيان OAuth الأساسي ومشاركي الاجتماع مسجلون في Google Workspace Developer Preview Program
لواجهات Meet media APIs.
الإعداد
لا يحتاج مسار وكيل Chrome الشائع إلا إلى تفعيل Plugin وBlackHole وSoX ومفتاح
مزود نسخ فوري، ومزود TTS مهيأ في OpenClaw. OpenAI هو مزود النسخ الافتراضي؛
عيّن realtime.voiceProvider إلى "google" وrealtime.model لاستخدام
Google Gemini Live لوضع bidi من دون تغيير مزود النسخ الافتراضي لوضع الوكيل:
brew install blackhole-2ch soxexport OPENAI_API_KEY=sk-...# orexport GEMINI_API_KEY=...عيّن إعدادات Plugin ضمن plugins.entries.google-meet.config:
{ plugins: { entries: { "google-meet": { enabled: true, config: {}, }, }, },}القيم الافتراضية:
defaultTransport: "chrome"defaultMode: "agent"(يُقبل"realtime"فقط كاسم مستعار قديم للتوافق مع"agent"؛ يجب أن تستخدم استدعاءات الأدوات الجديدة"agent")chromeNode.node: معرف/اسم/IP اختياري للعقدة من أجلchrome-nodechrome.audioBackend: "blackhole-2ch"chrome.guestName: "OpenClaw Agent": الاسم المستخدم في شاشة ضيف Meet غير المسجل الدخولchrome.autoJoin: true: محاولة بأفضل جهد لملء اسم الضيف والنقر على Join Now عبر أتمتة متصفح OpenClaw علىchrome-nodechrome.reuseExistingTab: true: تفعيل تبويب Meet موجود بدلا من فتح نسخ مكررةchrome.waitForInCallMs: 20000: الانتظار حتى يبلغ تبويب Meet أنه داخل المكالمة قبل تشغيل مقدمة الرد الصوتيchrome.audioFormat: "pcm16-24khz": تنسيق صوت زوج الأوامر. استخدم"g711-ulaw-8khz"فقط لأزواج الأوامر القديمة/المخصصة التي لا تزال تصدر صوتا هاتفيا.chrome.audioBufferBytes: 4096: مخزن معالجة SoX المؤقت لأوامر صوت زوج أوامر Chrome المولدة. هذا يساوي نصف مخزن SoX الافتراضي البالغ 8192 بايت، ما يقلل كمون الأنبوب الافتراضي مع ترك مجال لزيادته على المضيفات المزدحمة. تُثبت القيم الأقل من حد SoX الأدنى عند 17 بايت.chrome.audioInputCommand: أمر SoX يقرأ من CoreAudioBlackHole 2chويكتب الصوت بتنسيقchrome.audioFormatchrome.audioOutputCommand: أمر SoX يقرأ الصوت بتنسيقchrome.audioFormatويكتب إلى CoreAudioBlackHole 2chchrome.bargeInInputCommand: أمر ميكروفون محلي اختياري يكتب PCM أحادي القناة signed 16-bit little-endian لاكتشاف مقاطعة الإنسان أثناء تشغيل صوت المساعد. ينطبق هذا حاليا على جسر زوج أوامرchromeالمستضاف على Gateway.chrome.bargeInRmsThreshold: 650: مستوى RMS الذي يُحتسب كمقاطعة بشرية علىchrome.bargeInInputCommandchrome.bargeInPeakThreshold: 2500: مستوى الذروة الذي يُحتسب كمقاطعة بشرية علىchrome.bargeInInputCommandchrome.bargeInCooldownMs: 900: أقل تأخير بين عمليات مسح المقاطعة البشرية المتكررةmode: "agent": وضع الرد الصوتي الافتراضي. يتم نسخ كلام المشاركين بواسطة مزود النسخ الفوري المهيأ، وإرساله إلى وكيل OpenClaw المهيأ في جلسة وكيل فرعي لكل اجتماع، ثم نطقه مرة أخرى عبر وقت تشغيل TTS العادي في OpenClaw.mode: "bidi": وضع رجوع لنموذج فوري ثنائي الاتجاه مباشر. يجيب مزود الصوت الفوري عن كلام المشاركين مباشرة وقد يستدعيopenclaw_agent_consultللحصول على إجابات أعمق/مدعومة بالأدوات.mode: "transcribe": وضع مراقبة فقط من دون جسر الرد الصوتي.realtime.provider: "openai": رجوع توافق يُستخدم عندما تكون حقول المزود المحددة أدناه غير مضبوطة.realtime.transcriptionProvider: "openai": معرف المزود الذي يستخدمه وضعagentللنسخ الفوري.realtime.voiceProvider: معرف المزود الذي يستخدمه وضعbidiللصوت الفوري المباشر. عيّن هذا إلى"google"لاستخدام Gemini Live مع إبقاء النسخ في وضع الوكيل على OpenAI.realtime.toolPolicy: "safe-read-only"realtime.instructions: ردود منطوقة موجزة، معopenclaw_agent_consultللإجابات الأعمقrealtime.introMessage: فحص جاهزية منطوق قصير عند اتصال الجسر الفوري؛ عيّنه إلى""للانضمام بصمتrealtime.agentId: معرف وكيل OpenClaw اختياري من أجلopenclaw_agent_consult؛ القيمة الافتراضية هيmain
تجاوزات اختيارية:
{ defaults: { meeting: "https://meet.google.com/abc-defg-hij", }, browser: { defaultProfile: "openclaw", }, chrome: { guestName: "OpenClaw Agent", waitForInCallMs: 30000, bargeInInputCommand: [ "sox", "-q", "-t", "coreaudio", "External Microphone", "-r", "24000", "-c", "1", "-b", "16", "-e", "signed-integer", "-t", "raw", "-", ], }, chromeNode: { node: "parallels-macos", }, defaultMode: "agent", realtime: { provider: "openai", transcriptionProvider: "openai", voiceProvider: "google", model: "gemini-2.5-flash-native-audio-preview-12-2025", agentId: "jay", toolPolicy: "owner", introMessage: "Say exactly: I'm here.", providers: { google: { speakerVoice: "Kore", }, }, },}ElevenLabs للاستماع والتحدث في وضع الوكيل معا:
{ messages: { tts: { provider: "elevenlabs", providers: { elevenlabs: { modelId: "eleven_v3", speakerVoiceId: "pMsXgVXv3BLzUgSXRplE", }, }, }, }, plugins: { entries: { "google-meet": { config: { realtime: { transcriptionProvider: "elevenlabs", providers: { elevenlabs: { modelId: "scribe_v2_realtime", audioFormat: "ulaw_8000", sampleRate: 8000, commitStrategy: "vad", }, }, }, }, }, }, },}يأتي صوت Meet الدائم من
messages.tts.providers.elevenlabs.speakerVoiceId. يمكن لردود الوكيل أيضا
استخدام توجيهات [[tts:speakerVoiceId=... model=eleven_v3]] لكل رد عند تفعيل
تجاوزات نموذج TTS، لكن الإعداد هو الافتراضي الحتمي للاجتماعات. عند الانضمام،
يجب أن تعرض السجلات transcriptionProvider=elevenlabs، ويجب أن يسجل كل رد
منطوق provider=elevenlabs model=eleven_v3 speakerVoiceId=<voiceId>.
إعداد Twilio فقط:
{ defaultTransport: "twilio", twilio: { defaultDialInNumber: "+15551234567", defaultPin: "123456", }, voiceCall: { gatewayUrl: "ws://127.0.0.1:18789", },}القيمة الافتراضية لـ voiceCall.enabled هي true؛ ومع نقل Twilio يفوض
مكالمة PSTN الفعلية وDTMF وتحية المقدمة إلى Voice Call plugin. يشغل Voice Call
تسلسل DTMF قبل فتح دفق الوسائط الفوري، ثم يستخدم نص المقدمة المحفوظ كتحية
فورية أولية. إذا لم يكن voice-call مفعلا، فلا يزال بإمكان Google Meet
التحقق من خطة الاتصال وتسجيلها، لكنه لا يستطيع إجراء مكالمة Twilio.
الأداة
يمكن للوكلاء استخدام أداة google_meet:
{ "action": "join", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "mode": "agent"}استخدم transport: "chrome" عندما يعمل Chrome على مضيف Gateway. استخدم
transport: "chrome-node" عندما يعمل Chrome على عقدة مقترنة مثل Parallels VM.
في الحالتين، تعمل مزودات النماذج وopenclaw_agent_consult على مضيف Gateway،
لذلك تبقى بيانات اعتماد النماذج هناك. مع القيمة الافتراضية mode: "agent"،
يتولى مزود النسخ الفوري الاستماع، وينتج وكيل OpenClaw المهيأ الإجابة، ثم
ينطقها TTS العادي في OpenClaw داخل Meet. استخدم mode: "bidi" عندما تريد أن
يجيب نموذج الصوت الفوري مباشرة. يبقى mode: "realtime" الخام مقبولا كاسم
مستعار قديم للتوافق مع mode: "agent"، لكنه لم يعد معروضا في مخطط أداة
الوكيل. تتضمن سجلات وضع الوكيل مزود/نموذج النسخ المحلول عند بدء الجسر، ومزود
TTS والنموذج والصوت وتنسيق الإخراج ومعدل العينة بعد كل رد مولد.
استخدم action: "status" لسرد الجلسات النشطة أو فحص معرف جلسة. استخدم
action: "speak" مع sessionId وmessage لجعل الوكيل الفوري يتكلم فورا.
استخدم action: "test_speech" لإنشاء الجلسة أو إعادة استخدامها، وتشغيل عبارة
معروفة، وإرجاع صحة inCall عندما يستطيع مضيف Chrome الإبلاغ عنها. يفرض
test_speech دائما mode: "agent" ويفشل إذا طُلب منه العمل في
mode: "transcribe" لأن جلسات المراقبة فقط لا يمكنها عمدا إصدار الكلام.
تستند نتيجة speechOutputVerified إلى زيادة بايتات إخراج الصوت الفوري أثناء
استدعاء الاختبار هذا، لذلك لا تُحتسب جلسة معاد استخدامها ولديها صوت أقدم
كفحص كلام ناجح جديد. استخدم action: "leave" لوضع علامة على انتهاء الجلسة.
يتضمن status صحة Chrome عند توفرها:
inCall: يبدو أن Chrome داخل مكالمة MeetmicMuted: حالة ميكروفون Meet بأفضل جهدmanualActionRequired/manualActionReason/manualActionMessage: يحتاج ملف المتصفح الشخصي إلى تسجيل دخول يدوي، أو قبول مضيف Meet، أو أذونات، أو إصلاح تحكم المتصفح قبل أن يعمل الكلامspeechReady/speechBlockedReason/speechBlockedMessage: ما إذا كان كلام Chrome المدار مسموحا الآن. تعنيspeechReady: falseأن OpenClaw لم يرسل عبارة المقدمة/الاختبار إلى جسر الصوت.providerConnected/realtimeReady: حالة جسر الصوت الفوريlastInputAt/lastOutputAt: آخر صوت شوهد من الجسر أو أُرسل إليهaudioOutputRouted/audioOutputDeviceLabel: ما إذا كان إخراج وسائط تبويب Meet موجها بنشاط إلى جهاز BlackHole الذي يستخدمه الجسرlastSuppressedInputAt/suppressedInputBytes: إدخال local loopback تم تجاهله أثناء نشاط تشغيل المساعد
{ "action": "speak", "sessionId": "meet_...", "message": "Say exactly: I'm here and listening."}أوضاع الوكيل وbidi
تم تحسين وضع Chrome agent لسلوك "وكيلي في الاجتماع". يسمع مزود النسخ الفوري
صوت الاجتماع، وتُوجه النصوص النهائية للمشاركين عبر وكيل OpenClaw المهيأ، وتُنطق
الإجابة عبر وقت تشغيل TTS العادي في OpenClaw. عيّن mode: "bidi" عندما تريد
أن يجيب نموذج الصوت الفوري مباشرة.
تُدمج أجزاء النص النهائي القريبة قبل الاستشارة حتى لا ينتج دور منطوق واحد عدة
إجابات جزئية قديمة. كما يُمنع الإدخال الفوري أثناء استمرار تشغيل صوت المساعد
الموجود في قائمة الانتظار،
وتُتجاهل أصداء النصوص الحديثة الشبيهة بالمساعد قبل استشارة الوكيل حتى لا يجعل
local loopback في BlackHole الوكيل يجيب عن كلامه هو.
| الوضع | من يقرر الإجابة | مسار إخراج الكلام | استخدمه عندما |
|---|---|---|---|
agent |
وكيل OpenClaw المهيأ | وقت تشغيل TTS العادي في OpenClaw | تريد سلوك "وكيلي في الاجتماع" |
bidi |
نموذج الصوت الفوري | استجابة صوتية من مزود الصوت الفوري | تريد حلقة صوت محادثية بأقل كمون |
في وضع bidi، عندما يحتاج النموذج الفوري إلى استدلال أعمق أو معلومات حالية أو
أدوات OpenClaw العادية، يمكنه استدعاء openclaw_agent_consult.
تعمل أداة الاستشارة على تشغيل وكيل OpenClaw العادي في الخلفية مع سياق
نص محضر الاجتماع الأخير وتعيد إجابة منطوقة موجزة. في وضع agent،
يرسل OpenClaw تلك الإجابة مباشرة إلى وقت تشغيل TTS؛ وفي وضع bidi، يستطيع
نموذج الصوت الفوري نطق نتيجة الاستشارة مرة أخرى داخل الاجتماع. وهي تستخدم
آلية الاستشارة المشتركة نفسها مثل Voice Call.
افتراضيًا، تعمل الاستشارات ضد الوكيل main. عيّن realtime.agentId عندما
ينبغي أن يستشير مسار Meet مساحة عمل وكيل OpenClaw مخصصة، وافتراضات النموذج،
وسياسة الأدوات، والذاكرة، وسجل الجلسة.
تستخدم استشارات وضع الوكيل مفتاح جلسة لكل اجتماع
agent:<id>:subagent:google-meet:<session> بحيث تحتفظ أسئلة المتابعة بسياق
الاجتماع مع وراثة سياسة الوكيل العادية من الوكيل المكوّن.
يتحكم realtime.toolPolicy في تشغيل الاستشارة:
safe-read-only: يكشف أداة الاستشارة ويقيّد الوكيل العادي علىreadوweb_searchوweb_fetchوx_searchوmemory_searchوmemory_get.owner: يكشف أداة الاستشارة ويتيح للوكيل العادي استخدام سياسة أدوات الوكيل العادية.none: لا يكشف أداة الاستشارة لنموذج الصوت الفوري.
مفتاح جلسة الاستشارة مضبوط النطاق لكل جلسة Meet، لذلك يمكن لاستدعاءات الاستشارة اللاحقة إعادة استخدام سياق الاستشارة السابق أثناء الاجتماع نفسه.
لفرض فحص جاهزية منطوق بعد انضمام Chrome إلى المكالمة بالكامل:
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."لفحص الانضمام والنطق الكامل:
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ --transport chrome-node \ --message "Say exactly: I'm here and listening."قائمة فحص الاختبار المباشر
استخدم هذا التسلسل قبل تسليم اجتماع إلى وكيل غير مراقب:
openclaw googlemeet setupopenclaw nodes statusopenclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ --transport chrome-node \ --message "Say exactly: Google Meet speech test complete."حالة Chrome-node المتوقعة:
googlemeet setupكلها خضراء.- يتضمن
googlemeet setupالفحصchrome-node-connectedعندما يكون Chrome-node هو النقل الافتراضي أو عندما تكون عقدة مثبتة. - يعرض
nodes statusأن العقدة المحددة متصلة. - تعلن العقدة المحددة عن كل من
googlemeet.chromeوbrowser.proxy. - تنضم علامة تبويب Meet إلى المكالمة ويعيد
test-speechصحة Chrome معinCall: true.
بالنسبة إلى مضيف Chrome بعيد مثل آلة macOS افتراضية على Parallels، فهذا هو أقصر فحص آمن بعد تحديث Gateway أو الآلة الافتراضية:
openclaw googlemeet setupopenclaw nodes status --connectedopenclaw nodes invoke \ --node parallels-macos \ --command googlemeet.chrome \ --params '{"action":"setup"}'يثبت ذلك أن Plugin Gateway محمّل، وأن عقدة الآلة الافتراضية متصلة بالرمز الحالي، وأن جسر صوت Meet متاح قبل أن يفتح وكيل علامة تبويب اجتماع حقيقية.
لفحص Twilio، استخدم اجتماعًا يعرض تفاصيل الاتصال الهاتفي:
openclaw googlemeet setupopenclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --pin 123456حالة Twilio المتوقعة:
- يتضمن
googlemeet setupفحوصات خضراء لـtwilio-voice-call-pluginوtwilio-voice-call-credentialsوtwilio-voice-call-webhook. - يكون
voicecallمتاحًا في CLI بعد إعادة تحميل Gateway. - تحتوي الجلسة المعادة على
transport: "twilio"وtwilio.voiceCallId. - يعرض
openclaw logs --followتقديم DTMF TwiML قبل TwiML الفوري، ثم جسرًا فوريًا مع تحية أولية في الصف. - ينهي
googlemeet leave <sessionId>مكالمة الصوت المفوضة.
استكشاف الأخطاء وإصلاحها
لا يستطيع الوكيل رؤية أداة Google Meet
تأكد من تمكين Plugin في إعدادات Gateway وأعد تحميل Gateway:
openclaw plugins list | grep google-meetopenclaw googlemeet setupإذا كنت قد عدّلت للتو plugins.entries.google-meet، فأعد تشغيل Gateway أو
أعد تحميله. لا يرى الوكيل الجاري إلا أدوات Plugin المسجلة بواسطة عملية
Gateway الحالية.
على مضيفات Gateway غير macOS، تظل أداة google_meet المواجهة للوكيل مرئية،
لكن إجراءات ردّ الكلام عبر Chrome المحلي تُحظر قبل وصولها إلى جسر الصوت.
يعتمد صوت ردّ الكلام عبر Chrome المحلي حاليًا على BlackHole 2ch في macOS،
لذلك ينبغي لوكلاء Linux استخدام mode: "transcribe"، أو اتصال Twilio الهاتفي،
أو مضيف chrome-node على macOS بدلًا من مسار وكيل Chrome المحلي الافتراضي.
لا توجد عقدة متصلة قادرة على Google Meet
على مضيف العقدة، شغّل:
openclaw plugins enable google-meetopenclaw plugins enable browserOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macosعلى مضيف Gateway، وافق على العقدة وتحقق من الأوامر:
openclaw devices listopenclaw devices approve <requestId>openclaw nodes statusيجب أن تكون العقدة متصلة وأن تعرض googlemeet.chrome بالإضافة إلى
browser.proxy. يجب أن تسمح إعدادات Gateway بأوامر العقدة هذه:
{ gateway: { nodes: { allowCommands: ["browser.proxy", "googlemeet.chrome"], }, },}إذا فشل googlemeet setup في chrome-node-connected أو أبلغ سجل Gateway عن
gateway token mismatch، فأعد تثبيت العقدة أو أعد تشغيلها باستخدام رمز
Gateway الحالي. بالنسبة إلى Gateway على LAN، يعني ذلك عادةً:
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node install \ --host <gateway-lan-ip> \ --port 18789 \ --display-name parallels-macos \ --forceثم أعد تحميل خدمة العقدة وأعد تشغيل:
openclaw googlemeet setupopenclaw nodes status --connectedيفتح المتصفح لكن الوكيل لا يستطيع الانضمام
شغّل googlemeet test-listen للانضمامات بغرض المراقبة فقط أو
googlemeet test-speech للانضمامات الفورية، ثم افحص صحة Chrome المعادة. إذا
أبلغ أي من الفحصين عن manualActionRequired: true، فأظهر
manualActionMessage للمشغّل وتوقف عن إعادة المحاولة حتى يكتمل إجراء
المتصفح.
إجراءات يدوية شائعة:
- تسجيل الدخول إلى ملف تعريف Chrome.
- قبول الضيف من حساب مضيف Meet.
- منح أذونات الميكروفون/الكاميرا لـ Chrome عندما تظهر مطالبة الإذن الأصلية في Chrome.
- إغلاق مربع حوار إذن Meet عالق أو إصلاحه.
لا تُبلغ عن "not signed in" لمجرد أن Meet يعرض "Do you want people to hear you in the meeting?" فهذه شاشة اختيار الصوت في Meet؛ ينقر OpenClaw على Use microphone عبر أتمتة المتصفح عندما يكون ذلك متاحًا ويواصل انتظار حالة الاجتماع الحقيقية. بالنسبة إلى احتياطي المتصفح الخاص بالإنشاء فقط، قد ينقر OpenClaw على Continue without microphone لأن إنشاء URL لا يحتاج إلى مسار الصوت الفوري.
يفشل إنشاء الاجتماع
يستخدم googlemeet create أولًا نقطة نهاية Google Meet API spaces.create
عندما تكون بيانات اعتماد OAuth مكوّنة. وبدون بيانات اعتماد OAuth، يعود إلى
متصفح عقدة Chrome المثبتة. تأكد مما يلي:
- لإنشاء API: تم تكوين
oauth.clientIdوoauth.refreshToken، أو توجد متغيرات بيئةOPENCLAW_GOOGLE_MEET_*مطابقة. - لإنشاء API: تم إصدار رمز التحديث بعد إضافة دعم الإنشاء. قد تفتقر الرموز
الأقدم إلى نطاق
meetings.space.created؛ أعد تشغيلopenclaw googlemeet auth login --jsonوحدّث إعدادات Plugin. - لاحتياطي المتصفح: يشير
defaultTransport: "chrome-node"وchromeNode.nodeإلى عقدة متصلة تحتوي علىbrowser.proxyوgooglemeet.chrome. - لاحتياطي المتصفح: يكون ملف تعريف Chrome الخاص بـ OpenClaw على تلك العقدة
مسجل الدخول إلى Google وقادرًا على فتح
https://meet.google.com/new. - لاحتياطي المتصفح: تعيد المحاولات استخدام علامة تبويب
https://meet.google.com/newأو مطالبة حساب Google موجودة قبل فتح علامة تبويب جديدة. إذا انتهت مهلة وكيل، فأعد محاولة استدعاء الأداة بدلًا من فتح علامة تبويب Meet أخرى يدويًا. - لاحتياطي المتصفح: إذا أعادت الأداة
manualActionRequired: true، فاستخدمbrowser.nodeIdوbrowser.targetIdوbrowserUrlوmanualActionMessageالمعادة لإرشاد المشغّل. لا تعد المحاولة في حلقة حتى يكتمل ذلك الإجراء. - لاحتياطي المتصفح: إذا عرض Meet "Do you want people to hear you in the
meeting?"، فاترك علامة التبويب مفتوحة. ينبغي أن ينقر OpenClaw على
Use microphone أو، للاحتياطي الخاص بالإنشاء فقط، على
Continue without microphone عبر أتمتة المتصفح وأن يواصل انتظار URL
Meet المُنشأ. إذا تعذّر عليه ذلك، ينبغي أن يذكر الخطأ
meet-audio-choice-required، لاgoogle-login-required.
ينضم الوكيل لكنه لا يتكلم
تحقق من المسار الفوري:
openclaw googlemeet setupopenclaw googlemeet doctorاستخدم mode: "agent" لمسار STT -> وكيل OpenClaw -> ردّ الكلام عبر TTS
العادي، أو mode: "bidi" للاحتياطي الصوتي الفوري المباشر. لا يبدأ
mode: "transcribe" جسر ردّ الكلام عمدًا. لتصحيح أخطاء المراقبة فقط، شغّل
openclaw googlemeet status --json <session-id> بعد أن يتحدث المشاركون وتحقق
من captioning وtranscriptLines وlastCaptionText. إذا كان inCall هو
true لكن transcriptLines يبقى عند 0، فقد تكون التسميات التوضيحية في Meet
معطلة، أو لم يتحدث أحد منذ تثبيت المراقب، أو تغيّرت واجهة Meet، أو أن
التسميات التوضيحية المباشرة غير متاحة للغة/حساب الاجتماع.
يتحقق googlemeet test-speech دائمًا من المسار الفوري ويبلغ عما إذا كانت
بايتات خرج الجسر قد رُصدت لهذا الاستدعاء. إذا كان speechOutputVerified هو false وكان
speechOutputTimedOut هو true، فقد يكون مزود الخدمة الفوري قد قبل
العبارة لكن OpenClaw لم يرَ بايتات خرج جديدة تصل إلى جسر صوت Chrome.
تحقق أيضًا مما يلي:
- يتوفر مفتاح مزود خدمة فوري على مضيف Gateway، مثل
OPENAI_API_KEYأوGEMINI_API_KEY. - يظهر
BlackHole 2chعلى مضيف Chrome. - يوجد
soxعلى مضيف Chrome. - يتم توجيه ميكروفون Meet ومكبر الصوت عبر مسار الصوت الافتراضي الذي يستخدمه
OpenClaw. ينبغي أن يعرض
doctorالقيمةmeet output routed: yesلانضمامات Chrome المحلية الفورية.
يطبع googlemeet doctor [session-id] الجلسة، والعقدة، وحالة داخل المكالمة،
وسبب الإجراء اليدوي، واتصال مزود الخدمة الفوري، وrealtimeReady، ونشاط
إدخال/إخراج الصوت، والطوابع الزمنية الصوتية الأخيرة، وعدادات البايت، وURL
المتصفح. استخدم googlemeet status [session-id] --json عندما تحتاج إلى JSON
الخام. استخدم googlemeet doctor --oauth عندما تحتاج إلى التحقق من تحديث
OAuth لـ Google Meet من دون كشف الرموز؛ أضف --meeting أو --create-space
عندما تحتاج أيضًا إلى إثبات Google Meet API.
إذا انتهت مهلة وكيل ويمكنك رؤية علامة تبويب Meet مفتوحة بالفعل، فافحص تلك العلامة من دون فتح علامة أخرى:
openclaw googlemeet recover-tabopenclaw googlemeet recover-tab https://meet.google.com/abc-defg-hijإجراء الأداة المكافئ هو recover_current_tab. يركّز على علامة تبويب Meet
موجودة ويفحصها للنقل المحدد. مع chrome، يستخدم تحكم المتصفح المحلي عبر
Gateway؛ ومع chrome-node، يستخدم عقدة Chrome المكوّنة. لا يفتح علامة تبويب
جديدة ولا ينشئ جلسة جديدة؛ بل يبلّغ عن العائق الحالي، مثل تسجيل الدخول، أو
القبول، أو الأذونات، أو حالة اختيار الصوت. يتحدث أمر CLI إلى Gateway
المكوّن، لذلك يجب أن يكون Gateway قيد التشغيل؛ كما يتطلب chrome-node اتصال
عقدة Chrome.
تفشل فحوصات إعداد Twilio
يفشل twilio-voice-call-plugin عندما لا يكون voice-call مسموحًا به أو غير
مفعّل. أضفه إلى plugins.allow، وفعّل plugins.entries.voice-call، وأعد
تحميل Gateway.
يفشل twilio-voice-call-credentials عندما يفتقر طرف Twilio الخلفي إلى
معرّف SID للحساب، أو رمز المصادقة، أو رقم المتصل. عيّن هذه على مضيف
Gateway:
export TWILIO_ACCOUNT_SID=AC...export TWILIO_AUTH_TOKEN=...export TWILIO_FROM_NUMBER=+15550001234يفشل twilio-voice-call-webhook عندما لا يمتلك voice-call تعرض Webhook
عامًا، أو عندما يشير publicUrl إلى loopback أو مساحة شبكة خاصة.
عيّن plugins.entries.voice-call.config.publicUrl إلى URL المزود العام أو
كوّن نفق voice-call/تعرض Tailscale.
عناوين URL الخاصة بـ loopback والعناوين الخاصة غير صالحة لاستدعاءات شركات
الاتصال. لا تستخدم 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 أو
fd00::/8 كقيمة publicUrl.
للحصول على URL عام مستقر:
{ plugins: { entries: { "voice-call": { enabled: true, config: { provider: "twilio", fromNumber: "+15550001234", publicUrl: "https://voice.example.com/voice/webhook", }, }, }, },}للتطوير المحلي، استخدم نفقًا أو إتاحة عبر Tailscale بدلًا من عنوان URL لمضيف خاص:
{ plugins: { entries: { "voice-call": { config: { tunnel: { provider: "ngrok" }, // or tailscale: { mode: "funnel", path: "/voice/webhook" }, }, }, }, },}ثم أعد تشغيل Gateway أو أعد تحميله وشغّل:
openclaw googlemeet setup --transport twilioopenclaw voicecall setupopenclaw voicecall smokeيكون voicecall smoke مخصصًا للتحقق من الجاهزية فقط افتراضيًا. لإجراء تشغيل تجريبي لرقم محدد:
openclaw voicecall smoke --to "+15555550123"أضف --yes فقط عندما تريد عمدًا إجراء مكالمة إشعار صادرة مباشرة:
openclaw voicecall smoke --to "+15555550123" --yesيبدأ اتصال Twilio لكنه لا يدخل الاجتماع أبدًا
تأكد من أن حدث Meet يعرض تفاصيل الاتصال الهاتفي. مرر رقم الاتصال الهاتفي ورمز PIN بالضبط أو تسلسل DTMF مخصصًا:
openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --dtmf-sequence ww123456#استخدم w بادئة أو فواصل في --dtmf-sequence إذا كان المزود يحتاج إلى توقف مؤقت قبل إدخال رمز PIN.
إذا أُنشئت المكالمة الهاتفية لكن قائمة Meet لا تعرض أبدًا مشارك الاتصال الهاتفي:
- شغّل
openclaw googlemeet doctor <session-id>لتأكيد معرف مكالمة Twilio المفوضة، وما إذا كان DTMF قد وُضع في الطابور، وما إذا طُلبت تحية المقدمة. - شغّل
openclaw voicecall status --call-id <id>وتأكد من أن المكالمة لا تزال نشطة. - شغّل
openclaw voicecall tailوتحقق من وصول Twilio webhooks إلى Gateway. - شغّل
openclaw logs --followوابحث عن تسلسل Twilio Meet: يفوض Google Meet الانضمام، ويخزن Voice Call ويقدم TwiML الخاص بـ DTMF قبل الاتصال، ويقدم Voice Call TwiML الفوري لمكالمة Twilio، ثم يطلب Google Meet كلام المقدمة عبرvoicecall.speak. - أعد تشغيل
openclaw googlemeet setup --transport twilio؛ يلزم نجاح فحص الإعداد، لكنه لا يثبت أن تسلسل رمز PIN للاجتماع صحيح. - تأكد من أن رقم الاتصال الهاتفي ينتمي إلى دعوة Meet والمنطقة نفسهما مثل رمز PIN.
- زِد
voiceCall.dtmfDelayMsعن القيمة الافتراضية البالغة 12 ثانية إذا كان Meet يجيب ببطء أو كان نص المكالمة لا يزال يعرض المطالبة بإدخال رمز PIN بعد إرسال DTMF قبل الاتصال. - إذا انضم المشارك لكنك لا تسمع التحية، فتحقق من
openclaw logs --followلطلبvoicecall.speakبعد DTMF ومن تشغيل TTS عبر دفق الوسائط أو آلية TwilioOPENCLAW_DOCS_MARKER:calloutOpen:U2F5الاحتياطية. إذا كان نص المكالمة لا يزال يحتوي على "enter the meeting PIN"، فإن ساق الهاتف لم تنضم بعد إلى غرفة Meet، لذلك لن يسمع مشاركو الاجتماع الكلام.
إذا لم تصل webhooks، فصحح Plugin Voice Call أولًا: يجب أن يصل المزود إلى plugins.entries.voice-call.config.publicUrl أو النفق المكوّن. راجع استكشاف أخطاء المكالمات الصوتية وإصلاحها.
ملاحظات
واجهة API الرسمية للوسائط في Google Meet موجهة للاستقبال، لذلك لا يزال التحدث داخل مكالمة Meet يحتاج إلى مسار مشارك. يُبقي هذا Plugin ذلك الحد واضحًا: يتولى Chrome مشاركة المتصفح وتوجيه الصوت المحلي؛ وتتولى Twilio مشاركة الاتصال الهاتفي.
تحتاج أوضاع الرد الصوتي في Chrome إلى BlackHole 2ch بالإضافة إلى أحد الخيارين:
chrome.audioInputCommandمعchrome.audioOutputCommand: يملك OpenClaw الجسر ويمرر الصوت بصيغةchrome.audioFormatبين تلك الأوامر والمزود المحدد. يستخدم وضع الوكيل النسخ الفوري مع TTS عادي؛ ويستخدم وضع bidi مزود الصوت الفوري. مسار Chrome الافتراضي هو PCM16 بتردد 24 كيلوهرتز معchrome.audioBufferBytes: 4096؛ ويظل G.711 mu-law بتردد 8 كيلوهرتز متاحًا لأزواج الأوامر القديمة.chrome.audioBridgeCommand: يملك أمر جسر خارجي مسار الصوت المحلي بالكامل ويجب أن يخرج بعد بدء تشغيل برنامجه الخفي أو التحقق منه. هذا صالح فقط لـbidiلأن وضعagentيحتاج إلى وصول مباشر إلى زوج الأوامر من أجل TTS.
عندما يستدعي وكيل أداة google_meet في وضع الوكيل، تُفرّع جلسة مستشار الاجتماع نص المتصل الحالي قبل الرد على كلام المشاركين. تظل جلسة Meet منفصلة (agent:<agentId>:subagent:google-meet:<sessionId>) كي لا تعدّل متابعات الاجتماع نص المتصل مباشرة.
للحصول على صوت ثنائي الاتجاه نظيف، وجّه إخراج Meet وميكروفون Meet عبر أجهزة افتراضية منفصلة أو مخطط جهاز افتراضي بنمط Loopback. يمكن لجهاز BlackHole واحد مشترك أن يعيد صدى المشاركين الآخرين إلى المكالمة.
مع جسر Chrome ذي زوج الأوامر، يمكن لـ chrome.bargeInInputCommand الاستماع إلى ميكروفون محلي منفصل ومسح تشغيل المساعد عندما يبدأ الإنسان بالكلام. يحافظ ذلك على أسبقية كلام الإنسان على إخراج المساعد حتى عندما يكون إدخال BlackHole loopback المشترك مكبوتًا مؤقتًا أثناء تشغيل المساعد. ومثل chrome.audioInputCommand وchrome.audioOutputCommand، فهو أمر محلي يكوّنه المشغل. استخدم مسار أمر موثوقًا وصريحًا أو قائمة وسائط، ولا توجهه إلى سكربتات من مواقع غير موثوقة.
يفعّل googlemeet speak جسر صوت الرد النشط لجلسة Chrome. يوقف googlemeet leave ذلك الجسر. بالنسبة إلى جلسات Twilio المفوضة عبر Plugin Voice Call، يؤدي leave أيضًا إلى إنهاء المكالمة الصوتية الأساسية. استخدم googlemeet end-active-conference عندما تريد أيضًا إغلاق مؤتمر Google Meet النشط لمساحة تديرها API.