Skip to content

Commit 4a85e01

Browse files
committed
Merge branch 'main' into dc/media_devices
2 parents 15d104e + a46a472 commit 4a85e01

33 files changed

+1072
-622
lines changed

livekit-api/livekit/api/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,14 @@
3636

3737
from .twirp_client import TwirpError, TwirpErrorCode
3838
from .livekit_api import LiveKitAPI
39-
from .access_token import VideoGrants, SIPGrants, AccessToken, TokenVerifier
39+
from .access_token import (
40+
InferenceGrants,
41+
ObservabilityGrants,
42+
VideoGrants,
43+
SIPGrants,
44+
AccessToken,
45+
TokenVerifier,
46+
)
4047
from .webhook import WebhookReceiver
4148
from .version import __version__
4249

@@ -47,6 +54,8 @@
4754
"ingress_service",
4855
"sip_service",
4956
"agent_dispatch_service",
57+
"InferenceGrants",
58+
"ObservabilityGrants",
5059
"VideoGrants",
5160
"SIPGrants",
5261
"AccessToken",

livekit-api/livekit/api/access_token.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
# limitations under the License.
1414

1515
import calendar
16-
import dataclasses
1716
import re
1817
import datetime
1918
import os
2019
import jwt
20+
import dataclasses
21+
from dataclasses import dataclass
2122
from typing import Optional, List, Literal
2223
from google.protobuf.json_format import MessageToDict, ParseDict
2324

@@ -27,7 +28,7 @@
2728
DEFAULT_LEEWAY = datetime.timedelta(minutes=1)
2829

2930

30-
@dataclasses.dataclass
31+
@dataclass
3132
class VideoGrants:
3233
# actions on rooms
3334
room_create: Optional[bool] = None
@@ -68,21 +69,27 @@ class VideoGrants:
6869
agent: Optional[bool] = None
6970

7071

71-
@dataclasses.dataclass
72+
@dataclass
7273
class SIPGrants:
7374
# manage sip resources
7475
admin: bool = False
7576
# make outbound calls
7677
call: bool = False
7778

7879

79-
@dataclasses.dataclass
80+
@dataclass
8081
class InferenceGrants:
8182
# perform inference
8283
perform: bool = False
8384

8485

85-
@dataclasses.dataclass
86+
@dataclass
87+
class ObservabilityGrants:
88+
# write grants to publish observability data
89+
write: bool = False
90+
91+
92+
@dataclass
8693
class Claims:
8794
identity: str = ""
8895
name: str = ""
@@ -91,13 +98,14 @@ class Claims:
9198
video: Optional[VideoGrants] = None
9299
sip: Optional[SIPGrants] = None
93100
inference: Optional[InferenceGrants] = None
101+
observability: Optional[ObservabilityGrants] = None
94102
attributes: Optional[dict[str, str]] = None
95103
sha256: Optional[str] = None
96104
room_preset: Optional[str] = None
97105
room_config: Optional[RoomConfiguration] = None
98106

