most-client 1.0.30__py3-none-any.whl → 1.0.32__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.
most/api.py CHANGED
@@ -18,7 +18,7 @@ from most.types import (
18
18
  Script,
19
19
  StoredAudioData,
20
20
  Text,
21
- is_valid_id, SearchParams, ScriptScoreMapping, Dialog,
21
+ is_valid_id, SearchParams, ScriptScoreMapping, Dialog, Usage,
22
22
  )
23
23
 
24
24
 
@@ -26,7 +26,7 @@ class MostClient(object):
26
26
  retort = Retort(recipe=[
27
27
  loader(int, lambda x: int(x)),
28
28
  loader(float, lambda x: float(x)),
29
- loader(datetime, lambda x: datetime.fromtimestamp(x).replace(tzinfo=timezone.utc)),
29
+ loader(datetime, lambda x: datetime.fromtimestamp(x).astimezone(tz=timezone.utc) if isinstance(x, (int, float)) else datetime.fromisoformat(x)),
30
30
  ],)
31
31
 
32
32
  def __init__(self,
@@ -248,56 +248,64 @@ class MostClient(object):
248
248
  for model in resp.json()]
249
249
 
250
250
  def apply(self, audio_id,
251
- modify_scores: bool = False) -> Result:
251
+ modify_scores: bool = False,
252
+ overwrite: bool = False) -> Result:
252
253
  if not is_valid_id(self.model_id):
253
254
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
254
255
 
255
256
  if not is_valid_id(audio_id):
256
257
  raise RuntimeError("Please use valid audio_id. [try audio.id from list_audios()]")
257
258
 
258
- resp = self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply")
259
+ resp = self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply",
260
+ params={"overwrite": overwrite})
259
261
  result = self.retort.load(resp.json(), Result)
260
262
  if modify_scores:
261
263
  result = self.score_modifier.modify(result)
262
264
  return result
263
265
 
264
266
  def apply_on_text(self, text_id,
265
- modify_scores: bool = False) -> Result:
267
+ modify_scores: bool = False,
268
+ overwrite: bool = False) -> Result:
266
269
  if not is_valid_id(self.model_id):
267
270
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
268
271
 
269
272
  if not is_valid_id(text_id):
270
273
  raise RuntimeError("Please use valid text_id. [try text.id from list_texts()]")
271
274
 
272
- resp = self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply")
275
+ resp = self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply",
276
+ params={"overwrite": overwrite})
273
277
  result = self.retort.load(resp.json(), Result)
274
278
  if modify_scores:
275
279
  result = self.score_modifier.modify(result)
276
280
  return result
277
281
 
278
282
  def apply_later(self, audio_id,
279
- modify_scores: bool = False) -> Result:
283
+ modify_scores: bool = False,
284
+ overwrite: bool = False) -> Result:
280
285
  if not is_valid_id(self.model_id):
281
286
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
282
287
 
283
288
  if not is_valid_id(audio_id):
284
289
  raise RuntimeError("Please use valid audio_id. [try audio.id from list_audios()]")
285
290
 
286
- resp = self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply_async")
291
+ resp = self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply_async",
292
+ params={"overwrite": overwrite})
287
293
  result = self.retort.load(resp.json(), Result)
288
294
  if modify_scores:
289
295
  result = self.score_modifier.modify(result)
290
296
  return result
291
297
 
292
298
  def apply_on_text_later(self, text_id,
293
- modify_scores: bool = False) -> Result:
299
+ modify_scores: bool = False,
300
+ overwrite: bool = False) -> Result:
294
301
  if not is_valid_id(self.model_id):
295
302
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
296
303
 
297
304
  if not is_valid_id(text_id):
298
305
  raise RuntimeError("Please use valid text_id. [try audio.id from list_texts()]")
299
306
 
300
- resp = self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply_async")
307
+ resp = self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply_async",
308
+ params={"overwrite": overwrite})
301
309
  result = self.retort.load(resp.json(), Result)
302
310
  if modify_scores:
303
311
  result = self.score_modifier.modify(result)
@@ -436,3 +444,12 @@ class MostClient(object):
436
444
  raise RuntimeError("Audio can't be indexed")
437
445
  audio_list = resp.json()
438
446
  return self.retort.load(audio_list, List[Audio])
447
+
448
+ def get_usage(self,
449
+ start_dt: datetime,
450
+ end_dt: datetime):
451
+ resp = self.get(f"/{self.client_id}/model/{self.model_id}/usage",
452
+ params={'start_dt': start_dt.astimezone(timezone.utc).isoformat(),
453
+ 'end_dt': end_dt.astimezone(timezone.utc).isoformat()})
454
+ resp.raise_for_status()
455
+ return self.retort.load(resp.json(), Usage)
most/async_api.py CHANGED
@@ -18,7 +18,7 @@ from most.types import (
18
18
  Script,
19
19
  StoredAudioData,
20
20
  Text,
21
- is_valid_id, SearchParams, ScriptScoreMapping, Dialog,
21
+ is_valid_id, SearchParams, ScriptScoreMapping, Dialog, Usage,
22
22
  )
