tracebloc 4.0.1__tar.gz → 4.0.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.
- {tracebloc-4.0.1 → tracebloc-4.0.2}/PKG-INFO +1 -1
- {tracebloc-4.0.1 → tracebloc-4.0.2}/pyproject.toml +1 -1
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/client.py +120 -18
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc.egg-info/PKG-INFO +1 -1
- {tracebloc-4.0.1 → tracebloc-4.0.2}/MANIFEST.in +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/README.md +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/license.txt +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/setup.cfg +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/_linking.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/_upload_conversion.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/api/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/api/experiment_status.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/api/responses.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/auth/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/auth/env_login.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/checks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/compat/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/compat/deprecation.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/compat/frameworks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/config.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/contracts/stage_urls.v1.json +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/contracts/stage_urls.v1.source.json +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/contracts/survival_payload.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/contracts/training_requirements.source.json +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/contracts/training_requirements.txt +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/acceptance.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/families/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/families/hf/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/families/hf/_build.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/families/hf/_model_type.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/families/tabular.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/families/vision/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/families/vision/_matching.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/gate.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/heads.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/interfaces.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/licence/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/licence/spdx.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/outputs.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/arguments.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/assemble.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/checkpoint.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/gate_rules.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/generate.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/head.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/import_check.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/layer0.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/live.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/model_class.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/remote.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/repo.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/shake.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/owncode/source_tree.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/package.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/padding.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/report.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/tokenizers.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/convert/training_versions.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/base.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/detection.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/keypoint_detection.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/semantic_segmentation.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/tabular.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/text.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/time_series.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/datasets/time_to_event.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/downloads/lifelines_weights.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/downloads/seed_weights.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/env_login.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/exceptions.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/fetch.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/inference.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/library_fetch.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/lifelines_weights.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/link_model_dataset.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/answer.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/augmentation_methods.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/check_model.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/conversion.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/data_methods.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/library.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/model_dataset.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/regeneration.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/response.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/stored.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/training_methods.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/linking/user_methods.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/templates/_partials.tpl +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/templates/embeddings.tpl +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/templates/nlp_finetune.tpl +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/templates/nlp_generative.tpl +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/templates/survival.tpl +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/templates/tabular_timeseries.tpl +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/notebook/templates/vision_from_scratch.tpl +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/classes.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/declaration.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/fitted_model.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/frame_recording.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/link_check.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/pairs.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/schema.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/seed_prefixes.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/sklearn_check.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/survival.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/torch_checks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/raw_mode/width_note.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/augmentation.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/callbacks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/converted.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/features.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/image_channels.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/image_size.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/link_total.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/lora.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/lora_validation.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/loss.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/loss_policy.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/loss_source.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/memory_estimate.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/memory_sizing.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/plan.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/preprocessing.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/shape.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/subdataset.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/submitter.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/training/summary.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/lifelines_time_to_event.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/loss_config.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/model_params.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/model_upload.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/nlp_probes.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/scikit_survival_time_to_event.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/sequence_length.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/skl_tabular_base.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/skl_tabular_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/skl_tabular_regression.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/statistical_base.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/survival_base.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_causal_language_modeler.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_embeddings.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_handler.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_image_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_key_point_detector.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_masked_language_modeler.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_multi_label_text_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_nlp_base.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_object_detector.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_semantic_segmentation.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_sentence_pair_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_seq2seq_modeler.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_tabular_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_tabular_regression.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_text_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_text_regressor.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_time_series_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_time_series_forecaster.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_time_to_event.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/torch_token_classifier.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/user_methods.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/weight_loaders.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/weights_averaging.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/weights_check.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/upload/weights_parts.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/user.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/class_order.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/constants.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/custom_loss_probe.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/data_probes.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/declared_classes.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/declared_cls.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/detection_utils.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/device.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/entry_point.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/errors.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/feature_dict.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/model_loading.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/model_params.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/registry.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/resources.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/safetensors_io.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/staging.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/tabular_classification_utils.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/tabular_custom_loss_utils.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/tabular_regression_utils.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/text_classification_utils.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/time_series_utils.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/time_to_event_utils.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/utils/warnings_once.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/__init__.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/checker.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/estimator_checks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/header_rules.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/lifelines_checks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/pytorch_checks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/rewriter.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/scikit_survival_checks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc/validation/sklearn_checks.py +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc.egg-info/SOURCES.txt +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc.egg-info/dependency_links.txt +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc.egg-info/requires.txt +0 -0
- {tracebloc-4.0.1 → tracebloc-4.0.2}/tracebloc.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tracebloc"
|
|
7
|
-
version = "4.0.
|
|
7
|
+
version = "4.0.2"
|
|
8
8
|
description = "Build AI with anyone. On data that can't move. SDK for the tracebloc collaborative AI workspace."
|
|
9
9
|
license = "MIT"
|
|
10
10
|
license-files = ["license.txt"]
|
|
@@ -23,6 +23,13 @@ are **not** automatically retried, because a server-side 500 on an
|
|
|
23
23
|
upload might still have persisted the model and a retry would create
|
|
24
24
|
a duplicate. POST failures bubble up as :class:`APIError`; callers can
|
|
25
25
|
implement idempotent retry at their layer if they want.
|
|
26
|
+
|
|
27
|
+
**Overload (HTTP 429):** the backend sheds load with ``429`` plus
|
|
28
|
+
``Retry-After``. A rejected request was not processed, so reads
|
|
29
|
+
(``GET``/``HEAD``/``OPTIONS``) and login wait the stated time and retry
|
|
30
|
+
(:func:`_send_honouring_429`: each wait capped at :data:`MAX_RETRY_WAIT_SECONDS`,
|
|
31
|
+
all waits at :data:`MAX_TOTAL_WAIT_SECONDS`). Past the budget, and at once for
|
|
32
|
+
every other call, the failure says the service is busy (:data:`BUSY_MESSAGE`).
|
|
26
33
|
"""
|
|
27
34
|
|
|
28
35
|
from __future__ import annotations
|
|
@@ -31,7 +38,11 @@ from typing import Any, Dict, Mapping, Optional
|
|
|
31
38
|
|
|
32
39
|
import json as _json
|
|
33
40
|
import platform
|
|
41
|
+
import time
|
|
42
|
+
from datetime import datetime, timezone
|
|
43
|
+
from email.utils import parsedate_to_datetime
|
|
34
44
|
from importlib import metadata as _metadata
|
|
45
|
+
from typing import Callable
|
|
35
46
|
|
|
36
47
|
import requests
|
|
37
48
|
from requests.adapters import HTTPAdapter
|
|
@@ -76,13 +87,83 @@ SDK_VERSION = _sdk_version()
|
|
|
76
87
|
USER_AGENT = f"tracebloc-sdk/{SDK_VERSION} (python/{platform.python_version()})"
|
|
77
88
|
|
|
78
89
|
|
|
90
|
+
#: Longest single ``Retry-After`` wait, and the most an SDK call waits in total.
|
|
91
|
+
MAX_RETRY_WAIT_SECONDS = 60.0
|
|
92
|
+
MAX_TOTAL_WAIT_SECONDS = 180.0
|
|
93
|
+
|
|
94
|
+
#: Wait when a 429 names no usable ``Retry-After``; also the shortest wait taken,
|
|
95
|
+
#: so a ``Retry-After: 0`` still spends the budget and the loop ends.
|
|
96
|
+
_DEFAULT_RETRY_WAIT_SECONDS = 1.0
|
|
97
|
+
|
|
98
|
+
#: Methods that are re-sent on a 429 (reads); login is re-sent explicitly.
|
|
99
|
+
_RETRY_ON_429_METHODS = frozenset({"GET", "HEAD", "OPTIONS"})
|
|
100
|
+
|
|
101
|
+
#: What a 429 reads as once the SDK has stopped waiting, or does not wait.
|
|
102
|
+
BUSY_MESSAGE = (
|
|
103
|
+
"The tracebloc service is busy right now (HTTP 429). "
|
|
104
|
+
"Please retry in a few minutes."
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Indirection so tests can run the waits without sleeping.
|
|
108
|
+
_sleep = time.sleep
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _retry_after_seconds(response: requests.Response) -> float:
|
|
112
|
+
"""Seconds a 429 asks us to wait: ``Retry-After`` as delay-seconds or an
|
|
113
|
+
HTTP date; a default when absent or unreadable. Never negative."""
|
|
114
|
+
raw = response.headers.get("Retry-After")
|
|
115
|
+
if isinstance(raw, str) and raw.strip():
|
|
116
|
+
raw = raw.strip()
|
|
117
|
+
try:
|
|
118
|
+
return max(0.0, float(raw))
|
|
119
|
+
except ValueError:
|
|
120
|
+
pass
|
|
121
|
+
try:
|
|
122
|
+
when = parsedate_to_datetime(raw)
|
|
123
|
+
if when.tzinfo is None:
|
|
124
|
+
when = when.replace(tzinfo=timezone.utc)
|
|
125
|
+
return max(0.0, (when - datetime.now(timezone.utc)).total_seconds())
|
|
126
|
+
except (TypeError, ValueError):
|
|
127
|
+
pass
|
|
128
|
+
return _DEFAULT_RETRY_WAIT_SECONDS
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _send_honouring_429(
|
|
132
|
+
send: Callable[[], requests.Response], *, retry: bool
|
|
133
|
+
) -> requests.Response:
|
|
134
|
+
"""Run ``send``; on a 429 with ``retry`` wait ``Retry-After`` and run it
|
|
135
|
+
again until the budget (:data:`MAX_TOTAL_WAIT_SECONDS`) is spent.
|
|
136
|
+
|
|
137
|
+
Returns the last response, which may still be a 429 for the caller's
|
|
138
|
+
error handling. The wait that would overrun the budget is not taken.
|
|
139
|
+
"""
|
|
140
|
+
waited = 0.0
|
|
141
|
+
while True:
|
|
142
|
+
response = send()
|
|
143
|
+
if response.status_code != 429 or not retry:
|
|
144
|
+
return response
|
|
145
|
+
wait = min(
|
|
146
|
+
max(_retry_after_seconds(response), _DEFAULT_RETRY_WAIT_SECONDS),
|
|
147
|
+
MAX_RETRY_WAIT_SECONDS,
|
|
148
|
+
)
|
|
149
|
+
if waited + wait > MAX_TOTAL_WAIT_SECONDS:
|
|
150
|
+
return response
|
|
151
|
+
response.close()
|
|
152
|
+
_sleep(wait)
|
|
153
|
+
waited += wait
|
|
154
|
+
|
|
155
|
+
|
|
79
156
|
def _error_message(response: requests.Response) -> str:
|
|
80
157
|
"""The user-facing message for a non-2xx response.
|
|
81
158
|
|
|
82
159
|
A 426 is the backend refusing this SDK as older than the oldest it
|
|
83
160
|
supports (``{"error": "upgrade_required", "min_version": ...}``); say
|
|
84
161
|
that, with the fix, rather than the bare ``upgrade_required`` code.
|
|
162
|
+
A 429 is the backend shedding load: :data:`BUSY_MESSAGE`, never the
|
|
163
|
+
server's own wording.
|
|
85
164
|
"""
|
|
165
|
+
if response.status_code == 429:
|
|
166
|
+
return BUSY_MESSAGE
|
|
86
167
|
if response.status_code == 426:
|
|
87
168
|
try:
|
|
88
169
|
body = response.json()
|
|
@@ -101,7 +182,21 @@ def _error_message(response: requests.Response) -> str:
|
|
|
101
182
|
return _extract_error_message(response)
|
|
102
183
|
|
|
103
184
|
|
|
104
|
-
|
|
185
|
+
class _Retry(Retry):
|
|
186
|
+
"""urllib3 ``Retry`` that leaves a 429 alone.
|
|
187
|
+
|
|
188
|
+
A 429's ``Retry-After`` is honoured, capped, by ``_send_honouring_429``;
|
|
189
|
+
urllib3's own sleep on it is uncapped and would stack on that budget. The
|
|
190
|
+
header still governs a 503's wait.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
def is_retry(self, method, status_code, has_retry_after=False):
|
|
194
|
+
if status_code == 429:
|
|
195
|
+
return False
|
|
196
|
+
return super().is_retry(method, status_code, has_retry_after)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
_DEFAULT_RETRY = _Retry(
|
|
105
200
|
total=3,
|
|
106
201
|
backoff_factor=0.5,
|
|
107
202
|
status_forcelist=(500, 502, 503, 504),
|
|
@@ -252,17 +347,21 @@ class TraceblocClient:
|
|
|
252
347
|
# Only passed when asked for, so every existing call is issued exactly
|
|
253
348
|
# as before.
|
|
254
349
|
extra = {"stream": True} if stream else {}
|
|
350
|
+
verb = method.upper()
|
|
255
351
|
try:
|
|
256
|
-
response =
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
352
|
+
response = _send_honouring_429(
|
|
353
|
+
lambda: self._session.request(
|
|
354
|
+
method=verb,
|
|
355
|
+
url=url,
|
|
356
|
+
data=data,
|
|
357
|
+
json=json,
|
|
358
|
+
files=files,
|
|
359
|
+
params=params,
|
|
360
|
+
headers=self._headers(headers),
|
|
361
|
+
timeout=request_timeout,
|
|
362
|
+
**extra,
|
|
363
|
+
),
|
|
364
|
+
retry=verb in _RETRY_ON_429_METHODS,
|
|
266
365
|
)
|
|
267
366
|
except requests.RequestException as error:
|
|
268
367
|
raise APIError(
|
|
@@ -312,13 +411,16 @@ class TraceblocClient:
|
|
|
312
411
|
"""
|
|
313
412
|
url = self._url("api-token-auth/")
|
|
314
413
|
try:
|
|
315
|
-
response =
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
414
|
+
response = _send_honouring_429(
|
|
415
|
+
lambda: self._session.post(
|
|
416
|
+
url,
|
|
417
|
+
data={"username": username, "password": password},
|
|
418
|
+
# Not self._headers(): login must never carry a previous
|
|
419
|
+
# session's Authorization, only who is calling.
|
|
420
|
+
headers={"User-Agent": USER_AGENT},
|
|
421
|
+
timeout=self._config.timeout_seconds,
|
|
422
|
+
),
|
|
423
|
+
retry=True,
|
|
322
424
|
)
|
|
323
425
|
except requests.RequestException as error:
|
|
324
426
|
raise APIError(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|