rapidata 1.2.0__py3-none-any.whl → 1.2.2__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.

Potentially problematic release.


This version of rapidata might be problematic. Click here for more details.

Files changed (67) hide show
  1. rapidata/__init__.py +4 -0
  2. rapidata/api_client/__init__.py +25 -5
  3. rapidata/api_client/api/dataset_api.py +388 -388
  4. rapidata/api_client/api/workflow_api.py +18 -1064
  5. rapidata/api_client/models/__init__.py +25 -5
  6. rapidata/api_client/models/add_validation_text_rapid_model.py +3 -3
  7. rapidata/api_client/models/classification_metadata_model.py +98 -0
  8. rapidata/api_client/models/compare_workflow_config.py +3 -3
  9. rapidata/api_client/models/compare_workflow_config_model.py +3 -3
  10. rapidata/api_client/models/compare_workflow_model1.py +4 -18
  11. rapidata/api_client/models/compare_workflow_model1_referee.py +154 -0
  12. rapidata/api_client/models/completed_rapid_model.py +3 -3
  13. rapidata/api_client/models/completed_rapid_model_asset.py +170 -0
  14. rapidata/api_client/models/count_metadata_model.py +98 -0
  15. rapidata/api_client/models/demographic_metadata_model.py +100 -0
  16. rapidata/api_client/models/file_asset_model.py +3 -3
  17. rapidata/api_client/models/file_asset_model1.py +108 -0
  18. rapidata/api_client/models/file_asset_model1_metadata_inner.py +252 -0
  19. rapidata/api_client/models/file_asset_model2.py +108 -0
  20. rapidata/api_client/models/file_asset_model_metadata_inner.py +252 -0
  21. rapidata/api_client/models/image_dimension_metadata_model.py +100 -0
  22. rapidata/api_client/models/in_progress_rapid_model.py +3 -3
  23. rapidata/api_client/models/location_metadata_model.py +100 -0
  24. rapidata/api_client/models/multi_asset_model.py +3 -3
  25. rapidata/api_client/models/multi_asset_model1.py +118 -0
  26. rapidata/api_client/models/multi_asset_model1_assets_inner.py +170 -0
  27. rapidata/api_client/models/multi_asset_model2.py +118 -0
  28. rapidata/api_client/models/not_started_rapid_model.py +3 -3
  29. rapidata/api_client/models/null_asset_model.py +3 -3
  30. rapidata/api_client/models/null_asset_model1.py +106 -0
  31. rapidata/api_client/models/null_asset_model2.py +106 -0
  32. rapidata/api_client/models/original_filename_metadata_model.py +98 -0
  33. rapidata/api_client/models/prompt_metadata_model.py +98 -0
  34. rapidata/api_client/models/query_validation_rapids_result_asset.py +40 -40
  35. rapidata/api_client/models/ranked_datapoint_model.py +3 -3
  36. rapidata/api_client/models/simple_workflow_config.py +6 -6
  37. rapidata/api_client/models/simple_workflow_config_model.py +3 -3
  38. rapidata/api_client/models/simple_workflow_model1.py +7 -21
  39. rapidata/api_client/models/simple_workflow_model1_blueprint.py +238 -0
  40. rapidata/api_client/models/text_asset_model.py +3 -3
  41. rapidata/api_client/models/text_asset_model1.py +108 -0
  42. rapidata/api_client/models/text_asset_model2.py +108 -0
  43. rapidata/api_client/models/text_metadata_model.py +98 -0
  44. rapidata/api_client/models/transcription_metadata_model.py +98 -0
  45. rapidata/api_client/models/translated_prompt_metadata_model.py +102 -0
  46. rapidata/api_client/models/translated_string.py +93 -0
  47. rapidata/api_client_README.md +26 -10
  48. rapidata/rapidata_client/__init__.py +10 -0
  49. rapidata/rapidata_client/assets/media_asset.py +1 -1
  50. rapidata/rapidata_client/assets/multi_asset.py +12 -3
  51. rapidata/rapidata_client/dataset/rapidata_dataset.py +43 -9
  52. rapidata/rapidata_client/dataset/rapidata_validation_set.py +26 -6
  53. rapidata/rapidata_client/dataset/validation_set_builder.py +1 -1
  54. rapidata/rapidata_client/filter/__init__.py +7 -0
  55. rapidata/rapidata_client/filter/age_filter.py +16 -0
  56. rapidata/rapidata_client/filter/base_filter.py +9 -0
  57. rapidata/rapidata_client/filter/campaign_filter.py +17 -0
  58. rapidata/rapidata_client/filter/country_filter.py +16 -0
  59. rapidata/rapidata_client/filter/gender_filter.py +16 -0
  60. rapidata/rapidata_client/filter/language_filter.py +18 -0
  61. rapidata/rapidata_client/filter/user_score_filter.py +19 -0
  62. rapidata/rapidata_client/order/rapidata_order_builder.py +141 -44
  63. rapidata/rapidata_client/selection/demographic_selection.py +3 -2
  64. {rapidata-1.2.0.dist-info → rapidata-1.2.2.dist-info}/METADATA +1 -1
  65. {rapidata-1.2.0.dist-info → rapidata-1.2.2.dist-info}/RECORD +67 -34
  66. {rapidata-1.2.0.dist-info → rapidata-1.2.2.dist-info}/LICENSE +0 -0
  67. {rapidata-1.2.0.dist-info → rapidata-1.2.2.dist-info}/WHEEL +0 -0
