wandb 0.21.2__py3-none-macosx_12_0_arm64.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,138 @@
|
|
1
|
+
"""Support for parsing W&B URLs (which might be user provided) into constituent parts."""
|
2
|
+
|
3
|
+
from dataclasses import dataclass
|
4
|
+
from enum import IntEnum
|
5
|
+
from typing import Optional
|
6
|
+
from urllib.parse import urlparse
|
7
|
+
|
8
|
+
PREFIX_HTTP = "http://"
|
9
|
+
PREFIX_HTTPS = "https://"
|
10
|
+
|
11
|
+
|
12
|
+
class ReferenceType(IntEnum):
|
13
|
+
RUN = 1
|
14
|
+
JOB = 2
|
15
|
+
|
16
|
+
|
17
|
+
# Ideally we would not overload the URL paths as we do.
|
18
|
+
# TODO: Not sure these are exhaustive, and even if so more special paths might get added.
|
19
|
+
# Would be good to have restrictions that we could check.
|
20
|
+
RESERVED_NON_ENTITIES = (
|
21
|
+
"create-team",
|
22
|
+
"fully-connected",
|
23
|
+
"registry",
|
24
|
+
"settings",
|
25
|
+
"subscriptions",
|
26
|
+
)
|
27
|
+
RESERVED_NON_PROJECTS = (
|
28
|
+
"likes",
|
29
|
+
"projects",
|
30
|
+
)
|
31
|
+
RESERVED_JOB_PATHS = ("_view",)
|
32
|
+
|
33
|
+
|
34
|
+
@dataclass
|
35
|
+
class WandbReference:
|
36
|
+
# TODO: This will include port, should we separate that out?
|
37
|
+
host: Optional[str] = None
|
38
|
+
|
39
|
+
entity: Optional[str] = None
|
40
|
+
project: Optional[str] = None
|
41
|
+
|
42
|
+
# Set when we don't know how to parse yet
|
43
|
+
path: Optional[str] = None
|
44
|
+
|
45
|
+
# Reference type will determine what other fields are set
|
46
|
+
ref_type: Optional[ReferenceType] = None
|
47
|
+
|
48
|
+
run_id: Optional[str] = None
|
49
|
+
|
50
|
+
job_name: Optional[str] = None
|
51
|
+
job_alias: str = "latest" # In addition to an alias can be a version specifier
|
52
|
+
|
53
|
+
def is_bare(self) -> bool:
|
54
|
+
return self.host is None
|
55
|
+
|
56
|
+
def is_job(self) -> bool:
|
57
|
+
return self.ref_type == ReferenceType.JOB
|
58
|
+
|
59
|
+
def is_run(self) -> bool:
|
60
|
+
return self.ref_type == ReferenceType.RUN
|
61
|
+
|
62
|
+
def is_job_or_run(self) -> bool:
|
63
|
+
return self.is_job() or self.is_run()
|
64
|
+
|
65
|
+
def job_reference(self) -> str:
|
66
|
+
assert self.is_job()
|
67
|
+
return f"{self.job_name}:{self.job_alias}"
|
68
|
+
|
69
|
+
def job_reference_scoped(self) -> str:
|
70
|
+
assert self.entity
|
71
|
+
assert self.project
|
72
|
+
unscoped = self.job_reference()
|
73
|
+
return f"{self.entity}/{self.project}/{unscoped}"
|
74
|
+
|
75
|
+
def url_host(self) -> str:
|
76
|
+
return f"{PREFIX_HTTPS}{self.host}" if self.host else ""
|
77
|
+
|
78
|
+
def url_entity(self) -> str:
|
79
|
+
assert self.entity
|
80
|
+
return f"{self.url_host()}/{self.entity}"
|
81
|
+
|
82
|
+
def url_project(self) -> str:
|
83
|
+
assert self.project
|
84
|
+
return f"{self.url_entity()}/{self.project}"
|
85
|
+
|
86
|
+
@staticmethod
|
87
|
+
def parse(uri: str) -> Optional["WandbReference"]:
|
88
|
+
"""Attempt to parse a string as a W&B URL."""
|
89
|
+
# TODO: Error if HTTP and host is not localhost?
|
90
|
+
if (
|
91
|
+
not uri.startswith("/")
|
92
|
+
and not uri.startswith(PREFIX_HTTP)
|
93
|
+
and not uri.startswith(PREFIX_HTTPS)
|
94
|
+
):
|
95
|
+
return None
|
96
|
+
|
97
|
+
ref = WandbReference()
|
98
|
+
|
99
|
+
# This takes care of things like query and fragment
|
100
|
+
parsed = urlparse(uri)
|
101
|
+
if parsed.netloc:
|
102
|
+
ref.host = parsed.netloc
|
103
|
+
|
104
|
+
if not parsed.path.startswith("/"):
|
105
|
+
return ref
|
106
|
+
|
107
|
+
ref.path = parsed.path[1:]
|
108
|
+
parts = ref.path.split("/")
|
109
|
+
if len(parts) > 0:
|
110
|
+
if parts[0] not in RESERVED_NON_ENTITIES:
|
111
|
+
ref.path = None
|
112
|
+
ref.entity = parts[0]
|
113
|
+
if len(parts) > 1:
|
114
|
+
if parts[1] not in RESERVED_NON_PROJECTS:
|
115
|
+
ref.project = parts[1]
|
116
|
+
if len(parts) > 3 and parts[2] == "runs":
|
117
|
+
ref.ref_type = ReferenceType.RUN
|
118
|
+
ref.run_id = parts[3]
|
119
|
+
elif (
|
120
|
+
len(parts) > 4
|
121
|
+
and parts[2] == "artifacts"
|
122
|
+
and parts[3] == "job"
|
123
|
+
):
|
124
|
+
ref.ref_type = ReferenceType.JOB
|
125
|
+
ref.job_name = parts[4]
|
126
|
+
if len(parts) > 5 and parts[5] not in RESERVED_JOB_PATHS:
|
127
|
+
ref.job_alias = parts[5]
|
128
|
+
# TODO: Right now we are not tracking selection as part of URL state in the Jobs tab.
|
129
|
+
# If that changes we'll want to update this.
|
130
|
+
|
131
|
+
return ref
|
132
|
+
|
133
|
+
@staticmethod
|
134
|
+
def is_uri_job_or_run(uri: str) -> bool:
|
135
|
+
ref = WandbReference.parse(uri)
|
136
|
+
if ref and ref.is_job_or_run():
|
137
|
+
return True
|
138
|
+
return False
|
wandb/sdk/lib/apikey.py
ADDED
@@ -0,0 +1,334 @@
|
|
1
|
+
"""apikey util."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import dataclasses
|
6
|
+
import os
|
7
|
+
import platform
|
8
|
+
import stat
|
9
|
+
import sys
|
10
|
+
import textwrap
|
11
|
+
from functools import partial
|
12
|
+
|
13
|
+
# import Literal
|
14
|
+
from typing import TYPE_CHECKING, Callable, Literal
|
15
|
+
from urllib.parse import urlparse
|
16
|
+
|
17
|
+
import click
|
18
|
+
from requests.utils import NETRC_FILES, get_netrc_auth
|
19
|
+
|
20
|
+
import wandb
|
21
|
+
from wandb.apis import InternalApi
|
22
|
+
from wandb.errors import term
|
23
|
+
from wandb.errors.links import url_registry
|
24
|
+
from wandb.sdk import wandb_setup
|
25
|
+
from wandb.util import _is_databricks, isatty, prompt_choices
|
26
|
+
|
27
|
+
if TYPE_CHECKING:
|
28
|
+
from wandb.sdk.wandb_settings import Settings
|
29
|
+
|
30
|
+
LOGIN_CHOICE_ANON = "Private W&B dashboard, no account required"
|
31
|
+
LOGIN_CHOICE_NEW = "Create a W&B account"
|
32
|
+
LOGIN_CHOICE_EXISTS = "Use an existing W&B account"
|
33
|
+
LOGIN_CHOICE_DRYRUN = "Don't visualize my results"
|
34
|
+
LOGIN_CHOICE_NOTTY = "Unconfigured"
|
35
|
+
LOGIN_CHOICES = [
|
36
|
+
LOGIN_CHOICE_ANON,
|
37
|
+
LOGIN_CHOICE_NEW,
|
38
|
+
LOGIN_CHOICE_EXISTS,
|
39
|
+
LOGIN_CHOICE_DRYRUN,
|
40
|
+
]
|
41
|
+
|
42
|
+
|
43
|
+
@dataclasses.dataclass(frozen=True)
|
44
|
+
class _NetrcPermissions:
|
45
|
+
exists: bool
|
46
|
+
read_access: bool
|
47
|
+
write_access: bool
|
48
|
+
|
49
|
+
|
50
|
+
class WriteNetrcError(Exception):
|
51
|
+
"""Raised when we cannot write to the netrc file."""
|
52
|
+
|
53
|
+
|
54
|
+
Mode = Literal["allow", "must", "never", "false", "true"]
|
55
|
+
|
56
|
+
|
57
|
+
getpass = partial(click.prompt, hide_input=True, err=True)
|
58
|
+
|
59
|
+
|
60
|
+
def _fixup_anon_mode(default: Mode | None) -> Mode | None:
|
61
|
+
# Convert weird anonymode values from legacy settings files
|
62
|
+
# into one of our expected values.
|
63
|
+
anon_mode = default or "never"
|
64
|
+
mapping: dict[Mode, Mode] = {"true": "allow", "false": "never"}
|
65
|
+
return mapping.get(anon_mode, anon_mode)
|
66
|
+
|
67
|
+
|
68
|
+
def get_netrc_file_path() -> str:
|
69
|
+
"""Return the path to the netrc file."""
|
70
|
+
# if the NETRC environment variable is set, use that
|
71
|
+
netrc_file = os.environ.get("NETRC")
|
72
|
+
if netrc_file:
|
73
|
+
return os.path.expanduser(netrc_file)
|
74
|
+
|
75
|
+
# if either .netrc or _netrc exists in the home directory, use that
|
76
|
+
for netrc_file in NETRC_FILES:
|
77
|
+
home_dir = os.path.expanduser("~")
|
78
|
+
if os.path.exists(os.path.join(home_dir, netrc_file)):
|
79
|
+
return os.path.join(home_dir, netrc_file)
|
80
|
+
|
81
|
+
# otherwise, use .netrc on non-Windows platforms and _netrc on Windows
|
82
|
+
netrc_file = ".netrc" if platform.system() != "Windows" else "_netrc"
|
83
|
+
|
84
|
+
return os.path.join(os.path.expanduser("~"), netrc_file)
|
85
|
+
|
86
|
+
|
87
|
+
def _api_key_prompt_str(app_url: str, referrer: str | None = None) -> str:
|
88
|
+
"""Generate a prompt string for API key authorization.
|
89
|
+
|
90
|
+
Creates a URL string that directs users to the authorization page where they
|
91
|
+
can find their API key.
|
92
|
+
|
93
|
+
Args:
|
94
|
+
app_url: The base URL of the W&B application.
|
95
|
+
referrer: Optional referrer parameter to include in the URL.
|
96
|
+
|
97
|
+
Returns:
|
98
|
+
A formatted string with instructions and the authorization URL.
|
99
|
+
"""
|
100
|
+
ref = ""
|
101
|
+
if referrer:
|
102
|
+
ref = f"?ref={referrer}"
|
103
|
+
return f"You can find your API key in your browser here: {app_url}/authorize{ref}"
|
104
|
+
|
105
|
+
|
106
|
+
def prompt_api_key( # noqa: C901
|
107
|
+
settings: Settings,
|
108
|
+
api: InternalApi | None = None,
|
109
|
+
input_callback: Callable | None = None,
|
110
|
+
browser_callback: Callable | None = None,
|
111
|
+
no_offline: bool = False,
|
112
|
+
no_create: bool = False,
|
113
|
+
local: bool = False,
|
114
|
+
referrer: str | None = None,
|
115
|
+
) -> str | bool | None:
|
116
|
+
"""Prompt for api key.
|
117
|
+
|
118
|
+
Returns:
|
119
|
+
str - if key is configured
|
120
|
+
None - if dryrun is selected
|
121
|
+
False - if unconfigured (notty)
|
122
|
+
"""
|
123
|
+
input_callback = input_callback or getpass
|
124
|
+
log_string = term.LOG_STRING
|
125
|
+
api = api or InternalApi(settings)
|
126
|
+
anon_mode = _fixup_anon_mode(settings.anonymous) # type: ignore
|
127
|
+
jupyter = settings._jupyter or False
|
128
|
+
app_url = api.app_url
|
129
|
+
|
130
|
+
choices = [choice for choice in LOGIN_CHOICES]
|
131
|
+
if anon_mode == "never":
|
132
|
+
# Omit LOGIN_CHOICE_ANON as a choice if the env var is set to never
|
133
|
+
choices.remove(LOGIN_CHOICE_ANON)
|
134
|
+
if (jupyter and not settings.login_timeout) or no_offline:
|
135
|
+
choices.remove(LOGIN_CHOICE_DRYRUN)
|
136
|
+
if (jupyter and not settings.login_timeout) or no_create:
|
137
|
+
choices.remove(LOGIN_CHOICE_NEW)
|
138
|
+
|
139
|
+
if jupyter and "google.colab" in sys.modules:
|
140
|
+
log_string = term.LOG_STRING_NOCOLOR
|
141
|
+
key = wandb.jupyter.attempt_colab_login(app_url) # type: ignore
|
142
|
+
if key is not None:
|
143
|
+
return key # type: ignore
|
144
|
+
|
145
|
+
if anon_mode == "must":
|
146
|
+
result = LOGIN_CHOICE_ANON
|
147
|
+
# If we're not in an interactive environment, default to dry-run.
|
148
|
+
elif (
|
149
|
+
not jupyter and (not isatty(sys.stdout) or not isatty(sys.stdin))
|
150
|
+
) or _is_databricks():
|
151
|
+
result = LOGIN_CHOICE_NOTTY
|
152
|
+
elif local:
|
153
|
+
result = LOGIN_CHOICE_EXISTS
|
154
|
+
elif len(choices) == 1:
|
155
|
+
result = choices[0]
|
156
|
+
else:
|
157
|
+
result = prompt_choices(
|
158
|
+
choices, input_timeout=settings.login_timeout, jupyter=jupyter
|
159
|
+
)
|
160
|
+
|
161
|
+
key = None
|
162
|
+
api_ask = (
|
163
|
+
f"{log_string}: Paste an API key from your profile and hit enter"
|
164
|
+
if jupyter
|
165
|
+
else f"{log_string}: Paste an API key from your profile and hit enter, or press ctrl+c to quit"
|
166
|
+
)
|
167
|
+
if result == LOGIN_CHOICE_ANON:
|
168
|
+
key = api.create_anonymous_api_key()
|
169
|
+
elif result == LOGIN_CHOICE_NEW:
|
170
|
+
key = browser_callback(signup=True) if browser_callback else None
|
171
|
+
|
172
|
+
if not key:
|
173
|
+
ref = f"&ref={referrer}" if referrer else ""
|
174
|
+
wandb.termlog(
|
175
|
+
f"Create an account here: {app_url}/authorize?signup=true{ref}"
|
176
|
+
)
|
177
|
+
key = input_callback(api_ask).strip()
|
178
|
+
elif result == LOGIN_CHOICE_EXISTS:
|
179
|
+
key = browser_callback() if browser_callback else None
|
180
|
+
|
181
|
+
if not key:
|
182
|
+
if not (settings.is_local or local):
|
183
|
+
host = app_url
|
184
|
+
for prefix in ("http://", "https://"):
|
185
|
+
if app_url.startswith(prefix):
|
186
|
+
host = app_url[len(prefix) :]
|
187
|
+
wandb.termlog(
|
188
|
+
f"Logging into {host}. (Learn how to deploy a W&B server "
|
189
|
+
f"locally: {url_registry.url('wandb-server')})"
|
190
|
+
)
|
191
|
+
wandb.termlog(_api_key_prompt_str(app_url, referrer))
|
192
|
+
key = input_callback(api_ask).strip()
|
193
|
+
elif result == LOGIN_CHOICE_NOTTY:
|
194
|
+
# TODO: Needs refactor as this needs to be handled by caller
|
195
|
+
return False
|
196
|
+
elif result == LOGIN_CHOICE_DRYRUN:
|
197
|
+
return None
|
198
|
+
else:
|
199
|
+
# Jupyter environments don't have a tty, but we can still try logging in using
|
200
|
+
# the browser callback if one is supplied.
|
201
|
+
key, anonymous = (
|
202
|
+
browser_callback() if jupyter and browser_callback else (None, False)
|
203
|
+
)
|
204
|
+
|
205
|
+
if not key:
|
206
|
+
raise ValueError("No API key specified.")
|
207
|
+
return key
|
208
|
+
|
209
|
+
|
210
|
+
def check_netrc_access(
|
211
|
+
netrc_path: str,
|
212
|
+
) -> _NetrcPermissions:
|
213
|
+
"""Check if we can read and write to the netrc file."""
|
214
|
+
file_exists = False
|
215
|
+
write_access = False
|
216
|
+
read_access = False
|
217
|
+
try:
|
218
|
+
st = os.stat(netrc_path)
|
219
|
+
file_exists = True
|
220
|
+
write_access = bool(st.st_mode & stat.S_IWUSR)
|
221
|
+
read_access = bool(st.st_mode & stat.S_IRUSR)
|
222
|
+
except FileNotFoundError:
|
223
|
+
# If the netrc file doesn't exist, we will create it.
|
224
|
+
write_access = True
|
225
|
+
read_access = True
|
226
|
+
except OSError as e:
|
227
|
+
wandb.termerror(f"Unable to read permissions for {netrc_path}, {e}")
|
228
|
+
|
229
|
+
return _NetrcPermissions(
|
230
|
+
exists=file_exists,
|
231
|
+
write_access=write_access,
|
232
|
+
read_access=read_access,
|
233
|
+
)
|
234
|
+
|
235
|
+
|
236
|
+
def write_netrc(host: str, entity: str, key: str):
|
237
|
+
"""Add our host and key to .netrc."""
|
238
|
+
_, key_suffix = key.split("-", 1) if "-" in key else ("", key)
|
239
|
+
if len(key_suffix) != 40:
|
240
|
+
raise ValueError(
|
241
|
+
f"API-key must be exactly 40 characters long: {key_suffix} ({len(key_suffix)} chars)"
|
242
|
+
)
|
243
|
+
|
244
|
+
normalized_host = urlparse(host).netloc
|
245
|
+
netrc_path = get_netrc_file_path()
|
246
|
+
netrc_access = check_netrc_access(netrc_path)
|
247
|
+
|
248
|
+
if not netrc_access.write_access or not netrc_access.read_access:
|
249
|
+
raise WriteNetrcError(
|
250
|
+
f"Cannot access {netrc_path}. In order to persist your API key, "
|
251
|
+
"grant read and write permissions for your user to the file "
|
252
|
+
'or specify a different file with the environment variable "NETRC=<new_netrc_path>".'
|
253
|
+
)
|
254
|
+
|
255
|
+
machine_line = f"machine {normalized_host}"
|
256
|
+
orig_lines = None
|
257
|
+
try:
|
258
|
+
with open(netrc_path) as f:
|
259
|
+
orig_lines = f.read().strip().split("\n")
|
260
|
+
except FileNotFoundError:
|
261
|
+
wandb.termlog("No netrc file found, creating one.")
|
262
|
+
except OSError as e:
|
263
|
+
raise WriteNetrcError(f"Unable to read {netrc_path}") from e
|
264
|
+
|
265
|
+
try:
|
266
|
+
with open(netrc_path, "w") as f:
|
267
|
+
if orig_lines:
|
268
|
+
# delete this machine from the file if it's already there.
|
269
|
+
skip = 0
|
270
|
+
for line in orig_lines:
|
271
|
+
# we fix invalid netrc files with an empty host that we wrote before
|
272
|
+
# verifying host...
|
273
|
+
if line == "machine " or machine_line in line:
|
274
|
+
skip = 2
|
275
|
+
elif skip:
|
276
|
+
skip -= 1
|
277
|
+
else:
|
278
|
+
f.write(f"{line}\n")
|
279
|
+
|
280
|
+
wandb.termlog(
|
281
|
+
f"Appending key for {normalized_host} to your netrc file: {netrc_path}"
|
282
|
+
)
|
283
|
+
f.write(
|
284
|
+
textwrap.dedent(
|
285
|
+
"""\
|
286
|
+
machine {host}
|
287
|
+
login {entity}
|
288
|
+
password {key}
|
289
|
+
"""
|
290
|
+
).format(host=normalized_host, entity=entity, key=key)
|
291
|
+
)
|
292
|
+
os.chmod(netrc_path, stat.S_IRUSR | stat.S_IWUSR)
|
293
|
+
except OSError as e:
|
294
|
+
raise WriteNetrcError(f"Unable to write {netrc_path}") from e
|
295
|
+
|
296
|
+
|
297
|
+
def write_key(
|
298
|
+
settings: Settings,
|
299
|
+
key: str | None,
|
300
|
+
api: InternalApi | None = None,
|
301
|
+
) -> None:
|
302
|
+
if not key:
|
303
|
+
raise ValueError("No API key specified.")
|
304
|
+
|
305
|
+
# TODO(jhr): api shouldn't be optional or it shouldn't be passed, clean up callers
|
306
|
+
api = api or InternalApi()
|
307
|
+
|
308
|
+
# Normal API keys are 40-character hex strings. On-prem API keys have a
|
309
|
+
# variable-length prefix, a dash, then the 40-char string.
|
310
|
+
_, suffix = key.split("-", 1) if "-" in key else ("", key)
|
311
|
+
|
312
|
+
if len(suffix) != 40:
|
313
|
+
raise ValueError(f"API key must be 40 characters long, yours was {len(key)}")
|
314
|
+
|
315
|
+
write_netrc(settings.base_url, "user", key)
|
316
|
+
|
317
|
+
|
318
|
+
def api_key(settings: Settings | None = None) -> str | None:
|
319
|
+
if settings is None:
|
320
|
+
settings = wandb_setup.singleton().settings
|
321
|
+
if settings.api_key:
|
322
|
+
return settings.api_key
|
323
|
+
|
324
|
+
netrc_access = check_netrc_access(get_netrc_file_path())
|
325
|
+
if netrc_access.exists and not netrc_access.read_access:
|
326
|
+
wandb.termwarn(f"Cannot access {get_netrc_file_path()}.")
|
327
|
+
return None
|
328
|
+
|
329
|
+
if netrc_access.exists:
|
330
|
+
auth = get_netrc_auth(settings.base_url)
|
331
|
+
if auth:
|
332
|
+
return auth[-1]
|
333
|
+
|
334
|
+
return None
|
@@ -0,0 +1,213 @@
|
|
1
|
+
"""Functions for compatibility with asyncio."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import asyncio
|
6
|
+
import concurrent
|
7
|
+
import concurrent.futures
|
8
|
+
import contextlib
|
9
|
+
import threading
|
10
|
+
from typing import Any, AsyncIterator, Callable, Coroutine, Iterator, TypeVar
|
11
|
+
|
12
|
+
_T = TypeVar("_T")
|
13
|
+
|
14
|
+
|
15
|
+
def run(fn: Callable[[], Coroutine[Any, Any, _T]]) -> _T:
|
16
|
+
"""Run `fn` in an asyncio loop in a new thread.
|
17
|
+
|
18
|
+
This must always be used instead of `asyncio.run` which fails if there is
|
19
|
+
an active `asyncio` event loop in the current thread. Since `wandb` was not
|
20
|
+
originally designed with `asyncio` in mind, using `asyncio.run` would break
|
21
|
+
users who were calling `wandb` methods from an `asyncio` loop.
|
22
|
+
|
23
|
+
Note that due to starting a new thread, this is slightly slow.
|
24
|
+
"""
|
25
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
|
26
|
+
runner = CancellableRunner()
|
27
|
+
future = executor.submit(runner.run, fn)
|
28
|
+
|
29
|
+
try:
|
30
|
+
return future.result()
|
31
|
+
|
32
|
+
finally:
|
33
|
+
runner.cancel()
|
34
|
+
|
35
|
+
|
36
|
+
class RunnerCancelledError(Exception):
|
37
|
+
"""The `CancellableRunner.run()` invocation was cancelled."""
|
38
|
+
|
39
|
+
|
40
|
+
class CancellableRunner:
|
41
|
+
"""Runs an asyncio event loop allowing cancellation.
|
42
|
+
|
43
|
+
The `run()` method is like `asyncio.run()`. The `cancel()` method may
|
44
|
+
be used in a different thread, for instance in a `finally` block, to cancel
|
45
|
+
all tasks, and it is a no-op if `run()` completed.
|
46
|
+
|
47
|
+
Without this, it is impossible to make `asyncio.run()` stop if it runs
|
48
|
+
in a non-main thread. In particular, a KeyboardInterrupt causes the
|
49
|
+
ThreadPoolExecutor above to block until the asyncio thread completes,
|
50
|
+
but there is no way to tell the asyncio thread to cancel its work.
|
51
|
+
A second KeyboardInterrupt makes ThreadPoolExecutor give up while the
|
52
|
+
asyncio thread still runs in the background, with terrible effects if it
|
53
|
+
prints to the user's terminal.
|
54
|
+
"""
|
55
|
+
|
56
|
+
def __init__(self) -> None:
|
57
|
+
self._lock = threading.Lock()
|
58
|
+
|
59
|
+
self._is_cancelled = False
|
60
|
+
self._started = False
|
61
|
+
self._done = False
|
62
|
+
|
63
|
+
self._loop: asyncio.AbstractEventLoop | None = None
|
64
|
+
self._cancel_event: asyncio.Event | None = None
|
65
|
+
|
66
|
+
def run(self, fn: Callable[[], Coroutine[Any, Any, _T]]) -> _T:
|
67
|
+
"""Run a coroutine in asyncio, cancelling it on `cancel()`.
|
68
|
+
|
69
|
+
Returns:
|
70
|
+
The result of the coroutine returned by `fn`.
|
71
|
+
|
72
|
+
Raises:
|
73
|
+
RunnerCancelledError: If `cancel()` is called.
|
74
|
+
"""
|
75
|
+
return asyncio.run(self._run_or_cancel(fn))
|
76
|
+
|
77
|
+
async def _run_or_cancel(
|
78
|
+
self,
|
79
|
+
fn: Callable[[], Coroutine[Any, Any, _T]],
|
80
|
+
) -> _T:
|
81
|
+
with self._lock:
|
82
|
+
if self._is_cancelled:
|
83
|
+
raise RunnerCancelledError()
|
84
|
+
|
85
|
+
self._loop = asyncio.get_running_loop()
|
86
|
+
self._cancel_event = asyncio.Event()
|
87
|
+
self._started = True
|
88
|
+
|
89
|
+
cancellation_task = asyncio.create_task(self._cancel_event.wait())
|
90
|
+
fn_task = asyncio.create_task(fn())
|
91
|
+
|
92
|
+
try:
|
93
|
+
await asyncio.wait(
|
94
|
+
[cancellation_task, fn_task],
|
95
|
+
return_when=asyncio.FIRST_COMPLETED,
|
96
|
+
)
|
97
|
+
|
98
|
+
if fn_task.done():
|
99
|
+
return fn_task.result()
|
100
|
+
else:
|
101
|
+
raise RunnerCancelledError()
|
102
|
+
|
103
|
+
finally:
|
104
|
+
# NOTE: asyncio.run() cancels all tasks after the main task exits,
|
105
|
+
# but this is not documented, so we cancel them explicitly here
|
106
|
+
# as well. It also blocks until canceled tasks complete.
|
107
|
+
cancellation_task.cancel()
|
108
|
+
fn_task.cancel()
|
109
|
+
|
110
|
+
with self._lock:
|
111
|
+
self._done = True
|
112
|
+
|
113
|
+
def cancel(self) -> None:
|
114
|
+
"""Cancel all asyncio work started by `run()`."""
|
115
|
+
with self._lock:
|
116
|
+
if self._is_cancelled:
|
117
|
+
return
|
118
|
+
self._is_cancelled = True
|
119
|
+
|
120
|
+
if self._done or not self._started:
|
121
|
+
# If the runner already finished, no need to cancel it.
|
122
|
+
#
|
123
|
+
# If the runner hasn't started the loop yet, then it will not
|
124
|
+
# as we already set _is_cancelled.
|
125
|
+
return
|
126
|
+
|
127
|
+
assert self._loop
|
128
|
+
assert self._cancel_event
|
129
|
+
self._loop.call_soon_threadsafe(self._cancel_event.set)
|
130
|
+
|
131
|
+
|
132
|
+
class TaskGroup:
|
133
|
+
"""Object that `open_task_group()` yields."""
|
134
|
+
|
135
|
+
def __init__(self) -> None:
|
136
|
+
self._tasks: list[asyncio.Task] = []
|
137
|
+
|
138
|
+
def start_soon(self, coro: Coroutine[Any, Any, Any]) -> None:
|
139
|
+
"""Schedule a task in the group.
|
140
|
+
|
141
|
+
Args:
|
142
|
+
coro: The return value of the `async` function defining the task.
|
143
|
+
"""
|
144
|
+
self._tasks.append(asyncio.create_task(coro))
|
145
|
+
|
146
|
+
async def _wait_all(self) -> None:
|
147
|
+
"""Block until all tasks complete.
|
148
|
+
|
149
|
+
Raises:
|
150
|
+
Exception: If one or more tasks raises an exception, one of these
|
151
|
+
is raised arbitrarily.
|
152
|
+
"""
|
153
|
+
done, _ = await asyncio.wait(
|
154
|
+
self._tasks,
|
155
|
+
# NOTE: Cancelling a task counts as a normal exit,
|
156
|
+
# not an exception.
|
157
|
+
return_when=concurrent.futures.FIRST_EXCEPTION,
|
158
|
+
)
|
159
|
+
|
160
|
+
for task in done:
|
161
|
+
with contextlib.suppress(asyncio.CancelledError):
|
162
|
+
if exc := task.exception():
|
163
|
+
raise exc
|
164
|
+
|
165
|
+
def _cancel_all(self) -> None:
|
166
|
+
"""Cancel all tasks."""
|
167
|
+
for task in self._tasks:
|
168
|
+
# NOTE: It is safe to cancel tasks that have already completed.
|
169
|
+
task.cancel()
|
170
|
+
|
171
|
+
|
172
|
+
@contextlib.asynccontextmanager
|
173
|
+
async def open_task_group() -> AsyncIterator[TaskGroup]:
|
174
|
+
"""Create a task group.
|
175
|
+
|
176
|
+
`asyncio` gained task groups in Python 3.11.
|
177
|
+
|
178
|
+
This is an async context manager, meant to be used with `async with`.
|
179
|
+
On exit, it blocks until all subtasks complete. If any subtask fails, or if
|
180
|
+
the current task is cancelled, it cancels all subtasks in the group and
|
181
|
+
raises the subtask's exception. If multiple subtasks fail simultaneously,
|
182
|
+
one of their exceptions is chosen arbitrarily.
|
183
|
+
|
184
|
+
NOTE: Subtask exceptions do not propagate until the context manager exits.
|
185
|
+
This means that the task group cannot cancel code running inside the
|
186
|
+
`async with` block .
|
187
|
+
"""
|
188
|
+
task_group = TaskGroup()
|
189
|
+
|
190
|
+
try:
|
191
|
+
yield task_group
|
192
|
+
await task_group._wait_all()
|
193
|
+
finally:
|
194
|
+
task_group._cancel_all()
|
195
|
+
|
196
|
+
|
197
|
+
@contextlib.contextmanager
|
198
|
+
def cancel_on_exit(coro: Coroutine[Any, Any, Any]) -> Iterator[None]:
|
199
|
+
"""Schedule a task, cancelling it when exiting the context manager.
|
200
|
+
|
201
|
+
If the context manager exits successfully but the given coroutine raises
|
202
|
+
an exception, that exception is reraised. The exception is suppressed
|
203
|
+
if the context manager raises an exception.
|
204
|
+
"""
|
205
|
+
task = asyncio.create_task(coro)
|
206
|
+
|
207
|
+
try:
|
208
|
+
yield
|
209
|
+
|
210
|
+
if task.done() and (exception := task.exception()):
|
211
|
+
raise exception
|
212
|
+
finally:
|
213
|
+
task.cancel()
|