wandb 0.21.2__py3-none-macosx_12_0_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package_readme.md +97 -0
- wandb/__init__.py +248 -0
- wandb/__init__.pyi +1230 -0
- wandb/__main__.py +3 -0
- wandb/_iterutils.py +65 -0
- wandb/_pydantic/__init__.py +30 -0
- wandb/_pydantic/base.py +128 -0
- wandb/_pydantic/utils.py +80 -0
- wandb/_pydantic/v1_compat.py +284 -0
- wandb/agents/__init__.py +0 -0
- wandb/agents/pyagent.py +386 -0
- wandb/analytics/__init__.py +3 -0
- wandb/analytics/sentry.py +267 -0
- wandb/apis/__init__.py +48 -0
- wandb/apis/attrs.py +50 -0
- wandb/apis/importers/__init__.py +1 -0
- wandb/apis/importers/internals/internal.py +382 -0
- wandb/apis/importers/internals/protocols.py +103 -0
- wandb/apis/importers/internals/util.py +78 -0
- wandb/apis/importers/mlflow.py +254 -0
- wandb/apis/importers/validation.py +108 -0
- wandb/apis/importers/wandb.py +1608 -0
- wandb/apis/internal.py +239 -0
- wandb/apis/normalize.py +81 -0
- wandb/apis/paginator.py +138 -0
- wandb/apis/public/__init__.py +35 -0
- wandb/apis/public/api.py +2449 -0
- wandb/apis/public/artifacts.py +1046 -0
- wandb/apis/public/automations.py +85 -0
- wandb/apis/public/const.py +4 -0
- wandb/apis/public/files.py +402 -0
- wandb/apis/public/history.py +201 -0
- wandb/apis/public/integrations.py +203 -0
- wandb/apis/public/jobs.py +742 -0
- wandb/apis/public/projects.py +276 -0
- wandb/apis/public/query_generator.py +176 -0
- wandb/apis/public/registries/__init__.py +0 -0
- wandb/apis/public/registries/_freezable_list.py +179 -0
- wandb/apis/public/registries/_utils.py +138 -0
- wandb/apis/public/registries/registries_search.py +347 -0
- wandb/apis/public/registries/registry.py +358 -0
- wandb/apis/public/reports.py +595 -0
- wandb/apis/public/runs.py +1216 -0
- wandb/apis/public/sweeps.py +440 -0
- wandb/apis/public/teams.py +235 -0
- wandb/apis/public/users.py +177 -0
- wandb/apis/public/utils.py +210 -0
- wandb/apis/reports/__init__.py +1 -0
- wandb/apis/reports/v1/__init__.py +8 -0
- wandb/apis/reports/v2/__init__.py +8 -0
- wandb/apis/workspaces/__init__.py +8 -0
- wandb/automations/__init__.py +73 -0
- wandb/automations/_filters/__init__.py +40 -0
- wandb/automations/_filters/expressions.py +181 -0
- wandb/automations/_filters/operators.py +258 -0
- wandb/automations/_filters/run_metrics.py +330 -0
- wandb/automations/_generated/__init__.py +177 -0
- wandb/automations/_generated/create_automation.py +17 -0
- wandb/automations/_generated/create_generic_webhook_integration.py +43 -0
- wandb/automations/_generated/delete_automation.py +15 -0
- wandb/automations/_generated/enums.py +35 -0
- wandb/automations/_generated/fragments.py +358 -0
- wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
- wandb/automations/_generated/get_automations.py +24 -0
- wandb/automations/_generated/get_automations_by_entity.py +26 -0
- wandb/automations/_generated/input_types.py +104 -0
- wandb/automations/_generated/integrations_by_entity.py +22 -0
- wandb/automations/_generated/operations.py +647 -0
- wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
- wandb/automations/_generated/update_automation.py +17 -0
- wandb/automations/_utils.py +235 -0
- wandb/automations/_validators.py +165 -0
- wandb/automations/actions.py +218 -0
- wandb/automations/automations.py +85 -0
- wandb/automations/events.py +285 -0
- wandb/automations/integrations.py +45 -0
- wandb/automations/scopes.py +78 -0
- wandb/beta/workflows.py +324 -0
- wandb/bin/gpu_stats +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/__init__.py +0 -0
- wandb/cli/beta.py +175 -0
- wandb/cli/cli.py +2883 -0
- wandb/data_types.py +66 -0
- wandb/docker/__init__.py +290 -0
- wandb/docker/names.py +40 -0
- wandb/docker/wandb-entrypoint.sh +33 -0
- wandb/env.py +535 -0
- wandb/errors/__init__.py +17 -0
- wandb/errors/errors.py +40 -0
- wandb/errors/links.py +73 -0
- wandb/errors/term.py +415 -0
- wandb/errors/util.py +57 -0
- wandb/errors/warnings.py +2 -0
- wandb/filesync/__init__.py +0 -0
- wandb/filesync/dir_watcher.py +404 -0
- wandb/filesync/stats.py +100 -0
- wandb/filesync/step_checksum.py +142 -0
- wandb/filesync/step_prepare.py +179 -0
- wandb/filesync/step_upload.py +287 -0
- wandb/filesync/upload_job.py +142 -0
- wandb/integration/__init__.py +0 -0
- wandb/integration/catboost/__init__.py +5 -0
- wandb/integration/catboost/catboost.py +182 -0
- wandb/integration/cohere/__init__.py +3 -0
- wandb/integration/cohere/cohere.py +21 -0
- wandb/integration/cohere/resolver.py +347 -0
- wandb/integration/diffusers/__init__.py +3 -0
- wandb/integration/diffusers/autologger.py +76 -0
- wandb/integration/diffusers/pipeline_resolver.py +50 -0
- wandb/integration/diffusers/resolvers/__init__.py +9 -0
- wandb/integration/diffusers/resolvers/multimodal.py +881 -0
- wandb/integration/diffusers/resolvers/utils.py +102 -0
- wandb/integration/fastai/__init__.py +243 -0
- wandb/integration/gym/__init__.py +98 -0
- wandb/integration/huggingface/__init__.py +3 -0
- wandb/integration/huggingface/huggingface.py +18 -0
- wandb/integration/huggingface/resolver.py +213 -0
- wandb/integration/keras/__init__.py +11 -0
- wandb/integration/keras/callbacks/__init__.py +5 -0
- wandb/integration/keras/callbacks/metrics_logger.py +129 -0
- wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
- wandb/integration/keras/callbacks/tables_builder.py +228 -0
- wandb/integration/keras/keras.py +1086 -0
- wandb/integration/kfp/__init__.py +6 -0
- wandb/integration/kfp/helpers.py +28 -0
- wandb/integration/kfp/kfp_patch.py +335 -0
- wandb/integration/kfp/wandb_logging.py +182 -0
- wandb/integration/langchain/__init__.py +3 -0
- wandb/integration/langchain/wandb_tracer.py +49 -0
- wandb/integration/lightgbm/__init__.py +239 -0
- wandb/integration/lightning/__init__.py +0 -0
- wandb/integration/lightning/fabric/__init__.py +3 -0
- wandb/integration/lightning/fabric/logger.py +763 -0
- wandb/integration/metaflow/__init__.py +9 -0
- wandb/integration/metaflow/data_pandas.py +74 -0
- wandb/integration/metaflow/data_pytorch.py +75 -0
- wandb/integration/metaflow/data_sklearn.py +76 -0
- wandb/integration/metaflow/errors.py +13 -0
- wandb/integration/metaflow/metaflow.py +327 -0
- wandb/integration/openai/__init__.py +3 -0
- wandb/integration/openai/fine_tuning.py +480 -0
- wandb/integration/openai/openai.py +22 -0
- wandb/integration/openai/resolver.py +240 -0
- wandb/integration/prodigy/__init__.py +3 -0
- wandb/integration/prodigy/prodigy.py +291 -0
- wandb/integration/sacred/__init__.py +117 -0
- wandb/integration/sagemaker/__init__.py +14 -0
- wandb/integration/sagemaker/auth.py +29 -0
- wandb/integration/sagemaker/config.py +58 -0
- wandb/integration/sagemaker/files.py +2 -0
- wandb/integration/sagemaker/resources.py +63 -0
- wandb/integration/sb3/__init__.py +3 -0
- wandb/integration/sb3/sb3.py +147 -0
- wandb/integration/sklearn/__init__.py +37 -0
- wandb/integration/sklearn/calculate/__init__.py +32 -0
- wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
- wandb/integration/sklearn/calculate/class_proportions.py +68 -0
- wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
- wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
- wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
- wandb/integration/sklearn/calculate/feature_importances.py +67 -0
- wandb/integration/sklearn/calculate/learning_curve.py +64 -0
- wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
- wandb/integration/sklearn/calculate/residuals.py +86 -0
- wandb/integration/sklearn/calculate/silhouette.py +118 -0
- wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
- wandb/integration/sklearn/plot/__init__.py +35 -0
- wandb/integration/sklearn/plot/classifier.py +329 -0
- wandb/integration/sklearn/plot/clusterer.py +146 -0
- wandb/integration/sklearn/plot/regressor.py +121 -0
- wandb/integration/sklearn/plot/shared.py +91 -0
- wandb/integration/sklearn/utils.py +184 -0
- wandb/integration/tensorboard/__init__.py +10 -0
- wandb/integration/tensorboard/log.py +351 -0
- wandb/integration/tensorboard/monkeypatch.py +186 -0
- wandb/integration/tensorflow/__init__.py +5 -0
- wandb/integration/tensorflow/estimator_hook.py +54 -0
- wandb/integration/torch/__init__.py +0 -0
- wandb/integration/torch/wandb_torch.py +554 -0
- wandb/integration/ultralytics/__init__.py +11 -0
- wandb/integration/ultralytics/bbox_utils.py +215 -0
- wandb/integration/ultralytics/callback.py +528 -0
- wandb/integration/ultralytics/classification_utils.py +83 -0
- wandb/integration/ultralytics/mask_utils.py +202 -0
- wandb/integration/ultralytics/pose_utils.py +103 -0
- wandb/integration/weave/__init__.py +6 -0
- wandb/integration/weave/interface.py +49 -0
- wandb/integration/weave/weave.py +63 -0
- wandb/integration/xgboost/__init__.py +11 -0
- wandb/integration/xgboost/xgboost.py +189 -0
- wandb/integration/yolov8/__init__.py +0 -0
- wandb/integration/yolov8/yolov8.py +284 -0
- wandb/jupyter.py +538 -0
- wandb/mpmain/__init__.py +0 -0
- wandb/mpmain/__main__.py +1 -0
- wandb/old/__init__.py +0 -0
- wandb/old/core.py +53 -0
- wandb/old/settings.py +176 -0
- wandb/old/summary.py +438 -0
- wandb/plot/__init__.py +30 -0
- wandb/plot/bar.py +71 -0
- wandb/plot/confusion_matrix.py +185 -0
- wandb/plot/custom_chart.py +147 -0
- wandb/plot/histogram.py +66 -0
- wandb/plot/line.py +75 -0
- wandb/plot/line_series.py +173 -0
- wandb/plot/pr_curve.py +186 -0
- wandb/plot/roc_curve.py +163 -0
- wandb/plot/scatter.py +66 -0
- wandb/plot/utils.py +184 -0
- wandb/plot/viz.py +41 -0
- wandb/proto/__init__.py +0 -0
- wandb/proto/v3/__init__.py +0 -0
- wandb/proto/v3/wandb_base_pb2.py +55 -0
- wandb/proto/v3/wandb_internal_pb2.py +1728 -0
- wandb/proto/v3/wandb_server_pb2.py +228 -0
- wandb/proto/v3/wandb_settings_pb2.py +122 -0
- wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
- wandb/proto/v4/__init__.py +0 -0
- wandb/proto/v4/wandb_base_pb2.py +30 -0
- wandb/proto/v4/wandb_internal_pb2.py +382 -0
- wandb/proto/v4/wandb_server_pb2.py +67 -0
- wandb/proto/v4/wandb_settings_pb2.py +47 -0
- wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
- wandb/proto/v5/wandb_base_pb2.py +31 -0
- wandb/proto/v5/wandb_internal_pb2.py +383 -0
- wandb/proto/v5/wandb_server_pb2.py +68 -0
- wandb/proto/v5/wandb_settings_pb2.py +48 -0
- wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
- wandb/proto/v6/wandb_base_pb2.py +41 -0
- wandb/proto/v6/wandb_internal_pb2.py +393 -0
- wandb/proto/v6/wandb_server_pb2.py +78 -0
- wandb/proto/v6/wandb_settings_pb2.py +58 -0
- wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
- wandb/proto/wandb_base_pb2.py +12 -0
- wandb/proto/wandb_deprecated.py +59 -0
- wandb/proto/wandb_generate_deprecated.py +30 -0
- wandb/proto/wandb_generate_proto.py +49 -0
- wandb/proto/wandb_internal_pb2.py +18 -0
- wandb/proto/wandb_server_pb2.py +12 -0
- wandb/proto/wandb_settings_pb2.py +12 -0
- wandb/proto/wandb_telemetry_pb2.py +12 -0
- wandb/py.typed +0 -0
- wandb/sdk/__init__.py +37 -0
- wandb/sdk/artifacts/__init__.py +0 -0
- wandb/sdk/artifacts/_factories.py +17 -0
- wandb/sdk/artifacts/_generated/__init__.py +508 -0
- wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
- wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
- wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
- wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
- wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
- wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
- wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
- wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
- wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_generated/enums.py +22 -0
- wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
- wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
- wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
- wandb/sdk/artifacts/_generated/fragments.py +459 -0
- wandb/sdk/artifacts/_generated/input_types.py +46 -0
- wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
- wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
- wandb/sdk/artifacts/_generated/operations.py +1223 -0
- wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
- wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
- wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
- wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
- wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
- wandb/sdk/artifacts/_generated/run_input_artifacts.py +51 -0
- wandb/sdk/artifacts/_generated/run_output_artifacts.py +51 -0
- wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
- wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
- wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_graphql_fragments.py +19 -0
- wandb/sdk/artifacts/_internal_artifact.py +54 -0
- wandb/sdk/artifacts/_validators.py +309 -0
- wandb/sdk/artifacts/artifact.py +2702 -0
- wandb/sdk/artifacts/artifact_download_logger.py +45 -0
- wandb/sdk/artifacts/artifact_file_cache.py +251 -0
- wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
- wandb/sdk/artifacts/artifact_manifest.py +76 -0
- wandb/sdk/artifacts/artifact_manifest_entry.py +258 -0
- wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
- wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
- wandb/sdk/artifacts/artifact_saver.py +277 -0
- wandb/sdk/artifacts/artifact_state.py +13 -0
- wandb/sdk/artifacts/artifact_ttl.py +9 -0
- wandb/sdk/artifacts/exceptions.py +71 -0
- wandb/sdk/artifacts/staging.py +27 -0
- wandb/sdk/artifacts/storage_handler.py +62 -0
- wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
- wandb/sdk/artifacts/storage_handlers/azure_handler.py +214 -0
- wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
- wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
- wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
- wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +339 -0
- wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
- wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
- wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
- wandb/sdk/artifacts/storage_layout.py +8 -0
- wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +580 -0
- wandb/sdk/artifacts/storage_policy.py +75 -0
- wandb/sdk/backend/__init__.py +0 -0
- wandb/sdk/backend/backend.py +57 -0
- wandb/sdk/data_types/__init__.py +0 -0
- wandb/sdk/data_types/_dtypes.py +914 -0
- wandb/sdk/data_types/_private.py +10 -0
- wandb/sdk/data_types/audio.py +208 -0
- wandb/sdk/data_types/base_types/__init__.py +0 -0
- wandb/sdk/data_types/base_types/json_metadata.py +55 -0
- wandb/sdk/data_types/base_types/media.py +339 -0
- wandb/sdk/data_types/base_types/wb_value.py +295 -0
- wandb/sdk/data_types/bokeh.py +87 -0
- wandb/sdk/data_types/graph.py +439 -0
- wandb/sdk/data_types/helper_types/__init__.py +0 -0
- wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
- wandb/sdk/data_types/helper_types/classes.py +159 -0
- wandb/sdk/data_types/helper_types/image_mask.py +251 -0
- wandb/sdk/data_types/histogram.py +107 -0
- wandb/sdk/data_types/html.py +165 -0
- wandb/sdk/data_types/image.py +974 -0
- wandb/sdk/data_types/molecule.py +250 -0
- wandb/sdk/data_types/object_3d.py +495 -0
- wandb/sdk/data_types/plotly.py +95 -0
- wandb/sdk/data_types/saved_model.py +435 -0
- wandb/sdk/data_types/table.py +1468 -0
- wandb/sdk/data_types/table_decorators.py +108 -0
- wandb/sdk/data_types/trace_tree.py +440 -0
- wandb/sdk/data_types/utils.py +260 -0
- wandb/sdk/data_types/video.py +303 -0
- wandb/sdk/integration_utils/__init__.py +0 -0
- wandb/sdk/integration_utils/auto_logging.py +232 -0
- wandb/sdk/integration_utils/data_logging.py +475 -0
- wandb/sdk/interface/__init__.py +0 -0
- wandb/sdk/interface/constants.py +4 -0
- wandb/sdk/interface/interface.py +1056 -0
- wandb/sdk/interface/interface_queue.py +40 -0
- wandb/sdk/interface/interface_shared.py +471 -0
- wandb/sdk/interface/interface_sock.py +49 -0
- wandb/sdk/interface/summary_record.py +67 -0
- wandb/sdk/internal/__init__.py +0 -0
- wandb/sdk/internal/_generated/__init__.py +15 -0
- wandb/sdk/internal/_generated/enums.py +4 -0
- wandb/sdk/internal/_generated/input_types.py +4 -0
- wandb/sdk/internal/_generated/operations.py +15 -0
- wandb/sdk/internal/_generated/server_features_query.py +27 -0
- wandb/sdk/internal/context.py +89 -0
- wandb/sdk/internal/datastore.py +293 -0
- wandb/sdk/internal/file_pusher.py +177 -0
- wandb/sdk/internal/file_stream.py +686 -0
- wandb/sdk/internal/handler.py +854 -0
- wandb/sdk/internal/incremental_table_util.py +53 -0
- wandb/sdk/internal/internal_api.py +4723 -0
- wandb/sdk/internal/job_builder.py +639 -0
- wandb/sdk/internal/profiler.py +79 -0
- wandb/sdk/internal/progress.py +77 -0
- wandb/sdk/internal/run.py +27 -0
- wandb/sdk/internal/sample.py +70 -0
- wandb/sdk/internal/sender.py +1692 -0
- wandb/sdk/internal/sender_config.py +203 -0
- wandb/sdk/internal/settings_static.py +120 -0
- wandb/sdk/internal/tb_watcher.py +519 -0
- wandb/sdk/internal/thread_local_settings.py +18 -0
- wandb/sdk/launch/__init__.py +15 -0
- wandb/sdk/launch/_launch.py +331 -0
- wandb/sdk/launch/_launch_add.py +255 -0
- wandb/sdk/launch/_project_spec.py +565 -0
- wandb/sdk/launch/agent/__init__.py +5 -0
- wandb/sdk/launch/agent/agent.py +931 -0
- wandb/sdk/launch/agent/config.py +296 -0
- wandb/sdk/launch/agent/job_status_tracker.py +55 -0
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
- wandb/sdk/launch/builder/__init__.py +0 -0
- wandb/sdk/launch/builder/abstract.py +156 -0
- wandb/sdk/launch/builder/build.py +296 -0
- wandb/sdk/launch/builder/context_manager.py +235 -0
- wandb/sdk/launch/builder/docker_builder.py +177 -0
- wandb/sdk/launch/builder/kaniko_builder.py +595 -0
- wandb/sdk/launch/builder/noop.py +58 -0
- wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
- wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
- wandb/sdk/launch/create_job.py +541 -0
- wandb/sdk/launch/environment/abstract.py +29 -0
- wandb/sdk/launch/environment/aws_environment.py +322 -0
- wandb/sdk/launch/environment/azure_environment.py +105 -0
- wandb/sdk/launch/environment/gcp_environment.py +334 -0
- wandb/sdk/launch/environment/local_environment.py +65 -0
- wandb/sdk/launch/errors.py +13 -0
- wandb/sdk/launch/git_reference.py +109 -0
- wandb/sdk/launch/inputs/files.py +148 -0
- wandb/sdk/launch/inputs/internal.py +314 -0
- wandb/sdk/launch/inputs/manage.py +113 -0
- wandb/sdk/launch/inputs/schema.py +40 -0
- wandb/sdk/launch/loader.py +249 -0
- wandb/sdk/launch/registry/abstract.py +48 -0
- wandb/sdk/launch/registry/anon.py +29 -0
- wandb/sdk/launch/registry/azure_container_registry.py +124 -0
- wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
- wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
- wandb/sdk/launch/registry/local_registry.py +65 -0
- wandb/sdk/launch/runner/__init__.py +0 -0
- wandb/sdk/launch/runner/abstract.py +185 -0
- wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +1285 -0
- wandb/sdk/launch/runner/local_container.py +301 -0
- wandb/sdk/launch/runner/local_process.py +78 -0
- wandb/sdk/launch/runner/sagemaker_runner.py +424 -0
- wandb/sdk/launch/runner/vertex_runner.py +225 -0
- wandb/sdk/launch/sweeps/__init__.py +37 -0
- wandb/sdk/launch/sweeps/scheduler.py +739 -0
- wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
- wandb/sdk/launch/sweeps/utils.py +324 -0
- wandb/sdk/launch/utils.py +746 -0
- wandb/sdk/launch/wandb_reference.py +138 -0
- wandb/sdk/lib/__init__.py +5 -0
- wandb/sdk/lib/apikey.py +334 -0
- wandb/sdk/lib/asyncio_compat.py +213 -0
- wandb/sdk/lib/asyncio_manager.py +252 -0
- wandb/sdk/lib/capped_dict.py +26 -0
- wandb/sdk/lib/config_util.py +101 -0
- wandb/sdk/lib/console_capture.py +219 -0
- wandb/sdk/lib/credentials.py +141 -0
- wandb/sdk/lib/deprecate.py +27 -0
- wandb/sdk/lib/disabled.py +30 -0
- wandb/sdk/lib/exit_hooks.py +54 -0
- wandb/sdk/lib/file_stream_utils.py +118 -0
- wandb/sdk/lib/filenames.py +64 -0
- wandb/sdk/lib/filesystem.py +372 -0
- wandb/sdk/lib/fsm.py +165 -0
- wandb/sdk/lib/gitlib.py +240 -0
- wandb/sdk/lib/gql_request.py +65 -0
- wandb/sdk/lib/handler_util.py +21 -0
- wandb/sdk/lib/hashutil.py +106 -0
- wandb/sdk/lib/import_hooks.py +275 -0
- wandb/sdk/lib/interrupt.py +37 -0
- wandb/sdk/lib/ipython.py +126 -0
- wandb/sdk/lib/json_util.py +75 -0
- wandb/sdk/lib/lazyloader.py +63 -0
- wandb/sdk/lib/module.py +72 -0
- wandb/sdk/lib/paths.py +106 -0
- wandb/sdk/lib/preinit.py +42 -0
- wandb/sdk/lib/printer.py +571 -0
- wandb/sdk/lib/printer_asyncio.py +48 -0
- wandb/sdk/lib/progress.py +320 -0
- wandb/sdk/lib/proto_util.py +90 -0
- wandb/sdk/lib/redirect.py +876 -0
- wandb/sdk/lib/retry.py +395 -0
- wandb/sdk/lib/run_moment.py +82 -0
- wandb/sdk/lib/runid.py +12 -0
- wandb/sdk/lib/server.py +58 -0
- wandb/sdk/lib/service/ipc_support.py +13 -0
- wandb/sdk/lib/service/service_client.py +106 -0
- wandb/sdk/lib/service/service_connection.py +192 -0
- wandb/sdk/lib/service/service_port_file.py +105 -0
- wandb/sdk/lib/service/service_process.py +111 -0
- wandb/sdk/lib/service/service_token.py +181 -0
- wandb/sdk/lib/sparkline.py +44 -0
- wandb/sdk/lib/telemetry.py +100 -0
- wandb/sdk/lib/timed_input.py +133 -0
- wandb/sdk/lib/timer.py +19 -0
- wandb/sdk/lib/wb_logging.py +161 -0
- wandb/sdk/mailbox/__init__.py +23 -0
- wandb/sdk/mailbox/mailbox.py +143 -0
- wandb/sdk/mailbox/mailbox_handle.py +132 -0
- wandb/sdk/mailbox/response_handle.py +99 -0
- wandb/sdk/mailbox/wait_with_progress.py +100 -0
- wandb/sdk/projects/_generated/__init__.py +47 -0
- wandb/sdk/projects/_generated/delete_project.py +22 -0
- wandb/sdk/projects/_generated/enums.py +4 -0
- wandb/sdk/projects/_generated/fetch_registry.py +22 -0
- wandb/sdk/projects/_generated/fragments.py +41 -0
- wandb/sdk/projects/_generated/input_types.py +13 -0
- wandb/sdk/projects/_generated/operations.py +88 -0
- wandb/sdk/projects/_generated/rename_project.py +27 -0
- wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
- wandb/sdk/verify/__init__.py +0 -0
- wandb/sdk/verify/verify.py +555 -0
- wandb/sdk/wandb_alerts.py +12 -0
- wandb/sdk/wandb_config.py +323 -0
- wandb/sdk/wandb_helper.py +54 -0
- wandb/sdk/wandb_init.py +1581 -0
- wandb/sdk/wandb_login.py +332 -0
- wandb/sdk/wandb_metric.py +112 -0
- wandb/sdk/wandb_require.py +88 -0
- wandb/sdk/wandb_require_helpers.py +44 -0
- wandb/sdk/wandb_run.py +4088 -0
- wandb/sdk/wandb_settings.py +2105 -0
- wandb/sdk/wandb_setup.py +560 -0
- wandb/sdk/wandb_summary.py +150 -0
- wandb/sdk/wandb_sweep.py +120 -0
- wandb/sdk/wandb_sync.py +71 -0
- wandb/sdk/wandb_watch.py +146 -0
- wandb/sklearn.py +35 -0
- wandb/sync/__init__.py +3 -0
- wandb/sync/sync.py +452 -0
- wandb/trigger.py +29 -0
- wandb/util.py +2040 -0
- wandb/vendor/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/setup.py +40 -0
- wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
- wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
- wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
- wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
- wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
- wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
- wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
- wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
- wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
- wandb/vendor/graphql-core-1.1/setup.py +86 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
- wandb/vendor/promise-2.3.0/conftest.py +30 -0
- wandb/vendor/promise-2.3.0/setup.py +64 -0
- wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
- wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
- wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
- wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
- wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
- wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
- wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
- wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
- wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
- wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
- wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
- wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
- wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
- wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
- wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
- wandb/vendor/pygments/__init__.py +90 -0
- wandb/vendor/pygments/cmdline.py +568 -0
- wandb/vendor/pygments/console.py +74 -0
- wandb/vendor/pygments/filter.py +74 -0
- wandb/vendor/pygments/filters/__init__.py +350 -0
- wandb/vendor/pygments/formatter.py +95 -0
- wandb/vendor/pygments/formatters/__init__.py +153 -0
- wandb/vendor/pygments/formatters/_mapping.py +85 -0
- wandb/vendor/pygments/formatters/bbcode.py +109 -0
- wandb/vendor/pygments/formatters/html.py +851 -0
- wandb/vendor/pygments/formatters/img.py +600 -0
- wandb/vendor/pygments/formatters/irc.py +182 -0
- wandb/vendor/pygments/formatters/latex.py +482 -0
- wandb/vendor/pygments/formatters/other.py +160 -0
- wandb/vendor/pygments/formatters/rtf.py +147 -0
- wandb/vendor/pygments/formatters/svg.py +153 -0
- wandb/vendor/pygments/formatters/terminal.py +136 -0
- wandb/vendor/pygments/formatters/terminal256.py +309 -0
- wandb/vendor/pygments/lexer.py +871 -0
- wandb/vendor/pygments/lexers/__init__.py +329 -0
- wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
- wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
- wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
- wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
- wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
- wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
- wandb/vendor/pygments/lexers/_mapping.py +500 -0
- wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
- wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
- wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
- wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
- wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
- wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
- wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
- wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
- wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
- wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
- wandb/vendor/pygments/lexers/actionscript.py +240 -0
- wandb/vendor/pygments/lexers/agile.py +24 -0
- wandb/vendor/pygments/lexers/algebra.py +221 -0
- wandb/vendor/pygments/lexers/ambient.py +76 -0
- wandb/vendor/pygments/lexers/ampl.py +87 -0
- wandb/vendor/pygments/lexers/apl.py +101 -0
- wandb/vendor/pygments/lexers/archetype.py +318 -0
- wandb/vendor/pygments/lexers/asm.py +641 -0
- wandb/vendor/pygments/lexers/automation.py +374 -0
- wandb/vendor/pygments/lexers/basic.py +500 -0
- wandb/vendor/pygments/lexers/bibtex.py +160 -0
- wandb/vendor/pygments/lexers/business.py +612 -0
- wandb/vendor/pygments/lexers/c_cpp.py +252 -0
- wandb/vendor/pygments/lexers/c_like.py +541 -0
- wandb/vendor/pygments/lexers/capnproto.py +78 -0
- wandb/vendor/pygments/lexers/chapel.py +102 -0
- wandb/vendor/pygments/lexers/clean.py +288 -0
- wandb/vendor/pygments/lexers/compiled.py +34 -0
- wandb/vendor/pygments/lexers/configs.py +833 -0
- wandb/vendor/pygments/lexers/console.py +114 -0
- wandb/vendor/pygments/lexers/crystal.py +393 -0
- wandb/vendor/pygments/lexers/csound.py +366 -0
- wandb/vendor/pygments/lexers/css.py +689 -0
- wandb/vendor/pygments/lexers/d.py +251 -0
- wandb/vendor/pygments/lexers/dalvik.py +125 -0
- wandb/vendor/pygments/lexers/data.py +555 -0
- wandb/vendor/pygments/lexers/diff.py +165 -0
- wandb/vendor/pygments/lexers/dotnet.py +691 -0
- wandb/vendor/pygments/lexers/dsls.py +878 -0
- wandb/vendor/pygments/lexers/dylan.py +289 -0
- wandb/vendor/pygments/lexers/ecl.py +125 -0
- wandb/vendor/pygments/lexers/eiffel.py +65 -0
- wandb/vendor/pygments/lexers/elm.py +121 -0
- wandb/vendor/pygments/lexers/erlang.py +533 -0
- wandb/vendor/pygments/lexers/esoteric.py +277 -0
- wandb/vendor/pygments/lexers/ezhil.py +69 -0
- wandb/vendor/pygments/lexers/factor.py +344 -0
- wandb/vendor/pygments/lexers/fantom.py +250 -0
- wandb/vendor/pygments/lexers/felix.py +273 -0
- wandb/vendor/pygments/lexers/forth.py +177 -0
- wandb/vendor/pygments/lexers/fortran.py +205 -0
- wandb/vendor/pygments/lexers/foxpro.py +428 -0
- wandb/vendor/pygments/lexers/functional.py +21 -0
- wandb/vendor/pygments/lexers/go.py +101 -0
- wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
- wandb/vendor/pygments/lexers/graph.py +80 -0
- wandb/vendor/pygments/lexers/graphics.py +553 -0
- wandb/vendor/pygments/lexers/haskell.py +843 -0
- wandb/vendor/pygments/lexers/haxe.py +936 -0
- wandb/vendor/pygments/lexers/hdl.py +382 -0
- wandb/vendor/pygments/lexers/hexdump.py +103 -0
- wandb/vendor/pygments/lexers/html.py +602 -0
- wandb/vendor/pygments/lexers/idl.py +270 -0
- wandb/vendor/pygments/lexers/igor.py +288 -0
- wandb/vendor/pygments/lexers/inferno.py +96 -0
- wandb/vendor/pygments/lexers/installers.py +322 -0
- wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
- wandb/vendor/pygments/lexers/iolang.py +63 -0
- wandb/vendor/pygments/lexers/j.py +146 -0
- wandb/vendor/pygments/lexers/javascript.py +1525 -0
- wandb/vendor/pygments/lexers/julia.py +333 -0
- wandb/vendor/pygments/lexers/jvm.py +1573 -0
- wandb/vendor/pygments/lexers/lisp.py +2621 -0
- wandb/vendor/pygments/lexers/make.py +202 -0
- wandb/vendor/pygments/lexers/markup.py +595 -0
- wandb/vendor/pygments/lexers/math.py +21 -0
- wandb/vendor/pygments/lexers/matlab.py +663 -0
- wandb/vendor/pygments/lexers/ml.py +769 -0
- wandb/vendor/pygments/lexers/modeling.py +358 -0
- wandb/vendor/pygments/lexers/modula2.py +1561 -0
- wandb/vendor/pygments/lexers/monte.py +204 -0
- wandb/vendor/pygments/lexers/ncl.py +894 -0
- wandb/vendor/pygments/lexers/nimrod.py +159 -0
- wandb/vendor/pygments/lexers/nit.py +64 -0
- wandb/vendor/pygments/lexers/nix.py +136 -0
- wandb/vendor/pygments/lexers/oberon.py +105 -0
- wandb/vendor/pygments/lexers/objective.py +504 -0
- wandb/vendor/pygments/lexers/ooc.py +85 -0
- wandb/vendor/pygments/lexers/other.py +41 -0
- wandb/vendor/pygments/lexers/parasail.py +79 -0
- wandb/vendor/pygments/lexers/parsers.py +835 -0
- wandb/vendor/pygments/lexers/pascal.py +644 -0
- wandb/vendor/pygments/lexers/pawn.py +199 -0
- wandb/vendor/pygments/lexers/perl.py +620 -0
- wandb/vendor/pygments/lexers/php.py +267 -0
- wandb/vendor/pygments/lexers/praat.py +294 -0
- wandb/vendor/pygments/lexers/prolog.py +306 -0
- wandb/vendor/pygments/lexers/python.py +939 -0
- wandb/vendor/pygments/lexers/qvt.py +152 -0
- wandb/vendor/pygments/lexers/r.py +453 -0
- wandb/vendor/pygments/lexers/rdf.py +270 -0
- wandb/vendor/pygments/lexers/rebol.py +431 -0
- wandb/vendor/pygments/lexers/resource.py +85 -0
- wandb/vendor/pygments/lexers/rnc.py +67 -0
- wandb/vendor/pygments/lexers/roboconf.py +82 -0
- wandb/vendor/pygments/lexers/robotframework.py +560 -0
- wandb/vendor/pygments/lexers/ruby.py +519 -0
- wandb/vendor/pygments/lexers/rust.py +220 -0
- wandb/vendor/pygments/lexers/sas.py +228 -0
- wandb/vendor/pygments/lexers/scripting.py +1222 -0
- wandb/vendor/pygments/lexers/shell.py +794 -0
- wandb/vendor/pygments/lexers/smalltalk.py +195 -0
- wandb/vendor/pygments/lexers/smv.py +79 -0
- wandb/vendor/pygments/lexers/snobol.py +83 -0
- wandb/vendor/pygments/lexers/special.py +103 -0
- wandb/vendor/pygments/lexers/sql.py +681 -0
- wandb/vendor/pygments/lexers/stata.py +108 -0
- wandb/vendor/pygments/lexers/supercollider.py +90 -0
- wandb/vendor/pygments/lexers/tcl.py +145 -0
- wandb/vendor/pygments/lexers/templates.py +2283 -0
- wandb/vendor/pygments/lexers/testing.py +207 -0
- wandb/vendor/pygments/lexers/text.py +25 -0
- wandb/vendor/pygments/lexers/textedit.py +169 -0
- wandb/vendor/pygments/lexers/textfmts.py +297 -0
- wandb/vendor/pygments/lexers/theorem.py +458 -0
- wandb/vendor/pygments/lexers/trafficscript.py +54 -0
- wandb/vendor/pygments/lexers/typoscript.py +226 -0
- wandb/vendor/pygments/lexers/urbi.py +133 -0
- wandb/vendor/pygments/lexers/varnish.py +190 -0
- wandb/vendor/pygments/lexers/verification.py +111 -0
- wandb/vendor/pygments/lexers/web.py +24 -0
- wandb/vendor/pygments/lexers/webmisc.py +988 -0
- wandb/vendor/pygments/lexers/whiley.py +116 -0
- wandb/vendor/pygments/lexers/x10.py +69 -0
- wandb/vendor/pygments/modeline.py +44 -0
- wandb/vendor/pygments/plugin.py +68 -0
- wandb/vendor/pygments/regexopt.py +92 -0
- wandb/vendor/pygments/scanner.py +105 -0
- wandb/vendor/pygments/sphinxext.py +158 -0
- wandb/vendor/pygments/style.py +155 -0
- wandb/vendor/pygments/styles/__init__.py +80 -0
- wandb/vendor/pygments/styles/abap.py +29 -0
- wandb/vendor/pygments/styles/algol.py +63 -0
- wandb/vendor/pygments/styles/algol_nu.py +63 -0
- wandb/vendor/pygments/styles/arduino.py +98 -0
- wandb/vendor/pygments/styles/autumn.py +65 -0
- wandb/vendor/pygments/styles/borland.py +51 -0
- wandb/vendor/pygments/styles/bw.py +49 -0
- wandb/vendor/pygments/styles/colorful.py +81 -0
- wandb/vendor/pygments/styles/default.py +73 -0
- wandb/vendor/pygments/styles/emacs.py +72 -0
- wandb/vendor/pygments/styles/friendly.py +72 -0
- wandb/vendor/pygments/styles/fruity.py +42 -0
- wandb/vendor/pygments/styles/igor.py +29 -0
- wandb/vendor/pygments/styles/lovelace.py +97 -0
- wandb/vendor/pygments/styles/manni.py +75 -0
- wandb/vendor/pygments/styles/monokai.py +106 -0
- wandb/vendor/pygments/styles/murphy.py +80 -0
- wandb/vendor/pygments/styles/native.py +65 -0
- wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
- wandb/vendor/pygments/styles/paraiso_light.py +125 -0
- wandb/vendor/pygments/styles/pastie.py +75 -0
- wandb/vendor/pygments/styles/perldoc.py +69 -0
- wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
- wandb/vendor/pygments/styles/rrt.py +33 -0
- wandb/vendor/pygments/styles/sas.py +44 -0
- wandb/vendor/pygments/styles/stata.py +40 -0
- wandb/vendor/pygments/styles/tango.py +141 -0
- wandb/vendor/pygments/styles/trac.py +63 -0
- wandb/vendor/pygments/styles/vim.py +63 -0
- wandb/vendor/pygments/styles/vs.py +38 -0
- wandb/vendor/pygments/styles/xcode.py +51 -0
- wandb/vendor/pygments/token.py +213 -0
- wandb/vendor/pygments/unistring.py +217 -0
- wandb/vendor/pygments/util.py +388 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
- wandb/wandb_agent.py +580 -0
- wandb/wandb_controller.py +719 -0
- wandb/wandb_run.py +8 -0
- wandb-0.21.2.dist-info/METADATA +223 -0
- wandb-0.21.2.dist-info/RECORD +904 -0
- wandb-0.21.2.dist-info/WHEEL +4 -0
- wandb-0.21.2.dist-info/entry_points.txt +3 -0
- wandb-0.21.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1046 @@
|
|
1
|
+
"""W&B Public API for Artifact objects.
|
2
|
+
|
3
|
+
This module provides classes for interacting with W&B artifacts and their
|
4
|
+
collections.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from __future__ import annotations
|
8
|
+
|
9
|
+
import json
|
10
|
+
import re
|
11
|
+
from copy import copy
|
12
|
+
from typing import TYPE_CHECKING, Any, Iterable, Literal, Mapping, Sequence
|
13
|
+
|
14
|
+
from typing_extensions import override
|
15
|
+
from wandb_gql import Client, gql
|
16
|
+
|
17
|
+
import wandb
|
18
|
+
from wandb.apis import public
|
19
|
+
from wandb.apis.normalize import normalize_exceptions
|
20
|
+
from wandb.apis.paginator import Paginator, SizedPaginator
|
21
|
+
from wandb.errors.term import termlog
|
22
|
+
from wandb.proto.wandb_deprecated import Deprecated
|
23
|
+
from wandb.proto.wandb_internal_pb2 import ServerFeature
|
24
|
+
from wandb.sdk.artifacts._generated import (
|
25
|
+
ARTIFACT_COLLECTION_MEMBERSHIP_FILES_GQL,
|
26
|
+
ARTIFACT_VERSION_FILES_GQL,
|
27
|
+
CREATE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL,
|
28
|
+
DELETE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL,
|
29
|
+
DELETE_ARTIFACT_PORTFOLIO_GQL,
|
30
|
+
DELETE_ARTIFACT_SEQUENCE_GQL,
|
31
|
+
MOVE_ARTIFACT_COLLECTION_GQL,
|
32
|
+
PROJECT_ARTIFACT_COLLECTION_GQL,
|
33
|
+
PROJECT_ARTIFACT_COLLECTIONS_GQL,
|
34
|
+
PROJECT_ARTIFACT_TYPE_GQL,
|
35
|
+
PROJECT_ARTIFACT_TYPES_GQL,
|
36
|
+
PROJECT_ARTIFACTS_GQL,
|
37
|
+
RUN_INPUT_ARTIFACTS_GQL,
|
38
|
+
RUN_OUTPUT_ARTIFACTS_GQL,
|
39
|
+
UPDATE_ARTIFACT_PORTFOLIO_GQL,
|
40
|
+
UPDATE_ARTIFACT_SEQUENCE_GQL,
|
41
|
+
ArtifactCollectionMembershipFiles,
|
42
|
+
ArtifactCollectionsFragment,
|
43
|
+
ArtifactsFragment,
|
44
|
+
ArtifactTypeFragment,
|
45
|
+
ArtifactTypesFragment,
|
46
|
+
ArtifactVersionFiles,
|
47
|
+
FilesFragment,
|
48
|
+
ProjectArtifactCollection,
|
49
|
+
ProjectArtifactCollections,
|
50
|
+
ProjectArtifacts,
|
51
|
+
ProjectArtifactType,
|
52
|
+
ProjectArtifactTypes,
|
53
|
+
RunInputArtifactsProjectRunInputArtifacts,
|
54
|
+
RunOutputArtifactsProjectRunOutputArtifacts,
|
55
|
+
)
|
56
|
+
from wandb.sdk.artifacts._graphql_fragments import omit_artifact_fields
|
57
|
+
from wandb.sdk.artifacts._validators import (
|
58
|
+
SOURCE_ARTIFACT_COLLECTION_TYPE,
|
59
|
+
validate_artifact_name,
|
60
|
+
validate_artifact_type,
|
61
|
+
)
|
62
|
+
from wandb.sdk.internal.internal_api import Api as InternalApi
|
63
|
+
from wandb.sdk.lib import deprecate
|
64
|
+
|
65
|
+
from .utils import gql_compat
|
66
|
+
|
67
|
+
if TYPE_CHECKING:
|
68
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
69
|
+
|
70
|
+
from . import RetryingClient, Run
|
71
|
+
|
72
|
+
|
73
|
+
class ArtifactTypes(Paginator["ArtifactType"]):
|
74
|
+
"""An lazy iterator of `ArtifactType` objects for a specific project.
|
75
|
+
|
76
|
+
<!-- lazydoc-ignore-init: internal -->
|
77
|
+
"""
|
78
|
+
|
79
|
+
QUERY = gql(PROJECT_ARTIFACT_TYPES_GQL)
|
80
|
+
|
81
|
+
last_response: ArtifactTypesFragment | None
|
82
|
+
|
83
|
+
def __init__(
|
84
|
+
self,
|
85
|
+
client: Client,
|
86
|
+
entity: str,
|
87
|
+
project: str,
|
88
|
+
per_page: int = 50,
|
89
|
+
):
|
90
|
+
self.entity = entity
|
91
|
+
self.project = project
|
92
|
+
|
93
|
+
variable_values = {
|
94
|
+
"entityName": entity,
|
95
|
+
"projectName": project,
|
96
|
+
}
|
97
|
+
super().__init__(client, variable_values, per_page)
|
98
|
+
|
99
|
+
@override
|
100
|
+
def _update_response(self) -> None:
|
101
|
+
"""Fetch and validate the response data for the current page."""
|
102
|
+
data = self.client.execute(self.QUERY, variable_values=self.variables)
|
103
|
+
result = ProjectArtifactTypes.model_validate(data)
|
104
|
+
|
105
|
+
# Extract the inner `*Connection` result for faster/easier access.
|
106
|
+
if not ((proj := result.project) and (conn := proj.artifact_types)):
|
107
|
+
raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
|
108
|
+
|
109
|
+
self.last_response = ArtifactTypesFragment.model_validate(conn)
|
110
|
+
|
111
|
+
@property
|
112
|
+
def _length(self) -> None:
|
113
|
+
"""Returns `None`.
|
114
|
+
|
115
|
+
<!-- lazydoc-ignore: internal -->
|
116
|
+
"""
|
117
|
+
# TODO
|
118
|
+
return None
|
119
|
+
|
120
|
+
@property
|
121
|
+
def more(self) -> bool:
|
122
|
+
"""Returns whether there are more artifact types to fetch.
|
123
|
+
|
124
|
+
<!-- lazydoc-ignore: internal -->
|
125
|
+
"""
|
126
|
+
if self.last_response is None:
|
127
|
+
return True
|
128
|
+
return self.last_response.page_info.has_next_page
|
129
|
+
|
130
|
+
@property
|
131
|
+
def cursor(self) -> str | None:
|
132
|
+
"""Returns the cursor for the next page of results.
|
133
|
+
|
134
|
+
<!-- lazydoc-ignore: internal -->
|
135
|
+
"""
|
136
|
+
if self.last_response is None:
|
137
|
+
return None
|
138
|
+
return self.last_response.edges[-1].cursor
|
139
|
+
|
140
|
+
def update_variables(self) -> None:
|
141
|
+
"""Update the cursor variable for pagination.
|
142
|
+
|
143
|
+
<!-- lazydoc-ignore: internal -->
|
144
|
+
"""
|
145
|
+
self.variables.update({"cursor": self.cursor})
|
146
|
+
|
147
|
+
def convert_objects(self) -> list[ArtifactType]:
|
148
|
+
"""Convert the raw response data into a list of ArtifactType objects.
|
149
|
+
|
150
|
+
<!-- lazydoc-ignore: internal -->
|
151
|
+
"""
|
152
|
+
if self.last_response is None:
|
153
|
+
return []
|
154
|
+
|
155
|
+
return [
|
156
|
+
ArtifactType(
|
157
|
+
client=self.client,
|
158
|
+
entity=self.entity,
|
159
|
+
project=self.project,
|
160
|
+
type_name=node.name,
|
161
|
+
attrs=node.model_dump(exclude_unset=True),
|
162
|
+
)
|
163
|
+
for edge in self.last_response.edges
|
164
|
+
if edge.node and (node := ArtifactTypeFragment.model_validate(edge.node))
|
165
|
+
]
|
166
|
+
|
167
|
+
|
168
|
+
class ArtifactType:
|
169
|
+
"""An artifact object that satisfies query based on the specified type.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
client: The client instance to use for querying W&B.
|
173
|
+
entity: The entity (user or team) that owns the project.
|
174
|
+
project: The name of the project to query for artifact types.
|
175
|
+
type_name: The name of the artifact type.
|
176
|
+
attrs: Optional mapping of attributes to initialize the artifact type. If not provided,
|
177
|
+
the object will load its attributes from W&B upon initialization.
|
178
|
+
|
179
|
+
<!-- lazydoc-ignore-init: internal -->
|
180
|
+
"""
|
181
|
+
|
182
|
+
def __init__(
|
183
|
+
self,
|
184
|
+
client: Client,
|
185
|
+
entity: str,
|
186
|
+
project: str,
|
187
|
+
type_name: str,
|
188
|
+
attrs: Mapping[str, Any] | None = None,
|
189
|
+
):
|
190
|
+
self.client = client
|
191
|
+
self.entity = entity
|
192
|
+
self.project = project
|
193
|
+
self.type = type_name
|
194
|
+
self._attrs = attrs
|
195
|
+
if self._attrs is None:
|
196
|
+
self.load()
|
197
|
+
|
198
|
+
def load(self) -> Mapping[str, Any]:
|
199
|
+
"""Load the artifact type attributes from W&B.
|
200
|
+
|
201
|
+
<!-- lazydoc-ignore: internal -->
|
202
|
+
"""
|
203
|
+
data: Mapping[str, Any] | None = self.client.execute(
|
204
|
+
gql(PROJECT_ARTIFACT_TYPE_GQL),
|
205
|
+
variable_values={
|
206
|
+
"entityName": self.entity,
|
207
|
+
"projectName": self.project,
|
208
|
+
"artifactTypeName": self.type,
|
209
|
+
},
|
210
|
+
)
|
211
|
+
result = ProjectArtifactType.model_validate(data)
|
212
|
+
if not ((proj := result.project) and (artifact_type := proj.artifact_type)):
|
213
|
+
raise ValueError(f"Could not find artifact type {self.type}")
|
214
|
+
|
215
|
+
self._attrs = artifact_type.model_dump(exclude_unset=True)
|
216
|
+
return self._attrs
|
217
|
+
|
218
|
+
@property
|
219
|
+
def id(self) -> str:
|
220
|
+
"""The unique identifier of the artifact type."""
|
221
|
+
return self._attrs["id"]
|
222
|
+
|
223
|
+
@property
|
224
|
+
def name(self) -> str:
|
225
|
+
"""The name of the artifact type."""
|
226
|
+
return self._attrs["name"]
|
227
|
+
|
228
|
+
@normalize_exceptions
|
229
|
+
def collections(self, per_page: int = 50) -> ArtifactCollections:
|
230
|
+
"""Get all artifact collections associated with this artifact type.
|
231
|
+
|
232
|
+
Args:
|
233
|
+
per_page (int): The number of artifact collections to fetch per page.
|
234
|
+
Default is 50.
|
235
|
+
"""
|
236
|
+
return ArtifactCollections(self.client, self.entity, self.project, self.type)
|
237
|
+
|
238
|
+
def collection(self, name: str) -> ArtifactCollection:
|
239
|
+
"""Get a specific artifact collection by name.
|
240
|
+
|
241
|
+
Args:
|
242
|
+
name (str): The name of the artifact collection to retrieve.
|
243
|
+
"""
|
244
|
+
return ArtifactCollection(
|
245
|
+
self.client, self.entity, self.project, name, self.type
|
246
|
+
)
|
247
|
+
|
248
|
+
def __repr__(self) -> str:
|
249
|
+
return f"<ArtifactType {self.type}>"
|
250
|
+
|
251
|
+
|
252
|
+
class ArtifactCollections(SizedPaginator["ArtifactCollection"]):
|
253
|
+
"""Artifact collections of a specific type in a project.
|
254
|
+
|
255
|
+
Args:
|
256
|
+
client: The client instance to use for querying W&B.
|
257
|
+
entity: The entity (user or team) that owns the project.
|
258
|
+
project: The name of the project to query for artifact collections.
|
259
|
+
type_name: The name of the artifact type for which to fetch collections.
|
260
|
+
per_page: The number of artifact collections to fetch per page. Default is 50.
|
261
|
+
|
262
|
+
<!-- lazydoc-ignore-init: internal -->
|
263
|
+
"""
|
264
|
+
|
265
|
+
last_response: ArtifactCollectionsFragment | None
|
266
|
+
|
267
|
+
def __init__(
|
268
|
+
self,
|
269
|
+
client: Client,
|
270
|
+
entity: str,
|
271
|
+
project: str,
|
272
|
+
type_name: str,
|
273
|
+
per_page: int = 50,
|
274
|
+
):
|
275
|
+
self.entity = entity
|
276
|
+
self.project = project
|
277
|
+
self.type_name = type_name
|
278
|
+
|
279
|
+
variable_values = {
|
280
|
+
"entityName": entity,
|
281
|
+
"projectName": project,
|
282
|
+
"artifactTypeName": type_name,
|
283
|
+
}
|
284
|
+
|
285
|
+
if server_supports_artifact_collections_gql_edges(client):
|
286
|
+
rename_fields = None
|
287
|
+
else:
|
288
|
+
rename_fields = {"artifactCollections": "artifactSequences"}
|
289
|
+
|
290
|
+
self.QUERY = gql_compat(
|
291
|
+
PROJECT_ARTIFACT_COLLECTIONS_GQL, rename_fields=rename_fields
|
292
|
+
)
|
293
|
+
|
294
|
+
super().__init__(client, variable_values, per_page)
|
295
|
+
|
296
|
+
@override
|
297
|
+
def _update_response(self) -> None:
|
298
|
+
"""Fetch and validate the response data for the current page."""
|
299
|
+
data = self.client.execute(self.QUERY, variable_values=self.variables)
|
300
|
+
result = ProjectArtifactCollections.model_validate(data)
|
301
|
+
|
302
|
+
# Extract the inner `*Connection` result for faster/easier access.
|
303
|
+
if not (
|
304
|
+
(proj := result.project)
|
305
|
+
and (type_ := proj.artifact_type)
|
306
|
+
and (conn := type_.artifact_collections)
|
307
|
+
):
|
308
|
+
raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
|
309
|
+
|
310
|
+
self.last_response = ArtifactCollectionsFragment.model_validate(conn)
|
311
|
+
|
312
|
+
@property
|
313
|
+
def _length(self) -> int:
|
314
|
+
"""Returns the total number of artifact collections.
|
315
|
+
|
316
|
+
<!-- lazydoc-ignore: internal -->
|
317
|
+
"""
|
318
|
+
if self.last_response is None:
|
319
|
+
self._load_page()
|
320
|
+
return self.last_response.total_count
|
321
|
+
|
322
|
+
@property
|
323
|
+
def more(self):
|
324
|
+
"""Returns whether there are more artifacts to fetch.
|
325
|
+
|
326
|
+
<!-- lazydoc-ignore: internal -->
|
327
|
+
"""
|
328
|
+
if self.last_response is None:
|
329
|
+
return True
|
330
|
+
return self.last_response.page_info.has_next_page
|
331
|
+
|
332
|
+
@property
|
333
|
+
def cursor(self):
|
334
|
+
"""Returns the cursor for the next page of results.
|
335
|
+
|
336
|
+
<!-- lazydoc-ignore: internal -->
|
337
|
+
"""
|
338
|
+
if self.last_response is None:
|
339
|
+
return None
|
340
|
+
return self.last_response.edges[-1].cursor
|
341
|
+
|
342
|
+
def update_variables(self) -> None:
|
343
|
+
"""Update the cursor variable for pagination.
|
344
|
+
|
345
|
+
<!-- lazydoc-ignore: internal -->
|
346
|
+
"""
|
347
|
+
self.variables.update({"cursor": self.cursor})
|
348
|
+
|
349
|
+
def convert_objects(self) -> list[ArtifactCollection]:
|
350
|
+
"""Convert the raw response data into a list of ArtifactCollection objects.
|
351
|
+
|
352
|
+
<!-- lazydoc-ignore: internal -->
|
353
|
+
"""
|
354
|
+
if self.last_response is None:
|
355
|
+
return []
|
356
|
+
return [
|
357
|
+
ArtifactCollection(
|
358
|
+
client=self.client,
|
359
|
+
entity=self.entity,
|
360
|
+
project=self.project,
|
361
|
+
name=node.name,
|
362
|
+
type=self.type_name,
|
363
|
+
)
|
364
|
+
for edge in self.last_response.edges
|
365
|
+
if (node := edge.node)
|
366
|
+
]
|
367
|
+
|
368
|
+
|
369
|
+
class ArtifactCollection:
|
370
|
+
"""An artifact collection that represents a group of related artifacts.
|
371
|
+
|
372
|
+
Args:
|
373
|
+
client: The client instance to use for querying W&B.
|
374
|
+
entity: The entity (user or team) that owns the project.
|
375
|
+
project: The name of the project to query for artifact collections.
|
376
|
+
name: The name of the artifact collection.
|
377
|
+
type: The type of the artifact collection (e.g., "dataset", "model").
|
378
|
+
organization: Optional organization name if applicable.
|
379
|
+
attrs: Optional mapping of attributes to initialize the artifact collection.
|
380
|
+
If not provided, the object will load its attributes from W&B upon
|
381
|
+
initialization.
|
382
|
+
|
383
|
+
<!-- lazydoc-ignore-init: internal -->
|
384
|
+
"""
|
385
|
+
|
386
|
+
def __init__(
|
387
|
+
self,
|
388
|
+
client: Client,
|
389
|
+
entity: str,
|
390
|
+
project: str,
|
391
|
+
name: str,
|
392
|
+
type: str,
|
393
|
+
organization: str | None = None,
|
394
|
+
attrs: Mapping[str, Any] | None = None,
|
395
|
+
is_sequence: bool | None = None,
|
396
|
+
):
|
397
|
+
self.client = client
|
398
|
+
self.entity = entity
|
399
|
+
self.project = project
|
400
|
+
self._name = validate_artifact_name(name)
|
401
|
+
self._saved_name = name
|
402
|
+
self._type = type
|
403
|
+
self._saved_type = type
|
404
|
+
self._attrs = attrs
|
405
|
+
if is_sequence is not None:
|
406
|
+
self._is_sequence = is_sequence
|
407
|
+
if (attrs is None) or (is_sequence is None):
|
408
|
+
self.load()
|
409
|
+
self._aliases = [a["node"]["alias"] for a in self._attrs["aliases"]["edges"]]
|
410
|
+
self._description = self._attrs["description"]
|
411
|
+
self._created_at = self._attrs["createdAt"]
|
412
|
+
self._tags = [a["node"]["name"] for a in self._attrs["tags"]["edges"]]
|
413
|
+
self._saved_tags = copy(self._tags)
|
414
|
+
self.organization = organization
|
415
|
+
|
416
|
+
@property
|
417
|
+
def id(self) -> str:
|
418
|
+
"""The unique identifier of the artifact collection."""
|
419
|
+
return self._attrs["id"]
|
420
|
+
|
421
|
+
@normalize_exceptions
|
422
|
+
def artifacts(self, per_page: int = 50) -> Artifacts:
|
423
|
+
"""Get all artifacts in the collection."""
|
424
|
+
return Artifacts(
|
425
|
+
client=self.client,
|
426
|
+
entity=self.entity,
|
427
|
+
project=self.project,
|
428
|
+
collection_name=self._saved_name,
|
429
|
+
type=self._saved_type,
|
430
|
+
per_page=per_page,
|
431
|
+
)
|
432
|
+
|
433
|
+
@property
|
434
|
+
def aliases(self) -> list[str]:
|
435
|
+
"""Artifact Collection Aliases."""
|
436
|
+
return self._aliases
|
437
|
+
|
438
|
+
@property
|
439
|
+
def created_at(self) -> str:
|
440
|
+
"""The creation date of the artifact collection."""
|
441
|
+
return self._created_at
|
442
|
+
|
443
|
+
def load(self):
|
444
|
+
"""Load the artifact collection attributes from W&B.
|
445
|
+
|
446
|
+
<!-- lazydoc-ignore: internal -->
|
447
|
+
"""
|
448
|
+
if server_supports_artifact_collections_gql_edges(self.client):
|
449
|
+
rename_fields = None
|
450
|
+
else:
|
451
|
+
rename_fields = {"artifactCollection": "artifactSequence"}
|
452
|
+
|
453
|
+
response = self.client.execute(
|
454
|
+
gql_compat(PROJECT_ARTIFACT_COLLECTION_GQL, rename_fields=rename_fields),
|
455
|
+
variable_values={
|
456
|
+
"entityName": self.entity,
|
457
|
+
"projectName": self.project,
|
458
|
+
"artifactTypeName": self._saved_type,
|
459
|
+
"artifactCollectionName": self._saved_name,
|
460
|
+
},
|
461
|
+
)
|
462
|
+
|
463
|
+
result = ProjectArtifactCollection.model_validate(response)
|
464
|
+
|
465
|
+
if not (
|
466
|
+
result.project
|
467
|
+
and (proj := result.project)
|
468
|
+
and (type_ := proj.artifact_type)
|
469
|
+
and (collection := type_.artifact_collection)
|
470
|
+
):
|
471
|
+
raise ValueError(f"Could not find artifact type {self._saved_type}")
|
472
|
+
|
473
|
+
sequence = type_.artifact_sequence
|
474
|
+
self._is_sequence = (
|
475
|
+
sequence is not None
|
476
|
+
) and sequence.typename__ == SOURCE_ARTIFACT_COLLECTION_TYPE
|
477
|
+
|
478
|
+
if self._attrs is None:
|
479
|
+
self._attrs = collection.model_dump(exclude_unset=True)
|
480
|
+
return self._attrs
|
481
|
+
|
482
|
+
@normalize_exceptions
|
483
|
+
def change_type(self, new_type: str) -> None:
|
484
|
+
"""Deprecated, change type directly with `save` instead."""
|
485
|
+
deprecate.deprecate(
|
486
|
+
field_name=Deprecated.artifact_collection__change_type,
|
487
|
+
warning_message="ArtifactCollection.change_type(type) is deprecated, use ArtifactCollection.save() instead.",
|
488
|
+
)
|
489
|
+
|
490
|
+
if self._saved_type != new_type:
|
491
|
+
try:
|
492
|
+
validate_artifact_type(self._saved_type, self.name)
|
493
|
+
except ValueError as e:
|
494
|
+
raise ValueError(
|
495
|
+
f"The current type '{self._saved_type!r}' is an internal type and cannot be changed."
|
496
|
+
) from e
|
497
|
+
|
498
|
+
# Check that the new type is not going to conflict with internal types
|
499
|
+
validate_artifact_type(new_type, self.name)
|
500
|
+
|
501
|
+
if not self.is_sequence():
|
502
|
+
raise ValueError("Artifact collection needs to be a sequence")
|
503
|
+
termlog(
|
504
|
+
f"Changing artifact collection type of {self._saved_type} to {new_type}"
|
505
|
+
)
|
506
|
+
self.client.execute(
|
507
|
+
gql(MOVE_ARTIFACT_COLLECTION_GQL),
|
508
|
+
variable_values={
|
509
|
+
"artifactSequenceID": self.id,
|
510
|
+
"destinationArtifactTypeName": new_type,
|
511
|
+
},
|
512
|
+
)
|
513
|
+
self._saved_type = new_type
|
514
|
+
self._type = new_type
|
515
|
+
|
516
|
+
def is_sequence(self) -> bool:
|
517
|
+
"""Return whether the artifact collection is a sequence."""
|
518
|
+
return self._is_sequence
|
519
|
+
|
520
|
+
@normalize_exceptions
|
521
|
+
def delete(self) -> None:
|
522
|
+
"""Delete the entire artifact collection."""
|
523
|
+
self.client.execute(
|
524
|
+
gql(
|
525
|
+
DELETE_ARTIFACT_SEQUENCE_GQL
|
526
|
+
if self.is_sequence()
|
527
|
+
else DELETE_ARTIFACT_PORTFOLIO_GQL
|
528
|
+
),
|
529
|
+
variable_values={"id": self.id},
|
530
|
+
)
|
531
|
+
|
532
|
+
@property
|
533
|
+
def description(self) -> str:
|
534
|
+
"""A description of the artifact collection."""
|
535
|
+
return self._description
|
536
|
+
|
537
|
+
@description.setter
|
538
|
+
def description(self, description: str | None) -> None:
|
539
|
+
"""Set the description of the artifact collection."""
|
540
|
+
self._description = description
|
541
|
+
|
542
|
+
@property
|
543
|
+
def tags(self) -> list[str]:
|
544
|
+
"""The tags associated with the artifact collection."""
|
545
|
+
return self._tags
|
546
|
+
|
547
|
+
@tags.setter
|
548
|
+
def tags(self, tags: list[str]) -> None:
|
549
|
+
"""Set the tags associated with the artifact collection."""
|
550
|
+
if any(not re.match(r"^[-\w]+([ ]+[-\w]+)*$", tag) for tag in tags):
|
551
|
+
raise ValueError(
|
552
|
+
"Tags must only contain alphanumeric characters or underscores separated by spaces or hyphens"
|
553
|
+
)
|
554
|
+
self._tags = tags
|
555
|
+
|
556
|
+
@property
|
557
|
+
def name(self) -> str:
|
558
|
+
"""The name of the artifact collection."""
|
559
|
+
return self._name
|
560
|
+
|
561
|
+
@name.setter
|
562
|
+
def name(self, name: str) -> None:
|
563
|
+
"""Set the name of the artifact collection."""
|
564
|
+
self._name = validate_artifact_name(name)
|
565
|
+
|
566
|
+
@property
|
567
|
+
def type(self):
|
568
|
+
"""Returns the type of the artifact collection."""
|
569
|
+
return self._type
|
570
|
+
|
571
|
+
@type.setter
|
572
|
+
def type(self, type: list[str]) -> None:
|
573
|
+
"""Set the type of the artifact collection."""
|
574
|
+
if not self.is_sequence():
|
575
|
+
raise ValueError(
|
576
|
+
"Type can only be changed if the artifact collection is a sequence."
|
577
|
+
)
|
578
|
+
self._type = type
|
579
|
+
|
580
|
+
def _update_collection(self) -> None:
|
581
|
+
self.client.execute(
|
582
|
+
gql(
|
583
|
+
UPDATE_ARTIFACT_SEQUENCE_GQL
|
584
|
+
if self.is_sequence()
|
585
|
+
else UPDATE_ARTIFACT_PORTFOLIO_GQL
|
586
|
+
),
|
587
|
+
variable_values={
|
588
|
+
"id": self.id,
|
589
|
+
"name": self.name,
|
590
|
+
"description": self.description,
|
591
|
+
},
|
592
|
+
)
|
593
|
+
self._saved_name = self._name
|
594
|
+
|
595
|
+
def _update_collection_type(self) -> None:
|
596
|
+
self.client.execute(
|
597
|
+
gql(MOVE_ARTIFACT_COLLECTION_GQL),
|
598
|
+
variable_values={
|
599
|
+
"artifactSequenceID": self.id,
|
600
|
+
"destinationArtifactTypeName": self.type,
|
601
|
+
},
|
602
|
+
)
|
603
|
+
self._saved_type = self._type
|
604
|
+
|
605
|
+
def _add_tags(self, tags_to_add: Iterable[str]) -> None:
|
606
|
+
self.client.execute(
|
607
|
+
gql(CREATE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL),
|
608
|
+
variable_values={
|
609
|
+
"entityName": self.entity,
|
610
|
+
"projectName": self.project,
|
611
|
+
"artifactCollectionName": self._saved_name,
|
612
|
+
"tags": [{"tagName": tag} for tag in tags_to_add],
|
613
|
+
},
|
614
|
+
)
|
615
|
+
|
616
|
+
def _delete_tags(self, tags_to_delete: Iterable[str]) -> None:
|
617
|
+
self.client.execute(
|
618
|
+
gql(DELETE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL),
|
619
|
+
variable_values={
|
620
|
+
"entityName": self.entity,
|
621
|
+
"projectName": self.project,
|
622
|
+
"artifactCollectionName": self._saved_name,
|
623
|
+
"tags": [{"tagName": tag} for tag in tags_to_delete],
|
624
|
+
},
|
625
|
+
)
|
626
|
+
|
627
|
+
@normalize_exceptions
|
628
|
+
def save(self) -> None:
|
629
|
+
"""Persist any changes made to the artifact collection."""
|
630
|
+
if self._saved_type != self.type:
|
631
|
+
try:
|
632
|
+
validate_artifact_type(self.type, self._name)
|
633
|
+
except ValueError as e:
|
634
|
+
raise ValueError(f"Failed to save artifact collection: {e}") from e
|
635
|
+
try:
|
636
|
+
validate_artifact_type(self._saved_type, self._name)
|
637
|
+
except ValueError as e:
|
638
|
+
raise ValueError(
|
639
|
+
f"Failed to save artifact collection '{self._name}': "
|
640
|
+
f"The current type '{self._saved_type!r}' is an internal type and cannot be changed."
|
641
|
+
) from e
|
642
|
+
|
643
|
+
self._update_collection()
|
644
|
+
|
645
|
+
if self.is_sequence() and (self._saved_type != self._type):
|
646
|
+
self._update_collection_type()
|
647
|
+
|
648
|
+
current_tags = set(self._tags)
|
649
|
+
saved_tags = set(self._saved_tags)
|
650
|
+
if tags_to_add := (current_tags - saved_tags):
|
651
|
+
self._add_tags(tags_to_add)
|
652
|
+
if tags_to_delete := (saved_tags - current_tags):
|
653
|
+
self._delete_tags(tags_to_delete)
|
654
|
+
self._saved_tags = copy(self._tags)
|
655
|
+
|
656
|
+
def __repr__(self) -> str:
|
657
|
+
return f"<ArtifactCollection {self._name} ({self._type})>"
|
658
|
+
|
659
|
+
|
660
|
+
class Artifacts(SizedPaginator["Artifact"]):
|
661
|
+
"""An iterable collection of artifact versions associated with a project.
|
662
|
+
|
663
|
+
Optionally pass in filters to narrow down the results based on specific criteria.
|
664
|
+
|
665
|
+
Args:
|
666
|
+
client: The client instance to use for querying W&B.
|
667
|
+
entity: The entity (user or team) that owns the project.
|
668
|
+
project: The name of the project to query for artifacts.
|
669
|
+
collection_name: The name of the artifact collection to query.
|
670
|
+
type: The type of the artifacts to query. Common examples include
|
671
|
+
"dataset" or "model".
|
672
|
+
filters: Optional mapping of filters to apply to the query.
|
673
|
+
order: Optional string to specify the order of the results.
|
674
|
+
per_page: The number of artifact versions to fetch per page. Default is 50.
|
675
|
+
tags: Optional string or list of strings to filter artifacts by tags.
|
676
|
+
|
677
|
+
<!-- lazydoc-ignore-init: internal -->
|
678
|
+
"""
|
679
|
+
|
680
|
+
last_response: ArtifactsFragment | None
|
681
|
+
|
682
|
+
def __init__(
|
683
|
+
self,
|
684
|
+
client: Client,
|
685
|
+
entity: str,
|
686
|
+
project: str,
|
687
|
+
collection_name: str,
|
688
|
+
type: str,
|
689
|
+
filters: Mapping[str, Any] | None = None,
|
690
|
+
order: str | None = None,
|
691
|
+
per_page: int = 50,
|
692
|
+
tags: str | list[str] | None = None,
|
693
|
+
):
|
694
|
+
self.entity = entity
|
695
|
+
self.collection_name = collection_name
|
696
|
+
self.type = type
|
697
|
+
self.project = project
|
698
|
+
self.filters = {"state": "COMMITTED"} if filters is None else filters
|
699
|
+
self.tags = [tags] if isinstance(tags, str) else tags
|
700
|
+
self.order = order
|
701
|
+
variables = {
|
702
|
+
"project": self.project,
|
703
|
+
"entity": self.entity,
|
704
|
+
"order": self.order,
|
705
|
+
"type": self.type,
|
706
|
+
"collection": self.collection_name,
|
707
|
+
"filters": json.dumps(self.filters),
|
708
|
+
}
|
709
|
+
|
710
|
+
if server_supports_artifact_collections_gql_edges(client):
|
711
|
+
rename_fields = None
|
712
|
+
else:
|
713
|
+
rename_fields = {"artifactCollection": "artifactSequence"}
|
714
|
+
|
715
|
+
self.QUERY = gql_compat(
|
716
|
+
PROJECT_ARTIFACTS_GQL,
|
717
|
+
omit_fields=omit_artifact_fields(),
|
718
|
+
rename_fields=rename_fields,
|
719
|
+
)
|
720
|
+
|
721
|
+
super().__init__(client, variables, per_page)
|
722
|
+
|
723
|
+
@override
|
724
|
+
def _update_response(self) -> None:
|
725
|
+
data = self.client.execute(self.QUERY, variable_values=self.variables)
|
726
|
+
result = ProjectArtifacts.model_validate(data)
|
727
|
+
|
728
|
+
# Extract the inner `*Connection` result for faster/easier access.
|
729
|
+
if not (
|
730
|
+
(proj := result.project)
|
731
|
+
and (type_ := proj.artifact_type)
|
732
|
+
and (collection := type_.artifact_collection)
|
733
|
+
and (conn := collection.artifacts)
|
734
|
+
):
|
735
|
+
raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
|
736
|
+
|
737
|
+
self.last_response = ArtifactsFragment.model_validate(conn)
|
738
|
+
|
739
|
+
@property
|
740
|
+
def _length(self) -> int:
|
741
|
+
"""Returns the total number of artifacts in the collection.
|
742
|
+
|
743
|
+
<!-- lazydoc-ignore: internal -->
|
744
|
+
"""
|
745
|
+
if self.last_response is None:
|
746
|
+
self._load_page()
|
747
|
+
return self.last_response.total_count
|
748
|
+
|
749
|
+
@property
|
750
|
+
def more(self) -> bool:
|
751
|
+
"""Returns whether there are more files to fetch.
|
752
|
+
|
753
|
+
<!-- lazydoc-ignore: internal -->
|
754
|
+
"""
|
755
|
+
if self.last_response is None:
|
756
|
+
return True
|
757
|
+
return self.last_response.page_info.has_next_page
|
758
|
+
|
759
|
+
@property
|
760
|
+
def cursor(self) -> str | None:
|
761
|
+
"""Returns the cursor for the next page of results.
|
762
|
+
|
763
|
+
<!-- lazydoc-ignore: internal -->
|
764
|
+
"""
|
765
|
+
if self.last_response is None:
|
766
|
+
return None
|
767
|
+
return self.last_response.edges[-1].cursor
|
768
|
+
|
769
|
+
def convert_objects(self) -> list[Artifact]:
|
770
|
+
"""Convert the raw response data into a list of wandb.Artifact objects.
|
771
|
+
|
772
|
+
<!-- lazydoc-ignore: internal -->
|
773
|
+
"""
|
774
|
+
if self.last_response is None:
|
775
|
+
return []
|
776
|
+
|
777
|
+
artifact_edges = (edge for edge in self.last_response.edges if edge.node)
|
778
|
+
artifacts = (
|
779
|
+
wandb.Artifact._from_attrs(
|
780
|
+
entity=self.entity,
|
781
|
+
project=self.project,
|
782
|
+
name=f"{self.collection_name}:{edge.version}",
|
783
|
+
attrs=edge.node.model_dump(exclude_unset=True),
|
784
|
+
client=self.client,
|
785
|
+
)
|
786
|
+
for edge in artifact_edges
|
787
|
+
)
|
788
|
+
required_tags = set(self.tags or [])
|
789
|
+
return [art for art in artifacts if required_tags.issubset(art.tags)]
|
790
|
+
|
791
|
+
|
792
|
+
class RunArtifacts(SizedPaginator["Artifact"]):
|
793
|
+
"""An iterable collection of artifacts associated with a specific run.
|
794
|
+
|
795
|
+
<!-- lazydoc-ignore-init: internal -->
|
796
|
+
"""
|
797
|
+
|
798
|
+
last_response: (
|
799
|
+
RunOutputArtifactsProjectRunOutputArtifacts
|
800
|
+
| RunInputArtifactsProjectRunInputArtifacts
|
801
|
+
)
|
802
|
+
|
803
|
+
#: The pydantic model used to parse the (inner part of the) raw response.
|
804
|
+
_response_cls: type[
|
805
|
+
RunOutputArtifactsProjectRunOutputArtifacts
|
806
|
+
| RunInputArtifactsProjectRunInputArtifacts
|
807
|
+
]
|
808
|
+
|
809
|
+
def __init__(
|
810
|
+
self,
|
811
|
+
client: Client,
|
812
|
+
run: Run,
|
813
|
+
mode: Literal["logged", "used"] = "logged",
|
814
|
+
per_page: int = 50,
|
815
|
+
):
|
816
|
+
self.run = run
|
817
|
+
|
818
|
+
if mode == "logged":
|
819
|
+
self.run_key = "outputArtifacts"
|
820
|
+
self.QUERY = gql_compat(
|
821
|
+
RUN_OUTPUT_ARTIFACTS_GQL, omit_fields=omit_artifact_fields()
|
822
|
+
)
|
823
|
+
self._response_cls = RunOutputArtifactsProjectRunOutputArtifacts
|
824
|
+
elif mode == "used":
|
825
|
+
self.run_key = "inputArtifacts"
|
826
|
+
self.QUERY = gql_compat(
|
827
|
+
RUN_INPUT_ARTIFACTS_GQL, omit_fields=omit_artifact_fields()
|
828
|
+
)
|
829
|
+
self._response_cls = RunInputArtifactsProjectRunInputArtifacts
|
830
|
+
else:
|
831
|
+
raise ValueError("mode must be logged or used")
|
832
|
+
|
833
|
+
variable_values = {
|
834
|
+
"entity": run.entity,
|
835
|
+
"project": run.project,
|
836
|
+
"runName": run.id,
|
837
|
+
}
|
838
|
+
super().__init__(client, variable_values, per_page)
|
839
|
+
|
840
|
+
@override
|
841
|
+
def _update_response(self) -> None:
|
842
|
+
data = self.client.execute(self.QUERY, variable_values=self.variables)
|
843
|
+
|
844
|
+
# Extract the inner `*Connection` result for faster/easier access.
|
845
|
+
inner_data = data["project"]["run"][self.run_key]
|
846
|
+
self.last_response = self._response_cls.model_validate(inner_data)
|
847
|
+
|
848
|
+
@property
|
849
|
+
def _length(self) -> int:
|
850
|
+
"""Returns the total number of artifacts in the collection.
|
851
|
+
|
852
|
+
<!-- lazydoc-ignore: internal -->
|
853
|
+
"""
|
854
|
+
if self.last_response is None:
|
855
|
+
self._load_page()
|
856
|
+
return self.last_response.total_count
|
857
|
+
|
858
|
+
@property
|
859
|
+
def more(self) -> bool:
|
860
|
+
"""Returns whether there are more artifacts to fetch.
|
861
|
+
|
862
|
+
<!-- lazydoc-ignore: internal -->
|
863
|
+
"""
|
864
|
+
if self.last_response is None:
|
865
|
+
return True
|
866
|
+
return self.last_response.page_info.has_next_page
|
867
|
+
|
868
|
+
@property
|
869
|
+
def cursor(self) -> str | None:
|
870
|
+
"""Returns the cursor for the next page of results.
|
871
|
+
|
872
|
+
<!-- lazydoc-ignore: internal -->
|
873
|
+
"""
|
874
|
+
if self.last_response is None:
|
875
|
+
return None
|
876
|
+
return self.last_response.edges[-1].cursor
|
877
|
+
|
878
|
+
def convert_objects(self) -> list[Artifact]:
|
879
|
+
"""Convert the raw response data into a list of wandb.Artifact objects.
|
880
|
+
|
881
|
+
<!-- lazydoc-ignore: internal -->
|
882
|
+
"""
|
883
|
+
if self.last_response is None:
|
884
|
+
return []
|
885
|
+
|
886
|
+
return [
|
887
|
+
wandb.Artifact._from_attrs(
|
888
|
+
entity=proj.entity_name,
|
889
|
+
project=proj.name,
|
890
|
+
name=f"{artifact_seq.name}:v{node.version_index}",
|
891
|
+
attrs=node.model_dump(exclude_unset=True),
|
892
|
+
client=self.client,
|
893
|
+
)
|
894
|
+
for edge in self.last_response.edges
|
895
|
+
if (node := edge.node)
|
896
|
+
and (artifact_seq := node.artifact_sequence)
|
897
|
+
and (proj := artifact_seq.project)
|
898
|
+
]
|
899
|
+
|
900
|
+
|
901
|
+
class ArtifactFiles(SizedPaginator["public.File"]):
|
902
|
+
"""A paginator for files in an artifact.
|
903
|
+
|
904
|
+
<!-- lazydoc-ignore-init: internal -->
|
905
|
+
"""
|
906
|
+
|
907
|
+
last_response: FilesFragment | None
|
908
|
+
|
909
|
+
def __init__(
|
910
|
+
self,
|
911
|
+
client: Client,
|
912
|
+
artifact: Artifact,
|
913
|
+
names: Sequence[str] | None = None,
|
914
|
+
per_page: int = 50,
|
915
|
+
):
|
916
|
+
self.query_via_membership = InternalApi()._server_supports(
|
917
|
+
ServerFeature.ARTIFACT_COLLECTION_MEMBERSHIP_FILES
|
918
|
+
)
|
919
|
+
self.artifact = artifact
|
920
|
+
|
921
|
+
if self.query_via_membership:
|
922
|
+
query_str = ARTIFACT_COLLECTION_MEMBERSHIP_FILES_GQL
|
923
|
+
variables = {
|
924
|
+
"entityName": artifact.entity,
|
925
|
+
"projectName": artifact.project,
|
926
|
+
"artifactName": artifact.name.split(":")[0],
|
927
|
+
"artifactVersionIndex": artifact.version,
|
928
|
+
"fileNames": names,
|
929
|
+
}
|
930
|
+
else:
|
931
|
+
query_str = ARTIFACT_VERSION_FILES_GQL
|
932
|
+
variables = {
|
933
|
+
"entityName": artifact.source_entity,
|
934
|
+
"projectName": artifact.source_project,
|
935
|
+
"artifactName": artifact.source_name,
|
936
|
+
"artifactTypeName": artifact.type,
|
937
|
+
"fileNames": names,
|
938
|
+
}
|
939
|
+
|
940
|
+
# The server must advertise at least SDK 0.12.21
|
941
|
+
# to get storagePath
|
942
|
+
if not client.version_supported("0.12.21"):
|
943
|
+
self.QUERY = gql_compat(query_str, omit_fields={"storagePath"})
|
944
|
+
else:
|
945
|
+
self.QUERY = gql(query_str)
|
946
|
+
|
947
|
+
super().__init__(client, variables, per_page)
|
948
|
+
|
949
|
+
@override
|
950
|
+
def _update_response(self) -> None:
|
951
|
+
data = self.client.execute(self.QUERY, variable_values=self.variables)
|
952
|
+
|
953
|
+
# Extract the inner `*Connection` result for faster/easier access.
|
954
|
+
if self.query_via_membership:
|
955
|
+
result = ArtifactCollectionMembershipFiles.model_validate(data)
|
956
|
+
conn = result.project.artifact_collection.artifact_membership.files
|
957
|
+
else:
|
958
|
+
result = ArtifactVersionFiles.model_validate(data)
|
959
|
+
conn = result.project.artifact_type.artifact.files
|
960
|
+
|
961
|
+
if conn is None:
|
962
|
+
raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
|
963
|
+
|
964
|
+
self.last_response = FilesFragment.model_validate(conn)
|
965
|
+
|
966
|
+
@property
|
967
|
+
def path(self) -> list[str]:
|
968
|
+
"""Returns the path of the artifact."""
|
969
|
+
return [self.artifact.entity, self.artifact.project, self.artifact.name]
|
970
|
+
|
971
|
+
@property
|
972
|
+
def _length(self) -> int:
|
973
|
+
if self.last_response is None:
|
974
|
+
self._load_page()
|
975
|
+
"""Returns the total number of files in the artifact.
|
976
|
+
|
977
|
+
<!-- lazydoc-ignore: internal -->
|
978
|
+
"""
|
979
|
+
return self.artifact.file_count
|
980
|
+
|
981
|
+
@property
|
982
|
+
def more(self) -> bool:
|
983
|
+
"""Returns whether there are more files to fetch.
|
984
|
+
|
985
|
+
<!-- lazydoc-ignore: internal -->
|
986
|
+
"""
|
987
|
+
if self.last_response is None:
|
988
|
+
return True
|
989
|
+
return self.last_response.page_info.has_next_page
|
990
|
+
|
991
|
+
@property
|
992
|
+
def cursor(self) -> str | None:
|
993
|
+
"""Returns the cursor for the next page of results.
|
994
|
+
|
995
|
+
<!-- lazydoc-ignore: internal -->
|
996
|
+
"""
|
997
|
+
if self.last_response is None:
|
998
|
+
return None
|
999
|
+
return self.last_response.edges[-1].cursor
|
1000
|
+
|
1001
|
+
def update_variables(self) -> None:
|
1002
|
+
"""Update the variables dictionary with the cursor.
|
1003
|
+
|
1004
|
+
<!-- lazydoc-ignore: internal -->
|
1005
|
+
"""
|
1006
|
+
self.variables.update({"fileLimit": self.per_page, "fileCursor": self.cursor})
|
1007
|
+
|
1008
|
+
def convert_objects(self) -> list[public.File]:
|
1009
|
+
"""Convert the raw response data into a list of public.File objects.
|
1010
|
+
|
1011
|
+
<!-- lazydoc-ignore: internal -->
|
1012
|
+
"""
|
1013
|
+
if self.last_response is None:
|
1014
|
+
return []
|
1015
|
+
|
1016
|
+
return [
|
1017
|
+
public.File(
|
1018
|
+
client=self.client,
|
1019
|
+
attrs=node.model_dump(exclude_unset=True),
|
1020
|
+
)
|
1021
|
+
for edge in self.last_response.edges
|
1022
|
+
if (node := edge.node)
|
1023
|
+
]
|
1024
|
+
|
1025
|
+
def __repr__(self) -> str:
|
1026
|
+
path_str = "/".join(self.path)
|
1027
|
+
return f"<ArtifactFiles {path_str} ({len(self)})>"
|
1028
|
+
|
1029
|
+
|
1030
|
+
def server_supports_artifact_collections_gql_edges(
|
1031
|
+
client: RetryingClient, warn: bool = False
|
1032
|
+
) -> bool:
|
1033
|
+
"""Check if W&B server supports GraphQL edges for artifact collections.
|
1034
|
+
|
1035
|
+
<!-- lazydoc-ignore-function: internal -->
|
1036
|
+
"""
|
1037
|
+
# TODO: Validate this version
|
1038
|
+
# Edges were merged into core on Mar 2, 2022: https://github.com/wandb/core/commit/81c90b29eaacfe0a96dc1ebd83c53560ca763e8b
|
1039
|
+
# CLI version was bumped to "0.12.11" on Mar 3, 2022: https://github.com/wandb/core/commit/328396fa7c89a2178d510a1be9c0d4451f350d7b
|
1040
|
+
supported = client.version_supported("0.12.11") # edges were merged on
|
1041
|
+
if not supported and warn:
|
1042
|
+
# First local release to include the above is 0.9.50: https://github.com/wandb/local/releases/tag/0.9.50
|
1043
|
+
wandb.termwarn(
|
1044
|
+
"W&B Local Server version does not support ArtifactCollection gql edges; falling back to using legacy ArtifactSequence. Please update server to at least version 0.9.50."
|
1045
|
+
)
|
1046
|
+
return supported
|