Files
openclaw/extensions/google-meet/openclaw.plugin.json
2026-05-03 20:16:50 -07:00

533 lines
15 KiB
JSON

{
"id": "google-meet",
"name": "Google Meet",
"description": "Join Google Meet calls through Chrome or Twilio transports.",
"enabledByDefault": false,
"commandAliases": [{ "name": "googlemeet" }],
"activation": {
"onStartup": true,
"onCommands": ["googlemeet"],
"onCapabilities": ["tool"]
},
"contracts": {
"tools": ["google_meet"]
},
"uiHints": {
"defaults.meeting": {
"label": "Default Meeting",
"help": "Meet URL, meeting code, or spaces/{id} used when commands omit a meeting."
},
"preview.enrollmentAcknowledged": {
"label": "Preview Acknowledged",
"help": "Confirms you understand the Google Meet Media API is still Developer Preview.",
"advanced": true
},
"defaultTransport": {
"label": "Default Transport",
"help": "Chrome uses a signed-in browser profile. Chrome-node runs Chrome on a paired node. Twilio uses Meet dial-in numbers."
},
"defaultMode": {
"label": "Default Mode",
"help": "Agent uses realtime transcription plus regular OpenClaw TTS. Bidi uses the realtime voice model directly. Transcribe observes only."
},
"chrome.audioBackend": {
"label": "Chrome Audio Backend",
"help": "BlackHole 2ch is required for local duplex audio routing."
},
"chrome.launch": {
"label": "Launch Chrome"
},
"chrome.browserProfile": {
"label": "Chrome Profile",
"advanced": true
},
"chrome.guestName": {
"label": "Guest Name",
"help": "Used when Chrome lands on the signed-out Meet guest-name screen."
},
"chrome.reuseExistingTab": {
"label": "Reuse Existing Meet Tab",
"help": "Avoids opening duplicate tabs for the same Meet URL."
},
"chrome.autoJoin": {
"label": "Auto Join Guest Screen",
"help": "Best-effort guest-name fill and Join Now click through OpenClaw browser automation."
},
"chrome.waitForInCallMs": {
"label": "Wait For In-Call (ms)",
"help": "Waits for Chrome to report that the Meet tab is in-call before the realtime intro speaks.",
"advanced": true
},
"chrome.audioInputCommand": {
"label": "Audio Input Command",
"help": "Command that writes meeting audio to stdout in chrome.audioFormat.",
"advanced": true
},
"chrome.audioOutputCommand": {
"label": "Audio Output Command",
"help": "Command that reads assistant audio from stdin in chrome.audioFormat.",
"advanced": true
},
"chrome.bargeInInputCommand": {
"label": "Barge-In Input Command",
"help": "Optional Gateway-hosted microphone command that writes signed 16-bit little-endian mono PCM for human interruption detection while assistant playback is active.",
"advanced": true
},
"chrome.bargeInRmsThreshold": {
"label": "Barge-In RMS Threshold",
"help": "RMS level on chrome.bargeInInputCommand that counts as a human interruption.",
"advanced": true
},
"chrome.bargeInPeakThreshold": {
"label": "Barge-In Peak Threshold",
"help": "Peak level on chrome.bargeInInputCommand that counts as a human interruption.",
"advanced": true
},
"chrome.bargeInCooldownMs": {
"label": "Barge-In Cooldown (ms)",
"help": "Minimum delay between repeated barge-in clears.",
"advanced": true
},
"chrome.audioFormat": {
"label": "Audio Format",
"help": "Command-pair audio format. PCM16 24 kHz is the default Chrome/Meet path; G.711 mu-law 8 kHz remains available for legacy command pairs.",
"advanced": true
},
"chrome.audioBufferBytes": {
"label": "Audio Buffer Bytes",
"help": "SoX processing buffer for generated Chrome command-pair audio commands. Lower values reduce latency but may underrun on busy hosts.",
"advanced": true
},
"chrome.audioBridgeCommand": {
"label": "Audio Bridge Command",
"advanced": true
},
"chrome.audioBridgeHealthCommand": {
"label": "Audio Bridge Health Command",
"advanced": true
},
"chromeNode.node": {
"label": "Chrome Node",
"help": "Node id/name/IP that owns Chrome, BlackHole, and SoX for chrome-node transport.",
"advanced": true
},
"twilio.defaultDialInNumber": {
"label": "Default Dial-In Number",
"placeholder": "+15551234567"
},
"twilio.defaultPin": {
"label": "Default PIN",
"advanced": true
},
"twilio.defaultDtmfSequence": {
"label": "Default DTMF Sequence",
"advanced": true
},
"voiceCall.enabled": {
"label": "Delegate To Voice Call"
},
"voiceCall.gatewayUrl": {
"label": "Voice Call Gateway URL",
"advanced": true
},
"voiceCall.token": {
"label": "Voice Call Gateway Token",
"sensitive": true,
"advanced": true
},
"voiceCall.requestTimeoutMs": {
"label": "Voice Call Request Timeout (ms)",
"advanced": true
},
"voiceCall.dtmfDelayMs": {
"label": "Legacy DTMF Delay (ms)",
"help": "Compatibility setting from the old post-connect DTMF flow. Twilio Meet joins now play DTMF before realtime connect.",
"advanced": true
},
"voiceCall.postDtmfSpeechDelayMs": {
"label": "Legacy Post-DTMF Speech Delay (ms)",
"help": "Compatibility setting from the old delayed-speech flow. Twilio Meet joins now carry the intro as the initial Voice Call message.",
"advanced": true
},
"voiceCall.introMessage": {
"label": "Voice Call Intro Message",
"advanced": true
},
"realtime.strategy": {
"label": "Realtime Strategy",
"help": "Legacy realtime alias setting. Use mode=agent or mode=bidi for new Meet joins."
},
"realtime.provider": {
"label": "Speech Provider",
"help": "Compatibility fallback for both realtime transcription and bidi voice. Prefer realtime.transcriptionProvider and realtime.voiceProvider for new configs."
},
"realtime.transcriptionProvider": {
"label": "Realtime Transcription Provider",
"help": "Agent mode uses this provider to transcribe meeting audio before regular OpenClaw TTS answers."
},
"realtime.voiceProvider": {
"label": "Bidi Voice Provider",
"help": "Bidi mode uses this realtime voice provider. Falls back to realtime.provider when unset."
},
"realtime.model": {
"label": "Bidi Realtime Model",
"help": "Only used by mode=bidi. Agent mode answers with the configured OpenClaw agent and regular TTS.",
"advanced": true
},
"realtime.instructions": {
"label": "Realtime Instructions",
"advanced": true
},
"realtime.introMessage": {
"label": "Realtime Intro Message",
"help": "Spoken once when the realtime bridge is ready. Set to an empty string to join silently."
},
"realtime.agentId": {
"label": "Realtime Consult Agent",
"help": "OpenClaw agent id used by openclaw_agent_consult. Defaults to \"main\".",
"advanced": true
},
"realtime.toolPolicy": {
"label": "Realtime Tool Policy",
"help": "Safe read-only tools are available by default; owner requests can unlock broader tools.",
"advanced": true
},
"oauth.clientId": {
"label": "OAuth Client ID"
},
"oauth.clientSecret": {
"label": "OAuth Client Secret",
"sensitive": true
},
"oauth.refreshToken": {
"label": "OAuth Refresh Token",
"sensitive": true
},
"oauth.accessToken": {
"label": "Cached Access Token",
"sensitive": true,
"advanced": true
},
"oauth.expiresAt": {
"label": "Cached Access Token Expiry",
"help": "Unix epoch milliseconds used only for the cached access-token fast path.",
"advanced": true
}
},
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": {
"type": "boolean"
},
"defaults": {
"type": "object",
"additionalProperties": false,
"properties": {
"meeting": {
"type": "string"
}
}
},
"preview": {
"type": "object",
"additionalProperties": false,
"properties": {
"enrollmentAcknowledged": {
"type": "boolean"
}
}
},
"defaultTransport": {
"type": "string",
"enum": ["chrome", "chrome-node", "twilio"],
"default": "chrome"
},
"defaultMode": {
"type": "string",
"enum": ["agent", "bidi", "transcribe"],
"default": "agent"
},
"chrome": {
"type": "object",
"additionalProperties": false,
"properties": {
"audioBackend": {
"type": "string",
"enum": ["blackhole-2ch"],
"default": "blackhole-2ch"
},
"launch": {
"type": "boolean",
"default": true
},
"browserProfile": {
"type": "string"
},
"guestName": {
"type": "string",
"default": "OpenClaw Agent"
},
"reuseExistingTab": {
"type": "boolean",
"default": true
},
"autoJoin": {
"type": "boolean",
"default": true
},
"joinTimeoutMs": {
"type": "number",
"default": 30000
},
"waitForInCallMs": {
"type": "number",
"default": 20000
},
"audioFormat": {
"type": "string",
"enum": ["pcm16-24khz", "g711-ulaw-8khz"],
"default": "pcm16-24khz"
},
"audioBufferBytes": {
"type": "number",
"default": 4096
},
"audioInputCommand": {
"type": "array",
"default": [
"sox",
"-q",
"--buffer",
"4096",
"-t",
"coreaudio",
"BlackHole 2ch",
"-t",
"raw",
"-r",
"24000",
"-c",
"1",
"-e",
"signed-integer",
"-b",
"16",
"-L",
"-"
],
"items": {
"type": "string"
}
},
"audioOutputCommand": {
"type": "array",
"default": [
"sox",
"-q",
"--buffer",
"4096",
"-t",
"raw",
"-r",
"24000",
"-c",
"1",
"-e",
"signed-integer",
"-b",
"16",
"-L",
"-",
"-t",
"coreaudio",
"BlackHole 2ch"
],
"items": {
"type": "string"
}
},
"bargeInInputCommand": {
"type": "array",
"items": {
"type": "string"
}
},
"bargeInRmsThreshold": {
"type": "number",
"default": 650
},
"bargeInPeakThreshold": {
"type": "number",
"default": 2500
},
"bargeInCooldownMs": {
"type": "number",
"default": 900
},
"audioBridgeCommand": {
"type": "array",
"items": {
"type": "string"
}
},
"audioBridgeHealthCommand": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"chromeNode": {
"type": "object",
"additionalProperties": false,
"properties": {
"node": {
"type": "string"
}
}
},
"twilio": {
"type": "object",
"additionalProperties": false,
"properties": {
"defaultDialInNumber": {
"type": "string"
},
"defaultPin": {
"type": "string"
},
"defaultDtmfSequence": {
"type": "string"
}
}
},
"voiceCall": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": {
"type": "boolean",
"default": true
},
"gatewayUrl": {
"type": "string"
},
"token": {
"type": "string"
},
"requestTimeoutMs": {
"type": "number",
"default": 30000
},
"dtmfDelayMs": {
"type": "number",
"default": 2500
},
"postDtmfSpeechDelayMs": {
"type": "number",
"default": 5000
},
"introMessage": {
"type": "string"
}
}
},
"realtime": {
"type": "object",
"additionalProperties": false,
"properties": {
"strategy": {
"type": "string",
"enum": ["agent", "bidi"],
"default": "agent"
},
"provider": {
"type": "string",
"default": "openai"
},
"transcriptionProvider": {
"type": "string",
"default": "openai"
},
"voiceProvider": {
"type": "string"
},
"model": {
"type": "string"
},
"instructions": {
"type": "string",
"default": "You are joining a private Google Meet as an OpenClaw voice transport. Keep spoken replies brief and natural. In agent mode, wait for OpenClaw consult results and speak them exactly. In bidi mode, answer directly and call openclaw_agent_consult for deeper reasoning, current information, or tools."
},
"introMessage": {
"type": "string",
"default": "Say exactly: I'm here and listening."
},
"agentId": {
"type": "string",
"description": "OpenClaw agent id used by openclaw_agent_consult. Defaults to \"main\"."
},
"toolPolicy": {
"type": "string",
"enum": ["safe-read-only", "owner", "none"],
"default": "safe-read-only"
},
"providers": {
"type": "object",
"additionalProperties": {
"type": "object",
"additionalProperties": true
}
}
}
},
"oauth": {
"type": "object",
"additionalProperties": false,
"properties": {
"clientId": {
"type": "string"
},
"clientSecret": {
"type": "string"
},
"refreshToken": {
"type": "string"
},
"accessToken": {
"type": "string"
},
"expiresAt": {
"type": "number"
}
}
},
"auth": {
"type": "object",
"additionalProperties": false,
"properties": {
"provider": {
"type": "string",
"enum": ["google-oauth"]
},
"clientId": {
"type": "string"
},
"clientSecret": {
"type": "string"
},
"tokenPath": {
"type": "string"
}
}
}
}
},
"configContracts": {
"compatibilityMigrationPaths": ["plugins.entries.google-meet.config.realtime.provider"]
}
}