@@ -0,0 +1,16 @@
1
+ from typing import Any
2
+ from rapidata.rapidata_client.filter.base_filter import Filter
3
+ from rapidata.api_client.models.age_user_filter_model import AgeUserFilterModel
4
+ from rapidata.api_client.models.age_group import AgeGroup
5
+
6
+
7
+ class AgeFilter(Filter):
8
+
9
+ def __init__(self, age_groups: list[AgeGroup]):
10
+ self.age_groups = age_groups
11
+
12
+ def to_model(self):
13
+ return AgeUserFilterModel(
14
+ _t="AgeFilter",
15
+ ageGroups=self.age_groups,
16
+ )
@@ -0,0 +1,9 @@
1
+ from abc import abstractmethod
2
+ from typing import Any
3
+
4
+
5
+ class Filter:
6
+
7
+ @abstractmethod
8
+ def to_model(self) -> Any:
9
+ pass
@@ -0,0 +1,17 @@
1
+ from typing import Any
2
+ from rapidata.rapidata_client.filter.base_filter import Filter
3
+ from rapidata.api_client.models.campaign_user_filter_model import (
4
+ CampaignUserFilterModel,
5
+ )
6
+
7
+
8
+ class CampaignFilter(Filter):
9
+
10
+ def __init__(self, campaign_ids: list[str]):
11
+ self.campaign_ids = campaign_ids
12
+
13
+ def to_model(self):
14
+ return CampaignUserFilterModel(
15
+ _t="CampaignFilter",
16
+ campaignIds=self.campaign_ids,
17
+ )
@@ -0,0 +1,16 @@
1
+ from typing import Any
2
+ from rapidata.rapidata_client.filter.base_filter import Filter
3
+ from rapidata.api_client.models.country_user_filter_model import CountryUserFilterModel
4
+
5
+
6
+ class CountryFilter(Filter):
7
+
8
+ def __init__(self, country_codes: list[str]):
9
+ # check that all characters in the country codes are uppercase
10
+ if not all([code.isupper() for code in country_codes]):
11
+ raise ValueError("Country codes must be uppercase")
12
+
13
+ self.country_codes = country_codes
14
+
15
+ def to_model(self):
16
+ return CountryUserFilterModel(_t="CountryFilter", countries=self.country_codes)
@@ -0,0 +1,16 @@
1
+ from typing import Any
2
+ from rapidata.rapidata_client.filter.base_filter import Filter
3
+ from rapidata.api_client.models.gender_user_filter_model import GenderUserFilterModel
4
+ from rapidata.api_client.models.gender import Gender
5
+
6
+
7
+ class GenderFilter(Filter):
8
+
9
+ def __init__(self, genders: list[Gender]):
10
+ self.genders = genders
11
+
12
+ def to_model(self):
13
+ return GenderUserFilterModel(
14
+ _t="GenderFilter",
15
+ genders=self.genders,
16
+ )
@@ -0,0 +1,18 @@
1
+ from typing import Any
2
+ from rapidata.rapidata_client.filter.base_filter import Filter
3
+ from rapidata.api_client.models.language_user_filter_model import (
4
+ LanguageUserFilterModel,
5
+ )
6
+
7
+
8
+ class LanguageFilter(Filter):
9
+
10
+ def __init__(self, language_codes: list[str]):
11
+ # check that all characters in the language codes are lowercase
12
+ if not all([code.islower() for code in language_codes]):
13
+ raise ValueError("Language codes must be lowercase")
14
+
15
+ self.languages = language_codes
16
+
17
+ def to_model(self):
18
+ return LanguageUserFilterModel(_t="LanguageFilter", languages=self.languages)
@@ -0,0 +1,19 @@
1
+ from typing import Any
2
+ from rapidata.rapidata_client.filter.base_filter import Filter
3
+ from rapidata.api_client.models.user_score_user_filter_model import (
4
+ UserScoreUserFilterModel,
5
+ )
6
+
7
+
8
+ class UserScoreFilter(Filter):
9
+
10
+ def __init__(self, lower_bound: int = 0, upper_bound: int = 1):
11
+ self.upper_bound = upper_bound
12
+ self.lower_bound = lower_bound
13
+
14
+ def to_model(self):
15
+ return UserScoreUserFilterModel(
16
+ _t="UserScoreFilter",
17
+ upperbound=self.upper_bound,
18
+ lowerbound=self.lower_bound,
19
+ )
@@ -1,3 +1,5 @@
1
+ from warnings import warn
2
+
1
3
  from rapidata.api_client.models.aggregator_type import AggregatorType
