spatialreal 0.2.0__tar.gz → 0.2.2__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.
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: spatialreal
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: SpatialReal Python SDK — realtime avatar sessions (audio in, animation/egress out)
5
- Project-URL: Documentation, https://docs.spatialreal.com
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,6 +14,9 @@ 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
@@ -117,7 +120,6 @@ implements the server's WebSocket close-code contract (40xx: don't retry,
117
120
  ```bash
118
121
  uv venv && uv pip install -e ".[dev]"
119
122
  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
123
  ```
122
124
 
123
125
  ## License
@@ -87,7 +87,6 @@ implements the server's WebSocket close-code contract (40xx: don't retry,
87
87
  ```bash
88
88
  uv venv && uv pip install -e ".[dev]"
89
89
  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
90
  ```
92
91
 
93
92
  ## License
@@ -18,6 +18,9 @@ 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 = [
@@ -31,7 +34,7 @@ dependencies = [
31
34
  dev = ["pytest", "pytest-asyncio", "grpcio-tools==1.75.1", "ruff"]
32
35
 
33
36
  [project.urls]
34
- Documentation = "https://docs.spatialreal.com"
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", "/proto"]
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: 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
+
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,4 +1,3 @@
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
@@ -16,7 +15,6 @@ class MessageType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
16
15
  MESSAGE_CLIENT_AUDIO_INPUT: _ClassVar[MessageType]
17
16
  MESSAGE_SERVER_ERROR: _ClassVar[MessageType]
18
17
  MESSAGE_SERVER_RESPONSE_ANIMATION: _ClassVar[MessageType]
19
- MESSAGE_CLIENT_DRIVEN_CONFIG: _ClassVar[MessageType]
20
18
  MESSAGE_CLIENT_INTERRUPT: _ClassVar[MessageType]
21
19
  MESSAGE_CLIENT_PAUSE: _ClassVar[MessageType]
22
20
  MESSAGE_CLIENT_RESUME: _ClassVar[MessageType]
@@ -36,22 +34,12 @@ class EgressType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
36
34
  EGRESS_TYPE_UNSPECIFIED: _ClassVar[EgressType]
37
35
  EGRESS_TYPE_LIVEKIT: _ClassVar[EgressType]
38
36
  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
37
  MESSAGE_UNSPECIFIED: MessageType
49
38
  MESSAGE_CLIENT_CONFIGURE_SESSION: MessageType
50
39
  MESSAGE_SERVER_CONFIRM_SESSION: MessageType
51
40
  MESSAGE_CLIENT_AUDIO_INPUT: MessageType
52
41
  MESSAGE_SERVER_ERROR: MessageType
53
42
  MESSAGE_SERVER_RESPONSE_ANIMATION: MessageType
54
- MESSAGE_CLIENT_DRIVEN_CONFIG: MessageType
55
43
  MESSAGE_CLIENT_INTERRUPT: MessageType
56
44
  MESSAGE_CLIENT_PAUSE: MessageType
57
45
  MESSAGE_CLIENT_RESUME: MessageType
@@ -62,12 +50,6 @@ TRANSPORT_COMPRESSION_NONE: TransportCompression
62
50
  EGRESS_TYPE_UNSPECIFIED: EgressType
63
51
  EGRESS_TYPE_LIVEKIT: EgressType
64
52
  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
53
 
72
54
  class LiveKitEgressConfig(_message.Message):
73
55
  __slots__ = ("url", "api_key", "api_secret", "room_name", "publisher_id", "extra_attributes", "idle_timeout", "api_token")
@@ -108,20 +90,6 @@ class AgoraEgressConfig(_message.Message):
108
90
  publisher_id: str
109
91
  def __init__(self, channel_name: _Optional[str] = ..., token: _Optional[str] = ..., uid: _Optional[int] = ..., publisher_id: _Optional[str] = ...) -> None: ...
110
92
 
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
93
  class ClientConfigureSession(_message.Message):
126
94
  __slots__ = ("sample_rate", "bitrate", "audio_format", "transport_compression", "egress_type", "livekit_egress", "agora_egress")
127
95
  SAMPLE_RATE_FIELD_NUMBER: _ClassVar[int]
@@ -170,30 +138,6 @@ class ServerError(_message.Message):
170
138
  message: str
171
139
  def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., code: _Optional[int] = ..., message: _Optional[str] = ...) -> None: ...
172
140
 
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
141
  class ServerResponseAnimation(_message.Message):
198
142
  __slots__ = ("connection_id", "req_id", "end", "animation", "avatar_id")
199
143
  CONNECTION_ID_FIELD_NUMBER: _ClassVar[int]
@@ -204,9 +148,9 @@ class ServerResponseAnimation(_message.Message):
204
148
  connection_id: str
205
149
  req_id: str
206
150
  end: bool
207
- animation: FlameAnimation
151
+ animation: bytes
208
152
  avatar_id: str
209
- def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., end: bool = ..., animation: _Optional[_Union[FlameAnimation, _Mapping]] = ..., avatar_id: _Optional[str] = ...) -> None: ...
153
+ def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., end: bool = ..., animation: _Optional[bytes] = ..., avatar_id: _Optional[str] = ...) -> None: ...
210
154
 
