Plugins
Sesli arama Plugin'i
Voice Call için OpenClaw üzerinden bir Plugin. Giden bildirimleri, çok turlu konuşmaları, full-duplex gerçek zamanlı sesi, streaming transcription’ı ve allowlist ilkeleriyle gelen aramaları destekler.
Mevcut sağlayıcılar: twilio (Programmable Voice + Media Streams),
telnyx (Call Control v2), plivo (Voice API + XML transfer + GetInput
speech), mock (dev/ağ yok).
Hızlı başlangıç
Plugin’i kurun
npm’den
openclaw plugins install @openclaw/voice-call
Yerel klasörden (dev)
PLUGIN_SRC=./path/to/local/voice-call-plugin
openclaw plugins install "$PLUGIN_SRC"
cd "$PLUGIN_SRC" && pnpm install
Mevcut resmi yayın etiketini takip etmek için yalın paketi kullanın. Tam sürümü yalnızca yeniden üretilebilir bir kurulum gerektiğinde sabitleyin.
Ardından Plugin’in yüklenmesi için Gateway’i yeniden başlatın.
Sağlayıcıyı ve Webhook’u yapılandırın
Yapılandırmayı plugins.entries.voice-call.config altında ayarlayın (tam
yapı için aşağıdaki Yapılandırma bölümüne bakın). En az:
provider, sağlayıcı kimlik bilgileri, fromNumber ve herkese açık
erişilebilir bir Webhook URL’si gerekir.
Kurulumu doğrulayın
openclaw voicecall setup
Varsayılan çıktı sohbet günlüklerinde ve terminallerde okunabilir. Plugin’in
etkinleştirilmesini, sağlayıcı kimlik bilgilerini, Webhook erişimini ve
yalnızca bir ses modunun (streaming veya realtime) etkin olduğunu
denetler. Betikler için --json kullanın.
Smoke test
openclaw voicecall smoke
openclaw voicecall smoke --to "+15555550123"
İkisi de varsayılan olarak dry run’dır. Gerçekten kısa bir giden bildirim
araması yapmak için --yes ekleyin:
openclaw voicecall smoke --to "+15555550123" --yes
Yapılandırma
enabled: true ayarlıysa ancak seçilen sağlayıcıda kimlik bilgileri eksikse,
Gateway başlatma sırasında eksik anahtarlarla birlikte setup-incomplete uyarısı
günlüğe yazılır ve runtime başlatılması atlanır. Komutlar, RPC çağrıları ve ajan
araçları kullanıldığında yine de eksik sağlayıcı yapılandırmasını aynen döndürür.
{
plugins: {
entries: {
"voice-call": {
enabled: true,
config: {
provider: "twilio", // or "telnyx" | "plivo" | "mock"
fromNumber: "+15550001234", // or TWILIO_FROM_NUMBER for Twilio
toNumber: "+15550005678",
sessionScope: "per-phone", // per-phone | per-call
numbers: {
"+15550009999": {
inboundGreeting: "Silver Fox Cards, how can I help?",
responseSystemPrompt: "You are a concise baseball card specialist.",
tts: {
providers: {
openai: { voice: "alloy" },
},
},
},
},
twilio: {
accountSid: "ACxxxxxxxx",
authToken: "...",
},
telnyx: {
apiKey: "...",
connectionId: "...",
// Telnyx webhook public key from the Mission Control Portal
// (Base64; can also be set via TELNYX_PUBLIC_KEY).
publicKey: "...",
},
plivo: {
authId: "MAxxxxxxxxxxxxxxxxxxxx",
authToken: "...",
},
// Webhook server
serve: {
port: 3334,
path: "/voice/webhook",
},
// Webhook security (recommended for tunnels/proxies)
webhookSecurity: {
allowedHosts: ["voice.example.com"],
trustedProxyIPs: ["100.64.0.1"],
},
// Public exposure (pick one)
// publicUrl: "https://example.ngrok.app/voice/webhook",
// tunnel: { provider: "ngrok" },
// tailscale: { mode: "funnel", path: "/voice/webhook" },
outbound: {
defaultMode: "notify", // notify | conversation
},
streaming: { enabled: true /* see Streaming transcription */ },
realtime: { enabled: false /* see Realtime voice */ },
},
},
},
},
}
Sağlayıcı erişimi ve güvenlik notları
- Twilio, Telnyx ve Plivo’nun tümü herkese açık erişilebilir bir Webhook URL’si gerektirir.
mock, yerel dev sağlayıcısıdır (ağ çağrısı yoktur).skipSignatureVerificationtrue değilse Telnyxtelnyx.publicKey(veyaTELNYX_PUBLIC_KEY) gerektirir.skipSignatureVerificationyalnızca yerel test içindir.- ngrok free tier’da
publicUrldeğerini tam ngrok URL’sine ayarlayın; imza doğrulaması her zaman uygulanır. tunnel.allowNgrokFreeTierLoopbackBypass: true, geçersiz imzalı Twilio Webhook’larına yalnızcatunnel.provider="ngrok"olduğunda veserve.bindloopback olduğunda (ngrok yerel ajanı) izin verir. Yalnızca yerel dev içindir.- Ngrok free-tier URL’leri değişebilir veya geçiş sayfası davranışı ekleyebilir;
publicUrlkayarsa Twilio imzaları başarısız olur. Production: kararlı bir alan adı veya Tailscale funnel tercih edin.
Streaming bağlantı sınırları
streaming.preStartTimeoutMs, hiçbir zaman geçerli birstartçerçevesi göndermeyen soketleri kapatır.streaming.maxPendingConnections, toplam kimliği doğrulanmamış pre-start soketlerini sınırlar.streaming.maxPendingConnectionsPerIp, kaynak IP başına kimliği doğrulanmamış pre-start soketlerini sınırlar.streaming.maxConnections, toplam açık media stream soketlerini sınırlar (pending + active).
Eski yapılandırma migration’ları
provider: "log", twilio.from veya eski streaming.* OpenAI anahtarlarını
kullanan eski yapılandırmalar openclaw doctor --fix tarafından yeniden
yazılır. Runtime fallback şimdilik eski voice-call anahtarlarını hâlâ kabul
eder, ancak yeniden yazma yolu openclaw doctor --fix olup compat shim
geçicidir.
Otomatik taşınan streaming anahtarları:
streaming.sttProvider→streaming.providerstreaming.openaiApiKey→streaming.providers.openai.apiKeystreaming.sttModel→streaming.providers.openai.modelstreaming.silenceDurationMs→streaming.providers.openai.silenceDurationMsstreaming.vadThreshold→streaming.providers.openai.vadThreshold
Oturum kapsamı
Varsayılan olarak Voice Call, aynı arayandan tekrarlanan aramaların konuşma
belleğini koruması için sessionScope: "per-phone" kullanır. Her taşıyıcı
aramasının yeni bağlamla başlaması gerektiğinde, örneğin resepsiyon, rezervasyon,
IVR veya aynı telefon numarasının farklı toplantıları temsil edebileceği Google
Meet köprüsü akışlarında sessionScope: "per-call" ayarlayın.
Gerçek zamanlı sesli konuşmalar
realtime, canlı arama sesi için full-duplex gerçek zamanlı bir ses sağlayıcısı
seçer. Yalnızca sesi gerçek zamanlı transcription sağlayıcılarına ileten
streaming’den ayrıdır.
Mevcut runtime davranışı:
realtime.enabled, Twilio Media Streams için desteklenir.realtime.provideristeğe bağlıdır. Ayarlanmazsa Voice Call ilk kayıtlı gerçek zamanlı ses sağlayıcısını kullanır.- Paketlenmiş gerçek zamanlı ses sağlayıcıları: Google Gemini Live (
google) ve OpenAI (openai), kendi sağlayıcı Plugin’leri tarafından kaydedilir. - Sağlayıcıya ait ham yapılandırma
realtime.providers.<providerId>altında bulunur. - Voice Call, paylaşılan
openclaw_agent_consultgerçek zamanlı aracını varsayılan olarak sunar. Gerçek zamanlı model, arayan daha derin akıl yürütme, güncel bilgi veya normal OpenClaw araçları istediğinde bunu çağırabilir. realtime.consultPolicy, gerçek zamanlı modelin ne zamanopenclaw_agent_consultçağırması gerektiğine ilişkin isteğe bağlı yönlendirme ekler.realtime.agentContext.enabledvarsayılan olarak kapalıdır. Etkinleştirildiğinde Voice Call, oturum kurulumu sırasında gerçek zamanlı sağlayıcı talimatlarına sınırlı ajan kimliği, sistem prompt override’ı ve seçili workspace-file kapsülü enjekte eder.realtime.fastContext.enabledvarsayılan olarak kapalıdır. Etkinleştirildiğinde Voice Call önce consult sorusu için dizinlenmiş bellek/oturum bağlamında arama yapar verealtime.fastContext.fallbackToConsulttrue ise yalnızca tam consult ajanına dönmeden önce bu parçacıklarırealtime.fastContext.timeoutMsiçinde gerçek zamanlı modele döndürür.realtime.providerkayıtlı olmayan bir sağlayıcıyı gösterirse veya hiç gerçek zamanlı ses sağlayıcısı kayıtlı değilse, Voice Call tüm Plugin’i başarısız kılmak yerine bir uyarı günlüğe yazar ve gerçek zamanlı medyayı atlar.- Consult oturum anahtarları, varsa depolanmış arama oturumunu yeniden kullanır; ardından yapılandırılmış
sessionScopedeğerine geri döner (varsayılan olarakper-phoneveya yalıtılmış aramalar içinper-call).
Araç ilkesi
realtime.toolPolicy, consult çalıştırmasını denetler:
| İlke | Davranış |
|---|---|
safe-read-only |
Consult aracını sunar ve normal ajanı read, web_search, web_fetch, x_search, memory_search ve memory_get ile sınırlar. |
owner |
Consult aracını sunar ve normal ajanın normal ajan araç ilkesini kullanmasına izin verir. |
none |
Consult aracını sunmaz. Özel realtime.tools yine de gerçek zamanlı sağlayıcıya aktarılır. |
realtime.consultPolicy yalnızca gerçek zamanlı model talimatlarını denetler:
| İlke | Yönlendirme |
|---|---|
auto |
Varsayılan prompt’u koruyun ve consult aracını ne zaman çağıracağına sağlayıcının karar vermesine izin verin. |
substantive |
Basit konuşma bağlantılarını doğrudan yanıtlayın ve olgular, bellek, araçlar veya bağlam öncesinde consult yapın. |
always |
Her anlamlı yanıttan önce consult yapın. |
Ajan ses bağlamı
Ses köprüsünün, sıradan turlarda tam ajan-consult gidiş dönüşü maliyeti olmadan
yapılandırılmış OpenClaw ajanı gibi duyulması gerektiğinde
realtime.agentContext etkinleştirin. Bağlam kapsülü, gerçek zamanlı oturum
oluşturulduğunda bir kez eklenir; bu nedenle tur başına gecikme eklemez.
openclaw_agent_consult çağrıları yine de tam OpenClaw ajanını çalıştırır ve
araç işleri, güncel bilgi, bellek aramaları veya workspace durumu için
kullanılmalıdır.
{
plugins: {
entries: {
"voice-call": {
config: {
agentId: "main",
realtime: {
enabled: true,
provider: "google",
toolPolicy: "safe-read-only",
consultPolicy: "substantive",
agentContext: {
enabled: true,
maxChars: 6000,
includeIdentity: true,
includeSystemPrompt: true,
includeWorkspaceFiles: true,
files: ["SOUL.md", "IDENTITY.md", "USER.md"],
},
},
},
},
},
},
}
Gerçek zamanlı sağlayıcı örnekleri
Google Gemini Live
Varsayılanlar: API anahtarı realtime.providers.google.apiKey,
GEMINI_API_KEY veya GOOGLE_GENERATIVE_AI_API_KEY; model
gemini-2.5-flash-native-audio-preview-12-2025; ses Kore.
Daha uzun, yeniden bağlanabilir çağrılar için sessionResumption ve
contextWindowCompression varsayılan olarak açıktır. Telefon sesi üzerinde
daha hızlı sıra alma davranışını ayarlamak için silenceDurationMs,
startSensitivity ve endSensitivity kullanın.
{
plugins: {
entries: {
"voice-call": {
config: {
provider: "twilio",
inboundPolicy: "allowlist",
allowFrom: ["+15550005678"],
realtime: {
enabled: true,
provider: "google",
instructions: "Speak briefly. Call openclaw_agent_consult before using deeper tools.",
toolPolicy: "safe-read-only",
consultPolicy: "substantive",
agentContext: { enabled: true },
providers: {
google: {
apiKey: "${GEMINI_API_KEY}",
model: "gemini-2.5-flash-native-audio-preview-12-2025",
voice: "Kore",
silenceDurationMs: 500,
startSensitivity: "high",
},
},
},
},
},
},
},
}
OpenAI
{
plugins: {
entries: {
"voice-call": {
config: {
realtime: {
enabled: true,
provider: "openai",
providers: {
openai: { apiKey: "${OPENAI_API_KEY}" },
},
},
},
},
},
},
}
Sağlayıcıya özel gerçek zamanlı ses seçenekleri için Google sağlayıcısı ve OpenAI sağlayıcısı bölümlerine bakın.
Akışla transkripsiyon
streaming, canlı çağrı sesi için gerçek zamanlı bir transkripsiyon sağlayıcısı seçer.
Geçerli çalışma zamanı davranışı:
streaming.provideristeğe bağlıdır. Ayarlanmamışsa Voice Call ilk kayıtlı gerçek zamanlı transkripsiyon sağlayıcısını kullanır.- Paketle gelen gerçek zamanlı transkripsiyon sağlayıcıları: Deepgram (
deepgram), ElevenLabs (elevenlabs), Mistral (mistral), OpenAI (openai) ve xAI (xai); bunlar kendi sağlayıcı Plugin'leri tarafından kaydedilir. - Sağlayıcının sahip olduğu ham yapılandırma
streaming.providers.<providerId>altında bulunur. - Twilio kabul edilmiş bir akış
startiletisi gönderdikten sonra Voice Call akışı hemen kaydeder, sağlayıcı bağlanırken gelen medyayı transkripsiyon sağlayıcısı üzerinden kuyruğa alır ve ilk selamlamayı yalnızca gerçek zamanlı transkripsiyon hazır olduktan sonra başlatır. streaming.providerkayıtlı olmayan bir sağlayıcıyı gösteriyorsa veya hiç sağlayıcı kayıtlı değilse Voice Call bir uyarı günlüğe yazar ve tüm Plugin'i başarısız kılmak yerine medya akışını atlar.
Akış sağlayıcısı örnekleri
OpenAI
Varsayılanlar: API anahtarı streaming.providers.openai.apiKey veya
OPENAI_API_KEY; model gpt-4o-transcribe; silenceDurationMs: 800;
vadThreshold: 0.5.
{
plugins: {
entries: {
"voice-call": {
config: {
streaming: {
enabled: true,
provider: "openai",
streamPath: "/voice/stream",
providers: {
openai: {
apiKey: "sk-...", // optional if OPENAI_API_KEY is set
model: "gpt-4o-transcribe",
silenceDurationMs: 800,
vadThreshold: 0.5,
},
},
},
},
},
},
},
}
xAI
Varsayılanlar: API anahtarı streaming.providers.xai.apiKey veya XAI_API_KEY;
uç nokta wss://api.x.ai/v1/stt; kodlama mulaw; örnekleme hızı 8000;
endpointingMs: 800; interimResults: true.
{
plugins: {
entries: {
"voice-call": {
config: {
streaming: {
enabled: true,
provider: "xai",
streamPath: "/voice/stream",
providers: {
xai: {
apiKey: "${XAI_API_KEY}", // optional if XAI_API_KEY is set
endpointingMs: 800,
language: "en",
},
},
},
},
},
},
},
}
Çağrılar için TTS
Voice Call, çağrılarda akışlı konuşma için çekirdek messages.tts
yapılandırmasını kullanır. Bunu Plugin yapılandırması altında
aynı biçimle geçersiz kılabilirsiniz; messages.tts ile derin birleştirme yapar.
{
tts: {
provider: "elevenlabs",
providers: {
elevenlabs: {
voiceId: "pMsXgVXv3BLzUgSXRplE",
modelId: "eleven_multilingual_v2",
},
},
},
}
Davranış notları:
- Plugin yapılandırması içindeki eski
tts.<provider>anahtarları (openai,elevenlabs,microsoft,edge)openclaw doctor --fixtarafından onarılır; commit edilmiş yapılandırmatts.providers.<provider>kullanmalıdır. - Twilio medya akışı etkinleştirildiğinde çekirdek TTS kullanılır; aksi halde çağrılar sağlayıcıya özgü seslere geri döner.
- Bir Twilio medya akışı zaten etkinse Voice Call TwiML
OPENCLAW_DOCS_MARKER:calloutOpen:U2F5öğesine geri dönmez. Bu durumda telefon TTS kullanılamıyorsa oynatma isteği iki oynatma yolunu karıştırmak yerine başarısız olur. - Telefon TTS ikincil bir sağlayıcıya geri döndüğünde Voice Call hata ayıklama için sağlayıcı zincirini (
from,to,attempts) içeren bir uyarı günlüğe yazar. - Twilio araya girme veya akış kapatma bekleyen TTS kuyruğunu temizlediğinde, kuyruğa alınmış oynatma istekleri oynatma tamamlanmasını bekleyen arayanları askıda bırakmak yerine sonuçlanır.
TTS örnekleri
Core TTS only
{
messages: {
tts: {
provider: "openai",
providers: {
openai: { voice: "alloy" },
},
},
},
}
Override to ElevenLabs (calls only)
{
plugins: {
entries: {
"voice-call": {
config: {
tts: {
provider: "elevenlabs",
providers: {
elevenlabs: {
apiKey: "elevenlabs_key",
voiceId: "pMsXgVXv3BLzUgSXRplE",
modelId: "eleven_multilingual_v2",
},
},
},
},
},
},
},
}
OpenAI model override (deep-merge)
{
plugins: {
entries: {
"voice-call": {
config: {
tts: {
providers: {
openai: {
model: "gpt-4o-mini-tts",
voice: "marin",
},
},
},
},
},
},
},
}
Gelen çağrılar
Gelen arama ilkesi varsayılan olarak disabled değerindedir. Gelen çağrıları etkinleştirmek için şunu ayarlayın:
{
inboundPolicy: "allowlist",
allowFrom: ["+15550001234"],
inboundGreeting: "Hello! How can I help?",
}
Otomatik yanıtlar aracı sistemini kullanır. responseModel,
responseSystemPrompt ve responseTimeoutMs ile ayarlayın.
Numara başına yönlendirme
Tek bir Voice Call Plugin'i birden fazla telefon numarası için çağrı aldığında
ve her numaranın farklı bir hat gibi davranması gerektiğinde numbers kullanın.
Örneğin, bir numara gündelik bir kişisel asistan kullanırken başka bir numara
iş kişiliği, farklı bir yanıt aracısı ve farklı bir TTS sesi kullanabilir.
Rotalar, sağlayıcının verdiği çevrilen To numarasından seçilir. Anahtarlar
E.164 numaraları olmalıdır. Bir çağrı geldiğinde Voice Call eşleşen rotayı bir kez çözer,
eşleşen rotayı çağrı kaydında saklar ve bu etkin yapılandırmayı selamlama,
klasik otomatik yanıt yolu, gerçek zamanlı danışma yolu ve TTS oynatma için
yeniden kullanır. Hiçbir rota eşleşmezse genel Voice Call yapılandırması kullanılır.
Giden çağrılar numbers kullanmaz; çağrıyı başlatırken giden hedefi, iletiyi ve
oturumu açıkça geçirin.
Rota geçersiz kılmaları şu anda şunları destekler:
inboundGreetingttsagentIdresponseModelresponseSystemPromptresponseTimeoutMs
tts rota değeri genel Voice Call tts yapılandırmasının üzerine derin birleştirme yapar; bu nedenle
genellikle yalnızca sağlayıcı sesini geçersiz kılabilirsiniz:
{
inboundGreeting: "Hello from the main line.",
responseSystemPrompt: "You are the default voice assistant.",
tts: {
provider: "openai",
providers: {
openai: { voice: "coral" },
},
},
numbers: {
"+15550001111": {
inboundGreeting: "Silver Fox Cards, how can I help?",
responseSystemPrompt: "You are a concise baseball card specialist.",
tts: {
providers: {
openai: { voice: "alloy" },
},
},
},
},
}
Sözlü çıktı sözleşmesi
Otomatik yanıtlar için Voice Call, sistem istemine katı bir sözlü çıktı sözleşmesi ekler:
{"spoken":"..."}
Voice Call konuşma metnini savunmacı biçimde çıkarır:
- Akıl yürütme/hata içeriği olarak işaretlenmiş yükleri yok sayar.
- Doğrudan JSON, çitle çevrilmiş JSON veya satır içi
"spoken"anahtarlarını ayrıştırır. - Düz metne geri döner ve olası planlama/meta giriş paragraflarını kaldırır.
Bu, sözlü oynatmayı arayana yönelik metne odaklı tutar ve planlama metninin sese sızmasını önler.
Konuşma başlatma davranışı
Giden conversation çağrıları için ilk ileti işleme canlı oynatma durumuna bağlıdır:
- Araya girme kuyruğu temizleme ve otomatik yanıt yalnızca ilk selamlama aktif olarak konuşulurken bastırılır.
- İlk oynatma başarısız olursa çağrı
listeningdurumuna döner ve ilk ileti yeniden deneme için kuyrukta kalır. - Twilio akışı için ilk oynatma, ek gecikme olmadan akış bağlantısında başlar.
- Araya girme etkin oynatmayı iptal eder ve kuyruğa alınmış ama henüz oynatılmayan Twilio TTS girdilerini temizler. Temizlenen girdiler atlandı olarak çözülür, böylece takip yanıtı mantığı asla oynatılmayacak sesi beklemeden devam edebilir.
- Gerçek zamanlı sesli konuşmalar, gerçek zamanlı akışın kendi açılış sırasını kullanır. Voice Call bu ilk ileti için eski
OPENCLAW_DOCS_MARKER:calloutOpen:U2F5TwiML güncellemesi göndermez; böylece giden<Connect><Stream>oturumları bağlı kalır.
Twilio akışı bağlantı kesme toleransı
Bir Twilio medya akışının bağlantısı kesildiğinde Voice Call çağrıyı otomatik sonlandırmadan önce 2000 ms bekler:
- Akış bu pencere içinde yeniden bağlanırsa otomatik sonlandırma iptal edilir.
- Tolerans süresinden sonra hiçbir akış yeniden kaydolmazsa takılı kalmış etkin çağrıları önlemek için çağrı sonlandırılır.
Eski çağrı temizleyici
Terminal Webhook hiç almayan çağrıları sonlandırmak için staleCallReaperSeconds
kullanın (örneğin, hiç tamamlanmayan bildirim modu çağrıları). Varsayılan
değer 0 (devre dışı).
Önerilen aralıklar:
- Üretim: Bildirim tarzı akışlar için
120–300saniye. - Normal çağrıların tamamlanabilmesi için bu değeri
maxDurationSecondsdeğerinden daha yüksek tutun. İyi bir başlangıç noktasımaxDurationSeconds + 30–60saniyedir.
{
plugins: {
entries: {
"voice-call": {
config: {
maxDurationSeconds: 300,
staleCallReaperSeconds: 360,
},
},
},
},
}
Webhook güvenliği
Gateway'in önünde bir proxy veya tünel olduğunda Plugin, imza doğrulaması için genel URL'yi yeniden oluşturur. Bu seçenekler hangi iletilen üstbilgilere güvenileceğini denetler:
webhookSecurity.allowedHostsstring[]İletme üstbilgilerinden ana makineleri izin listesine alın.
webhookSecurity.trustForwardingHeadersbooleanİzin listesi olmadan iletilen üstbilgilere güvenin.
webhookSecurity.trustedProxyIPsstring[]İletilen üstbilgilere yalnızca isteğin uzak IP'si listeyle eşleştiğinde güvenin.
Ek korumalar:
- Twilio ve Plivo için Webhook yeniden oynatma koruması etkindir. Yeniden oynatılan geçerli webhook istekleri onaylanır, ancak yan etkiler için atlanır.
- Twilio konuşma turları
<Gather>geri çağrılarında tur başına bir token içerir, böylece eski/yeniden oynatılan konuşma geri çağrıları daha yeni bir bekleyen transkript turunu karşılayamaz. - Kimliği doğrulanmamış webhook istekleri, sağlayıcının gerekli imza üstbilgileri eksik olduğunda gövde okunmadan önce reddedilir.
- Voice-call Webhook'u, imza doğrulamasından önce paylaşılan ön kimlik doğrulama gövde profilini (64 KB / 5 saniye) ve IP başına uçuşta istek sınırını kullanır.
Kararlı bir genel ana makineyle örnek:
{
plugins: {
entries: {
"voice-call": {
config: {
publicUrl: "https://voice.example.com/voice/webhook",
webhookSecurity: {
allowedHosts: ["voice.example.com"],
},
},
},
},
},
}
CLI
openclaw voicecall call --to "+15555550123" --message "Hello from OpenClaw"
openclaw voicecall start --to "+15555550123" # alias for call
openclaw voicecall continue --call-id <id> --message "Any questions?"
openclaw voicecall speak --call-id <id> --message "One moment"
openclaw voicecall dtmf --call-id <id> --digits "ww123456#"
openclaw voicecall end --call-id <id>
openclaw voicecall status --call-id <id>
openclaw voicecall tail
openclaw voicecall latency # summarize turn latency from logs
openclaw voicecall expose --mode funnel
Gateway zaten çalışıyorsa, operasyonel voicecall komutları Gateway'in sahip olduğu
voice-call çalışma zamanına devreder; böylece CLI ikinci bir webhook sunucusuna bağlanmaz.
Erişilebilir Gateway yoksa komutlar bağımsız bir CLI çalışma zamanına geri döner.
latency, varsayılan voice-call depolama yolundan calls.jsonl dosyasını okur.
Farklı bir günlüğü göstermek için --file <path>, analizi son N kayıtla
sınırlamak için --last <n> kullanın (varsayılan 200). Çıktı, tur gecikmesi
ve dinleme-bekleme süreleri için p50/p90/p99 içerir.
Ajan aracı
Araç adı: voice_call.
| Eylem | Argümanlar |
|---|---|
initiate_call |
message, to?, mode?, dtmfSequence? |
continue_call |
callId, message |
speak_to_user |
callId, message |
send_dtmf |
callId, digits |
end_call |
callId |
get_status |
callId |
Bu repo, skills/voice-call/SKILL.md konumunda eşleşen bir skill belgesi gönderir.
Gateway RPC
| Yöntem | Argümanlar |
|---|---|
voicecall.initiate |
to?, message, mode?, dtmfSequence? |
voicecall.continue |
callId, message |
voicecall.speak |
callId, message |
voicecall.dtmf |
callId, digits |
voicecall.end |
callId |
voicecall.status |
callId |
dtmfSequence yalnızca mode: "conversation" ile geçerlidir. Bildirim modu aramaları,
bağlantı sonrası rakamlara ihtiyaç duyuyorsa arama oluşturulduktan sonra
voicecall.dtmf kullanmalıdır.
Sorun giderme
Kurulum webhook açılımında başarısız oluyor
Kurulumu Gateway'i çalıştıran aynı ortamdan çalıştırın:
openclaw voicecall setup
openclaw voicecall setup --json
twilio, telnyx ve plivo için webhook-exposure yeşil olmalıdır. Yapılandırılmış
bir publicUrl, yerel veya özel ağ alanını işaret ettiğinde yine de başarısız olur,
çünkü operatör bu adreslere geri çağrı yapamaz. publicUrl olarak
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 veya fd00::/8 kullanmayın.
Twilio bildirim modu giden aramaları, ilk OPENCLAW_DOCS_MARKER:calloutOpen:U2F5 TwiML'lerini doğrudan
arama oluşturma isteğinde gönderir; bu nedenle ilk konuşulan mesaj, Twilio'nun
webhook TwiML'sini getirmesine bağlı değildir. Durum geri çağrıları,
konuşma aramaları, bağlantı öncesi DTMF, realtime akışlar ve bağlantı sonrası
arama denetimi için yine de genel bir Webhook gerekir.
Tek bir genel açılım yolu kullanın:
{
plugins: {
entries: {
"voice-call": {
config: {
publicUrl: "https://voice.example.com/voice/webhook",
// or
tunnel: { provider: "ngrok" },
// or
tailscale: { mode: "funnel", path: "/voice/webhook" },
},
},
},
},
}
Yapılandırmayı değiştirdikten sonra Gateway'i yeniden başlatın veya yeniden yükleyin, ardından şunu çalıştırın:
openclaw voicecall setup
openclaw voicecall smoke
voicecall smoke, --yes iletmediğiniz sürece bir deneme çalıştırmasıdır.
Sağlayıcı kimlik bilgileri başarısız oluyor
Seçili sağlayıcıyı ve gerekli kimlik bilgisi alanlarını denetleyin:
- Twilio:
twilio.accountSid,twilio.authTokenvefromNumberya daTWILIO_ACCOUNT_SID,TWILIO_AUTH_TOKENveTWILIO_FROM_NUMBER. - Telnyx:
telnyx.apiKey,telnyx.connectionId,telnyx.publicKeyvefromNumber. - Plivo:
plivo.authId,plivo.authTokenvefromNumber.
Kimlik bilgileri Gateway ana makinesinde mevcut olmalıdır. Yerel bir shell profilini düzenlemek, Gateway yeniden başlatılana veya ortamını yeniden yükleyene kadar zaten çalışan Gateway'i etkilemez.
Aramalar başlıyor ancak sağlayıcı webhook'ları ulaşmıyor
Sağlayıcı konsolunun tam genel Webhook URL'sini işaret ettiğini doğrulayın:
https://voice.example.com/voice/webhook
Ardından çalışma zamanı durumunu inceleyin:
openclaw voicecall status --call-id <id>
openclaw voicecall tail
openclaw logs --follow
Yaygın nedenler:
publicUrl,serve.pathdeğerinden farklı bir yolu işaret ediyor.- Gateway başlatıldıktan sonra tünel URL'si değişti.
- Bir proxy isteği iletiyor ancak host/proto üstbilgilerini kaldırıyor veya yeniden yazıyor.
- Güvenlik duvarı veya DNS, genel ana makine adını Gateway dışında bir yere yönlendiriyor.
- Gateway, Voice Call Plugin etkinleştirilmeden yeniden başlatıldı.
Gateway'in önünde bir ters proxy veya tünel olduğunda,
webhookSecurity.allowedHosts değerini genel ana makine adına ayarlayın veya bilinen
bir proxy adresi için webhookSecurity.trustedProxyIPs kullanın.
webhookSecurity.trustForwardingHeaders seçeneğini yalnızca proxy sınırı
denetiminiz altındaysa kullanın.
İmza doğrulaması başarısız oluyor
Sağlayıcı imzaları, OpenClaw'ın gelen istekten yeniden oluşturduğu genel URL'ye göre denetlenir. İmzalar başarısız olursa:
- Sağlayıcı Webhook URL'sinin şema, ana makine ve yol dahil olmak üzere
publicUrlile tam olarak eşleştiğini doğrulayın. - Ngrok ücretsiz katman URL'leri için tünel ana makine adı değiştiğinde
publicUrldeğerini güncelleyin. - Proxy'nin özgün host ve proto üstbilgilerini koruduğundan emin olun veya
webhookSecurity.allowedHostsyapılandırın. - Yerel test dışında
skipSignatureVerificationetkinleştirmeyin.
Google Meet Twilio katılımları başarısız oluyor
Google Meet, Twilio arayarak katılım için bu Plugin'i kullanır. Önce Voice Call'ı doğrulayın:
openclaw voicecall setup
openclaw voicecall smoke --to "+15555550123"
Ardından Google Meet taşımasını açıkça doğrulayın:
openclaw googlemeet setup --transport twilio
Voice Call yeşilse ancak Meet katılımcısı hiç katılmıyorsa Meet
arayarak katılım numarasını, PIN'i ve --dtmf-sequence değerini denetleyin.
Toplantı yanlış bir DTMF dizisini reddederken veya yok sayarken telefon araması sağlıklı olabilir.
Google Meet, Twilio telefon ayağını bağlantı öncesi DTMF dizisiyle
voicecall.start üzerinden başlatır. PIN'den türetilen diziler, başta Twilio bekleme
rakamları olarak Google Meet Plugin'inin voiceCall.dtmfDelayMs değerini içerir.
Varsayılan 12 saniyedir, çünkü Meet arayarak katılım istemleri geç gelebilir.
Voice Call daha sonra giriş selamlaması istenmeden önce realtime işlemeye geri yönlendirir.
Canlı aşama izi için openclaw logs --follow kullanın. Sağlıklı bir Twilio Meet
katılımı şu sırayı günlüğe yazar:
- Google Meet, Twilio katılımını Voice Call'a devreder.
- Voice Call, bağlantı öncesi DTMF TwiML'ini depolar.
- Twilio ilk TwiML'i, realtime işlemeye geçmeden önce tüketilir ve sunulur.
- Voice Call, Twilio araması için realtime TwiML sunar.
- Google Meet, DTMF sonrası gecikmeden sonra
voicecall.speakile giriş konuşması ister.
openclaw voicecall tail kalıcı arama kayıtlarını yine de gösterir; arama durumu
ve transkriptler için kullanışlıdır, ancak her webhook/realtime geçişi orada görünmez.
Realtime aramada konuşma yok
Yalnızca bir ses modunun etkin olduğunu doğrulayın. realtime.enabled ve
streaming.enabled ikisi birden true olamaz.
Realtime Twilio aramaları için ayrıca şunları doğrulayın:
- Bir realtime sağlayıcı Plugin'i yüklendi ve kaydedildi.
realtime.providerayarlanmamış veya kayıtlı bir sağlayıcıyı adlandırıyor.- Sağlayıcı API anahtarı Gateway işlemine kullanılabilir durumda.
openclaw logs --follow, realtime TwiML'in sunulduğunu, realtime köprüsünün başlatıldığını ve ilk selamlamanın kuyruğa alındığını gösteriyor.