Plugins
Google Meet Plugin
دعم المشاركين في 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 محليًا أو على مضيف عقدة مقترنة.
- تقبل Twilio رقم اتصال هاتفيًا مع رقم PIN أو تسلسل DTMF اختياري؛ ولا يمكنها طلب عنوان URL لاجتماع Meet مباشرة.
- أمر CLI هو
googlemeet؛ أماmeetفهو محجوز لسير عمل المؤتمرات الهاتفية الأوسع للوكلاء.
البدء السريع
ثبّت تبعيات الصوت المحلية وفعّل مزود نسخ فوريًا مع OpenClaw TTS العادي.
OpenAI هو مزود النسخ الافتراضي؛ كما يعمل Google Gemini Live أيضًا كاحتياطي
صوت bidi منفصل مع realtime.voiceProvider: "google":
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
# only needed when realtime.voiceProvider is "google" for bidi mode
export GEMINI_API_KEY=...
يثبّت blackhole-2ch جهاز الصوت الافتراضي BlackHole 2ch. يتطلب مثبّت
Homebrew إعادة تشغيل قبل أن يعرض macOS الجهاز:
sudo reboot
بعد إعادة التشغيل، تحقق من الجزأين:
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
فعّل Plugin:
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {},
},
},
},
}
تحقق من الإعداد:
openclaw googlemeet setup
مخرجات الإعداد مصممة لتكون قابلة للقراءة من الوكيل ومراعية للوضع. وهي تعرض
ملف Chrome الشخصي، وتثبيت العقدة، وبالنسبة إلى انضمامات 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 المثبتة، ويفتح
https://meet.google.com/new، وينتظر من Google إعادة التوجيه إلى عنوان URL حقيقي برمز اجتماع، ثم يعيد ذلك العنوان. يتطلب هذا المسار أن يكون ملف Chrome الشخصي الخاص بـ OpenClaw على العقدة مسجّل الدخول مسبقًا إلى 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 وتتجنب مسار Use microphone في Meet. إذا عرض 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
لا تحتاج إلى OpenClaw Gateway كامل أو مفتاح API لنموذج داخل جهاز macOS VM فقط لجعل VM يملك Chrome. شغّل Gateway والوكيل محليًا، ثم شغّل مضيف عقدة في VM. فعّل Plugin المضمّن على VM مرة واحدة حتى تعلن العقدة أمر Chrome:
ما الذي يعمل وأين:
- مضيف Gateway: OpenClaw Gateway، ومساحة عمل الوكيل، ومفاتيح النموذج/API، ومزود فوري، وتكوين Plugin الخاص بـ Google Meet.
- جهاز Parallels macOS VM: OpenClaw CLI/مضيف العقدة، وGoogle Chrome، وSoX، وBlackHole 2ch، وملف Chrome شخصي مسجّل الدخول إلى Google.
- غير مطلوب في VM: خدمة Gateway، أو تكوين الوكيل، أو مفتاح OpenAI/GPT، أو إعداد مزود النموذج.
ثبّت تبعيات VM:
brew install blackhole-2ch sox
أعد تشغيل VM بعد تثبيت BlackHole حتى يعرض macOS الجهاز BlackHole 2ch:
sudo reboot
بعد إعادة التشغيل، تحقق من أن VM يمكنه رؤية جهاز الصوت وأوامر SoX:
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox
ثبّت OpenClaw أو حدّثه في VM، ثم فعّل Plugin المضمّن هناك:
openclaw plugins enable google-meet
ابدأ مضيف العقدة في VM:
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
إذا كان <gateway-host> عنوان LAN IP ولا تستخدم TLS، فسترفض العقدة WebSocket
النصي غير المشفر ما لم تقبل صراحة ذلك للشبكة الخاصة الموثوقة:
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
استخدم متغير البيئة نفسه عند تثبيت العقدة كـ LaunchAgent:
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --force
openclaw node restart
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 هو بيئة العملية، وليس إعداد
openclaw.json. يخزّنه openclaw node install في بيئة LaunchAgent عندما
يكون موجودًا في أمر التثبيت.
وافق على العقدة من مضيف Gateway:
openclaw devices list
openclaw devices approve <requestId>
تأكد من أن Gateway يرى العقدة وأنها تعلن كلًا من googlemeet.chrome وإمكانية
المتصفح/browser.proxy:
openclaw nodes status
وجّه Meet عبر تلك العقدة على مضيف 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 عالقا عند
مطالبة لم تستطع الأتمتة حلها، فإن نتيجة الانضمام/اختبار الكلام تبلغ
manualActionRequired: true مع manualActionReason و
manualActionMessage. يجب على الوكلاء إيقاف إعادة محاولة الانضمام، والإبلاغ عن
تلك الرسالة بالضبط مع browserUrl/browserTitle الحاليين، ثم إعادة المحاولة
فقط بعد اكتمال إجراء المتصفح اليدوي.
إذا حُذف chromeNode.node، يختار OpenClaw تلقائيا فقط عندما يعلن Node واحد
متصل بالضبط عن كل من googlemeet.chrome والتحكم في المتصفح. إذا كانت عدة
Nodes قادرة متصلة، فاضبط chromeNode.node على معرف Node أو اسم العرض أو عنوان
IP البعيد.
فحوصات الفشل الشائعة:
Configured Google Meet node ... is not usable: offline: إن Node المثبت معروف لدى Gateway لكنه غير متاح. يجب على الوكلاء التعامل مع ذلك Node كحالة تشخيصية، لا كمضيف Chrome قابل للاستخدام، والإبلاغ عن عائق الإعداد بدلا من الرجوع إلى نقل آخر ما لم يطلب المستخدم ذلك.No connected Google Meet-capable node: شغّلopenclaw node runفي VM، وافق على الاقتران، وتأكد من تشغيلopenclaw plugins enable google-meetوopenclaw plugins enable browserفي VM. وتأكد أيضا من أن مضيف Gateway يسمح بأمري Node كليهما عبر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 عبر وكيل متصفح Node؛ تأكد من أن إعدادات متصفح Node تشير إلى ملف التعريف الذي تريده، مثلbrowser.defaultProfile: "user"أو ملف تعريف جلسة موجود مسمى. - تبويبات Meet مكررة: اترك
chrome.reuseExistingTab: trueمفعلا. يفعّل OpenClaw تبويبا موجودا لعنوان Meet نفسه قبل فتح تبويب جديد، ويعيد إنشاء الاجتماع في المتصفح استخدام تبويب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 عبر تحكم متصفح OpenClaw وينضم باستخدام ملف تعريف
متصفح OpenClaw المسجل للدخول. على macOS، يفحص Plugin وجود BlackHole 2ch
قبل التشغيل. وإذا كان مهيأ، فإنه يشغّل أيضا أمر صحة جسر الصوت وأمر بدء
التشغيل قبل فتح Chrome. استخدم chrome عندما يكون Chrome/الصوت على مضيف
Gateway؛ واستخدم chrome-node عندما يكون Chrome/الصوت على Node مقترن مثل VM
بنظام macOS في Parallels. بالنسبة إلى Chrome المحلي، اختر ملف التعريف باستخدام
browser.defaultProfile؛ ويتم تمرير chrome.browserProfile إلى مضيفي
chrome-node.
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
openclaw 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 Node:
{
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=+15550001234
export GEMINI_API_KEY=...
استخدم realtime.provider: "openai" مع Plugin موفر OpenAI و
OPENAI_API_KEY بدلا من ذلك إذا كان ذلك هو موفر الصوت في الوقت الفعلي لديك.
أعد تشغيل Gateway أو أعد تحميله بعد تفعيل voice-call؛ لا تظهر تغييرات إعدادات
Plugin في عملية Gateway قيد التشغيل بالفعل حتى يعاد تحميلها.
ثم تحقق:
openclaw config validate
openclaw 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، وNode متصل عند استخدام مشاركة المتصفح. 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 إعادة التوجيه المعتمد:
http://localhost:8085/oauth2callback
-
-
انسخ معرف العميل وسر العميل.
meetings.space.created مطلوب بواسطة Google Meet spaces.create.
يسمح meetings.space.readonly لـ OpenClaw بحل عناوين/رموز Meet إلى مساحات.
يسمح 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 باستخدام الطبيب
شغّل طبيب OAuth عندما تريد فحص صحة سريع لا يكشف الأسرار:
openclaw googlemeet doctor --oauth --json
لا يحمّل هذا وقت تشغيل Chrome ولا يتطلب Chrome Node متصلا. إنه يتحقق من وجود
إعدادات 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 --json
openclaw 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 --json
openclaw 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 الشخصي المسجل دخوله على Node المحددة، وليس من إعداد 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-hij
openclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hij
openclaw 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 --today
openclaw googlemeet calendar-events --today --json
openclaw 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-hij
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --json
openclaw 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.md
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 \
--format markdown --output meet-attendance.md
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 \
--format csv --output meet-attendance.csv
openclaw googlemeet export --conference-record conferenceRecords/abc123 \
--include-doc-bodies --zip --output meet-export
openclaw 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 transcribe
openclaw 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 يستخدم ملف المتصفح الشخصي المسجل دخوله في Node الخاصة بـ 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 مع سياق Node/علامة تبويب المتصفح والتوقف عن فتح علامات تبويب 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 sox
export OPENAI_API_KEY=sk-...
# or
export 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 أحادي القناة little-endian موقّعًا 16-بت لاكتشاف مقاطعة الإنسان أثناء تشغيل صوت المساعد. ينطبق هذا حاليًا على جسر زوج أوامرchromeالمستضاف على Gateway.chrome.bargeInRmsThreshold: 650: مستوى RMS الذي يُعد مقاطعة بشرية علىchrome.bargeInInputCommandchrome.bargeInPeakThreshold: 2500: مستوى الذروة الذي يُعد مقاطعة بشرية علىchrome.bargeInInputCommandchrome.bargeInCooldownMs: 900: الحد الأدنى للتأخير بين عمليات مسح المقاطعة البشرية المتكررةmode: "agent": وضع الرد الصوتي الافتراضي. يُنسخ كلام المشاركين بواسطة موفر النسخ الفوري المهيأ، ويُرسل إلى وكيل OpenClaw المهيأ في جلسة وكيل فرعي لكل اجتماع، ثم يُنطق عبر وقت تشغيل OpenClaw TTS العادي.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: {
voice: "Kore",
},
},
},
}
ElevenLabs للاستماع والتحدث في وضع الوكيل معًا:
{
messages: {
tts: {
provider: "elevenlabs",
providers: {
elevenlabs: {
modelId: "eleven_v3",
voiceId: "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.voiceId. يمكن لردود الوكيل أيضًا استخدام
توجيهات [[tts:voiceId=... model=eleven_v3]] لكل رد عند تفعيل تجاوزات نموذج TTS،
لكن التكوين هو الإعداد الافتراضي الحتمي للاجتماعات. عند الانضمام، ينبغي أن
تعرض السجلات transcriptionProvider=elevenlabs وأن يسجل كل رد منطوق
provider=elevenlabs model=eleven_v3 voice=<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. في الحالتين، تعمل موفرو النماذج وopenclaw_agent_consult على مضيف
Gateway، لذلك تبقى بيانات اعتماد النماذج هناك. مع mode: "agent" الافتراضي،
يتولى موفر النسخ الفوري الاستماع، وينتج وكيل OpenClaw المهيأ الإجابة، وينطقها
OpenClaw TTS العادي داخل 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."
}
أوضاع agent و bidi
وضع Chrome agent محسّن لسلوك "وكيلي موجود في الاجتماع". يسمع موفر النسخ
الفوري صوت الاجتماع، وتُوجّه نصوص المشاركين النهائية عبر وكيل OpenClaw المهيأ،
وتُنطق الإجابة عبر وقت تشغيل OpenClaw TTS العادي. عيّن mode: "bidi" عندما
تريد أن يجيب نموذج الصوت الفوري مباشرة.
تُدمج أجزاء النص النهائي القريبة قبل الاستشارة حتى لا ينتج دور منطوق واحد عدة
إجابات جزئية قديمة. ويُكبت الإدخال الفوري أيضًا أثناء استمرار تشغيل صوت المساعد
الموضوع في قائمة الانتظار،
وتُتجاهل أصداء النصوص الحديثة الشبيهة بالمساعد قبل استشارة الوكيل حتى لا يجعل
local loopback في BlackHole الوكيل يجيب على كلامه هو.
| الوضع | من يقرر الإجابة | مسار إخراج الكلام | استخدمه عندما |
|---|---|---|---|
agent |
وكيل OpenClaw المهيأ | وقت تشغيل OpenClaw TTS العادي | تريد سلوك "وكيلي موجود في الاجتماع" |
bidi |
نموذج الصوت الفوري | استجابة صوتية من موفر الصوت الفوري | تريد حلقة صوت محادثة بأقل زمن انتقال |
في وضع bidi، عندما يحتاج النموذج الفوري إلى استدلال أعمق أو معلومات حديثة أو
أدوات OpenClaw العادية، يمكنه استدعاء openclaw_agent_consult.
تعمل أداة الاستشارة على تشغيل وكيل OpenClaw العادي في الخلفية مع سياق
نص اجتماع حديث، وتُرجع إجابة منطوقة موجزة. في وضع agent،
يرسل OpenClaw تلك الإجابة مباشرة إلى وقت تشغيل TTS؛ وفي وضع bidi، يمكن
لنموذج الصوت الفوري نطق نتيجة الاستشارة مرة أخرى داخل الاجتماع. وهي تستخدم
آلية الاستشارة المشتركة نفسها المستخدمة في المكالمة الصوتية.
افتراضيًا، تعمل الاستشارات عبر الوكيل 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 setup
openclaw nodes status
openclaw 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 بعيد مثل آلة Parallels macOS الافتراضية، فهذا هو أقصر فحص آمن بعد تحديث Gateway أو الآلة الافتراضية:
openclaw googlemeet setup
openclaw nodes status --connected
openclaw nodes invoke \
--node parallels-macos \
--command googlemeet.chrome \
--params '{"action":"setup"}'
يثبت ذلك أن Plugin الخاص بـ Gateway محمّل، وأن عقدة الآلة الافتراضية متصلة بالرمز الحالي، وأن جسر صوت Meet متاح قبل أن يفتح وكيل علامة تبويب اجتماع حقيقية.
لاختبار Twilio، استخدم اجتماعًا يعرض تفاصيل الاتصال الهاتفي:
openclaw googlemeet setup
openclaw 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-meet
openclaw 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-meet
openclaw plugins enable browser
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
على مضيف Gateway، وافق على العقدة وتحقق من الأوامر:
openclaw devices list
openclaw 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 setup
openclaw 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. - لاحتياطي المتصفح: أن ملف OpenClaw الشخصي في Chrome على تلك العقدة مسجل دخوله
إلى 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 setup
openclaw 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-tab
openclaw 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 إلى local loopback أو مساحة شبكة خاصة.
عيّن plugins.entries.voice-call.config.publicUrl إلى عنوان URL العام للمزود
أو كوّن نفقًا/تعريضًا لـ voice-call عبر Tailscale.
عناوين local 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 twilio
openclaw voicecall setup
openclaw 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وتحقق من وصول Webhooks الخاصة بـ Twilio إلى 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 المكالمات الصوتية: يجب أن يصل المزوّد إلى
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 المكالمات الصوتية، يقوم leave أيضًا بإنهاء المكالمة الصوتية الأساسية.
استخدم googlemeet end-active-conference عندما تريد أيضًا إغلاق مؤتمر
Google Meet النشط لمساحة تُدار عبر API.