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).
    • skipSignatureVerification true değilse Telnyx telnyx.publicKey (veya TELNYX_PUBLIC_KEY) gerektirir.
    • skipSignatureVerification yalnızca yerel test içindir.
    • ngrok free tier’da publicUrl değ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ızca tunnel.provider="ngrok" olduğunda ve serve.bind loopback 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; publicUrl kayarsa 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 bir start ç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.sttProviderstreaming.provider
    • streaming.openaiApiKeystreaming.providers.openai.apiKey
    • streaming.sttModelstreaming.providers.openai.model
    • streaming.silenceDurationMsstreaming.providers.openai.silenceDurationMs
    • streaming.vadThresholdstreaming.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.provider isteğ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_consult gerç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 zaman openclaw_agent_consult çağırması gerektiğine ilişkin isteğe bağlı yönlendirme ekler.
    • realtime.agentContext.enabled varsayı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.enabled varsayılan olarak kapalıdır. Etkinleştirildiğinde Voice Call önce consult sorusu için dizinlenmiş bellek/oturum bağlamında arama yapar ve realtime.fastContext.fallbackToConsult true ise yalnızca tam consult ajanına dönmeden önce bu parçacıkları realtime.fastContext.timeoutMs içinde gerçek zamanlı modele döndürür.
    • realtime.provider kayı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ış sessionScope değerine geri döner (varsayılan olarak per-phone veya yalıtılmış aramalar için per-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.provider isteğ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ış start iletisi 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.provider kayı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 --fix tarafından onarılır; commit edilmiş yapılandırma tts.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:

    • inboundGreeting
    • tts
    • agentId
    • responseModel
    • responseSystemPrompt
    • responseTimeoutMs

    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ı listening durumuna 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:U2F5 TwiML güncellemesi göndermez; böylece giden &lt;Connect&gt;&lt;Stream&gt; 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 120300 saniye.
    • Normal çağrıların tamamlanabilmesi için bu değeri maxDurationSeconds değerinden daha yüksek tutun. İyi bir başlangıç noktası maxDurationSeconds + 30–60 saniyedir.
    {
    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ı &lt;Gather&gt; 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.authToken ve fromNumber ya da TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN ve TWILIO_FROM_NUMBER.
    • Telnyx: telnyx.apiKey, telnyx.connectionId, telnyx.publicKey ve fromNumber.
    • Plivo: plivo.authId, plivo.authToken ve fromNumber.

    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.path değ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 publicUrl ile 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 publicUrl değerini güncelleyin.
    • Proxy'nin özgün host ve proto üstbilgilerini koruduğundan emin olun veya webhookSecurity.allowedHosts yapılandırın.
    • Yerel test dışında skipSignatureVerification etkinleş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.speak ile 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.provider ayarlanmamış 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.

    İlgili