99107
def asdict(self) -> dict:
100-
# in order to produce minimal JWT size, exclude None or empty values
108+
# in order to produce minimal jwt size, exclude None or empty values
101109
claims = dataclasses.asdict(
102110
self,
103111
dict_factory=lambda items: {
@@ -143,6 +151,10 @@ def with_sip_grants(self, grants: SIPGrants) -> "AccessToken":
143151
self.claims.sip = grants
144152
return self
145153

154+
def with_observability_grants(self, grants: ObservabilityGrants) -> "AccessToken":
155+
self.claims.observability = grants
156+
return self
157+
146158
def with_inference_grants(self, grants: InferenceGrants) -> "AccessToken":
147159
self.claims.inference = grants
148160
return self

livekit-api/livekit/api/sip_service.py

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,9 @@ async def update_inbound_trunk_fields(
148148
self,
149149
trunk_id: str,
150150
*,
151-
numbers: Optional[list[str]] = None,
152-
allowed_addresses: Optional[list[str]] = None,
153-
allowed_numbers: Optional[list[str]] = None,
151+
numbers: Optional[ListUpdate | list[str]] = None,
152+
allowed_addresses: Optional[ListUpdate | list[str]] = None,
153+
allowed_numbers: Optional[ListUpdate | list[str]] = None,
154154
auth_username: Optional[str] = None,
155155
auth_password: Optional[str] = None,
156156
name: Optional[str] = None,
@@ -167,11 +167,26 @@ async def update_inbound_trunk_fields(
167167
metadata=metadata,
168168
)
169169
if numbers is not None:
170-
update.numbers.set.extend(numbers)
170+
if isinstance(numbers, ListUpdate):
171+
update.numbers.set.extend(numbers.set)
172+
update.numbers.add.extend(numbers.add)
173+
update.numbers.remove.extend(numbers.remove)
174+
else:
175+
update.numbers.set.extend(numbers)
171176
if allowed_addresses is not None:
172-
update.allowed_addresses.set.extend(allowed_addresses)
177+
if isinstance(allowed_addresses, ListUpdate):
178+
update.allowed_addresses.set.extend(allowed_addresses.set)
179+
update.allowed_addresses.add.extend(allowed_addresses.add)
180+
update.allowed_addresses.remove.extend(allowed_addresses.remove)
181+
else:
182+
update.allowed_addresses.set.extend(allowed_addresses)
173183
if allowed_numbers is not None:
174-
update.allowed_numbers.set.extend(allowed_numbers)
184+
if isinstance(allowed_numbers, ListUpdate):
185+
update.allowed_numbers.set.extend(allowed_numbers.set)
186+
update.allowed_numbers.add.extend(allowed_numbers.add)
187+
update.allowed_numbers.remove.extend(allowed_numbers.remove)
188+
else:
189+
update.allowed_numbers.set.extend(allowed_numbers)
175190

176191
return await self._client.request(
177192
SVC,
@@ -314,7 +329,7 @@ async def update_outbound_trunk_fields(
314329
*,
315330
address: str | None = None,
316331
transport: SIPTransport | None = None,
317-
numbers: list[str] | None = None,
332+
numbers: Optional[ListUpdate | list[str]] = None,
318333
auth_username: str | None = None,
319334
auth_password: str | None = None,
320335
name: str | None = None,
@@ -333,7 +348,13 @@ async def update_outbound_trunk_fields(
333348
metadata=metadata,
334349
)
335350
if numbers is not None:
336-
update.numbers.set.extend(numbers)
351+
if isinstance(numbers, ListUpdate):
352+
update.numbers.set.extend(numbers.set)
353+
update.numbers.add.extend(numbers.add)
354+
update.numbers.remove.extend(numbers.remove)
355+
else:
356+
update.numbers.set.extend(numbers)
357+
337358
return await self._client.request(
338359
SVC,
339360
"UpdateSIPOutboundTrunk",
@@ -586,7 +607,7 @@ async def update_dispatch_rule_fields(
586607
self,
587608
rule_id: str,
588609
*,
589-
trunk_ids: Optional[list[str]] = None,
610+
trunk_ids: Optional[ListUpdate | list[str]] = None,
590611
rule: Optional[SIPDispatchRule] = None,
591612
name: Optional[str] = None,
592613
metadata: Optional[str] = None,
@@ -601,8 +622,15 @@ async def update_dispatch_rule_fields(
601622
metadata=metadata,
602623
rule=rule,
603624
attributes=attributes,
604-
trunk_ids=ListUpdate(set=trunk_ids) if trunk_ids else None,
605625
)
626+
if trunk_ids is not None:
627+
if isinstance(trunk_ids, ListUpdate):
628+
update.trunk_ids.set.extend(trunk_ids.set)
629+
update.trunk_ids.add.extend(trunk_ids.add)
630+
update.trunk_ids.remove.extend(trunk_ids.remove)
631+
else:
632+
update.trunk_ids.set.extend(trunk_ids)
633+
606634
return await self._client.request(
607635
SVC,
608636
"UpdateSIPDispatchRule",

livekit-api/livekit/api/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "1.0.5"
1+
__version__ = "1.0.7"

livekit-protocol/generate_proto.sh

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ protoc \
3434
$API_PROTOCOL/livekit_agent_dispatch.proto \
3535
$API_PROTOCOL/livekit_metrics.proto \
3636
$API_PROTOCOL/livekit_sip.proto \
37-
$API_PROTOCOL/livekit_analytics.proto
37+
$API_PROTOCOL/livekit_analytics.proto \
38+
$API_PROTOCOL/agent/livekit_agent_session.proto
3839

3940

4041
touch -a "$API_OUT_PYTHON/__init__.py"
@@ -69,6 +70,10 @@ mv "$API_OUT_PYTHON/livekit_sip_pb2.pyi" "$API_OUT_PYTHON/sip.pyi"
6970
mv "$API_OUT_PYTHON/livekit_metrics_pb2.py" "$API_OUT_PYTHON/metrics.py"
7071
mv "$API_OUT_PYTHON/livekit_metrics_pb2.pyi" "$API_OUT_PYTHON/metrics.pyi"
7172

72-
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))|from . $1|g' "$API_OUT_PYTHON"/*.py "$API_OUT_PYTHON"/*.pyi
73+
mkdir -p "$API_OUT_PYTHON/agent_pb"
74+
mv "$API_OUT_PYTHON/agent/livekit_agent_session_pb2.py" "$API_OUT_PYTHON/agent_pb/agent_session.py"
75+
mv "$API_OUT_PYTHON/agent/livekit_agent_session_pb2.pyi" "$API_OUT_PYTHON/agent_pb/agent_session.pyi"
7376

74-
perl -i -pe 's|livekit_(\w+)_pb2|${1}|g' "$API_OUT_PYTHON"/*.py "$API_OUT_PYTHON"/*.pyi
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
78+
79+
perl -i -pe 's|livekit_(\w+)_pb2|${1}|g' "$API_OUT_PYTHON"/**.py "$API_OUT_PYTHON"/**.pyi

livekit-protocol/livekit/protocol/__init__.py

Lines changed: 17 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)