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.
- {spatialreal-0.2.0 → spatialreal-0.2.2}/PKG-INFO +5 -3
- {spatialreal-0.2.0 → spatialreal-0.2.2}/README.md +0 -1
- {spatialreal-0.2.0 → spatialreal-0.2.2}/pyproject.toml +5 -2
- spatialreal-0.2.2/spatialreal/proto/generated/message_pb2.py +72 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/proto/generated/message_pb2.pyi +4 -62
- spatialreal-0.2.2/spatialreal/py.typed +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/session.py +2 -1
- spatialreal-0.2.2/spatialreal/version.py +1 -0
- spatialreal-0.2.0/proto/SHARED_PROTO_COMMIT +0 -1
- spatialreal-0.2.0/proto/driveningress/v2/driveningress.proto +0 -278
- spatialreal-0.2.0/spatialreal/proto/generated/message_pb2.py +0 -96
- spatialreal-0.2.0/spatialreal/version.py +0 -1
- {spatialreal-0.2.0 → spatialreal-0.2.2}/.gitignore +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/LICENSE +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/__init__.py +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/config.py +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/environments.py +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/errors.py +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/events.py +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/logid.py +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/proto/__init__.py +0 -0
- {spatialreal-0.2.0 → spatialreal-0.2.2}/spatialreal/proto/generated/__init__.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: spatialreal
|
|
3
|
-
Version: 0.2.
|
|
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.
|
|
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.
|
|
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: 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:
|
|
151
|
+
animation: bytes
|
|
208
152
|
avatar_id: str
|
|
209
|
-
def __init__(self, connection_id: _Optional[str] = ..., req_id: _Optional[str] = ..., end: bool = ..., animation: _Optional[
|
|
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", "
|
|
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]] = ...,
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|