23
23
 
24
24
 
@@ -26,7 +26,7 @@ class AsyncMostClient(object):
26
26
  retort = Retort(recipe=[
27
27
  loader(int, lambda x: int(x)),
28
28
  loader(float, lambda x: float(x)),
29
- loader(datetime, lambda x: datetime.fromtimestamp(x).replace(tzinfo=timezone.utc)),
29
+ loader(datetime, lambda x: datetime.fromtimestamp(x).astimezone(tz=timezone.utc) if isinstance(x, (int, float)) else datetime.fromisoformat(x)),
30
30
  ])
31
31
 
32
32
  def __init__(self,
@@ -258,56 +258,64 @@ class AsyncMostClient(object):
258
258
  for model in resp.json()]
259
259
 
260
260
  async def apply(self, audio_id,
261
- modify_scores: bool = False) -> Result:
261
+ modify_scores: bool = False,
262
+ overwrite: bool = False) -> Result:
262
263
  if not is_valid_id(self.model_id):
263
264
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
264
265
 
265
266
  if not is_valid_id(audio_id):
266
267
  raise RuntimeError("Please use valid audio_id. [try audio.id from list_audios()]")
267
268
 
268
- resp = await self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply")
269
+ resp = await self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply",
270
+ params={"overwrite": overwrite})
269
271
  result = self.retort.load(resp.json(), Result)
270
272
  if modify_scores:
271
273
  result = self.score_modifier.modify(result)
272
274
  return result
273
275
 
274
276
  async def apply_on_text(self, text_id,
275
- modify_scores: bool = False) -> Result:
277
+ modify_scores: bool = False,
278
+ overwrite: bool = False) -> Result:
276
279
  if not is_valid_id(self.model_id):
277
280
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
278
281
 
279
282
  if not is_valid_id(text_id):
280
283
  raise RuntimeError("Please use valid text_id. [try text.id from list_texts()]")
281
284
 
282
- resp = await self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply")
285
+ resp = await self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply",
286
+ params={"overwrite": overwrite})
283
287
  result = self.retort.load(resp.json(), Result)
284
288
  if modify_scores:
285
289
  result = self.score_modifier.modify(result)
286
290
  return result
287
291
 
288
292
  async def apply_later(self, audio_id,
289
- modify_scores: bool = False) -> Result:
293
+ modify_scores: bool = False,
294
+ overwrite: bool = False) -> Result:
290
295
  if not is_valid_id(self.model_id):
291
296
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
292
297
 
293
298
  if not is_valid_id(audio_id):
294
299
  raise RuntimeError("Please use valid audio_id. [try audio.id from list_audios()]")
295
300
 
296
- resp = await self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply_async")
301
+ resp = await self.post(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/apply_async",
302
+ params={"overwrite": overwrite})
297
303
  result = self.retort.load(resp.json(), Result)
298
304
  if modify_scores:
299
305
  result = self.score_modifier.modify(result)
300
306
  return result
301
307
 
302
308
  async def apply_on_text_later(self, text_id,
303
- modify_scores: bool = False) -> Result:
309
+ modify_scores: bool = False,
310
+ overwrite: bool = False) -> Result:
304
311
  if not is_valid_id(self.model_id):
305
312
  raise RuntimeError("Please choose valid model to apply. [try list_models()]")
306
313
 
307
314
  if not is_valid_id(text_id):
308
315
  raise RuntimeError("Please use valid text_id. [try audio.id from list_texts()]")
309
316
 
310
- resp = await self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply_async")
317
+ resp = await self.post(f"/{self.client_id}/text/{text_id}/model/{self.model_id}/apply_async",
318
+ params={"overwrite": overwrite})
311
319
  result = self.retort.load(resp.json(), Result)
312
320
  if modify_scores:
313
321
  result = self.score_modifier.modify(result)
@@ -442,3 +450,12 @@ class AsyncMostClient(object):
442
450
  raise RuntimeError("Audio can't be indexed")
443
451
  audio_list = resp.json()
444
452
  return self.retort.load(audio_list, List[Audio])
453
+
454
+ async def get_usage(self,
455
+ start_dt: datetime,
456
+ end_dt: datetime):
457
+ resp = await self.get(f"/{self.client_id}/model/{self.model_id}/usage",
458
+ params={'start_dt': start_dt.astimezone(timezone.utc).isoformat(),
459
+ 'end_dt': end_dt.astimezone(timezone.utc).isoformat()})
460
+ resp.raise_for_status()
461
+ return self.retort.load(resp.json(), Usage)
most/types.py CHANGED
@@ -173,6 +173,25 @@ class HumanFeedback(DataClassJsonMixin):
173
173
  return sum((preds[key] == gt[key]) for key in common_keys) / len(common_keys)
