spatialreal 0.2.1__tar.gz → 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {spatialreal-0.2.1 → spatialreal-0.2.3}/PKG-INFO +10 -6
- {spatialreal-0.2.1 → spatialreal-0.2.3}/README.md +3 -2
- {spatialreal-0.2.1 → spatialreal-0.2.3}/pyproject.toml +7 -4
- spatialreal-0.2.3/spatialreal/proto/generated/message_pb2.py +72 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/proto/generated/message_pb2.pyi +5 -64
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/session.py +9 -5
- spatialreal-0.2.3/spatialreal/version.py +1 -0
- spatialreal-0.2.1/proto/SHARED_PROTO_COMMIT +0 -1
- spatialreal-0.2.1/proto/driveningress/v2/driveningress.proto +0 -278
- spatialreal-0.2.1/spatialreal/proto/generated/message_pb2.py +0 -96
- spatialreal-0.2.1/spatialreal/version.py +0 -1
- {spatialreal-0.2.1 → spatialreal-0.2.3}/.gitignore +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/LICENSE +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/__init__.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/config.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/environments.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/errors.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/events.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/logid.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/proto/__init__.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/proto/generated/__init__.py +0 -0
- {spatialreal-0.2.1 → spatialreal-0.2.3}/spatialreal/py.typed +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: spatialreal
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: SpatialReal Python SDK — realtime avatar sessions (audio in, animation/egress out)
|
|
5
|
-
Project-URL: Documentation, https://docs.spatialreal.
|
|
5
|
+
Project-URL: Documentation, https://docs.spatialreal.ai
|
|
6
6
|
Project-URL: Website, https://www.spatialreal.ai/
|
|
7
7
|
Project-URL: Source, https://github.com/SpatialReal-ai/python-sdk
|
|
8
8
|
Author-email: SpatialReal <hello@spatialreal.com>
|
|
@@ -14,15 +14,18 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
14
14
|
Classifier: Programming Language :: Python :: 3
|
|
15
15
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
20
|
Classifier: Topic :: Multimedia :: Sound/Audio
|
|
18
21
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
22
|
Requires-Python: >=3.10.0
|
|
20
23
|
Requires-Dist: aiohttp>=3.9
|
|
21
24
|
Requires-Dist: nanoid>=2.0
|
|
22
|
-
Requires-Dist: protobuf<8,>=
|
|
25
|
+
Requires-Dist: protobuf<8,>=5.29
|
|
23
26
|
Requires-Dist: websockets>=12
|
|
24
27
|
Provides-Extra: dev
|
|
25
|
-
Requires-Dist: grpcio-tools==1.
|
|
28
|
+
Requires-Dist: grpcio-tools==1.71.2; extra == 'dev'
|
|
26
29
|
Requires-Dist: pytest; extra == 'dev'
|
|
27
30
|
Requires-Dist: pytest-asyncio; extra == 'dev'
|
|
28
31
|
Requires-Dist: ruff; extra == 'dev'
|
|
@@ -43,8 +46,8 @@ from spatialreal import LiveKitEgressConfig, new_avatar_session
|
|
|
43
46
|
|
|
44
47
|
session = new_avatar_session(
|
|
45
48
|
api_key="...",
|
|
46
|
-
app_id="...",
|
|
47
49
|
avatar_id="...",
|
|
50
|
+
# app_id is optional: the app is derived from the API key server-side
|
|
48
51
|
expire_at=datetime.now(timezone.utc) + timedelta(hours=1),
|
|
49
52
|
sample_rate=16000,
|
|
50
53
|
livekit_egress=LiveKitEgressConfig(url=..., api_token=..., room_name=..., publisher_id=...),
|
|
@@ -99,6 +102,8 @@ implements the server's WebSocket close-code contract (40xx: don't retry,
|
|
|
99
102
|
|
|
100
103
|
## What's new
|
|
101
104
|
|
|
105
|
+
- 0.2.3: `app_id` is optional (the API key identifies the app); protobuf floor lowered
|
|
106
|
+
to 5.29 so the SDK installs next to packages that pin protobuf 5.x (TEN Framework agents).
|
|
102
107
|
- `on_playback(PlaybackSignal)` — structured playback lifecycle; no protobuf
|
|
103
108
|
parsing in caller code (`transport_frames(raw, is_last)` still exists).
|
|
104
109
|
- `CloseCode` + `AvatarSDKError.retryable` — the reconnect contract as API.
|
|
@@ -117,7 +122,6 @@ implements the server's WebSocket close-code contract (40xx: don't retry,
|
|
|
117
122
|
```bash
|
|
118
123
|
uv venv && uv pip install -e ".[dev]"
|
|
119
124
|
python -m pytest tests -q # protocol-level tests against an in-process fake backend
|
|
120
|
-
./scripts/gen_proto.sh # regenerate protobuf from proto/ (see proto/SHARED_PROTO_COMMIT)
|
|
121
125
|
```
|
|
122
126
|
|
|
123
127
|
## License
|
|
@@ -13,8 +13,8 @@ from spatialreal import LiveKitEgressConfig, new_avatar_session
|
|
|
13
13
|
|
|
14
14
|
session = new_avatar_session(
|
|
15
15
|
api_key="...",
|
|
16
|
-
app_id="...",
|
|
17
16
|
avatar_id="...",
|
|
17
|
+
# app_id is optional: the app is derived from the API key server-side
|
|
18
18
|
expire_at=datetime.now(timezone.utc) + timedelta(hours=1),
|
|
19
19
|
sample_rate=16000,
|
|
20
20
|
livekit_egress=LiveKitEgressConfig(url=..., api_token=..., room_name=..., publisher_id=...),
|
|
@@ -69,6 +69,8 @@ implements the server's WebSocket close-code contract (40xx: don't retry,
|
|
|
69
69
|
|
|
70
70
|
## What's new
|
|
71
71
|
|
|
72
|
+
- 0.2.3: `app_id` is optional (the API key identifies the app); protobuf floor lowered
|
|
73
|
+
to 5.29 so the SDK installs next to packages that pin protobuf 5.x (TEN Framework agents).
|
|
72
74
|
- `on_playback(PlaybackSignal)` — structured playback lifecycle; no protobuf
|
|
73
75
|
parsing in caller code (`transport_frames(raw, is_last)` still exists).
|
|
74
76
|
- `CloseCode` + `AvatarSDKError.retryable` — the reconnect contract as API.
|
|
@@ -87,7 +89,6 @@ implements the server's WebSocket close-code contract (40xx: don't retry,
|
|
|
87
89
|
```bash
|
|
88
90
|
uv venv && uv pip install -e ".[dev]"
|
|
89
91
|
python -m pytest tests -q # protocol-level tests against an in-process fake backend
|
|
90
|
-
./scripts/gen_proto.sh # regenerate protobuf from proto/ (see proto/SHARED_PROTO_COMMIT)
|
|
91
92
|
```
|
|
92
93
|
|
|
93
94
|
## License
|
|
@@ -18,20 +18,23 @@ classifiers = [
|
|
|
18
18
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
19
19
|
"Programming Language :: Python :: 3",
|
|
20
20
|
"Programming Language :: Python :: 3.10",
|
|
21
|
+
"Programming Language :: Python :: 3.11",
|
|
22
|
+
"Programming Language :: Python :: 3.12",
|
|
23
|
+
"Programming Language :: Python :: 3.13",
|
|
21
24
|
"Programming Language :: Python :: 3 :: Only",
|
|
22
25
|
]
|
|
23
26
|
dependencies = [
|
|
24
27
|
"aiohttp>=3.9",
|
|
25
28
|
"websockets>=12",
|
|
26
|
-
"protobuf>=
|
|
29
|
+
"protobuf>=5.29,<8",
|
|
27
30
|
"nanoid>=2.0",
|
|
28
31
|
]
|
|
29
32
|
|
|
30
33
|
[project.optional-dependencies]
|
|
31
|
-
dev = ["pytest", "pytest-asyncio", "grpcio-tools==1.
|
|
34
|
+
dev = ["pytest", "pytest-asyncio", "grpcio-tools==1.71.2", "ruff"]
|
|
32
35
|
|
|
33
36
|
[project.urls]
|
|
34
|
-
Documentation = "https://docs.spatialreal.
|
|
37
|
+
Documentation = "https://docs.spatialreal.ai"
|
|
35
38
|
Website = "https://www.spatialreal.ai/"
|
|
36
39
|
Source = "https://github.com/SpatialReal-ai/python-sdk"
|
|
37
40
|
|
|
@@ -42,7 +45,7 @@ path = "spatialreal/version.py"
|
|
|
42
45
|
packages = ["spatialreal"]
|
|
43
46
|
|
|
44
47
|
[tool.hatch.build.targets.sdist]
|
|
45
|
-
include = ["/spatialreal"
|
|
48
|
+
include = ["/spatialreal"]
|
|
46
49
|
|
|
47
50
|
[tool.ruff]
|
|
48
51
|
target-version = "py310"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# NO CHECKED-IN PROTOBUF GENCODE
|
|
4
|
+
# source: driveningress/v2/driveningress.proto
|
|
5
|
+
# Protobuf Python Version: 5.29.0
|
|
6
|
+
"""Generated protocol buffer code."""
|
|
7
|
+
from google.protobuf import descriptor as _descriptor
|
|
8
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
9
|
+
from google.protobuf import runtime_version as _runtime_version
|
|
10
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
11
|
+
from google.protobuf.internal import builder as _builder
|
|
12
|
+
_runtime_version.ValidateProtobufRuntimeVersion(
|
|
13
|
+
_runtime_version.Domain.PUBLIC,
|
|
14
|
+
5,
|
|
15
|
+
29,
|
|
16
|
+
0,
|
|
17
|
+
'',
|
|
18
|
+
'driveningress/v2/driveningress.proto'
|
|
19
|
+
)
|
|
20
|
+
# @@protoc_insertion_point(imports)
|
|
21
|
+
|
|
22
|
+
_sym_db = _symbol_database.Default()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$driveningress/v2/driveningress.proto\x12\x10\x64riveningress.v2\"\xa7\x02\n\x13LiveKitEgressConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0f\n\x07\x61pi_key\x18\x02 \x01(\t\x12\x12\n\napi_secret\x18\x03 \x01(\t\x12\x11\n\troom_name\x18\x04 \x01(\t\x12\x14\n\x0cpublisher_id\x18\x05 \x01(\t\x12T\n\x10\x65xtra_attributes\x18\x06 \x03(\x0b\x32:.driveningress.v2.LiveKitEgressConfig.ExtraAttributesEntry\x12\x14\n\x0cidle_timeout\x18\x07 \x01(\x05\x12\x11\n\tapi_token\x18\x08 \x01(\t\x1a\x36\n\x14\x45xtraAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"[\n\x11\x41goraEgressConfig\x12\x14\n\x0c\x63hannel_name\x18\x01 \x01(\t\x12\r\n\x05token\x18\x02 \x01(\t\x12\x0b\n\x03uid\x18\x03 \x01(\r\x12\x14\n\x0cpublisher_id\x18\x04 \x01(\t\"\xe7\x02\n\x16\x43lientConfigureSession\x12\x13\n\x0bsample_rate\x18\x01 \x01(\x05\x12\x0f\n\x07\x62itrate\x18\x02 \x01(\x05\x12\x33\n\x0c\x61udio_format\x18\x03 \x01(\x0e\x32\x1d.driveningress.v2.AudioFormat\x12\x45\n\x15transport_compression\x18\x04 \x01(\x0e\x32&.driveningress.v2.TransportCompression\x12\x31\n\x0b\x65gress_type\x18\x05 \x01(\x0e\x32\x1c.driveningress.v2.EgressType\x12=\n\x0elivekit_egress\x18\x06 \x01(\x0b\x32%.driveningress.v2.LiveKitEgressConfig\x12\x39\n\x0c\x61gora_egress\x18\x07 \x01(\x0b\x32#.driveningress.v2.AgoraEgressConfig\"C\n\x14ServerConfirmSession\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x02 \x03(\t\">\n\x10\x43lientAudioInput\x12\x0e\n\x06req_id\x18\x01 \x01(\t\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x08\x12\r\n\x05\x61udio\x18\x03 \x01(\x0c\"S\n\x0bServerError\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x0e\n\x06req_id\x18\x02 \x01(\t\x12\x0c\n\x04\x63ode\x18\x03 \x01(\x05\x12\x0f\n\x07message\x18\x04 \x01(\t\"s\n\x17ServerResponseAnimation\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x0e\n\x06req_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x08\x12\x11\n\tanimation\x18\x04 \x01(\x0c\x12\x11\n\tavatar_id\x18\x05 \x01(\t\"!\n\x0f\x43lientInterrupt\x12\x0e\n\x06req_id\x18\x01 \x01(\t\"\x1d\n\x0b\x43lientPause\x12\x0e\n\x06req_id\x18\x01 \x01(\t\"\x1e\n\x0c\x43lientResume\x12\x0e\n\x06req_id\x18\x01 \x01(\t\"\xf0\x01\n\x13ServerPlaybackState\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x0e\n\x06req_id\x18\x02 \x01(\t\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.driveningress.v2.ServerPlaybackState.State\x12\x11\n\tplayed_ms\x18\x04 \x01(\x03\x12\x0e\n\x06reason\x18\x05 \x01(\t\"S\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x0b\n\x07PLAYING\x10\x01\x12\n\n\x06PAUSED\x10\x02\x12\t\n\x05\x45NDED\x10\x03\x12\x0f\n\x0bINTERRUPTED\x10\x04\"\x9c\x05\n\x07Message\x12+\n\x04type\x18\x01 \x01(\x0e\x32\x1d.driveningress.v2.MessageType\x12L\n\x18\x63lient_configure_session\x18\x02 \x01(\x0b\x32(.driveningress.v2.ClientConfigureSessionH\x00\x12H\n\x16server_confirm_session\x18\x03 \x01(\x0b\x32&.driveningress.v2.ServerConfirmSessionH\x00\x12@\n\x12\x63lient_audio_input\x18\x04 \x01(\x0b\x32\".driveningress.v2.ClientAudioInputH\x00\x12\x35\n\x0cserver_error\x18\x05 \x01(\x0b\x32\x1d.driveningress.v2.ServerErrorH\x00\x12N\n\x19server_response_animation\x18\x06 \x01(\x0b\x32).driveningress.v2.ServerResponseAnimationH\x00\x12=\n\x10\x63lient_interrupt\x18\x08 \x01(\x0b\x32!.driveningress.v2.ClientInterruptH\x00\x12\x35\n\x0c\x63lient_pause\x18\t \x01(\x0b\x32\x1d.driveningress.v2.ClientPauseH\x00\x12\x37\n\rclient_resume\x18\n \x01(\x0b\x32\x1e.driveningress.v2.ClientResumeH\x00\x12\x46\n\x15server_playback_state\x18\x0b \x01(\x0b\x32%.driveningress.v2.ServerPlaybackStateH\x00\x42\x06\n\x04\x64\x61taJ\x04\x08\x07\x10\x08*\xcd\x02\n\x0bMessageType\x12\x17\n\x13MESSAGE_UNSPECIFIED\x10\x00\x12$\n MESSAGE_CLIENT_CONFIGURE_SESSION\x10\x01\x12\"\n\x1eMESSAGE_SERVER_CONFIRM_SESSION\x10\x02\x12\x1e\n\x1aMESSAGE_CLIENT_AUDIO_INPUT\x10\x03\x12\x18\n\x14MESSAGE_SERVER_ERROR\x10\x04\x12%\n!MESSAGE_SERVER_RESPONSE_ANIMATION\x10\x05\x12\x1c\n\x18MESSAGE_CLIENT_INTERRUPT\x10\x07\x12\x18\n\x14MESSAGE_CLIENT_PAUSE\x10\x08\x12\x19\n\x15MESSAGE_CLIENT_RESUME\x10\t\x12!\n\x1dMESSAGE_SERVER_PLAYBACK_STATE\x10\n\"\x04\x08\x06\x10\x06*D\n\x0b\x41udioFormat\x12\x1a\n\x16\x41UDIO_FORMAT_PCM_S16LE\x10\x00\x12\x19\n\x15\x41UDIO_FORMAT_OGG_OPUS\x10\x01*6\n\x14TransportCompression\x12\x1e\n\x1aTRANSPORT_COMPRESSION_NONE\x10\x00*Y\n\nEgressType\x12\x1b\n\x17\x45GRESS_TYPE_UNSPECIFIED\x10\x00\x12\x17\n\x13\x45GRESS_TYPE_LIVEKIT\x10\x01\x12\x15\n\x11\x45GRESS_TYPE_AGORA\x10\x02\x62\x06proto3')
|
|
28
|
+
|
|
29
|
+
_globals = globals()
|
|
30
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
31
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'driveningress.v2.driveningress_pb2', _globals)
|
|
32
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
|
33
|
+
DESCRIPTOR._loaded_options = None
|
|
34
|
+
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._loaded_options = None
|
|
35
|
+
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._serialized_options = b'8\001'
|
|
36
|
+
_globals['_MESSAGETYPE']._serialized_start=2159
|
|
37
|
+
_globals['_MESSAGETYPE']._serialized_end=2492
|
|
38
|
+
_globals['_AUDIOFORMAT']._serialized_start=2494
|
|
39
|
+
_globals['_AUDIOFORMAT']._serialized_end=2562
|
|
40
|
+
_globals['_TRANSPORTCOMPRESSION']._serialized_start=2564
|
|
41
|
+
_globals['_TRANSPORTCOMPRESSION']._serialized_end=2618
|
|
42
|
+
_globals['_EGRESSTYPE']._serialized_start=2620
|
|
43
|
+
_globals['_EGRESSTYPE']._serialized_end=2709
|
|
44
|
+
_globals['_LIVEKITEGRESSCONFIG']._serialized_start=59
|
|
45
|
+
_globals['_LIVEKITEGRESSCONFIG']._serialized_end=354
|
|
46
|
+
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._serialized_start=300
|
|
47
|
+
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._serialized_end=354
|
|
48
|
+
_globals['_AGORAEGRESSCONFIG']._serialized_start=356
|
|
49
|
+
_globals['_AGORAEGRESSCONFIG']._serialized_end=447
|
|
50
|
+
_globals['_CLIENTCONFIGURESESSION']._serialized_start=450
|
|
51
|
+
_globals['_CLIENTCONFIGURESESSION']._serialized_end=809
|
|
52
|
+
_globals['_SERVERCONFIRMSESSION']._serialized_start=811
|
|
53
|
+
_globals['_SERVERCONFIRMSESSION']._serialized_end=878
|
|
54
|
+
_globals['_CLIENTAUDIOINPUT']._serialized_start=880
|
|
55
|
+
_globals['_CLIENTAUDIOINPUT']._serialized_end=942
|
|
56
|
+
_globals['_SERVERERROR']._serialized_start=944
|
|
57
|
+
_globals['_SERVERERROR']._serialized_end=1027
|
|
58
|
+
_globals['_SERVERRESPONSEANIMATION']._serialized_start=1029
|
|
59
|
+
_globals['_SERVERRESPONSEANIMATION']._serialized_end=1144
|
|
60
|
+
_globals['_CLIENTINTERRUPT']._serialized_start=1146
|
|
61
|
+
_globals['_CLIENTINTERRUPT']._serialized_end=1179
|
|
62
|
+
_globals['_CLIENTPAUSE']._serialized_start=1181
|
|
63
|
+
_globals['_CLIENTPAUSE']._serialized_end=1210
|
|
64
|
+
_globals['_CLIENTRESUME']._serialized_start=1212
|
|
65
|
+
_globals['_CLIENTRESUME']._serialized_end=1242
|
|
66
|
+
_globals['_SERVERPLAYBACKSTATE']._serialized_start=1245
|
|
67
|
+
_globals['_SERVERPLAYBACKSTATE']._serialized_end=1485
|
|
68
|
+
_globals['_SERVERPLAYBACKSTATE_STATE']._serialized_start=1402
|
|
69
|
+
_globals['_SERVERPLAYBACKSTATE_STATE']._serialized_end=1485
|
|
70
|
+
_globals['_MESSAGE']._serialized_start=1488
|
|
71
|
+
_globals['_MESSAGE']._serialized_end=2156
|
|
72
|
+
# @@protoc_insertion_point(module_scope)
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
from google.protobuf import struct_pb2 as _struct_pb2
|
|
2
1
|
from google.protobuf.internal import containers as _containers
|
|
3
2
|
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
|
4
3
|
from google.protobuf import descriptor as _descriptor
|
|
5
4
|
from google.protobuf import message as _message
|
|
6
|
-
from
|
|
7
|
-
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
|
|
5
|
+
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
|
8
6
|
|
|
9
7
|
DESCRIPTOR: _descriptor.FileDescriptor
|
|
10
8
|
|
|
@@ -16,7 +14,6 @@ class MessageType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
|
|
16
14
|
MESSAGE_CLIENT_AUDIO_INPUT: _ClassVar[MessageType]
|
|
17
15
|
MESSAGE_SERVER_ERROR: _ClassVar[MessageType]
|
|
18
16
|
MESSAGE_SERVER_RESPONSE_ANIMATION: _ClassVar[MessageType]
|
|
19
|
-
MESSAGE_CLIENT_DRIVEN_CONFIG: _ClassVar[MessageType]
|
|
20
17
|
MESSAGE_CLIENT_INTERRUPT: _ClassVar[MessageType]
|
|
21
18
|
MESSAGE_CLIENT_PAUSE: _ClassVar[MessageType]
|
|
22
19
|
MESSAGE_CLIENT_RESUME: _ClassVar[MessageType]
|
|
@@ -36,22 +33,12 @@ class EgressType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
|
|
36
33
|
EGRESS_TYPE_UNSPECIFIED: _ClassVar[EgressType]
|
|
37
34
|
EGRESS_TYPE_LIVEKIT: _ClassVar[EgressType]
|
|
38
35
|
EGRESS_TYPE_AGORA: _ClassVar[EgressType]
|
|
39
|
-
|
|
40
|
-
class CloseCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
|
41
|
-
__slots__ = ()
|
|
42
|
-
CLOSE_CODE_UNSPECIFIED: _ClassVar[CloseCode]
|
|
43
|
-
CLOSE_CODE_CREDITS_EXHAUSTED: _ClassVar[CloseCode]
|
|
44
|
-
CLOSE_CODE_SESSION_TIMEOUT: _ClassVar[CloseCode]
|
|
45
|
-
CLOSE_CODE_CONCURRENCY_LIMIT: _ClassVar[CloseCode]
|
|
46
|
-
CLOSE_CODE_AUTH_FAILED: _ClassVar[CloseCode]
|
|
47
|
-
CLOSE_CODE_UPSTREAM_UNAVAILABLE: _ClassVar[CloseCode]
|
|
48
36
|
MESSAGE_UNSPECIFIED: MessageType
|
|
49
37
|
MESSAGE_CLIENT_CONFIGURE_SESSION: MessageType
|
|
50
38
|
MESSAGE_SERVER_CONFIRM_SESSION: MessageType
|
|
51
39
|
MESSAGE_CLIENT_AUDIO_INPUT: MessageType
|
|
52
40
|
MESSAGE_SERVER_ERROR: MessageType
|
|
53
41
|
MESSAGE_SERVER_RESPONSE_ANIMATION: MessageType
|
|
54
|
-
MESSAGE_CLIENT_DRIVEN_CONFIG: MessageType
|
|
55
42
|
MESSAGE_CLIENT_INTERRUPT: MessageType
|
|
56
43
|
MESSAGE_CLIENT_PAUSE: MessageType
|
|
57
44
|
MESSAGE_CLIENT_RESUME: MessageType
|
|
@@ -62,12 +49,6 @@ TRANSPORT_COMPRESSION_NONE: TransportCompression
|
|
|
62
49
|
EGRESS_TYPE_UNSPECIFIED: EgressType
|
|
63
50
|
EGRESS_TYPE_LIVEKIT: EgressType
|
|
64
51
|
EGRESS_TYPE_AGORA: EgressType
|
|
65
|
-
CLOSE_CODE_UNSPECIFIED: CloseCode
|
|
66
|
-
CLOSE_CODE_CREDITS_EXHAUSTED: CloseCode
|
|
67
|
-
CLOSE_CODE_SESSION_TIMEOUT: CloseCode
|
|
68
|
-
CLOSE_CODE_CONCURRENCY_LIMIT: CloseCode
|
|
69
|
-
CLOSE_CODE_AUTH_FAILED: CloseCode
|
|
70
|
-
CLOSE_CODE_UPSTREAM_UNAVAILABLE: CloseCode
|
|
71
52
|
|
|
72
53
|
class LiveKitEgressConfig(_message.Message):
|
|
73
54
|
__slots__ = ("url", "api_key", "api_secret", "room_name", "publisher_id", "extra_attributes", "idle_timeout", "api_token")
|
|
@@ -108,20 +89,6 @@ class AgoraEgressConfig(_message.Message):
|
|
|
108
89
|
publisher_id: str
|
|
109
90
|
def __init__(self, channel_name: _Optional[str] = ..., token: _Optional[str] = ..., uid: _Optional[int] = ..., publisher_id: _Optional[str] = ...) -> None: ...
|
|
110
91
|
|
|
111
|
-
class DrivenIngressConfig(_message.Message):
|
|
112
|
-
__slots__ = ("shape_npy", "style_npy", "driven_server_url", "model_settings", "encoder_start_frame")
|
|
113
|
-
SHAPE_NPY_FIELD_NUMBER: _ClassVar[int]
|
|
114
|
-
STYLE_NPY_FIELD_NUMBER: _ClassVar[int]
|
|
115
|
-
DRIVEN_SERVER_URL_FIELD_NUMBER: _ClassVar[int]
|
|
116
|
-
MODEL_SETTINGS_FIELD_NUMBER: _ClassVar[int]
|
|
117
|
-
ENCODER_START_FRAME_FIELD_NUMBER: _ClassVar[int]
|
|
118
|
-
shape_npy: bytes
|
|
119
|
-
style_npy: bytes
|
|
120
|
-
driven_server_url: str
|
|
121
|
-
model_settings: _struct_pb2.Struct
|
|
122
|
-
encoder_start_frame: int
|
|
123
|
-
def __init__(self, shape_npy: _Optional[bytes] = ..., style_npy: _Optional[bytes] = ..., driven_server_url: _Optional[str] = ..., model_settings: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., encoder_start_frame: _Optional[int] = ...) -> None: ...
|
|
124
|
-
|
|
125
92
|
class ClientConfigureSession(_message.Message):
|
|
126
93
|
__slots__ = ("sample_rate", "bitrate", "audio_format", "transport_compression", "egress_type", "livekit_egress", "agora_egress")
|
|
127
94
|
SAMPLE_RATE_FIELD_NUMBER: _ClassVar[int]
|
|
@@ -170,30 +137,6 @@ class ServerError(_message.Message):
|
|
|
170
137
|
message: str
|
|
171
138
|
def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., code: _Optional[int] = ..., message: _Optional[str] = ...) -> None: ...
|
|
172
139
|
|
|
173
|
-
class Flame(_message.Message):
|
|
174
|
-
__slots__ = ("translation", "rotation", "neck_pose", "jaw_pose", "eye_pose", "eye_lid", "expression")
|
|
175
|
-
TRANSLATION_FIELD_NUMBER: _ClassVar[int]
|
|
176
|
-
ROTATION_FIELD_NUMBER: _ClassVar[int]
|
|
177
|
-
NECK_POSE_FIELD_NUMBER: _ClassVar[int]
|
|
178
|
-
JAW_POSE_FIELD_NUMBER: _ClassVar[int]
|
|
179
|
-
EYE_POSE_FIELD_NUMBER: _ClassVar[int]
|
|
180
|
-
EYE_LID_FIELD_NUMBER: _ClassVar[int]
|
|
181
|
-
EXPRESSION_FIELD_NUMBER: _ClassVar[int]
|
|
182
|
-
translation: _containers.RepeatedScalarFieldContainer[float]
|
|
183
|
-
rotation: _containers.RepeatedScalarFieldContainer[float]
|
|
184
|
-
neck_pose: _containers.RepeatedScalarFieldContainer[float]
|
|
185
|
-
jaw_pose: _containers.RepeatedScalarFieldContainer[float]
|
|
186
|
-
eye_pose: _containers.RepeatedScalarFieldContainer[float]
|
|
187
|
-
eye_lid: _containers.RepeatedScalarFieldContainer[float]
|
|
188
|
-
expression: _containers.RepeatedScalarFieldContainer[float]
|
|
189
|
-
def __init__(self, translation: _Optional[_Iterable[float]] = ..., rotation: _Optional[_Iterable[float]] = ..., neck_pose: _Optional[_Iterable[float]] = ..., jaw_pose: _Optional[_Iterable[float]] = ..., eye_pose: _Optional[_Iterable[float]] = ..., eye_lid: _Optional[_Iterable[float]] = ..., expression: _Optional[_Iterable[float]] = ...) -> None: ...
|
|
190
|
-
|
|
191
|
-
class FlameAnimation(_message.Message):
|
|
192
|
-
__slots__ = ("keyframes",)
|
|
193
|
-
KEYFRAMES_FIELD_NUMBER: _ClassVar[int]
|
|
194
|
-
keyframes: _containers.RepeatedCompositeFieldContainer[Flame]
|
|
195
|
-
def __init__(self, keyframes: _Optional[_Iterable[_Union[Flame, _Mapping]]] = ...) -> None: ...
|
|
196
|
-
|
|
197
140
|
class ServerResponseAnimation(_message.Message):
|
|
198
141
|
__slots__ = ("connection_id", "req_id", "end", "animation", "avatar_id")
|
|
199
142
|
CONNECTION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
@@ -204,9 +147,9 @@ class ServerResponseAnimation(_message.Message):
|
|
|
204
147
|
connection_id: str
|
|
205
148
|
req_id: str
|
|
206
149
|
end: bool
|
|
207
|
-
animation:
|
|
150
|
+
animation: bytes
|
|
208
151
|
avatar_id: str
|
|
209
|
-
def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., end: bool = ..., animation: _Optional[
|
|
152
|
+
def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., end: bool = ..., animation: _Optional[bytes] = ..., avatar_id: _Optional[str] = ...) -> None: ...
|
|
210
153
|
|
|
211
154
|
class ClientInterrupt(_message.Message):
|
|
212
155
|
__slots__ = ("req_id",)
|
|
@@ -253,14 +196,13 @@ class ServerPlaybackState(_message.Message):
|
|
|
253
196
|
def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., state: _Optional[_Union[ServerPlaybackState.State, str]] = ..., played_ms: _Optional[int] = ..., reason: _Optional[str] = ...) -> None: ...
|
|
254
197
|
|
|
255
198
|
class Message(_message.Message):
|
|
256
|
-
__slots__ = ("type", "client_configure_session", "server_confirm_session", "client_audio_input", "server_error", "server_response_animation", "
|
|
199
|
+
__slots__ = ("type", "client_configure_session", "server_confirm_session", "client_audio_input", "server_error", "server_response_animation", "client_interrupt", "client_pause", "client_resume", "server_playback_state")
|
|
257
200
|
TYPE_FIELD_NUMBER: _ClassVar[int]
|
|
258
201
|
CLIENT_CONFIGURE_SESSION_FIELD_NUMBER: _ClassVar[int]
|
|
259
202
|
SERVER_CONFIRM_SESSION_FIELD_NUMBER: _ClassVar[int]
|
|
260
203
|
CLIENT_AUDIO_INPUT_FIELD_NUMBER: _ClassVar[int]
|
|
261
204
|
SERVER_ERROR_FIELD_NUMBER: _ClassVar[int]
|
|
262
205
|
SERVER_RESPONSE_ANIMATION_FIELD_NUMBER: _ClassVar[int]
|
|
263
|
-
DRIVEN_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
|
264
206
|
CLIENT_INTERRUPT_FIELD_NUMBER: _ClassVar[int]
|
|
265
207
|
CLIENT_PAUSE_FIELD_NUMBER: _ClassVar[int]
|
|
266
208
|
CLIENT_RESUME_FIELD_NUMBER: _ClassVar[int]
|
|
@@ -271,9 +213,8 @@ class Message(_message.Message):
|
|
|
271
213
|
client_audio_input: ClientAudioInput
|
|
272
214
|
server_error: ServerError
|
|
273
215
|
server_response_animation: ServerResponseAnimation
|
|
274
|
-
driven_config: DrivenIngressConfig
|
|
275
216
|
client_interrupt: ClientInterrupt
|
|
276
217
|
client_pause: ClientPause
|
|
277
218
|
client_resume: ClientResume
|
|
278
219
|
server_playback_state: ServerPlaybackState
|
|
279
|
-
def __init__(self, type: _Optional[_Union[MessageType, str]] = ..., client_configure_session: _Optional[_Union[ClientConfigureSession, _Mapping]] = ..., server_confirm_session: _Optional[_Union[ServerConfirmSession, _Mapping]] = ..., client_audio_input: _Optional[_Union[ClientAudioInput, _Mapping]] = ..., server_error: _Optional[_Union[ServerError, _Mapping]] = ..., server_response_animation: _Optional[_Union[ServerResponseAnimation, _Mapping]] = ...,
|
|
220
|
+
def __init__(self, type: _Optional[_Union[MessageType, str]] = ..., client_configure_session: _Optional[_Union[ClientConfigureSession, _Mapping]] = ..., server_confirm_session: _Optional[_Union[ServerConfirmSession, _Mapping]] = ..., client_audio_input: _Optional[_Union[ClientAudioInput, _Mapping]] = ..., server_error: _Optional[_Union[ServerError, _Mapping]] = ..., server_response_animation: _Optional[_Union[ServerResponseAnimation, _Mapping]] = ..., client_interrupt: _Optional[_Union[ClientInterrupt, _Mapping]] = ..., client_pause: _Optional[_Union[ClientPause, _Mapping]] = ..., client_resume: _Optional[_Union[ClientResume, _Mapping]] = ..., server_playback_state: _Optional[_Union[ServerPlaybackState, _Mapping]] = ...) -> None: ...
|
|
@@ -155,8 +155,6 @@ class AvatarSession:
|
|
|
155
155
|
raise ValueError("Session not initialized (call init() first)")
|
|
156
156
|
if not self._config.avatar_id:
|
|
157
157
|
raise ValueError("Missing avatar ID")
|
|
158
|
-
if not self._config.app_id:
|
|
159
|
-
raise ValueError("Missing app ID")
|
|
160
158
|
if self._config.livekit_egress is not None and self._config.agora_egress is not None:
|
|
161
159
|
raise ValueError("Cannot configure both livekit_egress and agora_egress")
|
|
162
160
|
|
|
@@ -192,12 +190,17 @@ class AvatarSession:
|
|
|
192
190
|
|
|
193
191
|
query = parse_qs(parsed.query)
|
|
194
192
|
query["id"] = [self._config.avatar_id]
|
|
193
|
+
# The app is derived server-side from the API key; ``app_id`` is optional and only
|
|
194
|
+
# forwarded when set (the server ignores an absent X-App-ID / appId).
|
|
195
195
|
headers: dict[str, str] = {}
|
|
196
196
|
if self._config.use_query_auth:
|
|
197
|
-
|
|
197
|
+
if self._config.app_id:
|
|
198
|
+
query["appId"] = [self._config.app_id]
|
|
198
199
|
query["sessionKey"] = [self._session_token or ""]
|
|
199
200
|
else:
|
|
200
|
-
headers = {"X-
|
|
201
|
+
headers = {"X-Session-Key": self._session_token or ""}
|
|
202
|
+
if self._config.app_id:
|
|
203
|
+
headers["X-App-ID"] = self._config.app_id
|
|
201
204
|
|
|
202
205
|
return (
|
|
203
206
|
urlunparse((ws_scheme, parsed.netloc, parsed.path, parsed.params, urlencode(query, doseq=True), "")),
|
|
@@ -471,7 +474,8 @@ class AvatarSession:
|
|
|
471
474
|
end=bool(anim.end),
|
|
472
475
|
connection_id=anim.connection_id,
|
|
473
476
|
avatar_id=anim.avatar_id,
|
|
474
|
-
|
|
477
|
+
# The animation payload is opaque here; empty means the frame carries none.
|
|
478
|
+
has_animation=len(anim.animation) > 0,
|
|
475
479
|
)
|
|
476
480
|
try:
|
|
477
481
|
self._config.on_playback(signal)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.3"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
845c7f2b2b5c39994bffea3e589bbde51d80f379
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
// driveningress.v2 — the user <-> driven-server realtime session protocol.
|
|
2
|
-
// Kept as the production contract; asset-serving RPCs were removed (avatars are now
|
|
3
|
-
// inlined per request by the backend; see inferenceserver/v1 for the inference contract).
|
|
4
|
-
|
|
5
|
-
syntax = "proto3";
|
|
6
|
-
|
|
7
|
-
package driveningress.v2;
|
|
8
|
-
|
|
9
|
-
import "google/protobuf/struct.proto";
|
|
10
|
-
|
|
11
|
-
option go_package = "github.com/SpatialReal-ai/backend-ng/api/generated/driveningress/v2";
|
|
12
|
-
|
|
13
|
-
enum MessageType {
|
|
14
|
-
MESSAGE_UNSPECIFIED = 0;
|
|
15
|
-
MESSAGE_CLIENT_CONFIGURE_SESSION = 1; // 协商会话参数
|
|
16
|
-
MESSAGE_SERVER_CONFIRM_SESSION = 2; // 确认协商成功
|
|
17
|
-
MESSAGE_CLIENT_AUDIO_INPUT = 3;
|
|
18
|
-
MESSAGE_SERVER_ERROR = 4;
|
|
19
|
-
MESSAGE_SERVER_RESPONSE_ANIMATION = 5;
|
|
20
|
-
MESSAGE_CLIENT_DRIVEN_CONFIG = 6; // 驱动配置消息
|
|
21
|
-
MESSAGE_CLIENT_INTERRUPT = 7; // 打断
|
|
22
|
-
// 服务端 pause / resume(仅 egress 模式;服务端在 ServerConfirmSession.capabilities 里声明 "playback_control")。
|
|
23
|
-
// 与 interrupt 的本质区别:不取消生成、不丢缓冲,恢复后从同一位置继续 —— 零空档、零误差、不重新生成。
|
|
24
|
-
MESSAGE_CLIENT_PAUSE = 8;
|
|
25
|
-
MESSAGE_CLIENT_RESUME = 9;
|
|
26
|
-
// 服务端播放状态回执(能力 "playback_state")。每条 CLIENT_PAUSE / CLIENT_RESUME 都必有一条回执;
|
|
27
|
-
// 播放被打断时也发一条 INTERRUPTED 带位置(客户反馈第 4 条)。老客户端对未知类型静默忽略。
|
|
28
|
-
MESSAGE_SERVER_PLAYBACK_STATE = 10;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
enum AudioFormat {
|
|
32
|
-
AUDIO_FORMAT_PCM_S16LE = 0;
|
|
33
|
-
AUDIO_FORMAT_OGG_OPUS = 1;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
enum TransportCompression {
|
|
37
|
-
TRANSPORT_COMPRESSION_NONE = 0;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// EgressType specifies how animation and audio data should be delivered
|
|
41
|
-
enum EgressType {
|
|
42
|
-
EGRESS_TYPE_UNSPECIFIED = 0; // Default: return animation data via WebSocket
|
|
43
|
-
EGRESS_TYPE_LIVEKIT = 1; // Stream to LiveKit room via egress service
|
|
44
|
-
EGRESS_TYPE_AGORA = 2; // Stream to Agora channel via egress service
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// CloseCode is the WebSocket close code the server sends when it ends a session, and
|
|
48
|
-
// the value carried in ServerError.code.
|
|
49
|
-
//
|
|
50
|
-
// Delivery: the server sends a ServerError carrying the code, then closes the socket with
|
|
51
|
-
// the same code — at the handshake (a refused session) and in-session (credits exhausted,
|
|
52
|
-
// session ceiling reached). A client may act on whichever arrives first.
|
|
53
|
-
//
|
|
54
|
-
// These are a client contract, not diagnostics: the SDK branches on them to decide
|
|
55
|
-
// whether to reconnect. Picking the wrong one is a behavioural bug, not a wording one —
|
|
56
|
-
// a retryable failure reported as CLOSE_CODE_AUTH_FAILED makes the client give up for good.
|
|
57
|
-
//
|
|
58
|
-
// Ranges: 40xx means the request itself is at fault and retrying changes nothing;
|
|
59
|
-
// 45xx means the server is briefly unable and the client should retry.
|
|
60
|
-
enum CloseCode {
|
|
61
|
-
CLOSE_CODE_UNSPECIFIED = 0;
|
|
62
|
-
|
|
63
|
-
// Out of credits. Do not reconnect — retrying cannot succeed until the account is topped up.
|
|
64
|
-
CLOSE_CODE_CREDITS_EXHAUSTED = 4001;
|
|
65
|
-
|
|
66
|
-
// Session hit its maximum duration. Reconnect is allowed and expected.
|
|
67
|
-
CLOSE_CODE_SESSION_TIMEOUT = 4002;
|
|
68
|
-
|
|
69
|
-
// Too many concurrent connections for the plan. Do not reconnect immediately; a slot
|
|
70
|
-
// has to free up first.
|
|
71
|
-
CLOSE_CODE_CONCURRENCY_LIMIT = 4003;
|
|
72
|
-
|
|
73
|
-
// Bad or expired session token, or app_id mismatch. Do not reconnect — the client
|
|
74
|
-
// needs a fresh token first.
|
|
75
|
-
CLOSE_CODE_AUTH_FAILED = 4010;
|
|
76
|
-
|
|
77
|
-
// A server-side dependency is briefly unavailable: the control plane is rolling, a
|
|
78
|
-
// network blip, or it answered 5xx. **Reconnect, ideally with backoff.** Distinct from
|
|
79
|
-
// AUTH_FAILED precisely so that a few seconds of deploy does not read to the client as
|
|
80
|
-
// "your credentials are bad, stop trying".
|
|
81
|
-
CLOSE_CODE_UPSTREAM_UNAVAILABLE = 4503;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// LiveKitEgressConfig contains configuration for streaming to a LiveKit room
|
|
85
|
-
message LiveKitEgressConfig {
|
|
86
|
-
// LiveKit server URL (e.g., wss://livekit.example.com)
|
|
87
|
-
string url = 1;
|
|
88
|
-
// LiveKit API key. Optional when api_token is provided.
|
|
89
|
-
string api_key = 2;
|
|
90
|
-
// LiveKit API secret. Optional when api_token is provided.
|
|
91
|
-
string api_secret = 3;
|
|
92
|
-
// LiveKit room name to join
|
|
93
|
-
string room_name = 4;
|
|
94
|
-
// Publisher identity in the room
|
|
95
|
-
string publisher_id = 5;
|
|
96
|
-
// Extra attributes
|
|
97
|
-
map<string, string> extra_attributes = 6;
|
|
98
|
-
// Idle timeout in seconds. Server closes the connection when it is completely silent.
|
|
99
|
-
int32 idle_timeout = 7;
|
|
100
|
-
// Pre-generated LiveKit access token. When set, backend should prefer this over api_key/api_secret.
|
|
101
|
-
string api_token = 8;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// AgoraEgressConfig contains configuration for streaming to an Agora channel
|
|
105
|
-
message AgoraEgressConfig {
|
|
106
|
-
// Agora channel name to join
|
|
107
|
-
string channel_name = 1;
|
|
108
|
-
// Agora token for authentication (optional for testing)
|
|
109
|
-
string token = 2;
|
|
110
|
-
// Publisher UID in the channel (0 for auto-assign)
|
|
111
|
-
uint32 uid = 3;
|
|
112
|
-
// Publisher identity/name
|
|
113
|
-
string publisher_id = 4;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// DrivenIngressConfig contains driven server configuration
|
|
117
|
-
message DrivenIngressConfig {
|
|
118
|
-
// Base64 encoded shape.npy data
|
|
119
|
-
bytes shape_npy = 1;
|
|
120
|
-
|
|
121
|
-
// Base64 encoded style.npy data
|
|
122
|
-
bytes style_npy = 2;
|
|
123
|
-
|
|
124
|
-
// Driven server URL
|
|
125
|
-
string driven_server_url = 3;
|
|
126
|
-
|
|
127
|
-
// Model settings JSON
|
|
128
|
-
google.protobuf.Struct model_settings = 4;
|
|
129
|
-
|
|
130
|
-
// Encoder start frame (default: 0)
|
|
131
|
-
int32 encoder_start_frame = 5;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
message ClientConfigureSession {
|
|
135
|
-
int32 sample_rate = 1;
|
|
136
|
-
int32 bitrate = 2;
|
|
137
|
-
// AUDIO_FORMAT_PCM_S16LE sends raw PCM16 mono audio at sample_rate.
|
|
138
|
-
// AUDIO_FORMAT_OGG_OPUS sends one continuous Ogg Opus stream per req_id.
|
|
139
|
-
// The server decodes it to PCM internally before handing it to driven processing.
|
|
140
|
-
AudioFormat audio_format = 3;
|
|
141
|
-
TransportCompression transport_compression = 4;
|
|
142
|
-
// Egress configuration (optional)
|
|
143
|
-
// If egress_type is UNSPECIFIED or not set, animation data is returned via WebSocket
|
|
144
|
-
EgressType egress_type = 5;
|
|
145
|
-
// LiveKit egress configuration (required when egress_type is EGRESS_TYPE_LIVEKIT)
|
|
146
|
-
LiveKitEgressConfig livekit_egress = 6;
|
|
147
|
-
// Agora egress configuration (required when egress_type is EGRESS_TYPE_AGORA)
|
|
148
|
-
AgoraEgressConfig agora_egress = 7;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
message ServerConfirmSession {
|
|
152
|
-
string connection_id = 1;
|
|
153
|
-
// 服务端在本连接上支持的可选能力,SDK 据此决定走新路还是回退老路:
|
|
154
|
-
// "playback_control" —— 接受 CLIENT_PAUSE / CLIENT_RESUME(egress 模式)
|
|
155
|
-
// "playback_state" —— 会发 SERVER_PLAYBACK_STATE 回执
|
|
156
|
-
// 没有该字段 / 为空 = 老服务端,SDK 保持 interrupt + 重发的回退路径。
|
|
157
|
-
repeated string capabilities = 2;
|
|
158
|
-
}
|
|
159
|
-
message ClientAudioInput {
|
|
160
|
-
string req_id = 1;
|
|
161
|
-
// Last message of this req_id. Only a message carrying end drains the ~21 ms filter tail
|
|
162
|
-
// held by the server's resampler, so a segment is not complete until end is sent; it may
|
|
163
|
-
// be sent with empty audio.
|
|
164
|
-
bool end = 2;
|
|
165
|
-
// For AUDIO_FORMAT_OGG_OPUS, audio carries a slice of the continuous Ogg stream.
|
|
166
|
-
// Each req_id must use a single logical stream spanning multiple messages.
|
|
167
|
-
// The final message for the req_id must set end=true.
|
|
168
|
-
bytes audio = 3;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
message ServerError {
|
|
172
|
-
string connection_id = 1;
|
|
173
|
-
string req_id = 2;
|
|
174
|
-
// Always a CloseCode number, never a gRPC status. A refused or ended session carries the
|
|
175
|
-
// code the close frame repeats; an in-session failure carries the CloseCode it maps to
|
|
176
|
-
// (4010 for an auth failure, 4503 for an unavailable upstream) or 0 (CLOSE_CODE_UNSPECIFIED)
|
|
177
|
-
// when it has no client-facing class — `message` says what happened.
|
|
178
|
-
int32 code = 3;
|
|
179
|
-
string message = 4;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
message Flame {
|
|
183
|
-
repeated float translation = 1 [packed = true];
|
|
184
|
-
repeated float rotation = 2 [packed = true];
|
|
185
|
-
repeated float neck_pose = 3 [packed = true];
|
|
186
|
-
repeated float jaw_pose = 4 [packed = true];
|
|
187
|
-
repeated float eye_pose = 5 [packed = true];
|
|
188
|
-
repeated float eye_lid = 6 [packed = true];
|
|
189
|
-
repeated float expression = 7 [packed = true];
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
message FlameAnimation {
|
|
193
|
-
repeated Flame keyframes = 1;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Animation frames for one req_id, in order, at 25 fps. The server does not pace or
|
|
197
|
-
// rate-limit them: a client applies its own backpressure.
|
|
198
|
-
message ServerResponseAnimation {
|
|
199
|
-
string connection_id = 1;
|
|
200
|
-
string req_id = 2;
|
|
201
|
-
// Last frames of this req_id: the server has drained inference for it. It marks the end
|
|
202
|
-
// of a segment, not of the turn — an agent runtime splits one turn into several req_ids at
|
|
203
|
-
// silences — so a client derives "no more frames this turn" from its own end marker (the
|
|
204
|
-
// SDK's end=true, the agent route's turn.end), never from this flag.
|
|
205
|
-
bool end = 3;
|
|
206
|
-
FlameAnimation animation = 4;
|
|
207
|
-
string avatar_id = 5;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Interrupt the whole turn of req_id: audio buffered for it that has not reached inference
|
|
211
|
-
// is discarded (never flushed) and the processor is cancelled. Frames already emitted are
|
|
212
|
-
// still in flight and reach the client, which must drop them. Contrast ClientPause, which
|
|
213
|
-
// discards nothing.
|
|
214
|
-
message ClientInterrupt {
|
|
215
|
-
string req_id = 1;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// 暂停当前 req_id 的播放。req_id 与服务端当前会话不匹配时被忽略,但仍会收到一条
|
|
219
|
-
// SERVER_PLAYBACK_STATE 回执(内容是当前会话的真实状态,req_id 用请求里的那个)。
|
|
220
|
-
// 暂停期间客户端应【照常继续发送音频,包括 end=true】—— 服务端只停写出、不停吸入。
|
|
221
|
-
// Unlike interrupt, pause cancels nothing and discards no buffered audio; resume continues
|
|
222
|
-
// from the same position.
|
|
223
|
-
message ClientPause {
|
|
224
|
-
string req_id = 1;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// 从暂停点继续播放。未暂停时发 resume 是幂等的(回执 PLAYING)。
|
|
228
|
-
message ClientResume {
|
|
229
|
-
string req_id = 1;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// 服务端播放状态回执。
|
|
233
|
-
//
|
|
234
|
-
// 每条 CLIENT_PAUSE / CLIENT_RESUME 都必有一条,内容是操作【之后】的真实状态:
|
|
235
|
-
// pause 被接受 → PAUSED + 位置
|
|
236
|
-
// pause 撞上刚播完 → ENDED + 总长(收到 ENDED 即视为此前的 pause 落空)
|
|
237
|
-
// req_id 不匹配当前会话 → 当前会话的真实状态,req_id 用请求里的那个
|
|
238
|
-
// resume 时并未暂停 → PLAYING + 位置
|
|
239
|
-
// 另外播放被打断时服务端主动发一条 INTERRUPTED(reason 见下),暂停超时也走这条
|
|
240
|
-
// (reason = "pause_timeout":客户端应按打断收尾,丢弃本地留存,不再尝试 resume)。
|
|
241
|
-
// PLAYING / ENDED 也会随播放开始 / 播完主动发出,是 ServerResponseAnimation{end} 之外给新 SDK 的冗余,不替代它。
|
|
242
|
-
message ServerPlaybackState {
|
|
243
|
-
string connection_id = 1;
|
|
244
|
-
string req_id = 2;
|
|
245
|
-
enum State {
|
|
246
|
-
STATE_UNSPECIFIED = 0;
|
|
247
|
-
PLAYING = 1;
|
|
248
|
-
PAUSED = 2;
|
|
249
|
-
ENDED = 3;
|
|
250
|
-
INTERRUPTED = 4;
|
|
251
|
-
}
|
|
252
|
-
State state = 3;
|
|
253
|
-
// 已写出的内容毫秒数(不含过渡,暂停期间不推进)。
|
|
254
|
-
int64 played_ms = 4;
|
|
255
|
-
// INTERRUPTED 时:explicit | preempted | pause_timeout
|
|
256
|
-
string reason = 5;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
message Message {
|
|
260
|
-
MessageType type = 1;
|
|
261
|
-
oneof data {
|
|
262
|
-
ClientConfigureSession client_configure_session = 2;
|
|
263
|
-
ServerConfirmSession server_confirm_session = 3;
|
|
264
|
-
ClientAudioInput client_audio_input = 4;
|
|
265
|
-
ServerError server_error = 5;
|
|
266
|
-
ServerResponseAnimation server_response_animation = 6;
|
|
267
|
-
DrivenIngressConfig driven_config = 7;
|
|
268
|
-
ClientInterrupt client_interrupt = 8;
|
|
269
|
-
ClientPause client_pause = 9;
|
|
270
|
-
ClientResume client_resume = 10;
|
|
271
|
-
ServerPlaybackState server_playback_state = 11;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// PreviewAnimationRequest is the internal service-to-service payload used
|
|
276
|
-
// by Console to drive a preview. Console authorizes the caller (JWT) and
|
|
277
|
-
// resolves the avatar's shape/style/driven config before invoking this RPC,
|
|
278
|
-
// so the method carries no user context and is not exposed via HTTP gateway.
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
-
# NO CHECKED-IN PROTOBUF GENCODE
|
|
4
|
-
# source: driveningress/v2/driveningress.proto
|
|
5
|
-
# Protobuf Python Version: 6.31.1
|
|
6
|
-
"""Generated protocol buffer code."""
|
|
7
|
-
from google.protobuf import descriptor as _descriptor
|
|
8
|
-
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
9
|
-
from google.protobuf import runtime_version as _runtime_version
|
|
10
|
-
from google.protobuf import symbol_database as _symbol_database
|
|
11
|
-
from google.protobuf.internal import builder as _builder
|
|
12
|
-
_runtime_version.ValidateProtobufRuntimeVersion(
|
|
13
|
-
_runtime_version.Domain.PUBLIC,
|
|
14
|
-
6,
|
|
15
|
-
31,
|
|
16
|
-
1,
|
|
17
|
-
'',
|
|
18
|
-
'driveningress/v2/driveningress.proto'
|
|
19
|
-
)
|
|
20
|
-
# @@protoc_insertion_point(imports)
|
|
21
|
-
|
|
22
|
-
_sym_db = _symbol_database.Default()
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$driveningress/v2/driveningress.proto\x12\x10\x64riveningress.v2\x1a\x1cgoogle/protobuf/struct.proto\"\xa7\x02\n\x13LiveKitEgressConfig\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0f\n\x07\x61pi_key\x18\x02 \x01(\t\x12\x12\n\napi_secret\x18\x03 \x01(\t\x12\x11\n\troom_name\x18\x04 \x01(\t\x12\x14\n\x0cpublisher_id\x18\x05 \x01(\t\x12T\n\x10\x65xtra_attributes\x18\x06 \x03(\x0b\x32:.driveningress.v2.LiveKitEgressConfig.ExtraAttributesEntry\x12\x14\n\x0cidle_timeout\x18\x07 \x01(\x05\x12\x11\n\tapi_token\x18\x08 \x01(\t\x1a\x36\n\x14\x45xtraAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"[\n\x11\x41goraEgressConfig\x12\x14\n\x0c\x63hannel_name\x18\x01 \x01(\t\x12\r\n\x05token\x18\x02 \x01(\t\x12\x0b\n\x03uid\x18\x03 \x01(\r\x12\x14\n\x0cpublisher_id\x18\x04 \x01(\t\"\xa4\x01\n\x13\x44rivenIngressConfig\x12\x11\n\tshape_npy\x18\x01 \x01(\x0c\x12\x11\n\tstyle_npy\x18\x02 \x01(\x0c\x12\x19\n\x11\x64riven_server_url\x18\x03 \x01(\t\x12/\n\x0emodel_settings\x18\x04 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x1b\n\x13\x65ncoder_start_frame\x18\x05 \x01(\x05\"\xe7\x02\n\x16\x43lientConfigureSession\x12\x13\n\x0bsample_rate\x18\x01 \x01(\x05\x12\x0f\n\x07\x62itrate\x18\x02 \x01(\x05\x12\x33\n\x0c\x61udio_format\x18\x03 \x01(\x0e\x32\x1d.driveningress.v2.AudioFormat\x12\x45\n\x15transport_compression\x18\x04 \x01(\x0e\x32&.driveningress.v2.TransportCompression\x12\x31\n\x0b\x65gress_type\x18\x05 \x01(\x0e\x32\x1c.driveningress.v2.EgressType\x12=\n\x0elivekit_egress\x18\x06 \x01(\x0b\x32%.driveningress.v2.LiveKitEgressConfig\x12\x39\n\x0c\x61gora_egress\x18\x07 \x01(\x0b\x32#.driveningress.v2.AgoraEgressConfig\"C\n\x14ServerConfirmSession\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x02 \x03(\t\">\n\x10\x43lientAudioInput\x12\x0e\n\x06req_id\x18\x01 \x01(\t\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x08\x12\r\n\x05\x61udio\x18\x03 \x01(\x0c\"S\n\x0bServerError\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x0e\n\x06req_id\x18\x02 \x01(\t\x12\x0c\n\x04\x63ode\x18\x03 \x01(\x05\x12\x0f\n\x07message\x18\x04 \x01(\t\"\xa6\x01\n\x05\x46lame\x12\x17\n\x0btranslation\x18\x01 \x03(\x02\x42\x02\x10\x01\x12\x14\n\x08rotation\x18\x02 \x03(\x02\x42\x02\x10\x01\x12\x15\n\tneck_pose\x18\x03 \x03(\x02\x42\x02\x10\x01\x12\x14\n\x08jaw_pose\x18\x04 \x03(\x02\x42\x02\x10\x01\x12\x14\n\x08\x65ye_pose\x18\x05 \x03(\x02\x42\x02\x10\x01\x12\x13\n\x07\x65ye_lid\x18\x06 \x03(\x02\x42\x02\x10\x01\x12\x16\n\nexpression\x18\x07 \x03(\x02\x42\x02\x10\x01\"<\n\x0e\x46lameAnimation\x12*\n\tkeyframes\x18\x01 \x03(\x0b\x32\x17.driveningress.v2.Flame\"\x95\x01\n\x17ServerResponseAnimation\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x0e\n\x06req_id\x18\x02 \x01(\t\x12\x0b\n\x03\x65nd\x18\x03 \x01(\x08\x12\x33\n\tanimation\x18\x04 \x01(\x0b\x32 .driveningress.v2.FlameAnimation\x12\x11\n\tavatar_id\x18\x05 \x01(\t\"!\n\x0f\x43lientInterrupt\x12\x0e\n\x06req_id\x18\x01 \x01(\t\"\x1d\n\x0b\x43lientPause\x12\x0e\n\x06req_id\x18\x01 \x01(\t\"\x1e\n\x0c\x43lientResume\x12\x0e\n\x06req_id\x18\x01 \x01(\t\"\xf0\x01\n\x13ServerPlaybackState\x12\x15\n\rconnection_id\x18\x01 \x01(\t\x12\x0e\n\x06req_id\x18\x02 \x01(\t\x12:\n\x05state\x18\x03 \x01(\x0e\x32+.driveningress.v2.ServerPlaybackState.State\x12\x11\n\tplayed_ms\x18\x04 \x01(\x03\x12\x0e\n\x06reason\x18\x05 \x01(\t\"S\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x0b\n\x07PLAYING\x10\x01\x12\n\n\x06PAUSED\x10\x02\x12\t\n\x05\x45NDED\x10\x03\x12\x0f\n\x0bINTERRUPTED\x10\x04\"\xd6\x05\n\x07Message\x12+\n\x04type\x18\x01 \x01(\x0e\x32\x1d.driveningress.v2.MessageType\x12L\n\x18\x63lient_configure_session\x18\x02 \x01(\x0b\x32(.driveningress.v2.ClientConfigureSessionH\x00\x12H\n\x16server_confirm_session\x18\x03 \x01(\x0b\x32&.driveningress.v2.ServerConfirmSessionH\x00\x12@\n\x12\x63lient_audio_input\x18\x04 \x01(\x0b\x32\".driveningress.v2.ClientAudioInputH\x00\x12\x35\n\x0cserver_error\x18\x05 \x01(\x0b\x32\x1d.driveningress.v2.ServerErrorH\x00\x12N\n\x19server_response_animation\x18\x06 \x01(\x0b\x32).driveningress.v2.ServerResponseAnimationH\x00\x12>\n\rdriven_config\x18\x07 \x01(\x0b\x32%.driveningress.v2.DrivenIngressConfigH\x00\x12=\n\x10\x63lient_interrupt\x18\x08 \x01(\x0b\x32!.driveningress.v2.ClientInterruptH\x00\x12\x35\n\x0c\x63lient_pause\x18\t \x01(\x0b\x32\x1d.driveningress.v2.ClientPauseH\x00\x12\x37\n\rclient_resume\x18\n \x01(\x0b\x32\x1e.driveningress.v2.ClientResumeH\x00\x12\x46\n\x15server_playback_state\x18\x0b \x01(\x0b\x32%.driveningress.v2.ServerPlaybackStateH\x00\x42\x06\n\x04\x64\x61ta*\xe9\x02\n\x0bMessageType\x12\x17\n\x13MESSAGE_UNSPECIFIED\x10\x00\x12$\n MESSAGE_CLIENT_CONFIGURE_SESSION\x10\x01\x12\"\n\x1eMESSAGE_SERVER_CONFIRM_SESSION\x10\x02\x12\x1e\n\x1aMESSAGE_CLIENT_AUDIO_INPUT\x10\x03\x12\x18\n\x14MESSAGE_SERVER_ERROR\x10\x04\x12%\n!MESSAGE_SERVER_RESPONSE_ANIMATION\x10\x05\x12 \n\x1cMESSAGE_CLIENT_DRIVEN_CONFIG\x10\x06\x12\x1c\n\x18MESSAGE_CLIENT_INTERRUPT\x10\x07\x12\x18\n\x14MESSAGE_CLIENT_PAUSE\x10\x08\x12\x19\n\x15MESSAGE_CLIENT_RESUME\x10\t\x12!\n\x1dMESSAGE_SERVER_PLAYBACK_STATE\x10\n*D\n\x0b\x41udioFormat\x12\x1a\n\x16\x41UDIO_FORMAT_PCM_S16LE\x10\x00\x12\x19\n\x15\x41UDIO_FORMAT_OGG_OPUS\x10\x01*6\n\x14TransportCompression\x12\x1e\n\x1aTRANSPORT_COMPRESSION_NONE\x10\x00*Y\n\nEgressType\x12\x1b\n\x17\x45GRESS_TYPE_UNSPECIFIED\x10\x00\x12\x17\n\x13\x45GRESS_TYPE_LIVEKIT\x10\x01\x12\x15\n\x11\x45GRESS_TYPE_AGORA\x10\x02*\xd1\x01\n\tCloseCode\x12\x1a\n\x16\x43LOSE_CODE_UNSPECIFIED\x10\x00\x12!\n\x1c\x43LOSE_CODE_CREDITS_EXHAUSTED\x10\xa1\x1f\x12\x1f\n\x1a\x43LOSE_CODE_SESSION_TIMEOUT\x10\xa2\x1f\x12!\n\x1c\x43LOSE_CODE_CONCURRENCY_LIMIT\x10\xa3\x1f\x12\x1b\n\x16\x43LOSE_CODE_AUTH_FAILED\x10\xaa\x1f\x12$\n\x1f\x43LOSE_CODE_UPSTREAM_UNAVAILABLE\x10\x97#BEZCgithub.com/SpatialReal-ai/backend-ng/api/generated/driveningress/v2b\x06proto3')
|
|
29
|
-
|
|
30
|
-
_globals = globals()
|
|
31
|
-
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
32
|
-
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'driveningress.v2.driveningress_pb2', _globals)
|
|
33
|
-
if not _descriptor._USE_C_DESCRIPTORS:
|
|
34
|
-
_globals['DESCRIPTOR']._loaded_options = None
|
|
35
|
-
_globals['DESCRIPTOR']._serialized_options = b'ZCgithub.com/SpatialReal-ai/backend-ng/api/generated/driveningress/v2'
|
|
36
|
-
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._loaded_options = None
|
|
37
|
-
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._serialized_options = b'8\001'
|
|
38
|
-
_globals['_FLAME'].fields_by_name['translation']._loaded_options = None
|
|
39
|
-
_globals['_FLAME'].fields_by_name['translation']._serialized_options = b'\020\001'
|
|
40
|
-
_globals['_FLAME'].fields_by_name['rotation']._loaded_options = None
|
|
41
|
-
_globals['_FLAME'].fields_by_name['rotation']._serialized_options = b'\020\001'
|
|
42
|
-
_globals['_FLAME'].fields_by_name['neck_pose']._loaded_options = None
|
|
43
|
-
_globals['_FLAME'].fields_by_name['neck_pose']._serialized_options = b'\020\001'
|
|
44
|
-
_globals['_FLAME'].fields_by_name['jaw_pose']._loaded_options = None
|
|
45
|
-
_globals['_FLAME'].fields_by_name['jaw_pose']._serialized_options = b'\020\001'
|
|
46
|
-
_globals['_FLAME'].fields_by_name['eye_pose']._loaded_options = None
|
|
47
|
-
_globals['_FLAME'].fields_by_name['eye_pose']._serialized_options = b'\020\001'
|
|
48
|
-
_globals['_FLAME'].fields_by_name['eye_lid']._loaded_options = None
|
|
49
|
-
_globals['_FLAME'].fields_by_name['eye_lid']._serialized_options = b'\020\001'
|
|
50
|
-
_globals['_FLAME'].fields_by_name['expression']._loaded_options = None
|
|
51
|
-
_globals['_FLAME'].fields_by_name['expression']._serialized_options = b'\020\001'
|
|
52
|
-
_globals['_MESSAGETYPE']._serialized_start=2680
|
|
53
|
-
_globals['_MESSAGETYPE']._serialized_end=3041
|
|
54
|
-
_globals['_AUDIOFORMAT']._serialized_start=3043
|
|
55
|
-
_globals['_AUDIOFORMAT']._serialized_end=3111
|
|
56
|
-
_globals['_TRANSPORTCOMPRESSION']._serialized_start=3113
|
|
57
|
-
_globals['_TRANSPORTCOMPRESSION']._serialized_end=3167
|
|
58
|
-
_globals['_EGRESSTYPE']._serialized_start=3169
|
|
59
|
-
_globals['_EGRESSTYPE']._serialized_end=3258
|
|
60
|
-
_globals['_CLOSECODE']._serialized_start=3261
|
|
61
|
-
_globals['_CLOSECODE']._serialized_end=3470
|
|
62
|
-
_globals['_LIVEKITEGRESSCONFIG']._serialized_start=89
|
|
63
|
-
_globals['_LIVEKITEGRESSCONFIG']._serialized_end=384
|
|
64
|
-
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._serialized_start=330
|
|
65
|
-
_globals['_LIVEKITEGRESSCONFIG_EXTRAATTRIBUTESENTRY']._serialized_end=384
|
|
66
|
-
_globals['_AGORAEGRESSCONFIG']._serialized_start=386
|
|
67
|
-
_globals['_AGORAEGRESSCONFIG']._serialized_end=477
|
|
68
|
-
_globals['_DRIVENINGRESSCONFIG']._serialized_start=480
|
|
69
|
-
_globals['_DRIVENINGRESSCONFIG']._serialized_end=644
|
|
70
|
-
_globals['_CLIENTCONFIGURESESSION']._serialized_start=647
|
|
71
|
-
_globals['_CLIENTCONFIGURESESSION']._serialized_end=1006
|
|
72
|
-
_globals['_SERVERCONFIRMSESSION']._serialized_start=1008
|
|
73
|
-
_globals['_SERVERCONFIRMSESSION']._serialized_end=1075
|
|
74
|
-
_globals['_CLIENTAUDIOINPUT']._serialized_start=1077
|
|
75
|
-
_globals['_CLIENTAUDIOINPUT']._serialized_end=1139
|
|
76
|
-
_globals['_SERVERERROR']._serialized_start=1141
|
|
77
|
-
_globals['_SERVERERROR']._serialized_end=1224
|
|
78
|
-
_globals['_FLAME']._serialized_start=1227
|
|
79
|
-
_globals['_FLAME']._serialized_end=1393
|
|
80
|
-
_globals['_FLAMEANIMATION']._serialized_start=1395
|
|
81
|
-
_globals['_FLAMEANIMATION']._serialized_end=1455
|
|
82
|
-
_globals['_SERVERRESPONSEANIMATION']._serialized_start=1458
|
|
83
|
-
_globals['_SERVERRESPONSEANIMATION']._serialized_end=1607
|
|
84
|
-
_globals['_CLIENTINTERRUPT']._serialized_start=1609
|
|
85
|
-
_globals['_CLIENTINTERRUPT']._serialized_end=1642
|
|
86
|
-
_globals['_CLIENTPAUSE']._serialized_start=1644
|
|
87
|
-
_globals['_CLIENTPAUSE']._serialized_end=1673
|
|
88
|
-
_globals['_CLIENTRESUME']._serialized_start=1675
|
|
89
|
-
_globals['_CLIENTRESUME']._serialized_end=1705
|
|
90
|
-
_globals['_SERVERPLAYBACKSTATE']._serialized_start=1708
|
|
91
|
-
_globals['_SERVERPLAYBACKSTATE']._serialized_end=1948
|
|
92
|
-
_globals['_SERVERPLAYBACKSTATE_STATE']._serialized_start=1865
|
|
93
|
-
_globals['_SERVERPLAYBACKSTATE_STATE']._serialized_end=1948
|
|
94
|
-
_globals['_MESSAGE']._serialized_start=1951
|
|
95
|
-
_globals['_MESSAGE']._serialized_end=2677
|
|
96
|
-
# @@protoc_insertion_point(module_scope)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.2.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|