most-client 1.0.37__py3-none-any.whl → 1.0.39__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
@@ -24,8 +24,8 @@ from most.types import (
24
24
 
25
25
  class MostClient(object):
26
26
  retort = Retort(recipe=[
27
- loader(int, lambda x: int(x)),
28
- loader(float, lambda x: float(x)),
27
+ loader(int, lambda x: x if isinstance(x, int) else int(x)),
28
+ loader(float, lambda x: x if isinstance(x, float) else float(x)),
29
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
 
@@ -264,7 +264,7 @@ class MostClient(object):
264
264
  params={"overwrite": overwrite})
265
265
  result = self.retort.load(resp.json(), Result)
266
266
  if modify_scores:
267
- result = self.score_modifier.modify(result)
267
+ result = self.get_score_modifier().modify(result)
268
268
  return result
269
269
 
270
270
  def apply_on_text(self, text_id,
@@ -280,7 +280,7 @@ class MostClient(object):
280
280
  params={"overwrite": overwrite})
281
281
  result = self.retort.load(resp.json(), Result)
282
282
  if modify_scores:
283
- result = self.score_modifier.modify(result)
283
+ result = self.get_score_modifier().modify(result)
284
284
  return result
285
285
 
286
286
  def transcribe_later(self, audio_id,
@@ -308,7 +308,7 @@ class MostClient(object):
308
308
  params={"overwrite": overwrite})
309
309
  result = self.retort.load(resp.json(), Result)
310
310
  if modify_scores:
311
- result = self.score_modifier.modify(result)
311
+ result = self.get_score_modifier().modify(result)
312
312
  return result
313
313
 
314
314
  def apply_on_text_later(self, text_id,
@@ -324,7 +324,7 @@ class MostClient(object):
324
324
  params={"overwrite": overwrite})
325
325
  result = self.retort.load(resp.json(), Result)
326
326
  if modify_scores:
327
- result = self.score_modifier.modify(result)
327
+ result = self.get_score_modifier().modify(result)
328
328
  return result
329
329
 
330
330
  def get_job_status(self, audio_id) -> JobStatus:
@@ -348,7 +348,7 @@ class MostClient(object):
348
348
  resp = self.get(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/results")
349
349
  result = self.retort.load(resp.json(), Result)
350
350
  if modify_scores:
351
- result = self.score_modifier.modify(result)
351
+ result = self.get_score_modifier().modify(result)
352
352
  return result
353
353
 
354
354
  def fetch_text(self, audio_id: str) -> Result:
@@ -401,7 +401,7 @@ class MostClient(object):
401
401
 
402
402
  def store_info(self,
403
403
  audio_id: str,
404
- data: Dict[str, str]) -> StoredAudioData:
404
+ data: Dict[str, Union[str, int, float]]) -> StoredAudioData:
405
405
  if not is_valid_id(audio_id):
406
406
  raise RuntimeError("Please use valid audio_id. [try audio.id from list_audios()]")
407
407
 
@@ -409,14 +409,14 @@ class MostClient(object):
409
409
  json={
410
410
  "data": data,
411
411
  })
412
- return self.retort.load(resp.json(), StoredAudioData)
412
+ return StoredAudioData.from_dict(resp.json())
413
413
 
414
414
  def fetch_info(self, audio_id: str) -> StoredAudioData:
415
415
  if not is_valid_id(audio_id):
416
416
  raise RuntimeError("Please use valid audio_id. [try audio.id from list_audios()]")
417
417
 
418
418
  resp = self.get(f"/{self.client_id}/audio/{audio_id}/info")
419
- return self.retort.load(resp.json(), StoredAudioData)
419
+ return StoredAudioData.from_dict(resp.json())
420
420
 
421
421
  def __call__(self, audio_path: Path,
422
422
  modify_scores: bool = False) -> Result:
most/async_api.py CHANGED
@@ -24,8 +24,8 @@ from most.types import (
24
24
 
25
25
  class AsyncMostClient(object):
26
26
  retort = Retort(recipe=[
27
- loader(int, lambda x: int(x)),
28
- loader(float, lambda x: float(x)),
27
+ loader(int, lambda x: x if isinstance(x, int) else int(x)),
28
+ loader(float, lambda x: x if isinstance(x, float) else float(x)),
29
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
 
@@ -274,7 +274,8 @@ class AsyncMostClient(object):
274
274
  params={"overwrite": overwrite})
275
275
  result = self.retort.load(resp.json(), Result)
276
276
  if modify_scores:
277
- result = self.score_modifier.modify(result)
277
+ score_modifier = await self.get_score_modifier()
278
+ result = score_modifier.modify(result)
278
279
  return result
279
280
 
280
281
  async def apply_on_text(self, text_id,
@@ -290,7 +291,8 @@ class AsyncMostClient(object):
290
291
  params={"overwrite": overwrite})
291
292
  result = self.retort.load(resp.json(), Result)
292
293
  if modify_scores:
293
- result = self.score_modifier.modify(result)
294
+ score_modifier = await self.get_score_modifier()
295
+ result = score_modifier.modify(result)
294
296
  return result
295
297
 
296
298
  async def transcribe_later(self, audio_id,
@@ -318,7 +320,8 @@ class AsyncMostClient(object):
318
320
  params={"overwrite": overwrite})
319
321
  result = self.retort.load(resp.json(), Result)
320
322
  if modify_scores:
321
- result = self.score_modifier.modify(result)
323
+ score_modifier = await self.get_score_modifier()
324
+ result = score_modifier.modify(result)
322
325
  return result
323
326
 
324
327
  async def apply_on_text_later(self, text_id,
@@ -334,7 +337,8 @@ class AsyncMostClient(object):
334
337
  params={"overwrite": overwrite})
335
338
  result = self.retort.load(resp.json(), Result)
336
339
  if modify_scores:
337
- result = self.score_modifier.modify(result)
340
+ score_modifier = await self.get_score_modifier()
341
+ result = score_modifier.modify(result)
338
342
  return result
339
343
 
340
344
  async def get_job_status(self, audio_id) -> JobStatus:
@@ -358,7 +362,8 @@ class AsyncMostClient(object):
358
362
  resp = await self.get(f"/{self.client_id}/audio/{audio_id}/model/{self.model_id}/results")
359
363
  result = self.retort.load(resp.json(), Result)
360
364
  if modify_scores:
361
- result = self.score_modifier.modify(result)
365
+ score_modifier = await self.get_score_modifier()
366
+ result = score_modifier.modify(result)
362
367
  return result
363
368
 
364
369
  async def fetch_text(self, audio_id) -> Result:
@@ -411,18 +416,18 @@ class AsyncMostClient(object):
411
416
 
412
417
  async def store_info(self,
413
418
  audio_id: str,
414
- data: Dict[str, str]) -> StoredAudioData:
419
+ data: Dict[str, Union[str, int, float]]) -> StoredAudioData:
415
420
  resp = await self.post(f"/{self.client_id}/audio/{audio_id}/info",
416
421
  json={
417
422
  "data": data,
418
423
  })
419
- return self.retort.load(resp.json(), StoredAudioData)
424
+ return StoredAudioData.from_dict(resp.json())
420
425
 
421
426
  async def fetch_info(self, audio_id: str) -> StoredAudioData:
422
427
  if not is_valid_id(audio_id):
423
428
  raise RuntimeError("Please use valid audio_id. [try audio.id from list_audios()]")
424
429
  resp = await self.get(f"/{self.client_id}/audio/{audio_id}/info")
425
- return self.retort.load(resp.json(), StoredAudioData)
430
+ return StoredAudioData.from_dict(resp.json())
426
431
 
427
432
  async def __call__(self, audio_path: Path,
428
433
  modify_scores: bool = False) -> Result:
most/score_calculation.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Dict, Tuple, List, Optional
1
+ from typing import Dict, Tuple, List, Optional, Literal
2
2
  from dataclasses_json import dataclass_json, DataClassJsonMixin
3
3
  from dataclasses import dataclass, replace
4
4
  from .types import Result, ScriptScoreMapping
@@ -25,3 +25,55 @@ class ScoreCalculation(DataClassJsonMixin):
25
25
  subcolumn_result.score)
26
26
 
27
27
  return result
28
+
29
+ def unmodify(self, result: Optional[Result]):
30
+ score_mapping = {
31
+ (sm.column, sm.subcolumn, sm.to_score): sm.from_score
32
+ for sm in self.score_mapping
33
+ }
34
+ if result is None:
35
+ return None
36
+ result = replace(result)
37
+ for column_result in result.results:
38
+ for subcolumn_result in column_result.subcolumns:
39
+ subcolumn_result.score = score_mapping.get((column_result.name,
40
+ subcolumn_result.name,
41
+ subcolumn_result.score),
42
+ subcolumn_result.score)
43
+
44
+ return result
45
+
46
+ def modify_single(self,
47
+ column: str, subcolumn: str,
48
+ from_score: int):
49
+ for sm in self.score_mapping:
50
+ if sm.column == column and sm.subcolumn == subcolumn and sm.from_score == from_score:
51
+ return sm.to_score
52
+
53
+ def unmodify_single(self,
54
+ column: str, subcolumn: str,
55
+ to_score: int,
56
+ bound: Literal["strict", "upper", "lower"] = "strict"):
57
+ upper_from_score = None
58
+ lower_from_score = None
59
+
60
+ for sm in self.score_mapping:
61
+ if sm.column == column and sm.subcolumn == subcolumn:
62
+ if sm.to_score == to_score:
63
+ return sm.from_score
64
+
65
+ if sm.to_score > to_score:
66
+ if upper_from_score is None or sm.to_score < upper_from_score[1]:
67
+ upper_from_score = (sm.from_score, sm.to_score)
68
+ elif sm.to_score < to_score:
69
+ if lower_from_score is None or sm.to_score > lower_from_score[1]:
70
+ lower_from_score = (sm.from_score, sm.to_score)
71
+
72
+ if bound == "strict":
73
+ return None
74
+ elif bound == "upper" and upper_from_score is not None:
75
+ return upper_from_score[0]
76
+ elif bound == "lower" and lower_from_score is not None:
77
+ return lower_from_score[0]
78
+ else:
79
+ return None
most/search_types.py CHANGED
@@ -1,19 +1,15 @@
1
- import re
2
1
  from dataclasses import dataclass, field
3
- from datetime import datetime
4
- from typing import Dict, List, Literal, Optional, Union
5
-
6
- from bson import ObjectId
2
+ from typing import List, Optional
7
3
  from dataclasses_json import DataClassJsonMixin, dataclass_json
8
4
 
9
5
 
10
6
  @dataclass_json
11
7
  @dataclass
12
8
  class IDCondition(DataClassJsonMixin):
13
- equal: Optional[ObjectId] = None
14
- in_set: Optional[List[ObjectId]] = None
15
- greater_than: Optional[ObjectId] = None
16
- less_than: Optional[ObjectId] = None
9
+ equal: Optional[str] = None
10
+ in_set: Optional[List[str]] = None
11
+ greater_than: Optional[str] = None
12
+ less_than: Optional[str] = None
17
13
 
18
14
 
19
15
  @dataclass_json
@@ -33,9 +29,11 @@ class DurationCondition(DataClassJsonMixin):
33
29
  @dataclass
34
30
  class StoredInfoCondition(DataClassJsonMixin):
35
31
  key: str
36
- match: Optional[str] = None
32
+ match: Optional[int | str | float] = None
37
33
  starts_with: Optional[str] = None
38
34
  ends_with: Optional[str] = None
35
+ greater_than: Optional[int | str | float] = None
36
+ less_than: Optional[int | str | float] = None
39
37
 
40
38
 
41
39
  @dataclass_json
@@ -49,6 +47,90 @@ class ResultsCondition(DataClassJsonMixin):
49
47
  score_greater_than: Optional[int] = None
50
48
  score_less_than: Optional[int] = None
51
49
 
50
+ def create_from(self, client,
51
+ column: str, subcolumn: str,
52
+ score_equal: Optional[int] = None,
53
+ score_in_set: Optional[List[int]] = None,
54
+ score_greater_than: Optional[int] = None,
55
+ score_less_than: Optional[int] = None,
56
+ modified_scores: bool = False) -> 'ResultsCondition':
57
+ from .api import MostClient
58
+ client: MostClient
59
+ script = client.get_model_script()
60
+ column_idx = [column.name for column in script.columns].index(column)
61
+ subcolumn_idx = script.columns[column_idx].subcolumns.index(subcolumn)
62
+
63
+ if modified_scores:
64
+ score_modifier = client.get_score_modifier()
65
+ if score_equal is not None:
66
+ score_equal = score_modifier.unmodify_single(column, subcolumn,
67
+ score_equal,
68
+ bound="strict")
69
+ if score_in_set is not None:
70
+ score_in_set = [score_modifier.unmodify_single(column, subcolumn,
71
+ score,
72
+ bound="strict")
73
+ for score in score_in_set]
74
+ if score_greater_than is not None:
75
+ score_greater_than = score_modifier.unmodify_single(column, subcolumn,
76
+ score_greater_than,
77
+ bound="upper")
78
+
79
+ if score_less_than is not None:
80
+ score_less_than = score_modifier.unmodify_single(column, subcolumn,
81
+ score_less_than,
82
+ bound="lower")
83
+
84
+ return ResultsCondition(model_id=client.model_id,
85
+ column_idx=column_idx,
86
+ subcolumn_idx=subcolumn_idx,
87
+ score_equal=score_equal,
88
+ score_in_set=score_in_set,
89
+ score_greater_than=score_greater_than,
90
+ score_less_than=score_less_than)
91
+
92
+ async def acreate_from(self, client,
93
+ column: str, subcolumn: str,
94
+ score_equal: Optional[int] = None,
95
+ score_in_set: Optional[List[int]] = None,
96
+ score_greater_than: Optional[int] = None,
97
+ score_less_than: Optional[int] = None,
98
+ modified_scores: bool = False) -> 'ResultsCondition':
99
+ from .async_api import AsyncMostClient
100
+ client: AsyncMostClient
101
+ script = await client.get_model_script()
102
+ column_idx = [column.name for column in script.columns].index(column)
103
+ subcolumn_idx = script.columns[column_idx].subcolumns.index(subcolumn)
104
+
105
+ if modified_scores:
106
+ score_modifier = await client.get_score_modifier()
107
+ if score_equal is not None:
108
+ score_equal = score_modifier.unmodify_single(column, subcolumn,
109
+ score_equal,
110
+ bound="strict")
111
+ if score_in_set is not None:
112
+ score_in_set = [score_modifier.unmodify_single(column, subcolumn,
113
+ score,
114
+ bound="strict")
115
+ for score in score_in_set]
116
+ if score_greater_than is not None:
117
+ score_greater_than = score_modifier.unmodify_single(column, subcolumn,
118
+ score_greater_than,
119
+ bound="upper")
120
+
121
+ if score_less_than is not None:
122
+ score_less_than = score_modifier.unmodify_single(column, subcolumn,
123
+ score_less_than,
124
+ bound="lower")
125
+
126
+ return ResultsCondition(model_id=client.model_id,
127
+ column_idx=column_idx,
128
+ subcolumn_idx=subcolumn_idx,
129
+ score_equal=score_equal,
130
+ score_in_set=score_in_set,
131
+ score_greater_than=score_greater_than,
132
+ score_less_than=score_less_than)
133
+
52
134
 
53
135
  @dataclass_json
54
136
  @dataclass
most/types.py CHANGED
@@ -1,8 +1,7 @@
1
1
  import re
2
2
  from dataclasses import dataclass
3
3
  from datetime import datetime
4
- from typing import Dict, List, Literal, Optional
5
- from .search_types import ResultsCondition
4
+ from typing import Dict, List, Literal, Optional, Union
6
5
  from dataclasses_json import DataClassJsonMixin, dataclass_json
7
6
 
8
7
 
@@ -10,7 +9,7 @@ from dataclasses_json import DataClassJsonMixin, dataclass_json
10
9
  @dataclass
11
10
  class StoredAudioData(DataClassJsonMixin):
12
11
  id: str
13
- data: Dict[str, str]
12
+ data: Dict[str, Union[str, int, float]]
14
13
 
15
14
 
16
15
  @dataclass_json
@@ -53,22 +52,6 @@ class Column(DataClassJsonMixin):
53
52
  class Script(DataClassJsonMixin):
54
53
  columns: List[Column]
55
54
 
56
- def create_results_condition(self,
57
- model_id: str,
58
- column: str, subcolumn: str,
59
- score_equal: Optional[int] = None,
60
- score_greater_than: Optional[int] = None,
61
- score_less_than: Optional[int] = None) -> ResultsCondition:
62
-
63
- column_idx = [column.name for column in self.columns].index(column)
64
- subcolumn_idx = self.columns[column_idx].subcolumns.index(subcolumn)
65
- return ResultsCondition(model_id=model_id,
66
- column_idx=column_idx,
67
- subcolumn_idx=subcolumn_idx,
68
- score_equal=score_equal,
69
- score_greater_than=score_greater_than,
70
- score_less_than=score_less_than)
71
-
72
55
 
73
56
  @dataclass_json
74
57
  @dataclass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: most-client
3
- Version: 1.0.37
3
+ Version: 1.0.39
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
@@ -27,7 +27,6 @@ Requires-Dist: tox
27
27
  Requires-Dist: twine
28
28
  Requires-Dist: httpx
29
29
  Requires-Dist: pydub
30
- Requires-Dist: bson
31
30
  Dynamic: author
32
31
  Dynamic: author-email
33
32
  Dynamic: classifier
@@ -0,0 +1,16 @@
1
+ most/__init__.py,sha256=yoPKMxjZYAzrVqZ7l9rN0Skh0HPuttPX7ub0wlZMby4,351
2
+ most/_constrants.py,sha256=SlHKcBoXwe_sPzk8tdbb7lqhQz-Bfo__FhSoeFWodZE,217
3
+ most/api.py,sha256=HmJSAwLVuy7uaeVAM3y1nd-F-UDZ2kOVww_i2EY0Sjs,19145
4
+ most/async_api.py,sha256=Xyo1sGN4QstqIZh_4YDT6FStaXR0HRy6fbtbqc7uqK8,20562
5
+ most/async_searcher.py,sha256=C0zViW20K7OhKO1BzBZktTbMJYBBvor3uK6LAHZTxz0,2238
6
+ most/async_trainer_api.py,sha256=99rED8RjnOn8VezeEgrTgoVfQrO7DdmOE2Jajumno2g,1052
7
+ most/score_calculation.py,sha256=vLtGqXrR43xZhGjrH5dpQZfWX1q3s74LvTaHn-SKBAg,3254
8
+ most/search_types.py,sha256=OAtLDdpAPqH-ZYe0KxBuDbB-mUHp8eQM6-ZXUNvvBWU,6682
9
+ most/searcher.py,sha256=9UdiSlScsE6EPc6RpK8xkRLeB5gHNxgPQpXTJ17i3lQ,2135
10
+ most/trainer_api.py,sha256=ZwOv4mhROfY97n6i7IY_ZpafsuNRazOqMBAf2dh708k,992
11
+ most/types.py,sha256=AU74VqYilM9DXfBwptliRbhV5urLAf4BygdIY3wlAN8,4309
12
+ most_client-1.0.39.dist-info/METADATA,sha256=_0QPeMj75k6GrnBCLMeiyLAjrE5Mq17B3rmSy41E8dQ,1027
13
+ most_client-1.0.39.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
14
+ most_client-1.0.39.dist-info/top_level.txt,sha256=2g5fk02LKkM1hV3pVVti_LQ60TToLBcR2zQ3JEKGVk8,5
15
+ most_client-1.0.39.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
16
+ most_client-1.0.39.dist-info/RECORD,,
@@ -1,16 +0,0 @@
1
- most/__init__.py,sha256=yoPKMxjZYAzrVqZ7l9rN0Skh0HPuttPX7ub0wlZMby4,351
2
- most/_constrants.py,sha256=SlHKcBoXwe_sPzk8tdbb7lqhQz-Bfo__FhSoeFWodZE,217
3
- most/api.py,sha256=fwVmqyuCGhALQFOsgRW7IyX7ELY4sePPA5uHFRprCKQ,19052
4
- most/async_api.py,sha256=Kgy4sHZMLr4FD3dOop1BwfrNHeg5n7Ny0v7ZiYv1_ig,20219
5
- most/async_searcher.py,sha256=C0zViW20K7OhKO1BzBZktTbMJYBBvor3uK6LAHZTxz0,2238
6
- most/async_trainer_api.py,sha256=99rED8RjnOn8VezeEgrTgoVfQrO7DdmOE2Jajumno2g,1052
7
- most/score_calculation.py,sha256=1XU1LfIH5LSCwAbAaKkr-EjH5qOTXrJKOUvhCCawka4,1054
8
- most/search_types.py,sha256=fuuIkWEuYPTqljl-EMcoNgL5SOiHOVx9j5iH46ecVp8,1857
9
- most/searcher.py,sha256=9UdiSlScsE6EPc6RpK8xkRLeB5gHNxgPQpXTJ17i3lQ,2135
10
- most/trainer_api.py,sha256=ZwOv4mhROfY97n6i7IY_ZpafsuNRazOqMBAf2dh708k,992
11
- most/types.py,sha256=og32qmGnUGTvC0qTH2wzLnhYKeFTIcEmkpIDnclmhYM,5226
12
- most_client-1.0.37.dist-info/METADATA,sha256=VdEUqqsSRBSfiCdpwYh3bGdKcundkUeHReMTjCbHd2s,1047
13
- most_client-1.0.37.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
14
- most_client-1.0.37.dist-info/top_level.txt,sha256=2g5fk02LKkM1hV3pVVti_LQ60TToLBcR2zQ3JEKGVk8,5
15
- most_client-1.0.37.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
16
- most_client-1.0.37.dist-info/RECORD,,