most-client 1.0.37__py3-none-any.whl → 1.0.38__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,7 +1,5 @@
1
- import re
2
1
  from dataclasses import dataclass, field
3
- from datetime import datetime
4
- from typing import Dict, List, Literal, Optional, Union
2
+ from typing import List, Optional
5
3
 
6
4
  from bson import ObjectId
7
5
  from dataclasses_json import DataClassJsonMixin, dataclass_json
@@ -33,9 +31,11 @@ class DurationCondition(DataClassJsonMixin):
33
31
  @dataclass
34
32
  class StoredInfoCondition(DataClassJsonMixin):
35
33
  key: str
36
- match: Optional[str] = None
34
+ match: Optional[int | str | float] = None
37
35
  starts_with: Optional[str] = None
38
36
  ends_with: Optional[str] = None
37
+ greater_than: Optional[int | str | float] = None
38
+ less_than: Optional[int | str | float] = None
39
39
 
40
40
 
41
41
  @dataclass_json
@@ -49,6 +49,90 @@ class ResultsCondition(DataClassJsonMixin):
49
49
  score_greater_than: Optional[int] = None
50
50
  score_less_than: Optional[int] = None
51
51
 
52
+ def create_from(self, client,
53
+ column: str, subcolumn: str,
54
+ score_equal: Optional[int] = None,
55
+ score_in_set: Optional[List[int]] = None,
56
+ score_greater_than: Optional[int] = None,
57
+ score_less_than: Optional[int] = None,
58
+ modified_scores: bool = False) -> 'ResultsCondition':
59
+ from .api import MostClient
60
+ client: MostClient
61
+ script = client.get_model_script()
62
+ column_idx = [column.name for column in script.columns].index(column)
63
+ subcolumn_idx = script.columns[column_idx].subcolumns.index(subcolumn)
64
+
65
+ if modified_scores:
66
+ score_modifier = client.get_score_modifier()
67
+ if score_equal is not None:
68
+ score_equal = score_modifier.unmodify_single(column, subcolumn,
69
+ score_equal,
70
+ bound="strict")
71
+ if score_in_set is not None:
72
+ score_in_set = [score_modifier.unmodify_single(column, subcolumn,
73
+ score,
74
+ bound="strict")
75
+ for score in score_in_set]
76
+ if score_greater_than is not None:
77
+ score_greater_than = score_modifier.unmodify_single(column, subcolumn,
78
+ score_greater_than,
79
+ bound="upper")
80
+
81
+ if score_less_than is not None:
82
+ score_less_than = score_modifier.unmodify_single(column, subcolumn,
83
+ score_less_than,
84
+ bound="lower")
85
+
86
+ return ResultsCondition(model_id=client.model_id,
87
+ column_idx=column_idx,
88
+ subcolumn_idx=subcolumn_idx,
89
+ score_equal=score_equal,
90
+ score_in_set=score_in_set,
91
+ score_greater_than=score_greater_than,
92
+ score_less_than=score_less_than)
93
+
94
+ async def acreate_from(self, client,
95
+ column: str, subcolumn: str,
96
+ score_equal: Optional[int] = None,
97
+ score_in_set: Optional[List[int]] = None,
98
+ score_greater_than: Optional[int] = None,
99
+ score_less_than: Optional[int] = None,
100
+ modified_scores: bool = False) -> 'ResultsCondition':
101
+ from .async_api import AsyncMostClient
102
+ client: AsyncMostClient
103
+ script = await client.get_model_script()
104
+ column_idx = [column.name for column in script.columns].index(column)
105
+ subcolumn_idx = script.columns[column_idx].subcolumns.index(subcolumn)
106
+
107
+ if modified_scores:
108
+ score_modifier = await client.get_score_modifier()
109
+ if score_equal is not None:
110
+ score_equal = score_modifier.unmodify_single(column, subcolumn,
111
+ score_equal,
112
+ bound="strict")
113
+ if score_in_set is not None:
114
+ score_in_set = [score_modifier.unmodify_single(column, subcolumn,
115
+ score,
116
+ bound="strict")
117
+ for score in score_in_set]
118
+ if score_greater_than is not None:
119
+ score_greater_than = score_modifier.unmodify_single(column, subcolumn,
120
+ score_greater_than,
121
+ bound="upper")
122
+
123
+ if score_less_than is not None:
124
+ score_less_than = score_modifier.unmodify_single(column, subcolumn,
125
+ score_less_than,
126
+ bound="lower")
127
+
128
+ return ResultsCondition(model_id=client.model_id,
129
+ column_idx=column_idx,
130
+ subcolumn_idx=subcolumn_idx,
131
+ score_equal=score_equal,
132
+ score_in_set=score_in_set,
133
+ score_greater_than=score_greater_than,
134
+ score_less_than=score_less_than)
135
+
52
136
 
53
137
  @dataclass_json
54
138
  @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.38
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,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=63kBZvvkqlN2UOHXcxTraI9vEq-ANoqXmBnHi_QABDE,6729
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.38.dist-info/METADATA,sha256=17PN1v9-yRjWGMSVCEIlIKdkK7z6QQlFIaP9ZtvtQFU,1047
13
+ most_client-1.0.38.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
14
+ most_client-1.0.38.dist-info/top_level.txt,sha256=2g5fk02LKkM1hV3pVVti_LQ60TToLBcR2zQ3JEKGVk8,5
15
+ most_client-1.0.38.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
16
+ most_client-1.0.38.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,,