rapidata 1.6.0__tar.gz → 1.6.2__tar.gz
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-1.6.0 → rapidata-1.6.2}/PKG-INFO +2 -1
- {rapidata-1.6.0 → rapidata-1.6.2}/pyproject.toml +2 -1
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/rapidata_client.py +3 -3
- rapidata-1.6.2/src/rapidata/service/credential_manager.py +232 -0
- rapidata-1.6.2/src/rapidata/service/openapi_service.py +70 -0
- rapidata-1.6.2/src/rapidata/service/token_manager.py +175 -0
- rapidata-1.6.0/src/rapidata/service/openapi_service.py +0 -109
- {rapidata-1.6.0 → rapidata-1.6.2}/LICENSE +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/README.md +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/campaign_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/coco_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/compare_workflow_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/datapoint_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/dataset_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/identity_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/newsletter_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/order_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/pipeline_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/rapid_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/rapidata_identity_api_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/simple_workflow_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/user_info_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/validation_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api/workflow_api.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api_client.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/api_response.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/configuration.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/exceptions.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/add_campaign_artifact_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/add_campaign_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/add_validation_rapid_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/add_validation_rapid_model_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/add_validation_rapid_model_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/add_validation_rapid_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/add_validation_text_rapid_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/admin_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/admin_order_model_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/age_group.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/age_user_filter_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/aggregator_type.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/attach_category_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/attach_category_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/attach_category_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/base_error.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/bounding_box_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/bounding_box_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/bounding_box_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/bounding_box_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/box_shape.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/campaign_artifact_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/campaign_query_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/campaign_query_model_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/campaign_status.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/campaign_user_filter_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/capped_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/capped_selection_selections_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/classification_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/classification_metadata_filter_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/classification_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/classify_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/clone_dataset_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/clone_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/clone_order_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_config_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_config_rapid_selection_configs_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_config_referee.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_get_result_overview_get200_response.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_model1.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/compare_workflow_model1_referee.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/completed_rapid_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/completed_rapid_model_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/conditional_validation_rapid_selection_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/conditional_validation_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/coordinate.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/correlated_rapid_selection_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/count_classification_metadata_filter_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/count_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/count_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/country_user_filter_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_client_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_client_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_complex_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_complex_order_model_pipeline.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_complex_order_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_dataset_artifact_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_dataset_artifact_model_dataset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_default_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_default_order_model_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_demographic_rapid_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_empty_validation_set_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_independent_workflow_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_independent_workflow_model_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_independent_workflow_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_legacy_client_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_legacy_order_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_order_model_referee.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_order_model_selections_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_order_model_user_filters_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_order_model_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_order_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_simple_pipeline_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_simple_pipeline_model_artifacts_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_simple_pipeline_model_pipeline_steps_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/create_unsupported_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/customer_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/customer_order_model_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/datapoint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/datapoint_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/datapoint_get_by_id_get200_response.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/datapoint_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/datapoint_metadata_model_metadata_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/datapoint_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/datapoint_model_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/dataset_artifact_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/dataset_evaluation_step_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/demographic_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/demographic_rapid_selection_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/demographic_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/early_stopping_referee_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/empty_validation_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/error_type.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/evaluation_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/evaluation_workflow_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/feature_flag.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/feature_flag_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/feedback_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_artifact_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_asset_metadata_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_asset_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_asset_model1.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_asset_model1_metadata_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_asset_model2.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/file_asset_model_metadata_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/filter_operator.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/free_text_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/free_text_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/free_text_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/gender.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/gender_user_filter_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_attach_category_workflow_result_overview_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_available_validation_sets_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_compare_workflow_result_overview_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_compare_workflow_result_overview_small_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_datapoints_by_dataset_id_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_dataset_by_id_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_order_by_id_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_order_results_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_pipeline_by_id_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_pipeline_by_id_result_artifacts_value.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_public_orders_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_simple_workflow_result_overview_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_validation_set_by_id_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_workflow_by_id_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_workflow_by_id_result_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_workflow_config_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_workflow_config_result_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_workflow_progress_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/get_workflow_result_overview_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/i_workflow_model_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/image_dimension_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/image_dimension_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/import_from_file_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/import_validation_set_from_file_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/in_progress_rapid_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/issue_auth_token_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/issue_client_auth_token_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/labeling_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/language_user_filter_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/legacy_issue_client_auth_token_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/legacy_request_password_reset_command.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/legacy_submit_password_reset_command.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/line.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/line_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/line_point.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/line_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/line_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/line_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/locate_box_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/locate_coordinate.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/locate_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/locate_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/locate_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/location_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/location_metadata_exists_filter_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/location_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/logic_operator.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/login_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/metadata_visibilities.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/multi_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/multi_asset_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/multi_asset_model1.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/multi_asset_model1_assets_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/multi_asset_model2.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/naive_referee_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/naive_referee_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/named_classification.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/named_entity_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/named_entity_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/named_entity_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/named_entity_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/never_ending_referee_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/newsletter_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/no_validation_workflow_rapid_selection_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/not_started_rapid_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/null_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/null_asset_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/null_asset_model1.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/null_asset_model2.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/only_validation_workflow_rapid_selection_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/order_model_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/order_query_get200_response.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/order_state.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/original_filename_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/original_filename_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/page_info.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/polygon_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/polygon_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/polygon_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/polygon_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/private_text_metadata_input.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/probabilistic_attach_category_referee_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/prompt_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/prompt_metadata_input.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/prompt_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/public_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/public_text_metadata_input.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_campaigns_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_orders_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_validation_rapids_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_validation_rapids_result_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_validation_rapids_result_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_validation_set_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/query_workflows_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/ranked_datapoint_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/rapid_answer.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/rapid_answer_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/rapid_result_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/rapid_result_model_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/rapid_skipped_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/register_temporary_customer_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/request_password_reset_command.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/root_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/send_completion_mail_step_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/shape.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/signup_customer_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/signup_shadow_customer_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_config_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_config_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_config_model_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_get_result_overview_get200_response.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_model1.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_model1_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/simple_workflow_model_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/skip_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/sort_criterion.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/sort_direction.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/static_rapid_selection_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/static_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/submit_coco_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/submit_coco_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/submit_password_reset_command.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/text_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/text_asset_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/text_asset_model1.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/text_asset_model2.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/text_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/text_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_metadata_input.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_payload.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_rapid_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_truth.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/transcription_word.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/translated_prompt_metadata_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/translated_string.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/unlock_order_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/update_access_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/update_order_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/update_workflow_config_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/update_workflow_config_model_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/update_workflow_config_request.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/update_workflow_config_request_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/upload_coco_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/upload_datapoints_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/upload_files_from_s3_bucket_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/upload_text_sources_to_dataset_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/user_score_user_filter_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_chance.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_import_post_request_blueprint.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_rapid_selection_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_set.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_set_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_set_model_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_set_overview_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/validation_set_paged_result.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_aggregation_step_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_artifact_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_config_artifact_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_config_artifact_model_workflow_config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_labeling_step_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_split_model.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_split_model_filter_configs_inner.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/models/workflow_state.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client/rest.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/api_client_README.md +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/assets/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/assets/base_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/assets/media_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/assets/multi_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/assets/text_asset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/config.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/country_codes/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/country_codes/country_codes.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/dataset/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/dataset/rapidata_dataset.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/dataset/rapidata_validation_set.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/dataset/validation_rapid_parts.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/dataset/validation_set_builder.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/age_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/base_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/campaign_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/country_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/gender_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/language_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/filter/user_score_filter.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/metadata/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/metadata/base_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/metadata/private_text_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/metadata/prompt_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/metadata/public_text_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/metadata/transcription_metadata.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/order/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/order/rapidata_order.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/order/rapidata_order_builder.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/referee/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/referee/base_referee.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/referee/early_stopping_referee.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/referee/naive_referee.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/selection/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/selection/base_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/selection/capped_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/selection/conditional_validation_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/selection/demographic_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/selection/labeling_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/selection/validation_selection.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/settings/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/settings/feature_flags.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/settings/settings.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/simple_builders/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/simple_builders/simple_classification_builders.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/simple_builders/simple_compare_builders.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/workflow/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/workflow/base_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/workflow/classify_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/workflow/compare_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/workflow/evaluation_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/workflow/free_text_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/rapidata_client/workflow/transcription_workflow.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/service/__init__.py +0 -0
- {rapidata-1.6.0 → rapidata-1.6.2}/src/rapidata/service/local_file_service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: rapidata
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.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
|
|
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Requires-Dist: deprecated (>=1.2.14,<2.0.0)
|
|
15
16
|
Requires-Dist: pillow (>=10.4.0,<11.0.0)
|
|
16
17
|
Requires-Dist: pydantic (>=2.8.2,<3.0.0)
|
|
17
18
|
Requires-Dist: pyjwt (>=2.9.0,<3.0.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "rapidata"
|
|
3
|
-
version = "1.6.
|
|
3
|
+
version = "1.6.2"
|
|
4
4
|
description = "Rapidata package containing the Rapidata Python Client to interact with the Rapidata Web API in an easy way."
|
|
5
5
|
authors = ["Rapidata AG <info@rapidata.ai>"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -15,6 +15,7 @@ pillow = "^10.4.0"
|
|
|
15
15
|
pydantic = "^2.8.2"
|
|
16
16
|
python-dateutil = "^2.9.0.post0"
|
|
17
17
|
tqdm = "^4.66.5"
|
|
18
|
+
deprecated = "^1.2.14"
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
[tool.poetry.group.dev.dependencies]
|
|
@@ -27,10 +27,10 @@ class RapidataClient:
|
|
|
27
27
|
|
|
28
28
|
def __init__(
|
|
29
29
|
self,
|
|
30
|
-
client_id: str,
|
|
31
|
-
client_secret: str,
|
|
30
|
+
client_id: str | None = None,
|
|
31
|
+
client_secret: str | None = None,
|
|
32
32
|
endpoint: str = "https://api.rapidata.ai",
|
|
33
|
-
token_url: str = "https://auth.rapidata.ai
|
|
33
|
+
token_url: str = "https://auth.rapidata.ai",
|
|
34
34
|
oauth_scope: str = "openid",
|
|
35
35
|
cert_path: str | None = None,
|
|
36
36
|
):
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
import time
|
|
4
|
+
import webbrowser
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from socket import gethostname
|
|
8
|
+
from typing import Dict, List, Optional, Tuple
|
|
9
|
+
|
|
10
|
+
import requests
|
|
11
|
+
from pydantic import BaseModel
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ClientCredential(BaseModel):
|
|
15
|
+
display_name: str
|
|
16
|
+
client_id: str
|
|
17
|
+
client_secret: str
|
|
18
|
+
endpoint: str
|
|
19
|
+
created_at: datetime
|
|
20
|
+
last_used: datetime
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def from_dict(cls, data: Dict):
|
|
24
|
+
return cls(
|
|
25
|
+
display_name=data["display_name"],
|
|
26
|
+
client_id=data["client_id"],
|
|
27
|
+
client_secret=data["client_secret"],
|
|
28
|
+
endpoint=data["endpoint"],
|
|
29
|
+
created_at=datetime.fromisoformat(data["created_at"]),
|
|
30
|
+
last_used=datetime.fromisoformat(data["last_used"]),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def to_dict(self) -> Dict:
|
|
34
|
+
return {
|
|
35
|
+
"display_name": self.display_name,
|
|
36
|
+
"client_id": self.client_id,
|
|
37
|
+
"client_secret": self.client_secret,
|
|
38
|
+
"endpoint": self.endpoint,
|
|
39
|
+
"created_at": self.created_at.isoformat(),
|
|
40
|
+
"last_used": self.last_used.isoformat(),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def get_display_string(self):
|
|
44
|
+
return f"{self.display_name} - Client ID: {self.client_id} (Created: {self.created_at.strftime('%Y-%m-%d %H:%M:%S')})"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class BridgeToken(BaseModel):
|
|
48
|
+
read_key: str
|
|
49
|
+
write_key: str
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class CredentialManager:
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
endpoint: str,
|
|
56
|
+
cert_path: str | None = None,
|
|
57
|
+
poll_timeout: int = 60,
|
|
58
|
+
poll_interval: int = 1,
|
|
59
|
+
):
|
|
60
|
+
self.endpoint = endpoint
|
|
61
|
+
self.cert_path = cert_path
|
|
62
|
+
self.poll_timeout = poll_timeout
|
|
63
|
+
self.poll_interval = poll_interval
|
|
64
|
+
|
|
65
|
+
self.config_dir = Path.home() / ".config" / "rapidata"
|
|
66
|
+
self.config_path = self.config_dir / "credentials.json"
|
|
67
|
+
|
|
68
|
+
# Ensure config directory exists
|
|
69
|
+
self.config_dir.mkdir(parents=True, exist_ok=True)
|
|
70
|
+
|
|
71
|
+
def _read_credentials(self) -> Dict[str, List[ClientCredential]]:
|
|
72
|
+
"""Read all stored credentials from the config file."""
|
|
73
|
+
if not self.config_path.exists():
|
|
74
|
+
return {}
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
with open(self.config_path, "r") as f:
|
|
78
|
+
data = json.load(f)
|
|
79
|
+
return {
|
|
80
|
+
env: [ClientCredential.from_dict(cred) for cred in creds]
|
|
81
|
+
for env, creds in data.items()
|
|
82
|
+
}
|
|
83
|
+
except json.JSONDecodeError:
|
|
84
|
+
return {}
|
|
85
|
+
|
|
86
|
+
def _write_credentials(
|
|
87
|
+
self, credentials: Dict[str, List[ClientCredential]]
|
|
88
|
+
) -> None:
|
|
89
|
+
data = {
|
|
90
|
+
env: [cred.to_dict() for cred in creds]
|
|
91
|
+
for env, creds in credentials.items()
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
with open(self.config_path, "w") as f:
|
|
95
|
+
json.dump(data, f, indent=2)
|
|
96
|
+
|
|
97
|
+
# Ensure file is only readable by the user
|
|
98
|
+
os.chmod(self.config_path, 0o600)
|
|
99
|
+
|
|
100
|
+
def _store_credential(self, credential: ClientCredential) -> None:
|
|
101
|
+
credentials = self._read_credentials()
|
|
102
|
+
|
|
103
|
+
if credential.endpoint not in credentials:
|
|
104
|
+
credentials[credential.endpoint] = []
|
|
105
|
+
|
|
106
|
+
credentials[credential.endpoint].append(credential)
|
|
107
|
+
self._write_credentials(credentials)
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _select_credential(
|
|
111
|
+
credentials: List[ClientCredential],
|
|
112
|
+
) -> Optional[ClientCredential]:
|
|
113
|
+
if not credentials:
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
if len(credentials) == 1:
|
|
117
|
+
return credentials[0]
|
|
118
|
+
|
|
119
|
+
return max(credentials, key=lambda c: c.last_used)
|
|
120
|
+
|
|
121
|
+
def get_client_credentials(self) -> Optional[ClientCredential]:
|
|
122
|
+
"""Gets stored client credentials or create new ones via browser auth."""
|
|
123
|
+
credentials = self._read_credentials()
|
|
124
|
+
env_credentials = credentials.get(self.endpoint, [])
|
|
125
|
+
|
|
126
|
+
if env_credentials:
|
|
127
|
+
credential = self._select_credential(env_credentials)
|
|
128
|
+
if credential:
|
|
129
|
+
credential.last_used = datetime.now(timezone.utc)
|
|
130
|
+
self._write_credentials(credentials)
|
|
131
|
+
return credential
|
|
132
|
+
|
|
133
|
+
return self._create_new_credentials()
|
|
134
|
+
|
|
135
|
+
def _get_bridge_tokens(self) -> Optional[BridgeToken]:
|
|
136
|
+
"""Get bridge tokens from the identity endpoint."""
|
|
137
|
+
try:
|
|
138
|
+
bridge_endpoint = (
|
|
139
|
+
f"{self.endpoint}/Identity/CreateBridgeToken?clientId=rapidata-cli"
|
|
140
|
+
)
|
|
141
|
+
response = requests.post(bridge_endpoint, verify=self.cert_path)
|
|
142
|
+
if not response.ok:
|
|
143
|
+
print(f"Failed to get bridge tokens: {response.status_code}")
|
|
144
|
+
return None
|
|
145
|
+
|
|
146
|
+
data = response.json()
|
|
147
|
+
return BridgeToken(read_key=data["readKey"], write_key=data["writeKey"])
|
|
148
|
+
except requests.RequestException as e:
|
|
149
|
+
print(f"Failed to get bridge tokens: {e}")
|
|
150
|
+
return None
|
|
151
|
+
|
|
152
|
+
def _poll_read_key(self, read_key: str) -> Optional[str]:
|
|
153
|
+
"""Poll the read key endpoint until we get an access token."""
|
|
154
|
+
read_endpoint = f"{self.endpoint}/Identity/ReadBridgeToken"
|
|
155
|
+
start_time = time.time()
|
|
156
|
+
|
|
157
|
+
while time.time() - start_time < self.poll_timeout:
|
|
158
|
+
try:
|
|
159
|
+
response = requests.get(
|
|
160
|
+
read_endpoint, params={"readKey": read_key}, verify=self.cert_path
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
if response.status_code == 200:
|
|
164
|
+
return response.json().get("accessToken")
|
|
165
|
+
elif response.status_code == 202:
|
|
166
|
+
# Still processing
|
|
167
|
+
time.sleep(self.poll_interval)
|
|
168
|
+
continue
|
|
169
|
+
else:
|
|
170
|
+
# Error occurred
|
|
171
|
+
print(f"Error polling read key: {response.status_code}")
|
|
172
|
+
return None
|
|
173
|
+
|
|
174
|
+
except requests.RequestException as e:
|
|
175
|
+
print(f"Error polling read key: {e}")
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
print("Polling timed out")
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
def _create_client(self, access_token: str) -> Optional[Tuple[str, str, str]]:
|
|
182
|
+
"""Create a new client using the access token."""
|
|
183
|
+
try:
|
|
184
|
+
# set the display name to the hostname
|
|
185
|
+
display_name = f"{gethostname()} - CLI"
|
|
186
|
+
response = requests.post(
|
|
187
|
+
f"{self.endpoint}/Client",
|
|
188
|
+
headers={
|
|
189
|
+
"Authorization": f"Bearer {access_token}",
|
|
190
|
+
"Content-Type": "application/json",
|
|
191
|
+
"Accept": "*/*",
|
|
192
|
+
},
|
|
193
|
+
json={"displayName": display_name},
|
|
194
|
+
verify=self.cert_path,
|
|
195
|
+
)
|
|
196
|
+
response.raise_for_status()
|
|
197
|
+
data = response.json()
|
|
198
|
+
return data.get("clientId"), data.get("clientSecret"), display_name
|
|
199
|
+
except requests.RequestException as e:
|
|
200
|
+
print(f"Failed to create client: {e}")
|
|
201
|
+
return None
|
|
202
|
+
|
|
203
|
+
def _create_new_credentials(self) -> Optional[ClientCredential]:
|
|
204
|
+
bridge_endpoint = self._get_bridge_tokens()
|
|
205
|
+
if not bridge_endpoint:
|
|
206
|
+
return None
|
|
207
|
+
|
|
208
|
+
auth_url = f"{self.endpoint}/connect/authorize/external?clientId=rapidata-cli&scope=openid profile email&writeKey={bridge_endpoint.write_key}"
|
|
209
|
+
webbrowser.open(auth_url)
|
|
210
|
+
|
|
211
|
+
access_token = self._poll_read_key(bridge_endpoint.read_key)
|
|
212
|
+
if not access_token:
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
client_state = self._create_client(access_token)
|
|
216
|
+
|
|
217
|
+
if not client_state:
|
|
218
|
+
raise ValueError("Failed to create client")
|
|
219
|
+
|
|
220
|
+
client_id, client_secret, display_name = client_state
|
|
221
|
+
|
|
222
|
+
credential = ClientCredential(
|
|
223
|
+
client_id=client_id,
|
|
224
|
+
client_secret=client_secret,
|
|
225
|
+
display_name=display_name,
|
|
226
|
+
endpoint=self.endpoint,
|
|
227
|
+
created_at=datetime.now(timezone.utc),
|
|
228
|
+
last_used=datetime.now(timezone.utc),
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
self._store_credential(credential)
|
|
232
|
+
return credential
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from rapidata.api_client.api.campaign_api import CampaignApi
|
|
2
|
+
from rapidata.api_client.api.dataset_api import DatasetApi
|
|
3
|
+
from rapidata.api_client.api.order_api import OrderApi
|
|
4
|
+
from rapidata.api_client.api.pipeline_api import PipelineApi
|
|
5
|
+
from rapidata.api_client.api.rapid_api import RapidApi
|
|
6
|
+
from rapidata.api_client.api.validation_api import ValidationApi
|
|
7
|
+
from rapidata.api_client.api.workflow_api import WorkflowApi
|
|
8
|
+
from rapidata.api_client.api_client import ApiClient
|
|
9
|
+
from rapidata.api_client.configuration import Configuration
|
|
10
|
+
from rapidata.service.token_manager import TokenManager, TokenInfo
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class OpenAPIService:
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
client_id: str | None,
|
|
17
|
+
client_secret: str | None,
|
|
18
|
+
endpoint: str,
|
|
19
|
+
token_url: str,
|
|
20
|
+
oauth_scope: str,
|
|
21
|
+
cert_path: str | None = None,
|
|
22
|
+
):
|
|
23
|
+
token_manager = TokenManager(
|
|
24
|
+
client_id=client_id,
|
|
25
|
+
client_secret=client_secret,
|
|
26
|
+
endpoint=token_url,
|
|
27
|
+
oauth_scope=oauth_scope,
|
|
28
|
+
cert_path=cert_path
|
|
29
|
+
)
|
|
30
|
+
client_configuration = Configuration(host=endpoint, ssl_ca_cert=cert_path)
|
|
31
|
+
self.api_client = ApiClient(configuration=client_configuration)
|
|
32
|
+
|
|
33
|
+
self._client_id = client_id
|
|
34
|
+
self._client_secret = client_secret
|
|
35
|
+
self._oauth_scope = oauth_scope
|
|
36
|
+
self._token_url = f"{token_url}/connect/token"
|
|
37
|
+
self._cert_path = cert_path
|
|
38
|
+
|
|
39
|
+
token_manager.start_token_refresh(token_callback=self._set_token)
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def order_api(self) -> OrderApi:
|
|
43
|
+
return OrderApi(self.api_client)
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def dataset_api(self) -> DatasetApi:
|
|
47
|
+
return DatasetApi(self.api_client)
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def validation_api(self) -> ValidationApi:
|
|
51
|
+
return ValidationApi(self.api_client)
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def rapid_api(self) -> RapidApi:
|
|
55
|
+
return RapidApi(self.api_client)
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def campaign_api(self) -> CampaignApi:
|
|
59
|
+
return CampaignApi(self.api_client)
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def pipeline_api(self) -> PipelineApi:
|
|
63
|
+
return PipelineApi(self.api_client)
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def workflow_api(self) -> WorkflowApi:
|
|
67
|
+
return WorkflowApi(self.api_client)
|
|
68
|
+
|
|
69
|
+
def _set_token(self, token: TokenInfo):
|
|
70
|
+
self.api_client.configuration.api_key["bearer"] = f"Bearer {token.access_token}"
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import threading
|
|
4
|
+
from datetime import datetime, timedelta
|
|
5
|
+
from typing import Optional, Callable
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from rapidata.service.credential_manager import CredentialManager
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TokenInfo(BaseModel):
|
|
16
|
+
access_token: str
|
|
17
|
+
expires_in: int
|
|
18
|
+
issued_at: datetime
|
|
19
|
+
token_type: str = "Bearer"
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def auth_header(self):
|
|
23
|
+
return f"{self.token_type} {self.access_token}"
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def time_remaining(self):
|
|
27
|
+
remaining = (
|
|
28
|
+
(self.issued_at + timedelta(seconds=self.expires_in)) - datetime.now()
|
|
29
|
+
).total_seconds()
|
|
30
|
+
return max(0.0, remaining)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TokenManager:
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
client_id: str | None = None,
|
|
37
|
+
client_secret: str | None = None,
|
|
38
|
+
endpoint: str = "https://auth.rapidata.ai",
|
|
39
|
+
oauth_scope: str = "openid profile email",
|
|
40
|
+
cert_path: str | None = None,
|
|
41
|
+
refresh_threshold: float = 0.8,
|
|
42
|
+
max_sleep_time: float = 30,
|
|
43
|
+
):
|
|
44
|
+
self._client_id = client_id
|
|
45
|
+
self._client_secret = client_secret
|
|
46
|
+
|
|
47
|
+
if not client_id or not client_secret:
|
|
48
|
+
credential_manager = CredentialManager(
|
|
49
|
+
endpoint=endpoint, cert_path=cert_path
|
|
50
|
+
)
|
|
51
|
+
credentials = credential_manager.get_client_credentials()
|
|
52
|
+
if not credentials:
|
|
53
|
+
raise ValueError("Failed to fetch client credentials")
|
|
54
|
+
self._client_id = credentials.client_id
|
|
55
|
+
self._client_secret = credentials.client_secret
|
|
56
|
+
|
|
57
|
+
self._endpoint = endpoint
|
|
58
|
+
self._oauth_scope = oauth_scope
|
|
59
|
+
self._cert_path = cert_path
|
|
60
|
+
self._refresh_threshold = refresh_threshold
|
|
61
|
+
self._max_sleep_time = max_sleep_time
|
|
62
|
+
|
|
63
|
+
self._token_lock = threading.Lock()
|
|
64
|
+
self._current_token: Optional[TokenInfo] = None
|
|
65
|
+
self._refresh_thread: Optional[threading.Thread] = None
|
|
66
|
+
self._should_stop = threading.Event()
|
|
67
|
+
|
|
68
|
+
def fetch_token(self):
|
|
69
|
+
try:
|
|
70
|
+
response = requests.post(
|
|
71
|
+
f"{self._endpoint}/connect/token",
|
|
72
|
+
data={
|
|
73
|
+
"grant_type": "client_credentials",
|
|
74
|
+
"client_id": self._client_id,
|
|
75
|
+
"client_secret": self._client_secret,
|
|
76
|
+
"scope": self._oauth_scope,
|
|
77
|
+
},
|
|
78
|
+
verify=self._cert_path,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
if response.ok:
|
|
82
|
+
data = response.json()
|
|
83
|
+
return TokenInfo(
|
|
84
|
+
access_token=data["access_token"],
|
|
85
|
+
token_type=data["token_type"],
|
|
86
|
+
expires_in=data["expires_in"],
|
|
87
|
+
issued_at=datetime.now(),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
else:
|
|
91
|
+
data = response.text
|
|
92
|
+
error_description = "An unknown error occurred"
|
|
93
|
+
if "error_description" in data:
|
|
94
|
+
error_description = (
|
|
95
|
+
data.split("error_description")[1].split("\n")[0].strip()
|
|
96
|
+
)
|
|
97
|
+
raise ValueError(f"Failed to fetch token: {error_description}")
|
|
98
|
+
except requests.RequestException as e:
|
|
99
|
+
raise ValueError(f"Failed to fetch token: {e}")
|
|
100
|
+
except json.JSONDecodeError as e:
|
|
101
|
+
raise ValueError(f"Failed to parse token response: {e}")
|
|
102
|
+
except KeyError as e:
|
|
103
|
+
raise ValueError(f"Failed to extract token from response: {e}")
|
|
104
|
+
|
|
105
|
+
def start_token_refresh(self, token_callback: Callable[[TokenInfo], None]) -> None:
|
|
106
|
+
if self._refresh_thread and self._refresh_thread.is_alive():
|
|
107
|
+
logger.error("Token refresh thread is already running")
|
|
108
|
+
return
|
|
109
|
+
|
|
110
|
+
def refresh_loop():
|
|
111
|
+
while not self._should_stop.is_set():
|
|
112
|
+
try:
|
|
113
|
+
with self._token_lock:
|
|
114
|
+
if self._should_refresh_token(self._current_token):
|
|
115
|
+
logger.debug("Refreshing token")
|
|
116
|
+
self._current_token = self.fetch_token()
|
|
117
|
+
token_callback(self._current_token)
|
|
118
|
+
|
|
119
|
+
if self._current_token:
|
|
120
|
+
time_until_refresh_threshold = (
|
|
121
|
+
self._current_token.time_remaining
|
|
122
|
+
- (
|
|
123
|
+
self._current_token.expires_in
|
|
124
|
+
* (1 - self._refresh_threshold)
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
logger.debug("Time until refresh threshold: %s", time_until_refresh_threshold)
|
|
128
|
+
sleep_time = min(
|
|
129
|
+
self._max_sleep_time, time_until_refresh_threshold
|
|
130
|
+
)
|
|
131
|
+
logger.debug(
|
|
132
|
+
f"Sleeping for {sleep_time} until checking the token again"
|
|
133
|
+
)
|
|
134
|
+
self._should_stop.wait(timeout=max(1.0, sleep_time))
|
|
135
|
+
else:
|
|
136
|
+
self._should_stop.wait(timeout=self._max_sleep_time)
|
|
137
|
+
except Exception as e:
|
|
138
|
+
logger.error("Failed to refresh token: %s", e)
|
|
139
|
+
self._should_stop.wait(timeout=5)
|
|
140
|
+
|
|
141
|
+
self._should_stop.clear()
|
|
142
|
+
self._refresh_thread = threading.Thread(target=refresh_loop, daemon=True)
|
|
143
|
+
self._refresh_thread.start()
|
|
144
|
+
|
|
145
|
+
def stop_token_refresh(self):
|
|
146
|
+
self._should_stop.set()
|
|
147
|
+
if self._refresh_thread:
|
|
148
|
+
self._refresh_thread.join(timeout=1)
|
|
149
|
+
self._refresh_thread = None
|
|
150
|
+
|
|
151
|
+
def get_current_token(self) -> Optional[TokenInfo]:
|
|
152
|
+
with self._token_lock:
|
|
153
|
+
return self._current_token
|
|
154
|
+
|
|
155
|
+
def _should_refresh_token(self, token: TokenInfo | None) -> bool:
|
|
156
|
+
if not token:
|
|
157
|
+
return True
|
|
158
|
+
|
|
159
|
+
limit = token.expires_in * (1 - self._refresh_threshold)
|
|
160
|
+
|
|
161
|
+
logger.debug(
|
|
162
|
+
"The token was issued at %s, it expires in %s. It has %s seconds remaining and we refresh the token when it has %s seconds remaining",
|
|
163
|
+
token.issued_at,
|
|
164
|
+
token.expires_in,
|
|
165
|
+
token.time_remaining,
|
|
166
|
+
limit,
|
|
167
|
+
)
|
|
168
|
+
return token.time_remaining < limit
|
|
169
|
+
|
|
170
|
+
def __enter__(self):
|
|
171
|
+
return self
|
|
172
|
+
|
|
173
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
174
|
+
self.stop_token_refresh()
|
|
175
|
+
return False
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import time
|
|
3
|
-
import requests
|
|
4
|
-
import threading
|
|
5
|
-
from rapidata.api_client.api.campaign_api import CampaignApi
|
|
6
|
-
from rapidata.api_client.api.dataset_api import DatasetApi
|
|
7
|
-
from rapidata.api_client.api.order_api import OrderApi
|
|
8
|
-
from rapidata.api_client.api.pipeline_api import PipelineApi
|
|
9
|
-
from rapidata.api_client.api.rapid_api import RapidApi
|
|
10
|
-
from rapidata.api_client.api.validation_api import ValidationApi
|
|
11
|
-
from rapidata.api_client.api.workflow_api import WorkflowApi
|
|
12
|
-
from rapidata.api_client.api_client import ApiClient
|
|
13
|
-
from rapidata.api_client.configuration import Configuration
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class OpenAPIService:
|
|
17
|
-
|
|
18
|
-
_TOKEN_EXPIRATION_MINUTES = 30
|
|
19
|
-
|
|
20
|
-
def __init__(
|
|
21
|
-
self,
|
|
22
|
-
client_id: str,
|
|
23
|
-
client_secret: str,
|
|
24
|
-
endpoint: str,
|
|
25
|
-
token_url: str,
|
|
26
|
-
oauth_scope: str,
|
|
27
|
-
cert_path: str | None = None
|
|
28
|
-
):
|
|
29
|
-
client_configuration = Configuration(host=endpoint, ssl_ca_cert=cert_path)
|
|
30
|
-
self.api_client = ApiClient(configuration=client_configuration)
|
|
31
|
-
|
|
32
|
-
self._client_id = client_id
|
|
33
|
-
self._client_secret = client_secret
|
|
34
|
-
self._oauth_scope = oauth_scope
|
|
35
|
-
self._token_url = token_url
|
|
36
|
-
self._cert_path = cert_path
|
|
37
|
-
|
|
38
|
-
self._api_client = ApiClient()
|
|
39
|
-
self._order_api = OrderApi(self.api_client)
|
|
40
|
-
self._dataset_api = DatasetApi(self.api_client)
|
|
41
|
-
|
|
42
|
-
api_token = self.__fetch_token(
|
|
43
|
-
self._client_id, self._client_secret, self._oauth_scope, self._token_url, self._cert_path
|
|
44
|
-
)
|
|
45
|
-
self.api_client.configuration.api_key["bearer"] = f"Bearer {api_token}"
|
|
46
|
-
|
|
47
|
-
refresh_thread = threading.Thread(
|
|
48
|
-
target=lambda: self.__refresh_token_periodically(self._TOKEN_EXPIRATION_MINUTES - 1)
|
|
49
|
-
)
|
|
50
|
-
refresh_thread.daemon = True
|
|
51
|
-
refresh_thread.start()
|
|
52
|
-
|
|
53
|
-
def __refresh_token_periodically(self, refresh_interval):
|
|
54
|
-
while True:
|
|
55
|
-
new_token = self.__fetch_token(
|
|
56
|
-
self._client_id, self._client_secret, self._oauth_scope, self._token_url, self._cert_path
|
|
57
|
-
)
|
|
58
|
-
self.api_client.configuration.api_key["bearer"] = f"Bearer {new_token}"
|
|
59
|
-
|
|
60
|
-
time.sleep(refresh_interval)
|
|
61
|
-
|
|
62
|
-
@property
|
|
63
|
-
def order_api(self) -> OrderApi:
|
|
64
|
-
return self._order_api
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def dataset_api(self) -> DatasetApi:
|
|
68
|
-
return self._dataset_api
|
|
69
|
-
|
|
70
|
-
@property
|
|
71
|
-
def validation_api(self) -> ValidationApi:
|
|
72
|
-
return ValidationApi(self.api_client)
|
|
73
|
-
|
|
74
|
-
@property
|
|
75
|
-
def rapid_api(self) -> RapidApi:
|
|
76
|
-
return RapidApi(self.api_client)
|
|
77
|
-
|
|
78
|
-
@property
|
|
79
|
-
def campaign_api(self) -> CampaignApi:
|
|
80
|
-
return CampaignApi(self.api_client)
|
|
81
|
-
|
|
82
|
-
@property
|
|
83
|
-
def pipeline_api(self) -> PipelineApi:
|
|
84
|
-
return PipelineApi(self.api_client)
|
|
85
|
-
|
|
86
|
-
@property
|
|
87
|
-
def workflow_api(self) -> WorkflowApi:
|
|
88
|
-
return WorkflowApi(self.api_client)
|
|
89
|
-
|
|
90
|
-
@staticmethod
|
|
91
|
-
def __fetch_token(client_id: str, client_secret: str, scope: str, token_url: str, cert_path: str | None = None) -> str:
|
|
92
|
-
try:
|
|
93
|
-
return requests.post(
|
|
94
|
-
token_url,
|
|
95
|
-
data={
|
|
96
|
-
'grant_type': 'client_credentials',
|
|
97
|
-
'client_id': client_id,
|
|
98
|
-
'client_secret': client_secret,
|
|
99
|
-
'scope': scope,
|
|
100
|
-
},
|
|
101
|
-
verify=cert_path
|
|
102
|
-
).json()['access_token']
|
|
103
|
-
except requests.RequestException as e:
|
|
104
|
-
raise Exception(f"Failed to fetch token: {e}")
|
|
105
|
-
except json.JSONDecodeError as e:
|
|
106
|
-
raise Exception(f"Failed to parse token response: {e}")
|
|
107
|
-
except KeyError as e:
|
|
108
|
-
raise Exception(f"Failed to extract token from response: {e}")
|
|
109
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|