211
155
  class ClientInterrupt(_message.Message):
212
156
  __slots__ = ("req_id",)
@@ -253,14 +197,13 @@ class ServerPlaybackState(_message.Message):
253
197
  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
198
 
255
199
  class Message(_message.Message):
256
- __slots__ = ("type", "client_configure_session", "server_confirm_session", "client_audio_input", "server_error", "server_response_animation", "driven_config", "client_interrupt", "client_pause", "client_resume", "server_playback_state")
200
+ __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
201
  TYPE_FIELD_NUMBER: _ClassVar[int]
258
202
  CLIENT_CONFIGURE_SESSION_FIELD_NUMBER: _ClassVar[int]
259
203
  SERVER_CONFIRM_SESSION_FIELD_NUMBER: _ClassVar[int]
260
204
  CLIENT_AUDIO_INPUT_FIELD_NUMBER: _ClassVar[int]
261
205
  SERVER_ERROR_FIELD_NUMBER: _ClassVar[int]
262
206
  SERVER_RESPONSE_ANIMATION_FIELD_NUMBER: _ClassVar[int]
263
- DRIVEN_CONFIG_FIELD_NUMBER: _ClassVar[int]
264
207
  CLIENT_INTERRUPT_FIELD_NUMBER: _ClassVar[int]
265
208
  CLIENT_PAUSE_FIELD_NUMBER: _ClassVar[int]
266
209
  CLIENT_RESUME_FIELD_NUMBER: _ClassVar[int]
@@ -271,9 +214,8 @@ class Message(_message.Message):
271
214
  client_audio_input: ClientAudioInput
272
215
  server_error: ServerError
273
216
  server_response_animation: ServerResponseAnimation
274
- driven_config: DrivenIngressConfig
275
217
  client_interrupt: ClientInterrupt
276
218
  client_pause: ClientPause
277
219
  client_resume: ClientResume
278
220
  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]] = ..., driven_config: _Optional[_Union[DrivenIngressConfig, _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: ...
221
+ 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: ...
File without changes
@@ -471,7 +471,8 @@ class AvatarSession:
471
471
  end=bool(anim.end),
472
472
  connection_id=anim.connection_id,
473
473
  avatar_id=anim.avatar_id,
474
- has_animation=len(anim.animation.keyframes) > 0,
474
+ # The animation payload is opaque here; empty means the frame carries none.
475
+ has_animation=len(anim.animation) > 0,
475
476
  )
476
477
  try:
477
478
  self._config.on_playback(signal)
@@ -0,0 +1 @@
1
+ __version__ = "0.2.2"
@@ -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.0"
File without changes
File without changes