google-genai 1.41.0__py3-none-any.whl → 1.43.0__py3-none-any.whl
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.
- google/genai/_api_client.py +2 -1
- google/genai/_common.py +213 -77
- google/genai/_live_converters.py +717 -3098
- google/genai/_replay_api_client.py +9 -5
- google/genai/_tokens_converters.py +23 -434
- google/genai/_transformers.py +42 -12
- google/genai/batches.py +125 -1054
- google/genai/caches.py +69 -847
- google/genai/errors.py +9 -2
- google/genai/files.py +12 -171
- google/genai/live.py +10 -11
- google/genai/live_music.py +24 -27
- google/genai/models.py +333 -1828
- google/genai/operations.py +6 -32
- google/genai/tokens.py +2 -12
- google/genai/tunings.py +18 -197
- google/genai/types.py +154 -3
- google/genai/version.py +1 -1
- {google_genai-1.41.0.dist-info → google_genai-1.43.0.dist-info}/METADATA +40 -38
- google_genai-1.43.0.dist-info/RECORD +39 -0
- google_genai-1.41.0.dist-info/RECORD +0 -39
- {google_genai-1.41.0.dist-info → google_genai-1.43.0.dist-info}/WHEEL +0 -0
- {google_genai-1.41.0.dist-info → google_genai-1.43.0.dist-info}/licenses/LICENSE +0 -0
- {google_genai-1.41.0.dist-info → google_genai-1.43.0.dist-info}/top_level.txt +0 -0
google/genai/errors.py
CHANGED
@@ -134,6 +134,13 @@ class APIError(Exception):
|
|
134
134
|
'status': response.reason_phrase,
|
135
135
|
}
|
136
136
|
status_code = response.status_code
|
137
|
+
elif hasattr(response, 'body_segments') and hasattr(
|
138
|
+
response, 'status_code'
|
139
|
+
):
|
140
|
+
if response.status_code == 200:
|
141
|
+
return
|
142
|
+
response_json = response.body_segments[0].get('error', {})
|
143
|
+
status_code = response.status_code
|
137
144
|
else:
|
138
145
|
try:
|
139
146
|
import aiohttp # pylint: disable=g-import-not-at-top
|
@@ -151,9 +158,9 @@ class APIError(Exception):
|
|
151
158
|
}
|
152
159
|
status_code = response.status
|
153
160
|
else:
|
154
|
-
|
161
|
+
raise ValueError(f'Unsupported response type: {type(response)}')
|
155
162
|
except ImportError:
|
156
|
-
|
163
|
+
raise ValueError(f'Unsupported response type: {type(response)}')
|
157
164
|
|
158
165
|
if 400 <= status_code < 500:
|
159
166
|
raise ClientError(status_code, response_json, response)
|
google/genai/files.py
CHANGED
@@ -41,11 +41,7 @@ def _CreateFileParameters_to_mldev(
|
|
41
41
|
) -> dict[str, Any]:
|
42
42
|
to_object: dict[str, Any] = {}
|
43
43
|
if getv(from_object, ['file']) is not None:
|
44
|
-
setv(
|
45
|
-
to_object,
|
46
|
-
['file'],
|
47
|
-
_File_to_mldev(getv(from_object, ['file']), to_object),
|
48
|
-
)
|
44
|
+
setv(to_object, ['file'], getv(from_object, ['file']))
|
49
45
|
|
50
46
|
return to_object
|
51
47
|
|
@@ -89,148 +85,6 @@ def _DeleteFileResponse_from_mldev(
|
|
89
85
|
return to_object
|
90
86
|
|
91
87
|
|
92
|
-
def _FileStatus_from_mldev(
|
93
|
-
from_object: Union[dict[str, Any], object],
|
94
|
-
parent_object: Optional[dict[str, Any]] = None,
|
95
|
-
) -> dict[str, Any]:
|
96
|
-
to_object: dict[str, Any] = {}
|
97
|
-
if getv(from_object, ['details']) is not None:
|
98
|
-
setv(to_object, ['details'], getv(from_object, ['details']))
|
99
|
-
|
100
|
-
if getv(from_object, ['message']) is not None:
|
101
|
-
setv(to_object, ['message'], getv(from_object, ['message']))
|
102
|
-
|
103
|
-
if getv(from_object, ['code']) is not None:
|
104
|
-
setv(to_object, ['code'], getv(from_object, ['code']))
|
105
|
-
|
106
|
-
return to_object
|
107
|
-
|
108
|
-
|
109
|
-
def _FileStatus_to_mldev(
|
110
|
-
from_object: Union[dict[str, Any], object],
|
111
|
-
parent_object: Optional[dict[str, Any]] = None,
|
112
|
-
) -> dict[str, Any]:
|
113
|
-
to_object: dict[str, Any] = {}
|
114
|
-
if getv(from_object, ['details']) is not None:
|
115
|
-
setv(to_object, ['details'], getv(from_object, ['details']))
|
116
|
-
|
117
|
-
if getv(from_object, ['message']) is not None:
|
118
|
-
setv(to_object, ['message'], getv(from_object, ['message']))
|
119
|
-
|
120
|
-
if getv(from_object, ['code']) is not None:
|
121
|
-
setv(to_object, ['code'], getv(from_object, ['code']))
|
122
|
-
|
123
|
-
return to_object
|
124
|
-
|
125
|
-
|
126
|
-
def _File_from_mldev(
|
127
|
-
from_object: Union[dict[str, Any], object],
|
128
|
-
parent_object: Optional[dict[str, Any]] = None,
|
129
|
-
) -> dict[str, Any]:
|
130
|
-
to_object: dict[str, Any] = {}
|
131
|
-
if getv(from_object, ['name']) is not None:
|
132
|
-
setv(to_object, ['name'], getv(from_object, ['name']))
|
133
|
-
|
134
|
-
if getv(from_object, ['displayName']) is not None:
|
135
|
-
setv(to_object, ['display_name'], getv(from_object, ['displayName']))
|
136
|
-
|
137
|
-
if getv(from_object, ['mimeType']) is not None:
|
138
|
-
setv(to_object, ['mime_type'], getv(from_object, ['mimeType']))
|
139
|
-
|
140
|
-
if getv(from_object, ['sizeBytes']) is not None:
|
141
|
-
setv(to_object, ['size_bytes'], getv(from_object, ['sizeBytes']))
|
142
|
-
|
143
|
-
if getv(from_object, ['createTime']) is not None:
|
144
|
-
setv(to_object, ['create_time'], getv(from_object, ['createTime']))
|
145
|
-
|
146
|
-
if getv(from_object, ['expirationTime']) is not None:
|
147
|
-
setv(to_object, ['expiration_time'], getv(from_object, ['expirationTime']))
|
148
|
-
|
149
|
-
if getv(from_object, ['updateTime']) is not None:
|
150
|
-
setv(to_object, ['update_time'], getv(from_object, ['updateTime']))
|
151
|
-
|
152
|
-
if getv(from_object, ['sha256Hash']) is not None:
|
153
|
-
setv(to_object, ['sha256_hash'], getv(from_object, ['sha256Hash']))
|
154
|
-
|
155
|
-
if getv(from_object, ['uri']) is not None:
|
156
|
-
setv(to_object, ['uri'], getv(from_object, ['uri']))
|
157
|
-
|
158
|
-
if getv(from_object, ['downloadUri']) is not None:
|
159
|
-
setv(to_object, ['download_uri'], getv(from_object, ['downloadUri']))
|
160
|
-
|
161
|
-
if getv(from_object, ['state']) is not None:
|
162
|
-
setv(to_object, ['state'], getv(from_object, ['state']))
|
163
|
-
|
164
|
-
if getv(from_object, ['source']) is not None:
|
165
|
-
setv(to_object, ['source'], getv(from_object, ['source']))
|
166
|
-
|
167
|
-
if getv(from_object, ['videoMetadata']) is not None:
|
168
|
-
setv(to_object, ['video_metadata'], getv(from_object, ['videoMetadata']))
|
169
|
-
|
170
|
-
if getv(from_object, ['error']) is not None:
|
171
|
-
setv(
|
172
|
-
to_object,
|
173
|
-
['error'],
|
174
|
-
_FileStatus_from_mldev(getv(from_object, ['error']), to_object),
|
175
|
-
)
|
176
|
-
|
177
|
-
return to_object
|
178
|
-
|
179
|
-
|
180
|
-
def _File_to_mldev(
|
181
|
-
from_object: Union[dict[str, Any], object],
|
182
|
-
parent_object: Optional[dict[str, Any]] = None,
|
183
|
-
) -> dict[str, Any]:
|
184
|
-
to_object: dict[str, Any] = {}
|
185
|
-
if getv(from_object, ['name']) is not None:
|
186
|
-
setv(to_object, ['name'], getv(from_object, ['name']))
|
187
|
-
|
188
|
-
if getv(from_object, ['display_name']) is not None:
|
189
|
-
setv(to_object, ['displayName'], getv(from_object, ['display_name']))
|
190
|
-
|
191
|
-
if getv(from_object, ['mime_type']) is not None:
|
192
|
-
setv(to_object, ['mimeType'], getv(from_object, ['mime_type']))
|
193
|
-
|
194
|
-
if getv(from_object, ['size_bytes']) is not None:
|
195
|
-
setv(to_object, ['sizeBytes'], getv(from_object, ['size_bytes']))
|
196
|
-
|
197
|
-
if getv(from_object, ['create_time']) is not None:
|
198
|
-
setv(to_object, ['createTime'], getv(from_object, ['create_time']))
|
199
|
-
|
200
|
-
if getv(from_object, ['expiration_time']) is not None:
|
201
|
-
setv(to_object, ['expirationTime'], getv(from_object, ['expiration_time']))
|
202
|
-
|
203
|
-
if getv(from_object, ['update_time']) is not None:
|
204
|
-
setv(to_object, ['updateTime'], getv(from_object, ['update_time']))
|
205
|
-
|
206
|
-
if getv(from_object, ['sha256_hash']) is not None:
|
207
|
-
setv(to_object, ['sha256Hash'], getv(from_object, ['sha256_hash']))
|
208
|
-
|
209
|
-
if getv(from_object, ['uri']) is not None:
|
210
|
-
setv(to_object, ['uri'], getv(from_object, ['uri']))
|
211
|
-
|
212
|
-
if getv(from_object, ['download_uri']) is not None:
|
213
|
-
setv(to_object, ['downloadUri'], getv(from_object, ['download_uri']))
|
214
|
-
|
215
|
-
if getv(from_object, ['state']) is not None:
|
216
|
-
setv(to_object, ['state'], getv(from_object, ['state']))
|
217
|
-
|
218
|
-
if getv(from_object, ['source']) is not None:
|
219
|
-
setv(to_object, ['source'], getv(from_object, ['source']))
|
220
|
-
|
221
|
-
if getv(from_object, ['video_metadata']) is not None:
|
222
|
-
setv(to_object, ['videoMetadata'], getv(from_object, ['video_metadata']))
|
223
|
-
|
224
|
-
if getv(from_object, ['error']) is not None:
|
225
|
-
setv(
|
226
|
-
to_object,
|
227
|
-
['error'],
|
228
|
-
_FileStatus_to_mldev(getv(from_object, ['error']), to_object),
|
229
|
-
)
|
230
|
-
|
231
|
-
return to_object
|
232
|
-
|
233
|
-
|
234
88
|
def _GetFileParameters_to_mldev(
|
235
89
|
from_object: Union[dict[str, Any], object],
|
236
90
|
parent_object: Optional[dict[str, Any]] = None,
|
@@ -290,14 +144,7 @@ def _ListFilesResponse_from_mldev(
|
|
290
144
|
setv(to_object, ['next_page_token'], getv(from_object, ['nextPageToken']))
|
291
145
|
|
292
146
|
if getv(from_object, ['files']) is not None:
|
293
|
-
setv(
|
294
|
-
to_object,
|
295
|
-
['files'],
|
296
|
-
[
|
297
|
-
_File_from_mldev(item, to_object)
|
298
|
-
for item in getv(from_object, ['files'])
|
299
|
-
],
|
300
|
-
)
|
147
|
+
setv(to_object, ['files'], [item for item in getv(from_object, ['files'])])
|
301
148
|
|
302
149
|
return to_object
|
303
150
|
|
@@ -359,7 +206,7 @@ class Files(_api_module.BaseModule):
|
|
359
206
|
|
360
207
|
response = self._api_client.request('get', path, request_dict, http_options)
|
361
208
|
|
362
|
-
response_dict =
|
209
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
363
210
|
|
364
211
|
if not self._api_client.vertexai:
|
365
212
|
response_dict = _ListFilesResponse_from_mldev(response_dict)
|
@@ -424,7 +271,7 @@ class Files(_api_module.BaseModule):
|
|
424
271
|
self._api_client._verify_response(return_value)
|
425
272
|
return return_value
|
426
273
|
|
427
|
-
response_dict =
|
274
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
428
275
|
|
429
276
|
if not self._api_client.vertexai:
|
430
277
|
response_dict = _CreateFileResponse_from_mldev(response_dict)
|
@@ -492,10 +339,7 @@ class Files(_api_module.BaseModule):
|
|
492
339
|
|
493
340
|
response = self._api_client.request('get', path, request_dict, http_options)
|
494
341
|
|
495
|
-
response_dict =
|
496
|
-
|
497
|
-
if not self._api_client.vertexai:
|
498
|
-
response_dict = _File_from_mldev(response_dict)
|
342
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
499
343
|
|
500
344
|
return_value = types.File._from_response(
|
501
345
|
response=response_dict, kwargs=parameter_model.model_dump()
|
@@ -561,7 +405,7 @@ class Files(_api_module.BaseModule):
|
|
561
405
|
'delete', path, request_dict, http_options
|
562
406
|
)
|
563
407
|
|
564
|
-
response_dict =
|
408
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
565
409
|
|
566
410
|
if not self._api_client.vertexai:
|
567
411
|
response_dict = _DeleteFileResponse_from_mldev(response_dict)
|
@@ -647,7 +491,7 @@ class Files(_api_module.BaseModule):
|
|
647
491
|
)
|
648
492
|
|
649
493
|
return types.File._from_response(
|
650
|
-
response=
|
494
|
+
response=return_file.json['file'],
|
651
495
|
kwargs=config_model.model_dump() if config else {},
|
652
496
|
)
|
653
497
|
|
@@ -802,7 +646,7 @@ class AsyncFiles(_api_module.BaseModule):
|
|
802
646
|
'get', path, request_dict, http_options
|
803
647
|
)
|
804
648
|
|
805
|
-
response_dict =
|
649
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
806
650
|
|
807
651
|
if not self._api_client.vertexai:
|
808
652
|
response_dict = _ListFilesResponse_from_mldev(response_dict)
|
@@ -867,7 +711,7 @@ class AsyncFiles(_api_module.BaseModule):
|
|
867
711
|
self._api_client._verify_response(return_value)
|
868
712
|
return return_value
|
869
713
|
|
870
|
-
response_dict =
|
714
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
871
715
|
|
872
716
|
if not self._api_client.vertexai:
|
873
717
|
response_dict = _CreateFileResponse_from_mldev(response_dict)
|
@@ -937,10 +781,7 @@ class AsyncFiles(_api_module.BaseModule):
|
|
937
781
|
'get', path, request_dict, http_options
|
938
782
|
)
|
939
783
|
|
940
|
-
response_dict =
|
941
|
-
|
942
|
-
if not self._api_client.vertexai:
|
943
|
-
response_dict = _File_from_mldev(response_dict)
|
784
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
944
785
|
|
945
786
|
return_value = types.File._from_response(
|
946
787
|
response=response_dict, kwargs=parameter_model.model_dump()
|
@@ -1006,7 +847,7 @@ class AsyncFiles(_api_module.BaseModule):
|
|
1006
847
|
'delete', path, request_dict, http_options
|
1007
848
|
)
|
1008
849
|
|
1009
|
-
response_dict =
|
850
|
+
response_dict = {} if not response.body else json.loads(response.body)
|
1010
851
|
|
1011
852
|
if not self._api_client.vertexai:
|
1012
853
|
response_dict = _DeleteFileResponse_from_mldev(response_dict)
|
@@ -1097,7 +938,7 @@ class AsyncFiles(_api_module.BaseModule):
|
|
1097
938
|
)
|
1098
939
|
|
1099
940
|
return types.File._from_response(
|
1100
|
-
response=
|
941
|
+
response=return_file.json['file'],
|
1101
942
|
kwargs=config_model.model_dump() if config else {},
|
1102
943
|
)
|
1103
944
|
|
google/genai/live.py
CHANGED
@@ -21,7 +21,7 @@ import contextlib
|
|
21
21
|
import json
|
22
22
|
import logging
|
23
23
|
import typing
|
24
|
-
from typing import Any, AsyncIterator,
|
24
|
+
from typing import Any, AsyncIterator, Optional, Sequence, Union, get_args
|
25
25
|
import warnings
|
26
26
|
|
27
27
|
import google.auth
|
@@ -40,7 +40,6 @@ from ._common import get_value_by_path as getv
|
|
40
40
|
from ._common import set_value_by_path as setv
|
41
41
|
from .live_music import AsyncLiveMusic
|
42
42
|
from .models import _Content_to_mldev
|
43
|
-
from .models import _Content_to_vertex
|
44
43
|
|
45
44
|
|
46
45
|
try:
|
@@ -223,8 +222,8 @@ class AsyncSession:
|
|
223
222
|
)
|
224
223
|
|
225
224
|
if self._api_client.vertexai:
|
226
|
-
client_content_dict =
|
227
|
-
|
225
|
+
client_content_dict = _common.convert_to_dict(
|
226
|
+
client_content, convert_keys=True
|
228
227
|
)
|
229
228
|
else:
|
230
229
|
client_content_dict = live_converters._LiveClientContent_to_mldev(
|
@@ -410,12 +409,12 @@ class AsyncSession:
|
|
410
409
|
"""
|
411
410
|
tool_response = t.t_tool_response(function_responses)
|
412
411
|
if self._api_client.vertexai:
|
413
|
-
tool_response_dict =
|
414
|
-
|
412
|
+
tool_response_dict = _common.convert_to_dict(
|
413
|
+
tool_response, convert_keys=True
|
415
414
|
)
|
416
415
|
else:
|
417
|
-
tool_response_dict =
|
418
|
-
|
416
|
+
tool_response_dict = _common.convert_to_dict(
|
417
|
+
tool_response, convert_keys=True
|
419
418
|
)
|
420
419
|
for response in tool_response_dict.get('functionResponses', []):
|
421
420
|
if response.get('id') is None:
|
@@ -541,7 +540,7 @@ class AsyncSession:
|
|
541
540
|
if self._api_client.vertexai:
|
542
541
|
response_dict = live_converters._LiveServerMessage_from_vertex(response)
|
543
542
|
else:
|
544
|
-
response_dict =
|
543
|
+
response_dict = response
|
545
544
|
|
546
545
|
return types.LiveServerMessage._from_response(
|
547
546
|
response=response_dict, kwargs=parameter_model.model_dump()
|
@@ -655,7 +654,7 @@ class AsyncSession:
|
|
655
654
|
content_input_parts.append(item)
|
656
655
|
if self._api_client.vertexai:
|
657
656
|
contents = [
|
658
|
-
|
657
|
+
_common.convert_to_dict(item, convert_keys=True)
|
659
658
|
for item in t.t_contents(content_input_parts)
|
660
659
|
]
|
661
660
|
else:
|
@@ -1074,7 +1073,7 @@ class AsyncLive(_api_module.BaseModule):
|
|
1074
1073
|
if self._api_client.vertexai:
|
1075
1074
|
response_dict = live_converters._LiveServerMessage_from_vertex(response)
|
1076
1075
|
else:
|
1077
|
-
response_dict =
|
1076
|
+
response_dict = response
|
1078
1077
|
|
1079
1078
|
setup_response = types.LiveServerMessage._from_response(
|
1080
1079
|
response=response_dict, kwargs=parameter_model.model_dump()
|
google/genai/live_music.py
CHANGED
@@ -22,13 +22,11 @@ from typing import AsyncIterator
|
|
22
22
|
|
23
23
|
from . import _api_module
|
24
24
|
from . import _common
|
25
|
+
from . import _live_converters as live_converters
|
25
26
|
from . import _transformers as t
|
26
27
|
from . import types
|
27
28
|
from ._api_client import BaseApiClient
|
28
29
|
from ._common import set_value_by_path as setv
|
29
|
-
from . import _live_converters as live_converters
|
30
|
-
from .models import _Content_to_mldev
|
31
|
-
from .models import _Content_to_vertex
|
32
30
|
|
33
31
|
|
34
32
|
try:
|
@@ -44,46 +42,47 @@ logger = logging.getLogger('google_genai.live_music')
|
|
44
42
|
class AsyncMusicSession:
|
45
43
|
"""[Experimental] AsyncMusicSession."""
|
46
44
|
|
47
|
-
def __init__(
|
48
|
-
self, api_client: BaseApiClient, websocket: ClientConnection
|
49
|
-
):
|
45
|
+
def __init__(self, api_client: BaseApiClient, websocket: ClientConnection):
|
50
46
|
self._api_client = api_client
|
51
47
|
self._ws = websocket
|
52
48
|
|
53
49
|
async def set_weighted_prompts(
|
54
|
-
self,
|
55
|
-
prompts: list[types.WeightedPrompt]
|
50
|
+
self, prompts: list[types.WeightedPrompt]
|
56
51
|
) -> None:
|
57
52
|
if self._api_client.vertexai:
|
58
|
-
raise NotImplementedError(
|
59
|
-
|
60
|
-
client_content_dict = live_converters._LiveMusicClientContent_to_mldev(
|
61
|
-
from_object={'weighted_prompts': prompts}
|
53
|
+
raise NotImplementedError(
|
54
|
+
'Live music generation is not supported in Vertex AI.'
|
62
55
|
)
|
56
|
+
else:
|
57
|
+
client_content_dict = {
|
58
|
+
'weightedPrompts': [
|
59
|
+
_common.convert_to_dict(prompt, convert_keys=True)
|
60
|
+
for prompt in prompts
|
61
|
+
]
|
62
|
+
}
|
63
|
+
|
63
64
|
await self._ws.send(json.dumps({'clientContent': client_content_dict}))
|
64
65
|
|
65
66
|
async def set_music_generation_config(
|
66
|
-
self,
|
67
|
-
config: types.LiveMusicGenerationConfig
|
67
|
+
self, config: types.LiveMusicGenerationConfig
|
68
68
|
) -> None:
|
69
69
|
if self._api_client.vertexai:
|
70
|
-
raise NotImplementedError(
|
71
|
-
|
72
|
-
config_dict = live_converters._LiveMusicGenerationConfig_to_mldev(
|
73
|
-
from_object=config
|
70
|
+
raise NotImplementedError(
|
71
|
+
'Live music generation is not supported in Vertex AI.'
|
74
72
|
)
|
73
|
+
else:
|
74
|
+
config_dict = _common.convert_to_dict(config, convert_keys=True)
|
75
75
|
await self._ws.send(json.dumps({'musicGenerationConfig': config_dict}))
|
76
76
|
|
77
77
|
async def _send_control_signal(
|
78
|
-
self,
|
79
|
-
playback_control: types.LiveMusicPlaybackControl
|
78
|
+
self, playback_control: types.LiveMusicPlaybackControl
|
80
79
|
) -> None:
|
81
80
|
if self._api_client.vertexai:
|
82
|
-
raise NotImplementedError(
|
83
|
-
|
84
|
-
playback_control_dict = live_converters._LiveMusicClientMessage_to_mldev(
|
85
|
-
from_object={'playback_control': playback_control}
|
81
|
+
raise NotImplementedError(
|
82
|
+
'Live music generation is not supported in Vertex AI.'
|
86
83
|
)
|
84
|
+
else:
|
85
|
+
playback_control_dict = {'playbackControl': playback_control.value}
|
87
86
|
await self._ws.send(json.dumps(playback_control_dict))
|
88
87
|
|
89
88
|
async def play(self) -> None:
|
@@ -134,9 +133,7 @@ class AsyncMusicSession:
|
|
134
133
|
if self._api_client.vertexai:
|
135
134
|
raise NotImplementedError('Live music generation is not supported in Vertex AI.')
|
136
135
|
else:
|
137
|
-
response_dict =
|
138
|
-
response
|
139
|
-
)
|
136
|
+
response_dict = response
|
140
137
|
|
141
138
|
return types.LiveMusicServerMessage._from_response(
|
142
139
|
response=response_dict, kwargs=parameter_model.model_dump()
|