You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[Gap] PSTN parity: Twilio+Realtime lives in api/call.py, not Bot registry — vs OpenClaw voice-call plugin
Executive summary
Field
Content
OpenClaw reference
Voice Call plugin — telephony via Plivo or Twilio, documented as an installable assistant capability with CLI voicecall in their docs index.
PraisonAI reality
Messaging bots are first-class in praisonai.bots (_registry.py). PSTN exists mainly as a standalone Twilio + OpenAI Realtime sample in praisonai/api/call.py, not registered as a bot platform next to Telegram/Discord. Plivo does not appear in src/praisonai Python sources (no PSTN provider choice matching OpenClaw’s doc).
Gap type
Product / integration fragmentation — not “no Twilio string anywhere”; the gap is parity with OpenClaw’s unified voice-call plugin story (provider options, Gateway/BotOS alignment, discoverability).
Severity
Product / parity. Affects: checklist comparisons, “call my assistant” RFPs.
1. OpenClaw target (reference only)
OpenClaw documents a voice call capability with Plivo or Twilio as providers. That is positioned as part of their plugin ecosystem, not an unrelated demo script.
2. Where messaging channels live (canonical bot surface)
Runtime extension exists via register_platform() (_registry.py:39–46) — but there is no built-in "twilio", "voice", "pstn", or "plivo" key in _BUILTIN_PLATFORMS.
Takeaway: Evaluators who compare “channels” on OpenClaw vs Praison will not find PSTN listed alongside Telegram/Slack in the same registry table.
3. Twilio PSTN + Realtime — separate FastAPI module (api/call.py)
File:src/praisonai/praisonai/api/call.py
This module implements incoming Twilio voice → WebSocket media stream → OpenAI Realtime API (wss://api.openai.com/v1/realtime?...).
@app.api_route("/", methods=["GET", "POST"])asyncdefhandle_incoming_call(request: Request):
"""Handle incoming call and return TwiML response to connect to Media Stream."""response=VoiceResponse()
...
connect.stream(url=f'wss://{host}/media-stream')
Media bridge:
@app.websocket("/media-stream")asyncdefhandle_media_stream(websocket: WebSocket):
"""Handle WebSocket connections between Twilio and OpenAI."""
...
asyncwithwebsockets.connect(
'wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview-2024-10-01',
Takeaway: This is a self-contained FastAPI app pattern (uvicorn-oriented), not the same architectural slot as OpenClaw’s voice-call plugin documentation (plugin install, CLI, Gateway-centric narrative). It also does not add Plivo or a second provider in-repo.
4. CLI praisonai call — different code path
File:src/praisonai/praisonai/cli/commands/call.py
The Typer call command delegates to PraisonAI().main() with argv ['call', ...] — it does not import or start api/call.py’s FastAPI server in this file.
Takeaway: Operators may assume praisonai callis the Twilio PSTN server; wiring is not documented here as a single obvious path. Gap vs OpenClaw: one documentedvoicecall / plugin story vs multiple entry concepts (CLI call, api/call.py demo).
5. Architecture comparison (Mermaid)
OpenClaw (conceptual — plugin doc)
flowchart LR
subgraph OC["OpenClaw voice-call (documented)"]
P[Voice plugin]
T[Twilio / Plivo]
G[Gateway / assistant]
G --> P --> T
end
Loading
PraisonAI (this repo — simplified)
flowchart TB
subgraph Bots["praisonai.bots._registry"]
TG[telegram]
DC[discord]
SL[slack]
WA[whatsapp]
EM[email]
end
subgraph PSTN["api/call.py (standalone)"]
TW[Twilio TwiML + WS]
OA[OpenAI Realtime]
TW --> OA
end
Bots -.-x PSTN
Loading
The dashed “missing link” is intentional: registry does not list PSTN; api/call.py is not a registered platform key.
6. Repository checks (Plivo / telephony keywords)
plivo: no matches under src/praisonai/**/*.py (search at authoring time).
twilio: present in api/call.py (TwiML / voice).
Bot package docstring still lists Telegram, Discord, Slack, WhatsApp (+ orchestrator) — not PSTN:
[Gap] PSTN parity: Twilio+Realtime lives in api/call.py, not Bot registry — vs OpenClaw voice-call plugin
Executive summary
voicecallin their docs index.praisonai.bots(_registry.py). PSTN exists mainly as a standalone Twilio + OpenAI Realtime sample inpraisonai/api/call.py, not registered as a bot platform next to Telegram/Discord. Plivo does not appear insrc/praisonaiPython sources (no PSTN provider choice matching OpenClaw’s doc).1. OpenClaw target (reference only)
OpenClaw documents a voice call capability with Plivo or Twilio as providers. That is positioned as part of their plugin ecosystem, not an unrelated demo script.
2. Where messaging channels live (canonical bot surface)
File:
src/praisonai/praisonai/bots/_registry.pyBuilt-in platforms are explicit string keys → lazy
(module, class)tuples:Runtime extension exists via
register_platform()(_registry.py:39–46) — but there is no built-in"twilio","voice","pstn", or"plivo"key in_BUILTIN_PLATFORMS.Takeaway: Evaluators who compare “channels” on OpenClaw vs Praison will not find PSTN listed alongside Telegram/Slack in the same registry table.
3. Twilio PSTN + Realtime — separate FastAPI module (
api/call.py)File:
src/praisonai/praisonai/api/call.pyThis module implements incoming Twilio voice → WebSocket media stream → OpenAI Realtime API (
wss://api.openai.com/v1/realtime?...).Imports:
Incoming call handler (TwiML):
Media bridge:
Takeaway: This is a self-contained FastAPI app pattern (uvicorn-oriented), not the same architectural slot as OpenClaw’s voice-call plugin documentation (plugin install, CLI, Gateway-centric narrative). It also does not add Plivo or a second provider in-repo.
4. CLI
praisonai call— different code pathFile:
src/praisonai/praisonai/cli/commands/call.pyThe Typer
callcommand delegates toPraisonAI().main()with argv['call', ...]— it does not import or startapi/call.py’s FastAPI server in this file.Takeaway: Operators may assume
praisonai callis the Twilio PSTN server; wiring is not documented here as a single obvious path. Gap vs OpenClaw: one documentedvoicecall/ plugin story vs multiple entry concepts (CLIcall,api/call.pydemo).5. Architecture comparison (Mermaid)
OpenClaw (conceptual — plugin doc)
flowchart LR subgraph OC["OpenClaw voice-call (documented)"] P[Voice plugin] T[Twilio / Plivo] G[Gateway / assistant] G --> P --> T endPraisonAI (this repo — simplified)
flowchart TB subgraph Bots["praisonai.bots._registry"] TG[telegram] DC[discord] SL[slack] WA[whatsapp] EM[email] end subgraph PSTN["api/call.py (standalone)"] TW[Twilio TwiML + WS] OA[OpenAI Realtime] TW --> OA end Bots -.-x PSTNThe dashed “missing link” is intentional: registry does not list PSTN;
api/call.pyis not a registered platform key.6. Repository checks (Plivo / telephony keywords)
plivo: no matches undersrc/praisonai/**/*.py(search at authoring time).twilio: present inapi/call.py(TwiML / voice).7. Sequence (incoming call —
api/call.pyonly)This path does not appear in the BotOS platform resolution flow (
resolve_adapterin_registry.py).8. Suggested engineering directions
api/call.py; messaging bots are the supported channel matrix.twilio_voice(or similar) adapter in_registry.py+ docs + tests; optional Plivo adapter for OpenClaw-style provider choice.9. Acceptance criteria
10. Out of scope
Appendix — files cited
src/praisonai/praisonai/bots/_registry.pyregister_platformsrc/praisonai/praisonai/bots/__init__.pysrc/praisonai/praisonai/api/call.pysrc/praisonai/praisonai/cli/commands/call.pypraisonai call→PraisonAI().main()Evidence from PraisonAI
src/praisonai/; re-verify after refactors.