rapidata 1.10.0__py3-none-any.whl → 2.0.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.
Potentially problematic release.
This version of rapidata might be problematic. Click here for more details.
- rapidata/__init__.py +21 -17
- rapidata/api_client/__init__.py +15 -5
- rapidata/api_client/api/coco_api.py +14 -29
- rapidata/api_client/api/dataset_api.py +6 -6
- rapidata/api_client/api/identity_api.py +3 -3
- rapidata/api_client/api/pipeline_api.py +1008 -95
- rapidata/api_client/api/rapid_api.py +6 -6
- rapidata/api_client/api/validation_api.py +12 -42
- rapidata/api_client/models/__init__.py +15 -5
- rapidata/api_client/models/add_campaign_model.py +1 -3
- rapidata/api_client/models/add_validation_text_rapid_model.py +1 -1
- rapidata/api_client/models/age_group.py +5 -4
- rapidata/api_client/models/base_error.py +1 -4
- rapidata/api_client/models/compare_workflow_config.py +9 -24
- rapidata/api_client/models/compare_workflow_config_model.py +9 -29
- rapidata/api_client/models/compare_workflow_config_model_pair_maker_config.py +140 -0
- rapidata/api_client/models/compare_workflow_config_pair_maker_config.py +140 -0
- rapidata/api_client/models/compare_workflow_model.py +7 -3
- rapidata/api_client/models/compare_workflow_model1.py +7 -3
- rapidata/api_client/models/compare_workflow_model1_pair_maker_information.py +140 -0
- rapidata/api_client/models/compare_workflow_model_pair_maker_config.py +140 -0
- rapidata/api_client/models/file_asset_model_metadata_inner.py +8 -22
- rapidata/api_client/models/get_classify_workflow_result_overview_result.py +144 -0
- rapidata/api_client/models/get_pipeline_by_id_result.py +13 -3
- rapidata/api_client/models/identity_read_bridge_token_get202_response.py +140 -0
- rapidata/api_client/models/not_available_yet_result.py +96 -0
- rapidata/api_client/models/online_pair_maker_config.py +98 -0
- rapidata/api_client/models/online_pair_maker_config_model.py +98 -0
- rapidata/api_client/models/online_pair_maker_information.py +100 -0
- rapidata/api_client/models/pipeline_id_workflow_put_request.py +140 -0
- rapidata/api_client/models/pre_arranged_pair_maker_config.py +100 -0
- rapidata/api_client/models/pre_arranged_pair_maker_config_model.py +96 -0
- rapidata/api_client/models/pre_arranged_pair_maker_information.py +102 -0
- rapidata/api_client/models/read_bridge_token_keys_result.py +11 -2
- rapidata/api_client/models/simple_workflow_config.py +7 -26
- rapidata/api_client/models/simple_workflow_config_model.py +4 -28
- rapidata/api_client/models/simple_workflow_get_result_overview_get200_response.py +16 -16
- rapidata/api_client/models/simple_workflow_model1.py +3 -3
- rapidata/api_client/models/update_campaign_model.py +99 -0
- rapidata/api_client/models/validation_import_post_request_blueprint.py +1 -1
- rapidata/api_client_README.md +20 -7
- rapidata/rapidata_client/__init__.py +18 -9
- rapidata/rapidata_client/assets/__init__.py +5 -4
- rapidata/rapidata_client/assets/{media_asset.py → _media_asset.py} +32 -11
- rapidata/rapidata_client/assets/{multi_asset.py → _multi_asset.py} +1 -1
- rapidata/rapidata_client/assets/{text_asset.py → _text_asset.py} +1 -1
- rapidata/rapidata_client/assets/data_type_enum.py +7 -0
- rapidata/rapidata_client/filter/__init__.py +1 -1
- rapidata/rapidata_client/filter/_base_filter.py +10 -0
- rapidata/rapidata_client/filter/age_filter.py +12 -5
- rapidata/rapidata_client/filter/campaign_filter.py +12 -3
- rapidata/rapidata_client/filter/country_filter.py +10 -3
- rapidata/rapidata_client/filter/gender_filter.py +12 -5
- rapidata/rapidata_client/filter/language_filter.py +14 -3
- rapidata/rapidata_client/filter/models/age_group.py +26 -0
- rapidata/rapidata_client/filter/models/gender.py +19 -0
- rapidata/rapidata_client/filter/rapidata_filters.py +31 -0
- rapidata/rapidata_client/filter/user_score_filter.py +20 -4
- rapidata/rapidata_client/metadata/__init__.py +5 -5
- rapidata/rapidata_client/metadata/{base_metadata.py → _base_metadata.py} +2 -1
- rapidata/rapidata_client/metadata/{private_text_metadata.py → _private_text_metadata.py} +2 -2
- rapidata/rapidata_client/metadata/{prompt_metadata.py → _prompt_metadata.py} +3 -2
- rapidata/rapidata_client/metadata/{public_text_metadata.py → _public_text_metadata.py} +2 -2
- rapidata/rapidata_client/metadata/{select_words_metadata.py → _select_words_metadata.py} +3 -2
- rapidata/rapidata_client/{dataset/rapidata_dataset.py → order/_rapidata_dataset.py} +7 -8
- rapidata/rapidata_client/order/_rapidata_order_builder.py +365 -0
- rapidata/rapidata_client/order/rapidata_order.py +49 -31
- rapidata/rapidata_client/order/rapidata_order_manager.py +461 -0
- rapidata/rapidata_client/rapidata_client.py +12 -201
- rapidata/rapidata_client/referee/__init__.py +3 -3
- rapidata/rapidata_client/referee/{base_referee.py → _base_referee.py} +3 -3
- rapidata/rapidata_client/referee/{early_stopping_referee.py → _early_stopping_referee.py} +14 -11
- rapidata/rapidata_client/referee/{naive_referee.py → _naive_referee.py} +9 -9
- rapidata/rapidata_client/selection/__init__.py +1 -1
- rapidata/rapidata_client/{filter/base_filter.py → selection/_base_selection.py} +2 -2
- rapidata/rapidata_client/selection/capped_selection.py +15 -5
- rapidata/rapidata_client/selection/conditional_validation_selection.py +17 -4
- rapidata/rapidata_client/selection/demographic_selection.py +18 -7
- rapidata/rapidata_client/selection/labeling_selection.py +10 -3
- rapidata/rapidata_client/selection/rapidata_selections.py +21 -0
- rapidata/rapidata_client/selection/validation_selection.py +11 -4
- rapidata/rapidata_client/settings/__init__.py +9 -2
- rapidata/rapidata_client/settings/_rapidata_setting.py +11 -0
- rapidata/rapidata_client/settings/alert_on_fast_response.py +21 -0
- rapidata/rapidata_client/settings/custom_setting.py +16 -0
- rapidata/rapidata_client/settings/free_text_minimum_characters.py +16 -0
- rapidata/rapidata_client/settings/models/__init__.py +1 -0
- rapidata/rapidata_client/settings/models/translation_behaviour_options.py +14 -0
- rapidata/rapidata_client/settings/no_shuffle.py +16 -0
- rapidata/rapidata_client/settings/play_video_until_the_end.py +16 -0
- rapidata/rapidata_client/settings/rapidata_settings.py +31 -0
- rapidata/rapidata_client/settings/translation_behaviour.py +18 -0
- rapidata/rapidata_client/validation/__init__.py +1 -0
- rapidata/rapidata_client/{dataset/validation_rapid_parts.py → validation/_validation_rapid_parts.py} +7 -6
- rapidata/rapidata_client/validation/_validation_set_builder.py +371 -0
- rapidata/rapidata_client/{dataset → validation}/rapidata_validation_set.py +54 -50
- rapidata/rapidata_client/validation/rapids/__init__.py +1 -0
- rapidata/rapidata_client/validation/rapids/box.py +17 -0
- rapidata/rapidata_client/validation/rapids/rapids.py +94 -0
- rapidata/rapidata_client/validation/rapids/rapids_manager.py +163 -0
- rapidata/rapidata_client/validation/validation_set_manager.py +335 -0
- rapidata/rapidata_client/workflow/__init__.py +8 -6
- rapidata/rapidata_client/workflow/_base_workflow.py +25 -0
- rapidata/rapidata_client/workflow/{classify_workflow.py → _classify_workflow.py} +6 -6
- rapidata/rapidata_client/workflow/{compare_workflow.py → _compare_workflow.py} +10 -16
- rapidata/rapidata_client/workflow/_draw_workflow.py +22 -0
- rapidata/rapidata_client/workflow/_evaluation_workflow.py +26 -0
- rapidata/rapidata_client/workflow/{free_text_workflow.py → _free_text_workflow.py} +10 -16
- rapidata/rapidata_client/workflow/_locate_workflow.py +22 -0
- rapidata/rapidata_client/workflow/{select_words_workflow.py → _select_words_workflow.py} +2 -8
- rapidata/service/credential_manager.py +11 -1
- rapidata/service/openapi_service.py +23 -4
- {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/METADATA +2 -1
- {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/RECORD +118 -94
- rapidata/constants.py +0 -1
- rapidata/rapidata_client/dataset/rapid_builders/__init__.py +0 -4
- rapidata/rapidata_client/dataset/rapid_builders/base_rapid_builder.py +0 -33
- rapidata/rapidata_client/dataset/rapid_builders/classify_rapid_builders.py +0 -166
- rapidata/rapidata_client/dataset/rapid_builders/compare_rapid_builders.py +0 -145
- rapidata/rapidata_client/dataset/rapid_builders/rapids.py +0 -33
- rapidata/rapidata_client/dataset/rapid_builders/select_words_rapid_builders.py +0 -124
- rapidata/rapidata_client/dataset/validation_set_builder.py +0 -336
- rapidata/rapidata_client/order/order_builder.py +0 -25
- rapidata/rapidata_client/order/rapidata_order_builder.py +0 -463
- rapidata/rapidata_client/selection/base_selection.py +0 -9
- rapidata/rapidata_client/settings/feature_flags.py +0 -125
- rapidata/rapidata_client/settings/settings.py +0 -124
- rapidata/rapidata_client/simple_builders/__init__.py +0 -0
- rapidata/rapidata_client/simple_builders/simple_classification_builders.py +0 -271
- rapidata/rapidata_client/simple_builders/simple_compare_builders.py +0 -267
- rapidata/rapidata_client/simple_builders/simple_free_text_builders.py +0 -192
- rapidata/rapidata_client/simple_builders/simple_select_words_builders.py +0 -196
- rapidata/rapidata_client/workflow/base_workflow.py +0 -42
- rapidata/rapidata_client/workflow/evaluation_workflow.py +0 -15
- /rapidata/rapidata_client/assets/{base_asset.py → _base_asset.py} +0 -0
- /rapidata/rapidata_client/{dataset → filter/models}/__init__.py +0 -0
- {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/LICENSE +0 -0
- {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
from rapidata.api_client.models.capped_selection_selections_inner import (
|
|
2
|
+
CappedSelectionSelectionsInner,
|
|
3
|
+
)
|
|
4
|
+
from rapidata.api_client.models.create_order_model import CreateOrderModel
|
|
5
|
+
from rapidata.api_client.models.create_order_model_referee import (
|
|
6
|
+
CreateOrderModelReferee,
|
|
7
|
+
)
|
|
8
|
+
from rapidata.api_client.models.create_order_model_user_filters_inner import (
|
|
9
|
+
CreateOrderModelUserFiltersInner,
|
|
10
|
+
)
|
|
11
|
+
from rapidata.api_client.models.create_order_model_workflow import (
|
|
12
|
+
CreateOrderModelWorkflow,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
from rapidata.rapidata_client.settings import RapidataSetting
|
|
16
|
+
from rapidata.rapidata_client.metadata._base_metadata import Metadata
|
|
17
|
+
from rapidata.rapidata_client.order._rapidata_dataset import RapidataDataset
|
|
18
|
+
from rapidata.rapidata_client.referee._naive_referee import NaiveReferee
|
|
19
|
+
from rapidata.rapidata_client.selection._base_selection import RapidataSelection
|
|
20
|
+
from rapidata.rapidata_client.filter import RapidataFilter
|
|
21
|
+
from rapidata.rapidata_client.workflow import Workflow
|
|
22
|
+
from rapidata.rapidata_client.order.rapidata_order import RapidataOrder
|
|
23
|
+
from rapidata.rapidata_client.referee import Referee
|
|
24
|
+
from rapidata.service.openapi_service import OpenAPIService
|
|
25
|
+
|
|
26
|
+
from rapidata.rapidata_client.workflow._compare_workflow import CompareWorkflow
|
|
27
|
+
|
|
28
|
+
from rapidata.rapidata_client.assets import MediaAsset, TextAsset, MultiAsset, BaseAsset
|
|
29
|
+
|
|
30
|
+
from typing import Optional, cast, Sequence
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class RapidataOrderBuilder:
|
|
34
|
+
"""Builder object for creating Rapidata orders.
|
|
35
|
+
|
|
36
|
+
Use the fluent interface to set the desired configuration. Add a workflow to the order using `.workflow()` and finally call `.create()` to create the order.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
openapi_service (OpenAPIService): The OpenAPIService instance.
|
|
40
|
+
name (str): The name of the order.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
name: str,
|
|
46
|
+
openapi_service: OpenAPIService,
|
|
47
|
+
):
|
|
48
|
+
self._name = name
|
|
49
|
+
self.order_id: str | None = None
|
|
50
|
+
self.__openapi_service = openapi_service
|
|
51
|
+
self.__dataset: Optional[RapidataDataset]
|
|
52
|
+
self.__workflow: Workflow | None = None
|
|
53
|
+
self.__referee: Referee | None = None
|
|
54
|
+
self.__metadata: Sequence[Metadata] | None = None
|
|
55
|
+
self.__validation_set_id: str | None = None
|
|
56
|
+
self.__settings: Sequence[RapidataSetting] | None = None
|
|
57
|
+
self.__user_filters: list[RapidataFilter] = []
|
|
58
|
+
self.__selections: list[RapidataSelection] = []
|
|
59
|
+
self.__priority: int = 50
|
|
60
|
+
self.__assets: Sequence[BaseAsset] = []
|
|
61
|
+
|
|
62
|
+
def _to_model(self) -> CreateOrderModel:
|
|
63
|
+
"""
|
|
64
|
+
Convert the builder configuration to a CreateOrderModel.
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
ValueError: If no workflow is provided.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
CreateOrderModel: The model representing the order configuration.
|
|
71
|
+
"""
|
|
72
|
+
if self.__workflow is None:
|
|
73
|
+
raise ValueError("You must provide a workflow to create an order.")
|
|
74
|
+
|
|
75
|
+
if self.__referee is None:
|
|
76
|
+
print("No referee provided, using default NaiveReferee.")
|
|
77
|
+
self.__referee = NaiveReferee()
|
|
78
|
+
|
|
79
|
+
return CreateOrderModel(
|
|
80
|
+
_t="CreateOrderModel",
|
|
81
|
+
orderName=self._name,
|
|
82
|
+
workflow=CreateOrderModelWorkflow(self.__workflow._to_model()),
|
|
83
|
+
userFilters=[
|
|
84
|
+
CreateOrderModelUserFiltersInner(user_filter._to_model())
|
|
85
|
+
for user_filter in self.__user_filters
|
|
86
|
+
],
|
|
87
|
+
referee=CreateOrderModelReferee(self.__referee._to_model()),
|
|
88
|
+
validationSetId=self.__validation_set_id,
|
|
89
|
+
featureFlags=(
|
|
90
|
+
[setting._to_feature_flag() for setting in self.__settings]
|
|
91
|
+
if self.__settings is not None
|
|
92
|
+
else None
|
|
93
|
+
),
|
|
94
|
+
selections=[
|
|
95
|
+
CappedSelectionSelectionsInner(selection._to_model())
|
|
96
|
+
for selection in self.__selections
|
|
97
|
+
],
|
|
98
|
+
priority=self.__priority,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def _create(self, max_upload_workers: int = 10) -> RapidataOrder:
|
|
102
|
+
"""
|
|
103
|
+
Create the Rapidata order by making the necessary API calls based on the builder's configuration.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
max_upload_workers (int, optional): The maximum number of worker threads for processing media paths. Defaults to 10.
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
ValueError: If both media paths and texts are provided, or if neither is provided.
|
|
110
|
+
AssertionError: If the workflow is a CompareWorkflow and media paths are not in pairs.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
RapidataOrder: The created RapidataOrder instance.
|
|
114
|
+
"""
|
|
115
|
+
order_model = self._to_model()
|
|
116
|
+
if isinstance(
|
|
117
|
+
self.__workflow, CompareWorkflow
|
|
118
|
+
): # Temporary fix; will be handled by backend in the future
|
|
119
|
+
assert all(
|
|
120
|
+
isinstance(item, MultiAsset) for item in self.__assets
|
|
121
|
+
), "The media paths must be of type MultiAsset for comparison tasks."
|
|
122
|
+
|
|
123
|
+
result = self.__openapi_service.order_api.order_create_post(
|
|
124
|
+
create_order_model=order_model
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
self.order_id = result.order_id
|
|
128
|
+
|
|
129
|
+
self.__dataset = (
|
|
130
|
+
RapidataDataset(result.dataset_id, self.__openapi_service)
|
|
131
|
+
if result.dataset_id
|
|
132
|
+
else None
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
order = RapidataOrder(
|
|
136
|
+
order_id=self.order_id,
|
|
137
|
+
dataset=self.__dataset,
|
|
138
|
+
openapi_service=self.__openapi_service,
|
|
139
|
+
name=self._name,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
if all(isinstance(item, MediaAsset) for item in self.__assets) and order.dataset:
|
|
143
|
+
assets = cast(list[MediaAsset], self.__assets)
|
|
144
|
+
order.dataset._add_media_from_paths(assets, self.__metadata, max_upload_workers)
|
|
145
|
+
|
|
146
|
+
elif (
|
|
147
|
+
all(isinstance(item, TextAsset) for item in self.__assets) and order.dataset
|
|
148
|
+
):
|
|
149
|
+
assets = cast(list[TextAsset], self.__assets)
|
|
150
|
+
order.dataset._add_texts(assets)
|
|
151
|
+
|
|
152
|
+
elif (
|
|
153
|
+
all(isinstance(item, MultiAsset) for item in self.__assets) and order.dataset
|
|
154
|
+
):
|
|
155
|
+
multi_assets = cast(list[MultiAsset], self.__assets)
|
|
156
|
+
|
|
157
|
+
# Check if all MultiAssets contain the same type of assets
|
|
158
|
+
first_asset_type = type(multi_assets[0].assets[0])
|
|
159
|
+
if not all(
|
|
160
|
+
isinstance(asset, first_asset_type)
|
|
161
|
+
for multi_asset in multi_assets
|
|
162
|
+
for asset in multi_asset.assets
|
|
163
|
+
):
|
|
164
|
+
raise ValueError(
|
|
165
|
+
"All MultiAssets must contain the same type of assets (either all MediaAssets or all TextAssets)."
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Process based on the asset type
|
|
169
|
+
if issubclass(first_asset_type, MediaAsset):
|
|
170
|
+
order.dataset._add_media_from_paths(
|
|
171
|
+
multi_assets, self.__metadata, max_upload_workers
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
elif issubclass(first_asset_type, TextAsset):
|
|
175
|
+
order.dataset._add_texts(multi_assets)
|
|
176
|
+
|
|
177
|
+
else:
|
|
178
|
+
raise ValueError(
|
|
179
|
+
"MultiAsset must contain MediaAssets or TextAssets objects."
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
elif order.dataset:
|
|
183
|
+
raise ValueError(
|
|
184
|
+
"Media paths must all be of the same type: MediaAsset, TextAsset, or MultiAsset."
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
return order
|
|
188
|
+
|
|
189
|
+
def _workflow(self, workflow: Workflow) -> "RapidataOrderBuilder":
|
|
190
|
+
"""
|
|
191
|
+
Set the workflow for the order.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
workflow (Workflow): The workflow to be set.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
198
|
+
"""
|
|
199
|
+
if not isinstance(workflow, Workflow):
|
|
200
|
+
raise TypeError("Workflow must be of type Workflow.")
|
|
201
|
+
|
|
202
|
+
self.__workflow = workflow
|
|
203
|
+
return self
|
|
204
|
+
|
|
205
|
+
def _referee(self, referee: Referee) -> "RapidataOrderBuilder":
|
|
206
|
+
"""
|
|
207
|
+
Set the referee for the order.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
referee (Referee): The referee to be set.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
214
|
+
"""
|
|
215
|
+
if not isinstance(referee, Referee):
|
|
216
|
+
raise TypeError("Referee must be of type Referee.")
|
|
217
|
+
|
|
218
|
+
self.__referee = referee
|
|
219
|
+
return self
|
|
220
|
+
|
|
221
|
+
def _media(
|
|
222
|
+
self,
|
|
223
|
+
asset: Sequence[BaseAsset],
|
|
224
|
+
metadata: Sequence[Metadata] | None = None,
|
|
225
|
+
) -> "RapidataOrderBuilder":
|
|
226
|
+
"""
|
|
227
|
+
Set the media assets for the order.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
asset: (list[MediaAsset] | list[TextAsset] | list[MultiAsset]): The paths of the media assets to be set.
|
|
231
|
+
metadata: (list[Metadata] | None, optional): Metadata for the media assets. Defaults to None.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
235
|
+
"""
|
|
236
|
+
if not isinstance(asset, list):
|
|
237
|
+
raise TypeError("Media paths must be provided as a list of paths.")
|
|
238
|
+
|
|
239
|
+
# for a in asset:
|
|
240
|
+
# if not isinstance(a, (MediaAsset, TextAsset, MultiAsset)):
|
|
241
|
+
# raise TypeError(
|
|
242
|
+
# "Media paths must be of type MediaAsset, TextAsset, or MultiAsset."
|
|
243
|
+
# )
|
|
244
|
+
|
|
245
|
+
if metadata:
|
|
246
|
+
for data in metadata:
|
|
247
|
+
if not isinstance(data, Metadata):
|
|
248
|
+
raise TypeError("Metadata must be of type Metadata.")
|
|
249
|
+
|
|
250
|
+
self.__assets = asset
|
|
251
|
+
self.__metadata = metadata
|
|
252
|
+
return self
|
|
253
|
+
|
|
254
|
+
def _settings(self, settings: Sequence[RapidataSetting]) -> "RapidataOrderBuilder":
|
|
255
|
+
"""
|
|
256
|
+
Set the settings for the order.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
settings (Settings): The settings to be set.
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
if not isinstance(settings, list):
|
|
266
|
+
raise TypeError("Settings must be provided as a list of Setting objects.")
|
|
267
|
+
|
|
268
|
+
for s in settings:
|
|
269
|
+
if not isinstance(s, RapidataSetting):
|
|
270
|
+
raise TypeError("The settings list must only contain Setting objects.")
|
|
271
|
+
|
|
272
|
+
self.__settings = settings
|
|
273
|
+
return self
|
|
274
|
+
|
|
275
|
+
def _filters(self, filters: Sequence[RapidataFilter]) -> "RapidataOrderBuilder":
|
|
276
|
+
"""
|
|
277
|
+
Set the filters for the order, e.g., country, language, userscore, etc.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
filters (Sequence[Filters]): The user filters to be set.
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
284
|
+
"""
|
|
285
|
+
if not isinstance(filters, list):
|
|
286
|
+
raise TypeError("Filters must be provided as a list of Filter objects.")
|
|
287
|
+
|
|
288
|
+
for f in filters:
|
|
289
|
+
if not isinstance(f, RapidataFilter):
|
|
290
|
+
raise TypeError("Filters must be of type Filter.")
|
|
291
|
+
|
|
292
|
+
if len(self.__user_filters) > 0:
|
|
293
|
+
print("Overwriting existing user filters.")
|
|
294
|
+
|
|
295
|
+
self.__user_filters = filters
|
|
296
|
+
return self
|
|
297
|
+
|
|
298
|
+
def _validation_set_id(self, validation_set_id: str) -> "RapidataOrderBuilder":
|
|
299
|
+
"""
|
|
300
|
+
Set the validation set ID for the order.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
validation_set_id (str): The validation set ID to be set.
|
|
304
|
+
|
|
305
|
+
Returns:
|
|
306
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
307
|
+
"""
|
|
308
|
+
if not isinstance(validation_set_id, str):
|
|
309
|
+
raise TypeError("Validation set ID must be of type str.")
|
|
310
|
+
|
|
311
|
+
self.__validation_set_id = validation_set_id
|
|
312
|
+
return self
|
|
313
|
+
|
|
314
|
+
def _rapids_per_bag(self, amount: int) -> "RapidataOrderBuilder":
|
|
315
|
+
"""
|
|
316
|
+
Define the number of tasks a user sees in a single session.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
amount (int): The number of tasks a user sees in a single session.
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
323
|
+
|
|
324
|
+
Raises:
|
|
325
|
+
NotImplementedError: This method is not implemented yet.
|
|
326
|
+
"""
|
|
327
|
+
raise NotImplementedError("Not implemented yet.")
|
|
328
|
+
|
|
329
|
+
def _selections(self, selections: Sequence[RapidataSelection]) -> "RapidataOrderBuilder":
|
|
330
|
+
"""
|
|
331
|
+
Set the selections for the order.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
selections (Sequence[Selection]): The selections to be set.
|
|
335
|
+
|
|
336
|
+
Returns:
|
|
337
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
338
|
+
"""
|
|
339
|
+
if not isinstance(selections, list):
|
|
340
|
+
raise TypeError(
|
|
341
|
+
"Selections must be provided as a list of Selection objects."
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
for selection in selections:
|
|
345
|
+
if not isinstance(selection, RapidataSelection):
|
|
346
|
+
raise TypeError("Selections must be of type Selection.")
|
|
347
|
+
|
|
348
|
+
self.__selections = selections # type: ignore
|
|
349
|
+
return self
|
|
350
|
+
|
|
351
|
+
def _priority(self, priority: int) -> "RapidataOrderBuilder":
|
|
352
|
+
"""
|
|
353
|
+
Set the priority for the order.
|
|
354
|
+
|
|
355
|
+
Args:
|
|
356
|
+
priority (int): The priority to be set.
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
|
|
360
|
+
"""
|
|
361
|
+
if not isinstance(priority, int):
|
|
362
|
+
raise TypeError("Priority must be of type int.")
|
|
363
|
+
|
|
364
|
+
self.__priority = priority
|
|
365
|
+
return self
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from time import sleep
|
|
2
|
-
from rapidata.rapidata_client.
|
|
2
|
+
from rapidata.rapidata_client.order._rapidata_dataset import RapidataDataset
|
|
3
3
|
from rapidata.service.openapi_service import OpenAPIService
|
|
4
4
|
import json
|
|
5
5
|
from rapidata.api_client.exceptions import ApiException
|
|
@@ -9,33 +9,48 @@ from tqdm import tqdm
|
|
|
9
9
|
|
|
10
10
|
class RapidataOrder:
|
|
11
11
|
"""
|
|
12
|
-
|
|
12
|
+
An instance of a Rapidata order.
|
|
13
|
+
|
|
14
|
+
Used to interact with a specific order in the Rapidata system.
|
|
15
|
+
Such as starting, pausing, and getting the results of the order.
|
|
13
16
|
|
|
14
17
|
Args:
|
|
15
|
-
The ID of the order.
|
|
16
|
-
The
|
|
17
|
-
The
|
|
18
|
-
The
|
|
18
|
+
order_id: The ID of the order.
|
|
19
|
+
openapi_service: The OpenAPIService instance used to interact with the Rapidata API.
|
|
20
|
+
name: The name of the order.
|
|
21
|
+
dataset: The optional Dataset associated with the order.
|
|
19
22
|
"""
|
|
20
23
|
|
|
21
24
|
def __init__(
|
|
22
25
|
self,
|
|
23
26
|
order_id: str,
|
|
24
|
-
dataset: Optional[RapidataDataset],
|
|
25
27
|
openapi_service: OpenAPIService,
|
|
26
28
|
name: str,
|
|
29
|
+
dataset: Optional[RapidataDataset]=None,
|
|
27
30
|
):
|
|
28
|
-
self.openapi_service = openapi_service
|
|
29
31
|
self.order_id = order_id
|
|
30
|
-
self._dataset = dataset
|
|
31
32
|
self.name = name
|
|
32
|
-
self.
|
|
33
|
+
self.__openapi_service = openapi_service
|
|
34
|
+
self.__dataset = dataset
|
|
35
|
+
self.__workflow_id = None
|
|
33
36
|
|
|
34
|
-
def
|
|
37
|
+
def run(self, print_link: bool=True):
|
|
35
38
|
"""
|
|
36
|
-
|
|
39
|
+
Runs the order for to start collecting votes.
|
|
37
40
|
"""
|
|
38
|
-
self.
|
|
41
|
+
self.__openapi_service.order_api.order_submit_post(self.order_id)
|
|
42
|
+
|
|
43
|
+
if print_link:
|
|
44
|
+
print(f"Order '{self.name}' is now viewable under: https://app.{self.__openapi_service.enviroment}/order/detail/{self.order_id}")
|
|
45
|
+
|
|
46
|
+
return self
|
|
47
|
+
|
|
48
|
+
def pause(self):
|
|
49
|
+
"""
|
|
50
|
+
Pauses the order.
|
|
51
|
+
"""
|
|
52
|
+
self.__openapi_service.order_api.order_pause_post(self.order_id)
|
|
53
|
+
print(f"Order '{self}' has been paused.")
|
|
39
54
|
|
|
40
55
|
def get_status(self) -> str:
|
|
41
56
|
"""
|
|
@@ -44,19 +59,22 @@ class RapidataOrder:
|
|
|
44
59
|
Returns:
|
|
45
60
|
The status of the order.
|
|
46
61
|
"""
|
|
47
|
-
return self.
|
|
62
|
+
return self.__openapi_service.order_api.order_get_by_id_get(self.order_id).state
|
|
48
63
|
|
|
49
|
-
def display_progress_bar(self, refresh_rate=5):
|
|
64
|
+
def display_progress_bar(self, refresh_rate: int=5):
|
|
50
65
|
"""
|
|
51
66
|
Displays a progress bar for the order processing using tqdm.
|
|
52
67
|
|
|
53
|
-
|
|
54
|
-
How often to refresh the progress bar, in seconds.
|
|
68
|
+
Args:
|
|
69
|
+
refresh_rate: How often to refresh the progress bar, in seconds.
|
|
55
70
|
"""
|
|
71
|
+
if refresh_rate < 1:
|
|
72
|
+
raise ValueError("refresh_rate must be at least 1")
|
|
73
|
+
|
|
56
74
|
with tqdm(total=100, desc="Processing order", unit="%", bar_format="{desc}: {percentage:3.0f}%|{bar}| completed [{elapsed}<{remaining}, {rate_fmt}]") as pbar:
|
|
57
75
|
last_percentage = 0
|
|
58
76
|
while True:
|
|
59
|
-
current_percentage = self.
|
|
77
|
+
current_percentage = self.__get_workflow_progress().completion_percentage
|
|
60
78
|
if current_percentage > last_percentage:
|
|
61
79
|
pbar.update(current_percentage - last_percentage)
|
|
62
80
|
last_percentage = current_percentage
|
|
@@ -66,28 +84,28 @@ class RapidataOrder:
|
|
|
66
84
|
|
|
67
85
|
sleep(refresh_rate)
|
|
68
86
|
|
|
69
|
-
def
|
|
70
|
-
if self.
|
|
71
|
-
return self.
|
|
87
|
+
def __get_workflow_id(self):
|
|
88
|
+
if self.__workflow_id:
|
|
89
|
+
return self.__workflow_id
|
|
72
90
|
|
|
73
91
|
for _ in range(10):
|
|
74
92
|
try:
|
|
75
|
-
order_result = self.
|
|
76
|
-
pipeline = self.
|
|
77
|
-
self.
|
|
93
|
+
order_result = self.__openapi_service.order_api.order_get_by_id_get(self.order_id)
|
|
94
|
+
pipeline = self.__openapi_service.pipeline_api.pipeline_id_get(order_result.pipeline_id)
|
|
95
|
+
self.__workflow_id = cast(WorkflowArtifactModel, pipeline.artifacts["workflow-artifact"].actual_instance).workflow_id
|
|
78
96
|
break
|
|
79
97
|
except Exception:
|
|
80
98
|
sleep(2)
|
|
81
|
-
if not self.
|
|
99
|
+
if not self.__workflow_id:
|
|
82
100
|
raise Exception("Order has not started yet. Please start it or wait for a few seconds and try again.")
|
|
83
|
-
return self.
|
|
101
|
+
return self.__workflow_id
|
|
84
102
|
|
|
85
|
-
def
|
|
86
|
-
workflow_id = self.
|
|
103
|
+
def __get_workflow_progress(self):
|
|
104
|
+
workflow_id = self.__get_workflow_id()
|
|
87
105
|
progress = None
|
|
88
106
|
for _ in range(2):
|
|
89
107
|
try:
|
|
90
|
-
progress = self.
|
|
108
|
+
progress = self.__openapi_service.workflow_api.workflow_get_progress_get(workflow_id)
|
|
91
109
|
break
|
|
92
110
|
except Exception:
|
|
93
111
|
sleep(5)
|
|
@@ -111,7 +129,7 @@ class RapidataOrder:
|
|
|
111
129
|
|
|
112
130
|
try:
|
|
113
131
|
# Get the raw result string
|
|
114
|
-
result_str = self.
|
|
132
|
+
result_str = self.__openapi_service.order_api.order_result_get(id=self.order_id)
|
|
115
133
|
# Parse the result string as JSON
|
|
116
134
|
return json.loads(result_str)
|
|
117
135
|
except ApiException as e:
|
|
@@ -128,7 +146,7 @@ class RapidataOrder:
|
|
|
128
146
|
Returns:
|
|
129
147
|
The RapidataDataset instance.
|
|
130
148
|
"""
|
|
131
|
-
return self.
|
|
149
|
+
return self.__dataset
|
|
132
150
|
|
|
133
151
|
def __str__(self) -> str:
|
|
134
152
|
return f"name: '{self.name}' order id: {self.order_id}"
|