Plugin guides
Sesli arama plugin'i
Bir plugin aracılığıyla OpenClaw için sesli aramalar: giden bildirimler, çok turlu konuşmalar, tam çift yönlü gerçek zamanlı ses, akışlı transkripsiyon ve izin listesi politikalarıyla gelen aramalar.
Sağlayıcılar: mock (geliştirme, ağ yok), plivo (Voice API + XML aktarımı +
GetInput konuşması), telnyx (Call Control v2), twilio (Programmable Voice +
Media Streams).
Hızlı başlangıç
Plugin'i yükleyin
npm'den
openclaw plugins install @openclaw/voice-callYerel bir klasörden (geliştirme)
PLUGIN_SRC=./path/to/local/voice-call-pluginopenclaw plugins install "$PLUGIN_SRC"cd "$PLUGIN_SRC" && pnpm installGüncel sürüm etiketini takip etmek için yalın paketi kullanın. Yalnızca yeniden üretilebilir bir kurulum gerektiğinde tam bir sürümü sabitleyin. Daha sonra 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 (aşağıdaki
Yapılandırma bölümüne bakın). En azından şunlar gereklidir: provider, sağlayıcı
kimlik bilgileri, fromNumber ve herkese açık olarak erişilebilen bir Webhook URL'si.
Kurulumu doğrulayın
openclaw voicecall setupopenclaw voicecall setup --jsonPlugin'in etkinliğini, sağlayıcı kimlik bilgilerini, Webhook erişimini ve
yalnızca bir ses modunun (streaming veya realtime) etkin olduğunu denetler.
Temel testi çalıştırın
openclaw voicecall smokeopenclaw voicecall smoke --to "+15555550123"Her ikisi de varsayılan olarak deneme çalıştırmasıdır. Kısa bir giden
bildirim araması yapmak için --yes ekleyin:
openclaw voicecall smoke --to "+15555550123" --yesYapılandırma
enabled: true ancak seçilen sağlayıcının kimlik bilgileri eksikse Gateway
başlangıcı, eksik anahtarları içeren bir kurulum-tamamlanmadı uyarısı kaydeder ve
çalışma zamanını başlatmayı atlar. Komutlar, RPC çağrıları ve ajan araçları kullanıldığında
eksik yapılandırmanın tam karşılığını döndürmeye devam eder.
{ plugins: { entries: { "voice-call": { enabled: true, config: { provider: "twilio", // veya "telnyx" | "plivo" | "mock" fromNumber: "+15550001234", // veya Twilio için TWILIO_FROM_NUMBER toNumber: "+15550005678", sessionScope: "per-phone", // per-phone | per-call numbers: { "+15550009999": { inboundGreeting: "Silver Fox Cards, size nasıl yardımcı olabilirim?", responseSystemPrompt: "Kısa ve öz yanıt veren bir beyzbol kartı uzmanısınız.", tts: { providers: { openai: { speakerVoice: "alloy" }, }, }, }, }, twilio: { accountSid: "ACxxxxxxxx", authToken: "...", // region: "ie1", // isteğe bağlı: us1 | ie1 | au1; varsayılan us1'dir }, telnyx: { apiKey: "...", connectionId: "...", // Mission Control Portal'dan Telnyx Webhook genel anahtarı // (Base64; TELNYX_PUBLIC_KEY aracılığıyla da ayarlanabilir). publicKey: "...", }, plivo: { authId: "MAxxxxxxxxxxxxxxxxxxxx", authToken: "...", }, // Webhook sunucusu serve: { port: 3334, path: "/voice/webhook", }, // Webhook güvenliği (tüneller/proxy'ler için önerilir) webhookSecurity: { allowedHosts: ["voice.example.com"], trustedProxyIPs: ["100.64.0.1"], }, // Herkese açık erişim (birini seçin) // publicUrl: "https://example.ngrok.app/voice/webhook", // tunnel: { provider: "ngrok" }, // tailscale: { mode: "funnel", path: "/voice/webhook" }, outbound: { defaultMode: "notify", // notify | conversation }, streaming: { enabled: true /* yalnızca Twilio; bkz. Akışlı transkripsiyon */ }, realtime: { enabled: false /* bkz. Gerçek zamanlı sesli konuşmalar */ }, }, }, }, },}Yapılandırma başvurusu
Yukarıda gösterilmeyen, plugins.entries.voice-call.config altındaki üst düzey anahtarlar:
| Anahtar | Varsayılan | Notlar |
|---|---|---|
enabled |
false |
Ana açma/kapatma anahtarı. |
inboundPolicy |
"disabled" |
disabled | allowlist | pairing | open. Bkz. Gelen aramalar. |
allowFrom |
[] |
inboundPolicy: "allowlist" için E.164 izin listesi. |
maxDurationSeconds |
300 |
Yanıtlanma durumundan bağımsız olarak uygulanan, arama başına kesin süre sınırı. |
staleCallReaperSeconds |
120 |
Bkz. Eski arama temizleyicisi. 0 bunu devre dışı bırakır. |
silenceTimeoutMs |
800 |
Klasik (gerçek zamanlı olmayan) akış için konuşma sonu sessizlik algılama. |
transcriptTimeoutMs |
180000 |
Bir turdan vazgeçmeden önce arayanın transkripsiyonunu beklemek için azami süre. |
ringTimeoutMs |
30000 |
Giden aramalar için çalma zaman aşımı. |
maxConcurrentCalls |
1 |
Bu sınırı aşan giden aramalar reddedilir. |
outbound.notifyHangupDelaySec |
3 |
Bildirim modunda otomatik kapatmadan önce TTS sonrasında beklenecek saniye. |
skipSignatureVerification |
false |
Yalnızca yerel test içindir; üretimde asla etkinleştirmeyin. |
store |
ayarlanmamış | Varsayılan $OPENCLAW_STATE_DIR/voice-calls yolunu geçersiz kılar (normalde ~/.openclaw/voice-calls). |
agentId |
"main" |
Yanıt oluşturma ve oturum depolama için kullanılan ajan. |
responseModel |
ayarlanmamış | Klasik (gerçek zamanlı olmayan) yanıtlar için varsayılan modeli geçersiz kılar. |
responseSystemPrompt |
oluşturulan | Klasik yanıtlar için özel sistem istemi. |
responseTimeoutMs |
30000 |
Klasik yanıt oluşturma zaman aşımı (ms). |
Twilio varsayılan olarak US1 REST uç noktasını kullanır. Aramaları desteklenen
ABD dışı bir Bölgede işlemek için twilio.region değerini ie1 veya au1 olarak ayarlayın ve
o Bölgeye ait kimlik bilgilerini kullanın. Bkz.
Twilio'nun ABD dışı REST API kılavuzu.
Sağlayıcı erişimi ve güvenlik notları
- Twilio, Telnyx ve Plivo'nun tümü herkese açık olarak erişilebilen bir Webhook URL'si gerektirir.
mockyerel bir geliştirme sağlayıcısıdır (ağ çağrısı yoktur).- Telnyx,
skipSignatureVerificationtrue olmadığı sürecetelnyx.publicKey(veyaTELNYX_PUBLIC_KEY) gerektirir. skipSignatureVerificationyalnızca yerel test içindir.- Ücretsiz ngrok katmanında
publicUrldeğerini tam ngrok URL'sine ayarlayın; imza doğrulaması her zaman zorunludur. tunnel.allowNgrokFreeTierLoopbackBypass: true, yalnızcatunnel.provider="ngrok"olduğunda veserve.bindgeri döngü olduğunda (ngrok yerel ajanı), geçersiz imzalı Twilio Webhook'larına izin verir. Yalnızca yerel geliştirme içindir.- Ücretsiz ngrok katmanı URL'leri değişebilir veya geçiş sayfası davranışı ekleyebilir;
publicUrldeğişirse Twilio imzaları başarısız olur. Üretim için kararlı bir alan adı veya Tailscale funnel tercih edin.
Akış bağlantısı sınırları
streaming.preStartTimeoutMs(varsayılan5000), hiçbir zaman geçerli birstartçerçevesi göndermeyen soketleri kapatır.streaming.maxPendingConnections(varsayılan32), kimliği doğrulanmamış başlangıç öncesi toplam soket sayısını sınırlar.streaming.maxPendingConnectionsPerIp(varsayılan4), kaynak IP başına kimliği doğrulanmamış başlangıç öncesi soket sayısını sınırlar.streaming.maxConnections(varsayılan128), tüm açık medya akışı soketlerini (bekleyen + etkin) sınırlar.
Eski yapılandırma geçişleri
Yapılandırma ayrıştırma, bu eski anahtarları otomatik olarak normalleştirir ve
yerine geçen yolu belirten bir uyarı kaydeder; uyumluluk katmanı gelecekteki bir
sürümde (2026.6.0) kaldırılacağından, kaydedilmiş yapılandırmayı
standart şekle yeniden yazmak için openclaw doctor --fix çalıştırın:
provider: "log"→provider: "mock"twilio.from→fromNumberstreaming.sttProvider→streaming.providerstreaming.openaiApiKey→streaming.providers.openai.apiKeystreaming.sttModel→streaming.providers.openai.modelstreaming.silenceDurationMs→streaming.providers.openai.silenceDurationMsstreaming.vadThreshold→streaming.providers.openai.vadThresholdrealtime.agentContext.includeSystemPromptkaldırılmıştır (gerçek zamanlı bağlam artık oluşturulan ajan istemini kullanır)
Oturum kapsamı
Voice Call varsayılan olarak sessionScope: "per-phone" kullanır; böylece
aynı arayanın tekrarlanan aramalarında konuşma belleği korunur. Her
operatör aramasının yeni bir bağlamla başlaması gerektiğinde sessionScope: "per-call" ayarlayın;
örneğin aynı telefon numarasının farklı toplantıları temsil edebileceği resepsiyon,
rezervasyon, IVR veya Google Meet köprü akışlarında.
Voice Call, oluşturulan oturum anahtarlarını yapılandırılmış ajan ad alanında
(agent:<agentId>:voice:*) depolar. Açıkça belirtilen ham entegrasyon anahtarları
aynı ad alanına çözümlenir: standart bir agent:<configuredAgentId>:* anahtarı bu
sahibi korur ve çekirdek session.mainKey/genel kapsam takma adlandırmasına uyar; yabancı veya
hatalı biçimlendirilmiş agent:* girdisi, yapılandırılmış ajan altında opak bir anahtar
olarak kapsamlandırılır; global ve unknown genel sentinel değerleri olarak kalır.
Gerçek zamanlı sesli konuşmalar
realtime, canlı arama sesi için tam çift yönlü gerçek zamanlı bir ses sağlayıcısı seçer.
Bu, sesi yalnızca gerçek zamanlı transkripsiyon
sağlayıcılarına ileten streaming özelliğinden ayrıdır.
Geçerli çalışma zamanı davranışı:
realtime.enabled, Twilio ve Telnyx için desteklenir.realtime.provideristeğe bağlıdır. Ayarlanmamışsa Voice Call, kaydedilen ilk gerçek zamanlı ses sağlayıcısını kullanır.- Paketle birlikte gelen gerçek zamanlı ses sağlayıcıları: sağlayıcı pluginleri tarafından kaydedilen Google Gemini Live (
google) ve OpenAI (openai). - Sağlayıcının sahip olduğu ham yapılandırma
realtime.providers.<providerId>altında bulunur. - Voice Call, paylaşılan
openclaw_agent_consultgerçek zamanlı aracını varsayılan olarak kullanıma sunar. Arayan kişi daha derin akıl yürütme, güncel bilgi veya normal OpenClaw araçları istediğinde gerçek zamanlı model bu aracı çağırabilir. realtime.consultPolicy, gerçek zamanlı modelinopenclaw_agent_consultaracını ne zaman ç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ırlandırılmış bir aracı kimliği ve seçili çalışma alanı dosyalarından oluşan bir kapsül ekler.realtime.fastContext.enabledvarsayılan olarak kapalıdır. Etkinleştirildiğinde Voice Call, danışma sorusu için önce dizine alınmış bellek/oturum bağlamında arama yapar ve yalnızcarealtime.fastContext.fallbackToConsultdoğruysa tam danışma aracısına geri dönmeden önce bu parçalarırealtime.fastContext.timeoutMsiçinde gerçek zamanlı modele döndürür.realtime.providerkaydedilmemiş bir sağlayıcıyı gösteriyorsa veya hiçbir gerçek zamanlı ses sağlayıcısı kaydedilmemişse Voice Call bir uyarı kaydeder ve pluginin tamamını başarısız kılmak yerine gerçek zamanlı medyayı atlar.realtime.enableddoğru olduğundainboundPolicy,"disabled"olmamalıdır;validateProviderConfigbu birleşimi reddeder.- Danışma oturumu anahtarları, mevcut olduğunda depolanan çağrı oturumunu yeniden kullanır; ardından yapılandırılmış
sessionScopedeğerine geri döner (varsayılan olarakper-phoneveya yalıtılmış çağrılar içinper-call).
Araç politikası
realtime.toolPolicy, danışma çalıştırmasını denetler:
| Politika | Davranış |
|---|---|
safe-read-only |
Danışma aracını kullanıma sunar ve normal aracıyı read, web_search, web_fetch, x_search, memory_search ve memory_get ile sınırlar. |
owner |
Danışma aracını kullanıma sunar ve normal aracının normal aracı araç politikasını kullanmasına izin verir. |
none |
Danışma aracını kullanıma sunmaz. Özel realtime.tools yine de gerçek zamanlı sağlayıcıya iletilir. |
realtime.consultPolicy yalnızca gerçek zamanlı model talimatlarını denetler:
| Politika | Yönlendirme |
|---|---|
auto |
Varsayılan istemi korur ve danışma aracının ne zaman çağrılacağına sağlayıcının karar vermesine izin verir. |
substantive |
Basit konuşma bağlantılarını doğrudan yanıtlar; gerçekler, bellek, araçlar veya bağlamdan önce danışır. |
always |
Her önemli yanıttan önce danışır. |
Aracı ses bağlamı
Ses köprüsünün, sıradan dönüşlerde tam bir aracı danışma gidiş dönüşünün
maliyetini üstlenmeden yapılandırılmış OpenClaw aracısı gibi duyulması
gerektiğinde realtime.agentContext seçeneğini etkinleştirin. Bağlam kapsülü,
gerçek zamanlı oturum oluşturulduğunda bir kez eklenir; bu nedenle dönüş
başına gecikme eklemez. openclaw_agent_consult çağrıları yine de tam OpenClaw
aracısını çalıştırır ve araç çalışmaları, güncel bilgiler, bellek aramaları
veya çalışma alanı 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, includeWorkspaceFiles: true, files: ["SOUL.md", "IDENTITY.md", "USER.md"], }, }, }, }, }, },}Gerçek zamanlı sağlayıcı örnekleri
Google Gemini Live
Varsayılanlar: realtime.providers.google.apiKey, GEMINI_API_KEY
veya GOOGLE_API_KEY üzerinden API anahtarı; model gemini-3.1-flash-live-preview;
ses Kore. Daha uzun, yeniden bağlanabilir çağrılar için
sessionResumption ve contextWindowCompression varsayılan olarak açıktır.
Telefon sesiyle daha hızlı söz sırası geçişlerini 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: "Kısa konuş. Daha kapsamlı araçları kullanmadan önce openclaw_agent_consult aracını çağır.", toolPolicy: "safe-read-only", consultPolicy: "substantive", consultThinkingLevel: "low", consultFastMode: true, agentContext: { enabled: true }, providers: { google: { apiKey: "${GEMINI_API_KEY}", model: "gemini-3.1-flash-live-preview", speakerVoice: "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 özgü 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ışlı transkripsiyon
streaming, Twilio Media Streams'i gerçek zamanlı bir transkripsiyon sağlayıcısına bağlar.
Klasik akış yolu provider: "twilio" gerektirir; Telnyx, Plivo veya mock ile
yapılan yapılandırma reddedilir. Telnyx canlı sesi bunun yerine ayrı olarak
kimliği doğrulanmış realtime.enabled yolunu kullanır.
Geçerli çalışma zamanı davranışı:
streaming.provideristeğe bağlıdır. Ayarlanmamışsa Voice Call, kaydedilen ilk gerçek zamanlı transkripsiyon sağlayıcısını kullanır.- Paketle birlikte gelen gerçek zamanlı transkripsiyon sağlayıcıları: sağlayıcı pluginleri tarafından kaydedilen Deepgram (
deepgram), ElevenLabs (elevenlabs), Mistral (mistral), OpenAI (openai) ve xAI (xai). - 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 karşılamayı yalnızca gerçek zamanlı transkripsiyon hazır olduktan sonra başlatır. streaming.providerkaydedilmemiş bir sağlayıcıyı gösteriyorsa veya hiçbir sağlayıcı kaydedilmemişse Voice Call bir uyarı kaydeder ve pluginin tamamını 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-...", // OPENAI_API_KEY ayarlanmışsa isteğe bağlıdır model: "gpt-4o-transcribe", silenceDurationMs: 800, vadThreshold: 0.5, }, }, }, }, }, }, },}xAI
Varsayılanlar: API anahtarı streaming.providers.xai.apiKey veya XAI_API_KEY
(ikisi de ayarlanmamışsa bir xAI OAuth kimlik doğrulama profiline geri döner);
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}", // XAI_API_KEY ayarlanmışsa isteğe bağlıdır endpointingMs: 800, language: "en", }, }, }, }, }, }, },}Çağrılar için TTS
Voice Call, çağrılarda konuşma akışı için çekirdek tts
yapılandırmasını kullanır. Plugin yapılandırması altında aynı yapıyla
geçersiz kılabilirsiniz; tts ile derinlemesine birleştirilir.
{ tts: { provider: "elevenlabs", providers: { elevenlabs: { speakerVoiceId: "pMsXgVXv3BLzUgSXRplE", modelId: "eleven_multilingual_v2", }, }, },}Davranış notları:
- Plugin yapılandırmasındaki eski
tts.<provider>anahtarları (openai,elevenlabs,microsoft,edge)openclaw doctor --fixtarafından onarılır; kaydedilen yapılandırmatts.providers.<provider>kullanmalıdır. - Twilio medya akışı etkinleştirildiğinde çekirdek TTS kullanılır; aksi takdirde ç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:U2F5seçeneğine geri dönmez. Bu durumda telefon TTS'i kullanılamıyorsa oynatma isteği iki oynatma yolunu karıştırmak yerine başarısız olur. - Telefon TTS'i 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ı kaydeder. - Twilio araya girme veya akış kapatma işlemi bekleyen TTS kuyruğunu temizlediğinde, kuyruğa alınan oynatma istekleri oynatmanın tamamlanmasını bekleyen arayanları askıda bırakmak yerine sonuçlandırılır.
TTS örnekleri
Yalnızca çekirdek TTS
{tts: {provider: "openai",providers: {openai: { speakerVoice: "alloy" },},},}ElevenLabs ile geçersiz kılma (yalnızca aramalar)
{plugins: {entries: {"voice-call": { config: { tts: { provider: "elevenlabs", providers: { elevenlabs: { apiKey: "elevenlabs_key", speakerVoiceId: "pMsXgVXv3BLzUgSXRplE", modelId: "eleven_multilingual_v2", }, }, }, },},},},}OpenAI modeliyle geçersiz kılma (derin birleştirme)
{plugins: {entries: {"voice-call": { config: { tts: { providers: { openai: { model: "gpt-4o-mini-tts", speakerVoice: "marin", }, }, }, },},},},}Gelen aramalar
Gelen arama politikası varsayılan olarak disabled değerindedir. Gelen aramaları etkinleştirmek için şunu ayarlayın:
{inboundPolicy: "allowlist",allowFrom: ["+15550001234"],inboundGreeting: "Merhaba! Nasıl yardımcı olabilirim?",}Otomatik yanıtlar ajan 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ına gelen aramaları 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 kurumsal
bir kişilik, farklı bir yanıt ajanı ve farklı bir TTS sesi kullanabilir.
Rotalar, sağlayıcı tarafından sunulan ve aranan To numarasından seçilir. Anahtarlar
E.164 numaraları olmalıdır. Bir arama geldiğinde Voice Call, eşleşen
rotayı bir kez çözümler, eşleşen rotayı arama kaydında saklar ve bu
etkin yapılandırmayı karşılama, 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 aramalar numbers kullanmaz; aramayı
başlatırken giden hedefi, mesajı ve oturumu açıkça iletin.
Rota geçersiz kılmaları şu anda şunları destekler:
inboundGreetingttsagentIdresponseModelresponseSystemPromptresponseTimeoutMs
tts rota değeri, genel Voice Call tts yapılandırması üzerine derinlemesine birleştirilir; böylece
genellikle yalnızca sağlayıcı sesini geçersiz kılabilirsiniz:
{inboundGreeting: "Ana hattan merhaba.",responseSystemPrompt: "Varsayılan sesli asistansınız.",tts: { provider: "openai", providers: { openai: { speakerVoice: "coral" }, },},numbers: { "+15550001111": { inboundGreeting: "Silver Fox Cards, nasıl yardımcı olabilirim?", responseSystemPrompt: "Kısa ve öz yanıt veren bir beyzbol kartı uzmanısınız.", tts: { providers: { openai: { speakerVoice: "alloy" }, }, }, },},}Sözlü çıktı sözleşmesi
Otomatik yanıtlar için Voice Call, sistem istemine
{"spoken":"..."} JSON yanıtı gerektiren katı bir sözlü çıktı sözleşmesi ekler. Voice Call
konuşma metnini korumalı biçimde ayıklar:
- Akıl yürütme/hata içeriği olarak işaretlenen yükleri yok sayar.
- Doğrudan JSON'ı, kod çitli JSON'ı veya satır içi
"spoken"anahtarlarını ayrıştırır. - Düz metne geri döner ve muhtemel planlama/meta giriş paragraflarını kaldırır.
Bu, sözlü oynatmanın arayana yönelik metne odaklanmasını sağlar ve planlama metninin sese sızmasını önler.
Konuşma başlatma davranışı
Giden conversation aramaları için ilk mesaj işleme, canlı
oynatma durumuna bağlıdır:
- Araya girme kuyruğunu temizleme ve otomatik yanıt, yalnızca ilk karşılama etkin olarak seslendirilirken engellenir.
- İlk oynatma başarısız olursa arama
listeningdurumuna döner ve ilk mesaj 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ı durdurur ve kuyrukta olup henüz oynatılmayan Twilio TTS girdilerini temizler. Temizlenen girdiler atlanmış olarak çözümlenir; böylece sonraki yanıt mantığı, hiçbir zaman 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 mesaj için eski bir
OPENCLAW_DOCS_MARKER:calloutOpen:U2F5TwiML güncellemesi göndermez; böylece giden<Connect><Stream>oturumları bağlı kalır.
Twilio akış bağlantısı kesilme ek süresi
Bir Twilio medya akışının bağlantısı kesildiğinde Voice Call, aramayı otomatik olarak sonlandırmadan önce 2000 ms bekler:
- Akış bu süre içinde yeniden bağlanırsa otomatik sonlandırma iptal edilir.
- Ek süre sonrasında hiçbir akış yeniden kaydolmazsa etkin aramaların takılı kalmasını önlemek için arama sonlandırılır.
Bayat arama temizleyici
Hiçbir zaman yanıtlanmayan ve hiçbir zaman canlı konuşma durumuna ulaşmayan aramaları,
örneğin sağlayıcının hiçbir zaman sonlandırıcı Webhook göndermediği bildirim modundaki
aramaları sonlandırmak için staleCallReaperSeconds (varsayılan 120) kullanın. Devre dışı bırakmak için
0 olarak ayarlayın.
Temizleyici her 30 saniyede bir çalışır ve yalnızca
answeredAt zaman damgası olmayan ve halihazırda sonlandırılmış veya canlı
(speaking/listening) durumda bulunmayan aramaları sonlandırır; böylece yanıtlanan konuşmalar bu zamanlayıcı
tarafından hiçbir zaman temizlenmez. maxDurationSeconds (varsayılan 300), çok uzun
süren yanıtlanmış aramaları sonlandıran ayrı sınırdır.
Operatörlerin çalma/yanıtlama Webhook'larını yavaş teslim edebildiği bildirim tarzı
akışlarda, yavaş ancak normal aramaların erken temizlenmemesi için
staleCallReaperSeconds değerini varsayılanın üzerine çıkarın; 120-300 saniye makul bir üretim
aralığıdır.
{plugins: {entries: { "voice-call": { config: { maxDurationSeconds: 300, staleCallReaperSeconds: 120, }, },},},}Webhook güvenliği
Gateway'in önünde bir proxy veya tünel bulunduğ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 gelen izin verilenler listesindeki ana makineler.
webhookSecurity.trustForwardingHeadersbooleanİzin verilenler 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:
- Webhook yeniden oynatma koruması Twilio, Telnyx ve Plivo için etkindir. Yeniden oynatılan geçerli Webhook istekleri onaylanır ancak yan etkileri uygulanmaz.
- Twilio konuşma sıraları,
<Gather>geri çağırmalarında sıra başına bir belirteç içerir; böylece eski/yeniden oynatılan konuşma geri çağırmaları daha yeni bir bekleyen döküm sırasını 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 kimlik doğrulama öncesi gövde okuma profilini (en fazla 64 KB gövde, 5 saniyelik okuma zaman aşımı) ve anahtar başına devam eden istek sınırını (varsayılan olarak anahtar başına 8 eşzamanlı istek) kullanır.
Kararlı bir genel ana makine örneği:
{plugins: {entries: { "voice-call": { config: { publicUrl: "https://voice.example.com/voice/webhook", webhookSecurity: { allowedHosts: ["voice.example.com"], }, }, },},},}CLI
openclaw voicecall call --to "+15555550123" --message "OpenClaw'dan merhaba"openclaw voicecall start --to "+15555550123" # call için takma adopenclaw voicecall continue --call-id <id> --message "Sorunuz var mı?"openclaw voicecall speak --call-id <id> --message "Bir dakika"openclaw voicecall dtmf --call-id <id> --digits "ww123456#"openclaw voicecall end --call-id <id>openclaw voicecall status --call-id <id>openclaw voicecall tailopenclaw voicecall latency # günlüklerden sıra gecikmesini özetleopenclaw voicecall expose --mode funnelGateway zaten çalışırken operasyonel voicecall komutları,
CLI'nin ikinci bir Webhook sunucusuna bağlanmaması için Gateway'in sahip olduğu Voice Call çalışma zamanına
devredilir. Hiçbir Gateway'e erişilemiyorsa komutlar bağımsız
CLI çalışma zamanına geri döner.
latency, varsayılan Voice Call depolama yolundan calls.jsonl okur. Farklı bir günlüğü
belirtmek için --file <path>, analizi son N kayıtla (varsayılan 200) sınırlamak için
--last <n> kullanın. Çıktı; sıra gecikmesi ve dinleme-bekleme süreleri için minimum/maksimum/ortalama,
p50 ve p95 değerlerini içerir.
Ajan aracı
Araç adı: voice_call.
| Eylem | Bağımsız değişkenler |
|---|---|
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 |
Voice Call Plugin'i, eşleşen bir ajan becerisiyle birlikte gelir.
Gateway RPC
| Yöntem | Argümanlar | Notlar |
|---|---|---|
voicecall.initiate |
to?, message, mode?, sessionKey?, requesterSessionKey? |
to belirtilmediğinde toNumber yapılandırmasına geri döner. |
voicecall.start |
to, message?, mode?, dtmfSequence?, sessionKey? |
initiate ile aynıdır, ancak bağlantı öncesi dtmfSequence değerini de kabul eder. |
voicecall.continue |
callId, message |
Tur sonuçlanana kadar engeller; dökümü döndürür. |
voicecall.continue.start |
callId, message |
Eşzamansız değişken: hemen bir operationId döndürür. |
voicecall.continue.result |
operationId |
Bekleyen bir voicecall.continue.start işleminin sonucunu yoklar. |
voicecall.speak |
callId, message |
Beklemeden konuşur; realtime.enabled olduğunda gerçek zamanlı köprüyü kullanır. |
voicecall.dtmf |
callId, digits |
|
voicecall.end |
callId |
|
voicecall.status |
callId? |
Tüm etkin çağrıları listelemek için callId değerini belirtmeyin. |
dtmfSequence yalnızca mode: "conversation" ile geçerlidir; bildirim modundaki çağrılar,
bağlantı sonrası rakamlara ihtiyaç duyuyorsa çağrı oluşturulduktan sonra
voicecall.dtmf kullanmalıdır.
Sorun giderme
Kurulum Webhook erişimini açamıyor
Kurulumu Gateway'i çalıştıran ortamdan çalıştırın:
openclaw voicecall setupopenclaw voicecall setup --jsontwilio, 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 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, fd00::/8 veya operatör sınıfı NAT
aralıklarını kullanmayın.
Twilio bildirim modundaki giden çağrılar, başlangıç OPENCLAW_DOCS_MARKER:calloutOpen:U2F5 TwiML'lerini doğrudan
çağrı oluşturma isteğinde gönderir; dolayısıyla ilk sesli mesaj, Twilio'nun
Webhook TwiML'ini getirmesine bağlı değildir. Durum geri çağrıları, konuşma çağrıları,
bağlantı öncesi DTMF, gerçek zamanlı akışlar ve bağlantı sonrası çağrı denetimi için
herkese açık bir Webhook yine de gereklidir.
Herkese açık erişim yollarından birini kullanın:
{plugins: {entries: {"voice-call": { config: { publicUrl: "https://voice.example.com/voice/webhook", // veya tunnel: { provider: "ngrok" }, // veya 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 şunları çalıştırın:
openclaw voicecall setupopenclaw voicecall smoke--yes iletmediğiniz sürece voicecall smoke bir deneme çalıştırmasıdır.
Sağlayıcı kimlik bilgileri başarısız oluyor
Seçilen sağlayıcıyı ve gerekli kimlik bilgisi alanlarını kontrol edin:
- Twilio:
twilio.accountSid,twilio.authTokenvefromNumberveyaTWILIO_ACCOUNT_SID,TWILIO_AUTH_TOKENveTWILIO_FROM_NUMBER. - Telnyx:
telnyx.apiKey,telnyx.connectionId,telnyx.publicKeyvefromNumberveyaTELNYX_API_KEY,TELNYX_CONNECTION_IDveTELNYX_PUBLIC_KEY. - Plivo:
plivo.authId,plivo.authTokenvefromNumberveyaPLIVO_AUTH_IDvePLIVO_AUTH_TOKEN.
Kimlik bilgileri Gateway ana makinesinde bulunmalıdır. Yerel bir kabuk profilini düzenlemek, çalışan bir Gateway yeniden başlatılana veya ortamı yeniden yüklenene kadar onu etkilemez.
Çağrılar başlıyor ancak sağlayıcı Webhook'ları ulaşmıyor
Sağlayıcı konsolunun herkese açık Webhook URL'sini tam olarak işaret ettiğini doğrulayın:
https://voice.example.com/voice/webhookArdından çalışma zamanı durumunu inceleyin:
openclaw voicecall status --call-id <id>openclaw voicecall tailopenclaw logs --followYaygın nedenler:
publicUrl,serve.pathyolundan 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 ana makine/protokol başlıklarını kaldırıyor veya yeniden yazıyor.
- Güvenlik duvarı veya DNS, herkese açık ana makine adını Gateway dışında bir yere yönlendiriyor.
- Gateway, Voice Call Plugin'i etkinleştirilmeden yeniden başlatıldı.
Gateway'in önünde bir ters proxy veya tünel olduğunda
webhookSecurity.allowedHosts değerini herkese açık ana makine adına ayarlayın ya da
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 herkese açık URL'ye göre denetlenir. İmzalar başarısız olursa:
- Sağlayıcının Webhook URL'sinin şema, ana makine ve yol dâhil olmak üzere
publicUrlile tam olarak eşleştiğini doğrulayın. - ngrok ücretsiz katman URL'leri için tünelin ana makine adı değiştiğinde
publicUrldeğerini güncelleyin. - Proxy'nin özgün ana makine ve protokol başlıklarını koruduğundan emin olun veya
webhookSecurity.allowedHostsyapılandırmasını ayarlayın. - Yerel testler dışında
skipSignatureVerificationseçeneğini etkinleştirmeyin.
Google Meet Twilio katılımları başarısız oluyor
Google Meet, Twilio çevirmeli katılımları için bu Plugin'i kullanır. Önce Voice Call'u doğrulayın:
openclaw voicecall setupopenclaw voicecall smoke --to "+15555550123"Ardından Google Meet aktarımını açıkça doğrulayın:
openclaw googlemeet setup --transport twilioVoice Call yeşil olduğu hâlde Meet katılımcısı hiç katılmıyorsa Meet'in
çevirmeli numarasını, PIN'ini ve --dtmf-sequence değerini kontrol edin. Telefon çağrısı sağlıklı
olabilirken toplantı, yanlış bir DTMF dizisini reddedebilir veya yok sayabilir.
Google Meet, Twilio telefon ayağını bağlantı öncesi DTMF dizisiyle
voicecall.start üzerinden başlatır. PIN'den türetilen diziler, Google Meet
Plugin'inin voiceCall.dtmfDelayMs değerini (varsayılan 12000 ms) baştaki Twilio
bekleme rakamları olarak içerir; çünkü Meet çevirmeli istemleri geç ulaşabilir. Ardından Voice Call,
giriş selamlaması istenmeden önce gerçek zamanlı işleme geri yönlendirir.
Canlı aşama izlemesi için openclaw logs --follow kullanın. Sağlıklı bir Twilio Meet
katılımı şu sırayla günlüğe kaydedilir:
- Google Meet, Twilio katılımını Voice Call'a devreder.
- Voice Call, bağlantı öncesi DTMF TwiML'ini depolar.
- Twilio başlangıç TwiML'i tüketilir ve gerçek zamanlı işlemeden önce sunulur.
- Voice Call, Twilio çağrısı için gerçek zamanlı TwiML sunar.
- Google Meet, DTMF sonrası gecikmenin ardından
voicecall.speakile giriş konuşmasını ister.
openclaw voicecall tail kalıcı çağrı kayıtlarını göstermeye devam eder; çağrı durumu ve
dökümler için kullanışlıdır, ancak her Webhook/gerçek zamanlı geçiş
orada görünmez.
Gerçek zamanlı çağrıda konuşma yok
Yalnızca bir ses modunun etkinleştirildiğini doğrulayın: realtime.enabled ve
streaming.enabled aynı anda doğru olamaz.
Gerçek zamanlı Twilio/Telnyx çağrıları için ayrıca şunları doğrulayın:
- Bir gerçek zamanlı sağlayıcı Plugin'i yüklenmiş ve kaydedilmiş.
realtime.providerayarlanmamış veya kayıtlı bir sağlayıcıyı adlandırıyor.- Sağlayıcı API anahtarı Gateway işlemi tarafından kullanılabiliyor.
openclaw logs --follow, gerçek zamanlı TwiML'in sunulduğunu, gerçek zamanlı köprünün başladığını ve başlangıç selamlamasının kuyruğa alındığını gösteriyor.