2
4
  from rapidata.api_client.models.capped_selection_selections_inner import (
3
5
  CappedSelectionSelectionsInner,
@@ -21,6 +23,7 @@ from rapidata.rapidata_client.metadata.base_metadata import Metadata
21
23
  from rapidata.rapidata_client.dataset.rapidata_dataset import RapidataDataset
22
24
  from rapidata.rapidata_client.referee.naive_referee import NaiveReferee
23
25
  from rapidata.rapidata_client.selection.base_selection import Selection
26
+ from rapidata.rapidata_client.filter import Filter, CountryFilter, LanguageFilter
24
27
  from rapidata.rapidata_client.workflow import Workflow
25
28
  from rapidata.rapidata_client.order.rapidata_order import RapidataOrder
26
29
  from rapidata.rapidata_client.referee import Referee
@@ -63,8 +66,7 @@ class RapidataOrderBuilder:
63
66
  self._aggregator: AggregatorType | None = None
64
67
  self._validation_set_id: str | None = None
65
68
  self._feature_flags: FeatureFlags | None = None
66
- self._country_codes: list[str] | None = None
67
- self._language_codes: list[str] | None = None
69
+ self._user_filters: list[Filter] = []
68
70
  self._selections: list[Selection] = []
69
71
  self._rapids_per_bag: int = 2
70
72
  self._priority: int = 50
@@ -87,31 +89,14 @@ class RapidataOrderBuilder:
87
89
  print("No referee provided, using default NaiveReferee.")
88
90
  self._referee = NaiveReferee()
89
91
 
90
- user_filters = []
91
-
92
- if self._country_codes is not None:
93
- user_filters.append(
94
- CreateOrderModelUserFiltersInner(
95
- CountryUserFilterModel(
96
- _t="CountryFilter", countries=self._country_codes
97
- )
98
- )
99
- )
100
-
101
- if self._language_codes is not None:
102
- user_filters.append(
103
- CreateOrderModelUserFiltersInner(
104
- LanguageUserFilterModel(
105
- _t="LanguageFilter", languages=self._language_codes
106
- )
107
- )
108
- )
109
-
110
92
  return CreateOrderModel(
111
93
  _t="CreateOrderModel",
112
94
  orderName=self._name,
113
95
  workflow=CreateOrderModelWorkflow(self._workflow.to_model()),
114
- userFilters=user_filters,
96
+ userFilters=[
97
+ CreateOrderModelUserFiltersInner(user_filter.to_model())
98
+ for user_filter in self._user_filters
99
+ ],
115
100
  referee=CreateOrderModelReferee(self._referee.to_model()),
116
101
  validationSetId=self._validation_set_id,
117
102
  featureFlags=(
@@ -141,17 +126,17 @@ class RapidataOrderBuilder:
141
126
  Returns:
142
127
  RapidataOrder: The created RapidataOrder instance.
143
128
  """
129
+ if not self._workflow or not self._assets:
130
+ raise ValueError(
131
+ "You must provide a workflow and assets to create an order. Use the .workflow() and .media() methods respecitvely."
132
+ )
144
133
  order_model = self._to_model()
145
134
  if isinstance(
146
135
  self._workflow, CompareWorkflow
147
136
  ): # Temporary fix; will be handled by backend in the future
148
- assert all(isinstance(item, MultiAsset) for item in self._assets), (
149
- "The media paths must be of type MultiAsset for comparison tasks."
150
- )
151
- media_paths = cast(list[MultiAsset], self._assets)
152
137
  assert all(
153
- [len(path) == 2 for path in media_paths]
154
- ), "The media paths must come in pairs for comparison tasks."
138
+ isinstance(item, MultiAsset) for item in self._assets
139
+ ), "The media paths must be of type MultiAsset for comparison tasks."
155
140
 
156
141
  result = self._openapi_service.order_api.order_create_post(
157
142
  create_order_model=order_model
@@ -165,18 +150,45 @@ class RapidataOrderBuilder:
165
150
  openapi_service=self._openapi_service,
166
151
  )
167
152
 
168
- if not self._assets:
169
- raise ValueError(
170
- "You must provide assets to start the order."
171
- )
172
- if all(isinstance(item, TextAsset) for item in self._assets):
153
+ if all(isinstance(item, MediaAsset) for item in self._assets):
154
+ assets = cast(list[MediaAsset], self._assets)
155
+ order.dataset.add_media_from_paths(assets, self._metadata, max_workers)
156
+
157
+ elif all(isinstance(item, TextAsset) for item in self._assets):
173
158
  assets = cast(list[TextAsset], self._assets)
174
159
  order.dataset.add_texts(assets)
175
160
 
176
- elif all(isinstance(item, (MediaAsset, MultiAsset)) for item in self._assets):
177
- assets = cast(list[MediaAsset | MultiAsset], self._assets)
178
- order.dataset.add_media_from_paths(
179
- assets, self._metadata, max_workers
161
+ elif all(isinstance(item, MultiAsset) for item in self._assets):
162
+ multi_assets = cast(list[MultiAsset], self._assets)
163
+
164
+ # Check if all MultiAssets contain the same type of assets
165
+ first_asset_type = type(multi_assets[0].assets[0])
166
+ if not all(
167
+ isinstance(asset, first_asset_type)
168
+ for multi_asset in multi_assets
169
+ for asset in multi_asset.assets
170
+ ):
171
+ raise ValueError(
172
+ "All MultiAssets must contain the same type of assets (either all MediaAssets or all TextAssets)."
173
+ )
174
+
175
+ # Process based on the asset type
176
+ if issubclass(first_asset_type, MediaAsset):
177
+ order.dataset.add_media_from_paths(
178
+ multi_assets, self._metadata, max_workers
179
+ )
180
+
181
+ elif issubclass(first_asset_type, TextAsset):
182
+ order.dataset.add_texts(multi_assets)
183
+
184
+ else:
185
+ raise ValueError(
186
+ "MultiAsset must contain MediaAssets or TextAssets objects."
187
+ )
188
+
189
+ else:
190
+ raise ValueError(
191
+ "Media paths must be of type MediaAsset, TextAsset, or MultiAsset."
180
192
  )
181
193
 
182
194
  if submit:
@@ -194,6 +206,9 @@ class RapidataOrderBuilder:
194
206
  Returns:
195
207
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
196
208
  """
209
+ if not isinstance(workflow, Workflow):
210
+ raise TypeError("Workflow must be of type Workflow.")
211
+
197
212
  self._workflow = workflow
198
213
  return self
199
214
 
@@ -207,6 +222,9 @@ class RapidataOrderBuilder:
207
222
  Returns:
208
223
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
209
224
  """
225
+ if not isinstance(referee, Referee):
226
+ raise TypeError("Referee must be of type Referee.")
227
+
210
228
  self._referee = referee
211
229
  return self
212
230
 
@@ -225,8 +243,22 @@ class RapidataOrderBuilder:
225
243
  Returns:
226
244
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
227
245
  """
246
+ if not isinstance(asset, list):
247
+ raise TypeError("Media paths must be provided as a list of paths.")
248
+
249
+ for a in asset:
250
+ if not isinstance(a, (MediaAsset, TextAsset, MultiAsset)):
251
+ raise TypeError(
252
+ "Media paths must be of type MediaAsset, TextAsset, or MultiAsset."
253
+ )
254
+
255
+ if metadata:
256
+ for data in metadata:
257
+ if not isinstance(data, Metadata):
258
+ raise TypeError("Metadata must be of type Metadata.")
259
+
228
260
  self._assets = asset
229
- self._metadata = metadata # type: ignore
261
+ self._metadata = metadata # type: ignore
230
262
  return self
231
263
 
232
264
  def feature_flags(self, feature_flags: FeatureFlags) -> "RapidataOrderBuilder":
@@ -239,9 +271,35 @@ class RapidataOrderBuilder:
239
271
  Returns:
240
272
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
241
273
  """
274
+ if not isinstance(feature_flags, FeatureFlags):
275
+ raise TypeError("Feature flags must be of type FeatureFlags.")
276
+
242
277
  self._feature_flags = feature_flags
243
278
  return self
244
279
 
280
+ def filters(self, filters: Sequence[Filter]) -> "RapidataOrderBuilder":
281
+ """
282
+ Set the filters for the order, e.g., country, language, userscore, etc.
283
+
284
+ Args:
285
+ filters (Sequence[Filters]): The user filters to be set.
286
+
287
+ Returns:
288
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
289
+ """
290
+ if not isinstance(filters, list):
291
+ raise TypeError("Filters must be provided as a list of Filter objects.")
292
+
293
+ for f in filters:
294
+ if not isinstance(f, Filter):
295
+ raise TypeError("Filters must be of type Filter.")
296
+
297
+ if len(self._user_filters) > 0:
298
+ print("Overwriting existing user filters.")
299
+
300
+ self._user_filters = filters
301
+ return self
302
+
245
303
  def country_filter(self, country_codes: list[str]) -> "RapidataOrderBuilder":
246
304
  """
247
305
  Set the target country codes for the order. E.g. `country_codes=["DE", "CH", "AT"]` for Germany, Switzerland, and Austria.
@@ -252,7 +310,18 @@ class RapidataOrderBuilder:
252
310
  Returns:
253
311
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
254
312
  """
255
- self._country_codes = country_codes
313
+ warn(
314
+ "The country_filter method is deprecated. Use the filters method instead.",
315
+ DeprecationWarning,
316
+ )
317
+ if not isinstance(country_codes, list):
318
+ raise TypeError("Country codes must be provided as a list of strings.")
319
+
320
+ for code in country_codes:
321
+ if not isinstance(code, str):
322
+ raise TypeError("Country codes must be of type str.")
323
+
324
+ self._user_filters.append(CountryFilter(country_codes))
256
325
  return self
257
326
 
258
327
  def language_filter(self, language_codes: list[str]) -> "RapidataOrderBuilder":
@@ -265,7 +334,17 @@ class RapidataOrderBuilder:
265
334
  Returns:
266
335
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
267
336
  """
268
- self._language_codes = language_codes
337
+ warn(
338
+ "The language_filter method is deprecated. Use the filters method instead.",
339
+ DeprecationWarning,
340
+ )
341
+ if not isinstance(language_codes, list):
342
+ raise TypeError("Language codes must be provided as a list of strings.")
343
+
344
+ if not all(isinstance(code, str) for code in language_codes):
345
+ raise TypeError("Language codes must be of type str.")
346
+
347
+ self._user_filters.append(LanguageFilter(language_codes))
269
348
  return self
270
349
 
271
350
  def aggregator(self, aggregator: AggregatorType) -> "RapidataOrderBuilder":
@@ -278,6 +357,9 @@ class RapidataOrderBuilder:
278
357
  Returns:
279
358
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
280
359
  """
360
+ if not isinstance(aggregator, AggregatorType):
361
+ raise TypeError("Aggregator must be of type AggregatorType.")
362
+
281
363
  self._aggregator = aggregator
282
364
  return self
283
365
 
@@ -291,6 +373,9 @@ class RapidataOrderBuilder:
291
373
  Returns:
292
374
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
293
375
  """
376
+ if not isinstance(validation_set_id, str):
377
+ raise TypeError("Validation set ID must be of type str.")
378
+
294
379
  self._validation_set_id = validation_set_id
295
380
  return self
296
381
 
@@ -309,17 +394,26 @@ class RapidataOrderBuilder:
309
394
  """
310
395
  raise NotImplementedError("Not implemented yet.")
311
396
 
312
- def selections(self, selections: list[Selection]) -> "RapidataOrderBuilder":
397
+ def selections(self, selections: Sequence[Selection]) -> "RapidataOrderBuilder":
313
398
  """
314
399
  Set the selections for the order.
315
400
 
316
401
  Args:
317
- selections (list[Selection]): The selections to be set.
402
+ selections (Sequence[Selection]): The selections to be set.
318
403
 
319
404
  Returns:
320
405
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
321
406
  """
322
- self._selections = selections
407
+ if not isinstance(selections, list):
408
+ raise TypeError(
409
+ "Selections must be provided as a list of Selection objects."
410
+ )
411
+
412
+ for selection in selections:
413
+ if not isinstance(selection, Selection):
414
+ raise TypeError("Selections must be of type Selection.")
415
+
416
+ self._selections = selections # type: ignore
323
417
  return self
324
418
 
325
419
  def priority(self, priority: int) -> "RapidataOrderBuilder":
@@ -332,5 +426,8 @@ class RapidataOrderBuilder:
332
426
  Returns:
333
427
  RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
334
428
  """
429
+ if not isinstance(priority, int):
430
+ raise TypeError("Priority must be of type int.")
431
+
335
432
  self._priority = priority
336
433
  return self
@@ -5,8 +5,9 @@ from rapidata.api_client.models.demographic_selection import DemographicSelectio
5
5
  class DemographicSelection(Selection):
6
6
  """Demographic selection class."""
7
7
 
8
- def __init__(self, keys: list[str]):
8
+ def __init__(self, keys: list[str], maxRapids: int):
9
9
  self.keys = keys
10
+ self.maxRapids = maxRapids
10
11
 
11
12
  def to_model(self):
12
- return DemographicSelectionModel(_t="DemographicSelection", keys=self.keys)
13
+ return DemographicSelectionModel(_t="DemographicSelection", keys=self.keys, maxRapids=self.maxRapids)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rapidata
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Rapidata package containing the Rapidata Python Client to interact with the Rapidata Web API in an easy way.
5
5
  License: Apache-2.0
6
6
  Author: Rapidata AG