Skip to content

Commit 789a726

Browse files
feat(connector): initial service impl (#529)
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
1 parent 37ec826 commit 789a726

25 files changed

+2043
-433
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ sip_svc = lkapi.sip
8686

8787
# Agent Dispatch
8888
dispatch_svc = lkapi.agent_dispatch
89+
90+
# Connector Service
91+
connector_svc = lkapi.connector
8992
```
9093

9194
## Using Real-time SDK

livekit-api/livekit/api/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
from livekit.protocol.room import *
3434
from livekit.protocol.webhook import *
3535
from livekit.protocol.sip import *
36+
from livekit.protocol.connector_whatsapp import *
37+
from livekit.protocol.connector_twilio import *
3638

3739
from .twirp_client import TwirpError, TwirpErrorCode
3840
from .livekit_api import LiveKitAPI
@@ -54,6 +56,7 @@
5456
"ingress_service",
5557
"sip_service",
5658
"agent_dispatch_service",
59+
"connector_service",
5760
"InferenceGrants",
5861
"ObservabilityGrants",
5962
"VideoGrants",
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
from __future__ import annotations
2+
3+
import aiohttp
4+
5+
from livekit.protocol.connector_whatsapp import (
6+
DialWhatsAppCallRequest,
7+
DialWhatsAppCallResponse,
8+
DisconnectWhatsAppCallRequest,
9+
DisconnectWhatsAppCallResponse,
10+
ConnectWhatsAppCallRequest,
11+
ConnectWhatsAppCallResponse,
12+
AcceptWhatsAppCallRequest,
13+
AcceptWhatsAppCallResponse,
14+
)
15+
from livekit.protocol.connector_twilio import (
16+
ConnectTwilioCallRequest,
17+
ConnectTwilioCallResponse,
18+
)
19+
from ._service import Service
20+
from .access_token import VideoGrants
21+
22+
SVC = "Connector"
23+
"""@private"""
24+
25+
26+
class ConnectorService(Service):
27+
"""Client for LiveKit Connector Service API
28+
29+
Recommended way to use this service is via `livekit.api.LiveKitAPI`:
30+
31+
```python
32+
from livekit import api
33+
lkapi = api.LiveKitAPI()
34+
connector_service = lkapi.connector
35+
```
36+
"""
37+
38+
def __init__(self, session: aiohttp.ClientSession, url: str, api_key: str, api_secret: str):
39+
super().__init__(session, url, api_key, api_secret)
40+
41+
async def dial_whatsapp_call(
42+
self, request: DialWhatsAppCallRequest
43+
) -> DialWhatsAppCallResponse:
44+
"""
45+
Initiate an outbound WhatsApp call
46+
47+
Args:
48+
request: DialWhatsAppCallRequest containing call parameters
49+
50+
Returns:
51+
DialWhatsAppCallResponse with the WhatsApp call ID and room name
52+
"""
53+
return await self._client.request(
54+
SVC,
55+
"DialWhatsAppCall",
56+
request,
57+
self._auth_header(VideoGrants(room_create=True)),
58+
DialWhatsAppCallResponse,
59+
)
60+
61+
async def disconnect_whatsapp_call(
62+
self, request: DisconnectWhatsAppCallRequest
63+
) -> DisconnectWhatsAppCallResponse:
64+
"""
65+
Disconnect an active WhatsApp call
66+
67+
Args:
68+
request: DisconnectWhatsAppCallRequest containing the call ID to disconnect
69+
70+
Returns:
71+
DisconnectWhatsAppCallResponse (empty response)
72+
"""
73+
return await self._client.request(
74+
SVC,
75+
"DisconnectWhatsAppCall",
76+
request,
77+
self._auth_header(VideoGrants(room_create=True)),
78+
DisconnectWhatsAppCallResponse,
79+
)
80+
81+
async def connect_whatsapp_call(
82+
self, request: ConnectWhatsAppCallRequest
83+
) -> ConnectWhatsAppCallResponse:
84+
"""
85+
Connect a WhatsApp call with SDP information
86+
87+
Args:
88+
request: ConnectWhatsAppCallRequest containing call ID and SDP
89+
90+
Returns:
91+
ConnectWhatsAppCallResponse (empty response)
92+
"""
93+
return await self._client.request(
94+
SVC,
95+
"ConnectWhatsAppCall",
96+
request,
97+
self._auth_header(VideoGrants(room_create=True)),
98+
ConnectWhatsAppCallResponse,
99+
)
100+
101+
async def accept_whatsapp_call(
102+
self, request: AcceptWhatsAppCallRequest
103+
) -> AcceptWhatsAppCallResponse:
104+
"""
105+
Accept an inbound WhatsApp call
106+
107+
Args:
108+
request: AcceptWhatsAppCallRequest containing call parameters and SDP
109+
110+
Returns:
111+
AcceptWhatsAppCallResponse with the room name
112+
"""
113+
return await self._client.request(
114+
SVC,
115+
"AcceptWhatsAppCall",
116+
request,
117+
self._auth_header(VideoGrants(room_create=True)),
118+
AcceptWhatsAppCallResponse,
119+
)
120+
121+
async def connect_twilio_call(
122+
self, request: ConnectTwilioCallRequest
123+
) -> ConnectTwilioCallResponse:
124+
"""
125+
Connect a Twilio call to a LiveKit room
126+
127+
Args:
128+
request: ConnectTwilioCallRequest containing call parameters
129+
130+
Returns:
131+
ConnectTwilioCallResponse with the websocket URL for Twilio media stream
132+
"""
133+
return await self._client.request(
134+
SVC,
135+
"ConnectTwilioCall",
136+
request,
137+
self._auth_header(VideoGrants(room_create=True)),
138+
ConnectTwilioCallResponse,
139+
)

livekit-api/livekit/api/livekit_api.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .ingress_service import IngressService
66
from .sip_service import SipService
77
from .agent_dispatch_service import AgentDispatchService
8+
from .connector_service import ConnectorService
89
from typing import Optional
910

1011

@@ -63,6 +64,7 @@ def __init__(
6364
self._egress = EgressService(self._session, url, api_key, api_secret)
6465
self._sip = SipService(self._session, url, api_key, api_secret)
6566
self._agent_dispatch = AgentDispatchService(self._session, url, api_key, api_secret)
67+
self._connector = ConnectorService(self._session, url, api_key, api_secret)
6668

6769
@property
6870
def agent_dispatch(self) -> AgentDispatchService:
@@ -89,6 +91,11 @@ def sip(self) -> SipService:
8991
"""Instance of the SipService"""
9092
return self._sip
9193

94+
@property
95+
def connector(self) -> ConnectorService:
96+
"""Instance of the ConnectorService"""
97+
return self._connector
98+
9299
async def aclose(self):
93100
"""Close the API client
94101

livekit-protocol/generate_proto.sh

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ protoc \
3535
$API_PROTOCOL/livekit_metrics.proto \
3636
$API_PROTOCOL/livekit_sip.proto \
3737
$API_PROTOCOL/livekit_analytics.proto \
38-
$API_PROTOCOL/agent/livekit_agent_session.proto
38+
$API_PROTOCOL/livekit_rtc.proto \
39+
$API_PROTOCOL/agent/livekit_agent_session.proto \
40+
$API_PROTOCOL/logger/options.proto \
41+
$API_PROTOCOL/livekit_connector_whatsapp.proto \
42+
$API_PROTOCOL/livekit_connector_twilio.proto \
43+
$API_PROTOCOL/livekit_connector.proto
3944

4045

4146
touch -a "$API_OUT_PYTHON/__init__.py"
@@ -69,11 +74,28 @@ mv "$API_OUT_PYTHON/livekit_sip_pb2.py" "$API_OUT_PYTHON/sip.py"
6974
mv "$API_OUT_PYTHON/livekit_sip_pb2.pyi" "$API_OUT_PYTHON/sip.pyi"
7075
mv "$API_OUT_PYTHON/livekit_metrics_pb2.py" "$API_OUT_PYTHON/metrics.py"
7176
mv "$API_OUT_PYTHON/livekit_metrics_pb2.pyi" "$API_OUT_PYTHON/metrics.pyi"
77+
mv "$API_OUT_PYTHON/livekit_rtc_pb2.py" "$API_OUT_PYTHON/rtc.py"
78+
mv "$API_OUT_PYTHON/livekit_rtc_pb2.pyi" "$API_OUT_PYTHON/rtc.pyi"
79+
mv "$API_OUT_PYTHON/livekit_connector_whatsapp_pb2.py" "$API_OUT_PYTHON/connector_whatsapp.py"
80+
mv "$API_OUT_PYTHON/livekit_connector_whatsapp_pb2.pyi" "$API_OUT_PYTHON/connector_whatsapp.pyi"
81+
mv "$API_OUT_PYTHON/livekit_connector_twilio_pb2.py" "$API_OUT_PYTHON/connector_twilio.py"
82+
mv "$API_OUT_PYTHON/livekit_connector_twilio_pb2.pyi" "$API_OUT_PYTHON/connector_twilio.pyi"
83+
mv "$API_OUT_PYTHON/livekit_connector_pb2.py" "$API_OUT_PYTHON/connector.py"
84+
mv "$API_OUT_PYTHON/livekit_connector_pb2.pyi" "$API_OUT_PYTHON/connector.pyi"
7285

7386
mkdir -p "$API_OUT_PYTHON/agent_pb"
7487
mv "$API_OUT_PYTHON/agent/livekit_agent_session_pb2.py" "$API_OUT_PYTHON/agent_pb/agent_session.py"
7588
mv "$API_OUT_PYTHON/agent/livekit_agent_session_pb2.pyi" "$API_OUT_PYTHON/agent_pb/agent_session.pyi"
7689

77-
perl -i -pe 's|^(import (livekit_egress_pb2\|livekit_room_pb2\|livekit_webhook_pb2\|livekit_ingress_pb2\|livekit_models_pb2\|livekit_agent_pb2\|livekit_agent_dispatch_pb2\|livekit_analytics_pb2\|livekit_sip_pb2\|livekit_metrics_pb2\|livekit_agent_session_pb2))|from . $1|g' "$API_OUT_PYTHON"/**.py "$API_OUT_PYTHON"/**.pyi
90+
mkdir -p "$API_OUT_PYTHON/logger_pb"
91+
mv "$API_OUT_PYTHON/logger/options_pb2.py" "$API_OUT_PYTHON/logger_pb/options.py"
92+
mv "$API_OUT_PYTHON/logger/options_pb2.pyi" "$API_OUT_PYTHON/logger_pb/options.pyi"
93+
94+
perl -i -pe 's|^(import (livekit_egress_pb2\|livekit_room_pb2\|livekit_webhook_pb2\|livekit_ingress_pb2\|livekit_models_pb2\|livekit_agent_pb2\|livekit_agent_dispatch_pb2\|livekit_analytics_pb2\|livekit_sip_pb2\|livekit_metrics_pb2\|livekit_rtc_pb2\|livekit_connector_whatsapp_pb2\|livekit_connector_twilio_pb2\|livekit_connector_pb2\|livekit_agent_session_pb2\|options_pb2))|from . $1|g' "$API_OUT_PYTHON"/**.py "$API_OUT_PYTHON"/**.pyi
7895

7996
perl -i -pe 's|livekit_(\w+)_pb2|${1}|g' "$API_OUT_PYTHON"/**.py "$API_OUT_PYTHON"/**.pyi
97+
98+
perl -i -pe 's|from logger import options_pb2 as ([^ ]+)|from .logger_pb import options as $1|g' "$API_OUT_PYTHON"/**.py "$API_OUT_PYTHON"/**.pyi
99+
100+
# fixes - error: ClassVar can only be used for assignments in class body [misc]
101+
perl -i -pe 's|^(\w+_FIELD_NUMBER): _ClassVar\[int\]|$1: int|g' "$API_OUT_PYTHON/logger_pb/options.pyi"

livekit-protocol/livekit/protocol/connector.py

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

livekit-protocol/livekit/protocol/connector.pyi

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

livekit-protocol/livekit/protocol/connector_twilio.py

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

livekit-protocol/livekit/protocol/connector_twilio.pyi

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)