174
174
 
175
175
 
176
+ @dataclass_json
177
+ @dataclass
178
+ class Usage(DataClassJsonMixin):
179
+ apply_audio_async: int
180
+ apply_audio_async_duration: int
181
+ apply_text_async: int
182
+
183
+ apply_audio: int
184
+ apply_audio_duration: int
185
+ apply_text: int
186
+
187
+ upload_audio: int
188
+ upload_audio_duration: int
189
+ upload_text: int
190
+
191
+ start_dt: datetime
192
+ end_dt: datetime
193
+
194
+
176
195
  def is_valid_objectid(oid: str) -> bool:
177
196
  """
178
197
  Check if a given string is a valid MongoDB ObjectId (24-character hex).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: most-client
3
- Version: 1.0.30
3
+ Version: 1.0.32
4
4
  Summary: Most AI API for https://the-most.ai
5
5
  Home-page: https://github.com/the-most-ai/most-client
6
6
  Author: George Kasparyants
@@ -0,0 +1,13 @@
1
+ most/__init__.py,sha256=b0EXXaPA4kmt-FtGXKRWZr7SCwjipMLcpC6uT5WRIdY,144
2
+ most/_constrants.py,sha256=SlHKcBoXwe_sPzk8tdbb7lqhQz-Bfo__FhSoeFWodZE,217
3
+ most/api.py,sha256=3PzHr61qKQ0_BIo9rdsm2SRi43yD0HdQc8GPpW-ehgk,18816
4
+ most/async_api.py,sha256=uSfdZuWCdPr05JiO2hJ9HraF0uFRiRSPTYVYuUZLCDQ,19973
5
+ most/async_trainer_api.py,sha256=99rED8RjnOn8VezeEgrTgoVfQrO7DdmOE2Jajumno2g,1052
6
+ most/score_calculation.py,sha256=1XU1LfIH5LSCwAbAaKkr-EjH5qOTXrJKOUvhCCawka4,1054
7
+ most/trainer_api.py,sha256=ZwOv4mhROfY97n6i7IY_ZpafsuNRazOqMBAf2dh708k,992
8
+ most/types.py,sha256=KP34dzS8ayQUhToIxwxTL9O8-7TZz1ySfJzA3ZNGIGw,4921
9
+ most_client-1.0.32.dist-info/METADATA,sha256=YMrdEObidHQio4UzTc1yINdEEXnhr12EeqWrR110ssY,1027
10
+ most_client-1.0.32.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
11
+ most_client-1.0.32.dist-info/top_level.txt,sha256=2g5fk02LKkM1hV3pVVti_LQ60TToLBcR2zQ3JEKGVk8,5
12
+ most_client-1.0.32.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
13
+ most_client-1.0.32.dist-info/RECORD,,
@@ -1,13 +0,0 @@
1
- most/__init__.py,sha256=b0EXXaPA4kmt-FtGXKRWZr7SCwjipMLcpC6uT5WRIdY,144
2
- most/_constrants.py,sha256=SlHKcBoXwe_sPzk8tdbb7lqhQz-Bfo__FhSoeFWodZE,217
3
- most/api.py,sha256=_xqIj24dm1bINPy54zZ4Xqp5V8DQa05TN3zocuZW7io,17895
4
- most/async_api.py,sha256=7uymQ643SVzFU-j_iR-8MqT5wkNad9v54nR9vT87QoY,18968
5
- most/async_trainer_api.py,sha256=99rED8RjnOn8VezeEgrTgoVfQrO7DdmOE2Jajumno2g,1052
6
- most/score_calculation.py,sha256=1XU1LfIH5LSCwAbAaKkr-EjH5qOTXrJKOUvhCCawka4,1054
7
- most/trainer_api.py,sha256=ZwOv4mhROfY97n6i7IY_ZpafsuNRazOqMBAf2dh708k,992
8
- most/types.py,sha256=-voecFH0E4ScMHu0DR_2S6XNdlkGuVJgy0Z1Oui2iM8,4578
9
- most_client-1.0.30.dist-info/METADATA,sha256=f-x0jH2hHk7uYN2DMTohvxYEJFRczhoH0eQVHBSn8dg,1027
10
- most_client-1.0.30.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
11
- most_client-1.0.30.dist-info/top_level.txt,sha256=2g5fk02LKkM1hV3pVVti_LQ60TToLBcR2zQ3JEKGVk8,5
12
- most_client-1.0.30.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
13
- most_client-1.0.30.dist-info/RECORD,,