truefoundry 0.5.3rc3__tar.gz → 0.5.3rc5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of truefoundry might be problematic. Click here for more details.
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/PKG-INFO +1 -1
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/pyproject.toml +1 -1
- truefoundry-0.5.3rc5/truefoundry/__init__.py +12 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/cli.py +2 -2
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/__main__.py +0 -4
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/util.py +12 -3
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/auth_service_client.py +7 -4
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/constants.py +3 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/credential_provider.py +7 -8
- truefoundry-0.5.3rc5/truefoundry/common/exceptions.py +16 -0
- truefoundry-0.5.3rc5/truefoundry/common/request_utils.py +166 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/servicefoundry_client.py +31 -29
- truefoundry-0.5.3rc5/truefoundry/common/session.py +93 -0
- truefoundry-0.5.3rc5/truefoundry/common/storage_provider_utils.py +331 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/utils.py +9 -9
- truefoundry-0.5.3rc5/truefoundry/common/warnings.py +21 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +8 -20
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/deploy_command.py +4 -4
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/clients/servicefoundry_client.py +13 -14
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/dao/application.py +2 -2
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/dao/workspace.py +1 -1
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/session.py +1 -1
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/lib/deploy.py +2 -2
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/lib/deploy_workflow.py +1 -1
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/lib/patched_models.py +70 -4
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/lib/source.py +2 -1
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/artifact/truefoundry_artifact_repo.py +33 -297
- truefoundry-0.5.3rc5/truefoundry/ml/clients/servicefoundry_client.py +64 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/exceptions.py +2 -1
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/artifacts/artifact.py +3 -2
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/artifacts/model.py +6 -5
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/artifacts/utils.py +2 -2
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/mlfoundry_api.py +6 -38
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/mlfoundry_run.py +6 -15
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/model_framework.py +2 -1
- truefoundry-0.5.3rc5/truefoundry/ml/session.py +143 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +42 -9
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +126 -7
- truefoundry-0.5.3rc3/truefoundry/__init__.py +0 -3
- truefoundry-0.5.3rc3/truefoundry/common/exceptions.py +0 -12
- truefoundry-0.5.3rc3/truefoundry/common/request_utils.py +0 -84
- truefoundry-0.5.3rc3/truefoundry/deploy/lib/auth/servicefoundry_session.py +0 -61
- truefoundry-0.5.3rc3/truefoundry/ml/clients/entities.py +0 -8
- truefoundry-0.5.3rc3/truefoundry/ml/clients/servicefoundry_client.py +0 -43
- truefoundry-0.5.3rc3/truefoundry/ml/clients/utils.py +0 -122
- truefoundry-0.5.3rc3/truefoundry/ml/session.py +0 -171
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/README.md +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/agents/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/agents/base.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/agents/developer.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/agents/project_identifier.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/agents/tester.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/constants.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/exception.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/logger.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/ask.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/base.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/commit.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/docker_build.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/docker_run.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/file_type_counts.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/list_files.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/read_file.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/send_request.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/tools/write_file.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/utils/client.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/utils/diff.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/autodeploy/utils/pydantic_compat.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/commands/pat.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/config.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/console.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/const.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/cli/display_util.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/credential_file_manager.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/common/entities.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/auto_gen/models.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/builders/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/builders/dockerfile.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/constants.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/docker_service.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/builder/utils.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/apply_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/build_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/build_logs_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/create_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/delete_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/deploy_init_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/get_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/list_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/login_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/logout_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/logs_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/patch_application_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/patch_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/redeploy_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/terminate_comand.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/cli/commands/trigger_command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/core/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/core/login.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/core/logout.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/io/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/io/output_callback.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/io/rich_output_callback.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/clients/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/const.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/dao/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/dao/apply.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/dao/version.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/logs_utils.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/messages.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/model/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/model/entity.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/util.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/lib/win32.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/python_deploy_codegen.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/lib/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/lib/deployable_patched_models.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/deploy/v2/lib/models.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/gateway/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/gateway/cli/cli.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/gateway/lib/entities.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/gateway/lib/models.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/logger.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/artifact/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/auth_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/deprecated_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/experiments_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/generate_code_snippet_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/health_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/metrics_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/run_artifacts_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api/runs_api.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api_client.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/api_response.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/configuration.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/exceptions.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/add_custom_metrics_to_model_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/add_features_to_model_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/agent.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/agent_app.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/agent_open_api_tool.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/agent_open_api_tool_with_fqn.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/agent_with_fqn.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_type.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_version_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_version_manifest.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_version_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_version_serialization_format.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/artifact_version_status.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/assistant_message.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/authorize_user_for_model_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/authorize_user_for_model_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/blob_storage_reference.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/body_get_search_runs_get.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/chat_prompt.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/chat_prompt_messages_inner.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/columns_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/command.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/content.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/content1.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/content2.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/content2_any_of_inner.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_artifact_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_artifact_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_artifact_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_artifact_version_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_dataset_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_experiment_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_experiment_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_model_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_multi_part_upload_for_dataset_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_multi_part_upload_for_dataset_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_multi_part_upload_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_python_deployment_config_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_python_deployment_config_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_run_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_run_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/create_workflow_task_config_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/dataset_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/dataset_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/delete_artifact_versions_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/delete_dataset_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/delete_files_for_dataset_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/delete_model_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/delete_run_request.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/delete_tag_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/experiment_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/experiment_id_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/experiment_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/experiment_tag_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/export_deployment_files_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/external_artifact_source.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/fast_ai_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/file_info_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/finalize_artifact_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_artifact_tags_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_experiment_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_latest_run_log_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_metric_history_response.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_url_for_dataset_write_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_read_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_read_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_write_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_urls_for_artifact_version_write_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_urls_for_dataset_read_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_urls_for_dataset_read_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_signed_urls_for_dataset_write_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/get_tenant_id_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/gluon_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/h2_o_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/http_validation_error.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/image_content_part.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/image_url.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/infer_method_name.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/internal_metadata.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/keras_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/latest_run_log_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/library_name.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/light_gbm_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_artifact_versions_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_artifact_versions_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_artifacts_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_artifacts_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_colums_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_datasets_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_datasets_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_experiments_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_files_for_artifact_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_files_for_artifact_versions_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_files_for_dataset_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_files_for_dataset_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_latest_run_logs_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_metric_history_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_metric_history_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_model_version_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_model_versions_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_models_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_models_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_run_artifacts_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/list_run_logs_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/log_batch_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/log_metric_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/log_param_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/manifest.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/method.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/metric_collection_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/metric_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/mime_type.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_configuration.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_server.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_version_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_version_environment.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_version_manifest.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/model_version_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/multi_part_upload_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/multi_part_upload_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/multi_part_upload_storage_provider.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/notify_artifact_version_failure_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/onnx_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/openapi_spec.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/paddle_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/param_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/parameters.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/py_torch_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/resolve_agent_app_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/restore_run_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/run_data_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/run_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/run_info_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/run_log_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/run_log_input_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/run_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/run_tag_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/search_runs_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/search_runs_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/set_experiment_tag_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/set_tag_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/signed_url_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/sklearn_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/sklearn_model_schema.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/sklearn_serialization_format.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/source.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/source1.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/spa_cy_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/stats_models_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/stop.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/store_run_logs_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/subject.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/subject_type.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/system_message.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/tensor_flow_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/text.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/text_content_part.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/transformers_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/trigger_job_run_config_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/trigger_job_run_config_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/true_foundry_artifact_source.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/update_artifact_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/update_dataset_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/update_experiment_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/update_model_version_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/update_run_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/update_run_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/url.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/user_message.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/validate_external_storage_root_request_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/validate_external_storage_root_response_dto.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/validation_error.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/validation_error_loc_inner.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/xg_boost_framework.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/xg_boost_model_schema.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/models/xg_boost_serialization_format.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client/rest.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/client_README.md +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/entities/artifacts.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/models/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/models/exceptions.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/models/schema.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/models/signature.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/autogen/models/utils.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/cli/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/cli/cli.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/cli/commands/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/cli/commands/download.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/cli/commands/model_init.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/cli/utils.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/clients/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/constants.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/entities.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/enums.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/git_info.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/internal_namespace.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/artifacts/constants.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/artifacts/dataset.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/artifacts/general_artifact.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/image/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/image/constants.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/image/image.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/image/image_normalizer.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/image/types.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/plot.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/pydantic_base.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/log_types/utils.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/logger.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/run_utils.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/ml/validation_utils.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/pydantic_v1.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/version.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/container_task.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/example/deploy.sh +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/example/hello_world_package/workflow.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/example/package/test_workflow.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/example/truefoundry.yaml +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/example/workflow.yaml +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/map_task.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/python_task.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/remote_filesystem/__init__.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/remote_filesystem/logger.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/task.py +0 -0
- {truefoundry-0.5.3rc3 → truefoundry-0.5.3rc5}/truefoundry/workflow/workflow.py +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from truefoundry.common.warnings import (
|
|
2
|
+
suppress_truefoundry_deprecation_warnings,
|
|
3
|
+
surface_truefoundry_deprecation_warnings,
|
|
4
|
+
)
|
|
5
|
+
from truefoundry.deploy.core import login, logout
|
|
6
|
+
|
|
7
|
+
surface_truefoundry_deprecation_warnings()
|
|
8
|
+
__all__ = [
|
|
9
|
+
"login",
|
|
10
|
+
"logout",
|
|
11
|
+
"suppress_truefoundry_deprecation_warnings",
|
|
12
|
+
]
|
|
@@ -32,8 +32,8 @@ from truefoundry.autodeploy.tools.commit import CommitConfirmation
|
|
|
32
32
|
from truefoundry.autodeploy.tools.docker_run import DockerRun, DockerRunLog
|
|
33
33
|
from truefoundry.autodeploy.utils.client import get_git_binary
|
|
34
34
|
from truefoundry.cli.const import COMMAND_CLS
|
|
35
|
+
from truefoundry.common.session import Session
|
|
35
36
|
from truefoundry.deploy import Build, DockerFileBuild, Job, LocalSource, Port, Service
|
|
36
|
-
from truefoundry.deploy.lib.auth.servicefoundry_session import ServiceFoundrySession
|
|
37
37
|
from truefoundry.deploy.lib.clients.servicefoundry_client import (
|
|
38
38
|
ServiceFoundryServiceClient,
|
|
39
39
|
)
|
|
@@ -45,7 +45,7 @@ def _get_openai_client() -> OpenAI:
|
|
|
45
45
|
api_key=AUTODEPLOY_OPENAI_API_KEY, base_url=AUTODEPLOY_OPENAI_BASE_URL
|
|
46
46
|
)
|
|
47
47
|
try:
|
|
48
|
-
session =
|
|
48
|
+
session = Session.new()
|
|
49
49
|
resp = requests.get(
|
|
50
50
|
f"{AUTODEPLOY_TFY_BASE_URL}/api/svc/v1/llm-gateway/access-details",
|
|
51
51
|
headers={
|
|
@@ -4,7 +4,6 @@ import sys
|
|
|
4
4
|
import rich_click as click
|
|
5
5
|
|
|
6
6
|
from truefoundry import logger
|
|
7
|
-
from truefoundry.cli.commands.pat import get_generate_pat_command
|
|
8
7
|
from truefoundry.cli.config import CliConfig
|
|
9
8
|
from truefoundry.cli.const import GROUP_CLS
|
|
10
9
|
from truefoundry.cli.util import setup_rich_click
|
|
@@ -22,7 +21,6 @@ from truefoundry.deploy.cli.commands import (
|
|
|
22
21
|
get_terminate_command,
|
|
23
22
|
get_trigger_command,
|
|
24
23
|
)
|
|
25
|
-
from truefoundry.gateway.cli.cli import get_gateway_cli
|
|
26
24
|
from truefoundry.ml.cli.cli import get_ml_cli
|
|
27
25
|
from truefoundry.version import __version__
|
|
28
26
|
|
|
@@ -90,8 +88,6 @@ def create_truefoundry_cli() -> click.MultiCommand:
|
|
|
90
88
|
cli.add_command(get_trigger_command())
|
|
91
89
|
cli.add_command(get_terminate_command())
|
|
92
90
|
cli.add_command(get_ml_cli())
|
|
93
|
-
cli.add_command(get_gateway_cli())
|
|
94
|
-
cli.add_command(get_generate_pat_command())
|
|
95
91
|
|
|
96
92
|
if not (sys.platform.startswith("win32") or sys.platform.startswith("cygwin")):
|
|
97
93
|
cli.add_command(get_patch_command())
|
|
@@ -5,13 +5,13 @@ from typing import Dict
|
|
|
5
5
|
|
|
6
6
|
import rich_click as click
|
|
7
7
|
from packaging.version import parse as parse_version
|
|
8
|
-
from requests.exceptions import ConnectionError
|
|
8
|
+
from requests.exceptions import ConnectionError, Timeout
|
|
9
9
|
from rich.padding import Padding
|
|
10
10
|
from rich.panel import Panel
|
|
11
11
|
from rich.table import Table
|
|
12
12
|
|
|
13
13
|
from truefoundry.cli.console import console
|
|
14
|
-
from truefoundry.common.exceptions import
|
|
14
|
+
from truefoundry.common.exceptions import HttpRequestException
|
|
15
15
|
from truefoundry.common.utils import is_debug_env_set
|
|
16
16
|
|
|
17
17
|
|
|
@@ -25,12 +25,21 @@ def setup_rich_click():
|
|
|
25
25
|
def handle_exception(exception):
|
|
26
26
|
if is_debug_env_set():
|
|
27
27
|
console.print_exception(show_locals=True)
|
|
28
|
-
if isinstance(exception,
|
|
28
|
+
if isinstance(exception, HttpRequestException):
|
|
29
29
|
print_dict_as_table_panel(
|
|
30
30
|
{"Status Code": str(exception.status_code), "Error": exception.message},
|
|
31
31
|
title="Command Failed",
|
|
32
32
|
border_style="red",
|
|
33
33
|
)
|
|
34
|
+
elif isinstance(exception, Timeout):
|
|
35
|
+
loc = ""
|
|
36
|
+
if exception.request:
|
|
37
|
+
loc = f" at {exception.request.url}"
|
|
38
|
+
print_dict_as_table_panel(
|
|
39
|
+
{"Error": f"Request to TrueFoundry{loc} timed out."},
|
|
40
|
+
title="Command Failed",
|
|
41
|
+
border_style="red",
|
|
42
|
+
)
|
|
34
43
|
elif isinstance(exception, ConnectionError):
|
|
35
44
|
loc = ""
|
|
36
45
|
if exception.request:
|
|
@@ -7,7 +7,10 @@ import requests
|
|
|
7
7
|
from truefoundry.common.constants import VERSION_PREFIX
|
|
8
8
|
from truefoundry.common.entities import DeviceCode, Token
|
|
9
9
|
from truefoundry.common.exceptions import BadRequestException
|
|
10
|
-
from truefoundry.common.request_utils import
|
|
10
|
+
from truefoundry.common.request_utils import (
|
|
11
|
+
request_handling,
|
|
12
|
+
requests_retry_session,
|
|
13
|
+
)
|
|
11
14
|
from truefoundry.common.utils import poll_for_function, relogin_error_message
|
|
12
15
|
from truefoundry.logger import logger
|
|
13
16
|
|
|
@@ -16,14 +19,13 @@ class AuthServiceClient(ABC):
|
|
|
16
19
|
def __init__(self, tenant_name: str):
|
|
17
20
|
self._tenant_name = tenant_name
|
|
18
21
|
|
|
19
|
-
# TODO (chiragjn): Rename base_url to tfy_host
|
|
20
22
|
@classmethod
|
|
21
|
-
def
|
|
23
|
+
def from_tfy_host(cls, tfy_host: str) -> "AuthServiceClient":
|
|
22
24
|
from truefoundry.common.servicefoundry_client import (
|
|
23
25
|
ServiceFoundryServiceClient,
|
|
24
26
|
)
|
|
25
27
|
|
|
26
|
-
client = ServiceFoundryServiceClient(
|
|
28
|
+
client = ServiceFoundryServiceClient(tfy_host=tfy_host)
|
|
27
29
|
if client.python_sdk_config.use_sfy_server_auth_apis:
|
|
28
30
|
return ServiceFoundryServerAuthServiceClient(
|
|
29
31
|
tenant_name=client.tenant_info.tenant_name, url=client._api_server_url
|
|
@@ -159,6 +161,7 @@ class AuthServerServiceClient(AuthServiceClient):
|
|
|
159
161
|
session = requests_retry_session(retries=2)
|
|
160
162
|
response = session.post(url, json=data)
|
|
161
163
|
response_data = request_handling(response)
|
|
164
|
+
assert isinstance(response_data, dict)
|
|
162
165
|
# TODO: temporary cleanup of incorrect attributes
|
|
163
166
|
return DeviceCode.parse_obj(
|
|
164
167
|
{
|
|
@@ -38,6 +38,9 @@ class TrueFoundrySdkEnv(BaseSettings):
|
|
|
38
38
|
)
|
|
39
39
|
TFY_INTERNAL_SIGNED_URL_SERVER_MAX_TIMEOUT: int = 5 # default: 5 seconds
|
|
40
40
|
TFY_INTERNAL_SIGNED_URL_SERVER_DEFAULT_TTL: int = 3600 # default: 1 hour
|
|
41
|
+
TFY_INTERNAL_MULTIPART_UPLOAD_FINALIZE_SIGNED_URL_TIMEOUT: int = (
|
|
42
|
+
24 * 60 * 60
|
|
43
|
+
) # default: 24 hour
|
|
41
44
|
TFY_INTERNAL_SIGNED_URL_REQUEST_TIMEOUT: int = 3600 # default: 1 hour
|
|
42
45
|
TFY_INTERNAL_SIGNED_URL_CLIENT_LOG_LEVEL: str = "WARNING"
|
|
43
46
|
|
|
@@ -17,10 +17,9 @@ class CredentialProvider(ABC):
|
|
|
17
17
|
@abstractmethod
|
|
18
18
|
def token(self) -> Token: ...
|
|
19
19
|
|
|
20
|
-
# TODO (chiragjn): Rename base_url to tfy_host
|
|
21
20
|
@property
|
|
22
21
|
@abstractmethod
|
|
23
|
-
def
|
|
22
|
+
def tfy_host(self) -> str: ...
|
|
24
23
|
|
|
25
24
|
@staticmethod
|
|
26
25
|
@abstractmethod
|
|
@@ -38,7 +37,7 @@ class EnvCredentialProvider(CredentialProvider):
|
|
|
38
37
|
f"Value of {TFY_API_KEY_ENV_KEY} env var should be non-empty string"
|
|
39
38
|
)
|
|
40
39
|
self._host = resolve_tfy_host()
|
|
41
|
-
self._auth_service = AuthServiceClient.
|
|
40
|
+
self._auth_service = AuthServiceClient.from_tfy_host(tfy_host=self._host)
|
|
42
41
|
self._token: Token = Token(access_token=api_key, refresh_token=None) # type: ignore[call-arg]
|
|
43
42
|
|
|
44
43
|
@staticmethod
|
|
@@ -51,12 +50,12 @@ class EnvCredentialProvider(CredentialProvider):
|
|
|
51
50
|
if self._token.is_going_to_be_expired():
|
|
52
51
|
logger.info("Refreshing access token")
|
|
53
52
|
self._token = self._auth_service.refresh_token(
|
|
54
|
-
self._token, self.
|
|
53
|
+
self._token, self.tfy_host
|
|
55
54
|
)
|
|
56
55
|
return self._token
|
|
57
56
|
|
|
58
57
|
@property
|
|
59
|
-
def
|
|
58
|
+
def tfy_host(self) -> str:
|
|
60
59
|
return self._host
|
|
61
60
|
|
|
62
61
|
|
|
@@ -70,7 +69,7 @@ class FileCredentialProvider(CredentialProvider):
|
|
|
70
69
|
self._token = self._last_cred_file_content.to_token()
|
|
71
70
|
self._host = self._last_cred_file_content.host
|
|
72
71
|
|
|
73
|
-
self._auth_service = AuthServiceClient.
|
|
72
|
+
self._auth_service = AuthServiceClient.from_tfy_host(tfy_host=self._host)
|
|
74
73
|
|
|
75
74
|
@staticmethod
|
|
76
75
|
def can_provide() -> bool:
|
|
@@ -91,7 +90,7 @@ class FileCredentialProvider(CredentialProvider):
|
|
|
91
90
|
|
|
92
91
|
if new_cred_file_content == self._last_cred_file_content:
|
|
93
92
|
self._token = self._auth_service.refresh_token(
|
|
94
|
-
self._token, self.
|
|
93
|
+
self._token, self.tfy_host
|
|
95
94
|
)
|
|
96
95
|
self._last_cred_file_content = CredentialsFileContent(
|
|
97
96
|
host=self._host,
|
|
@@ -115,5 +114,5 @@ class FileCredentialProvider(CredentialProvider):
|
|
|
115
114
|
)
|
|
116
115
|
|
|
117
116
|
@property
|
|
118
|
-
def
|
|
117
|
+
def tfy_host(self) -> str:
|
|
119
118
|
return self._host
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# TODO (chiragjn): We need to establish uniform exception handling across codebase
|
|
5
|
+
class HttpRequestException(Exception):
|
|
6
|
+
def __init__(self, message: str, status_code: Optional[int] = None):
|
|
7
|
+
self.message = str(message)
|
|
8
|
+
self.status_code = status_code
|
|
9
|
+
super().__init__(message)
|
|
10
|
+
|
|
11
|
+
def __str__(self) -> str:
|
|
12
|
+
return self.message or ""
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BadRequestException(HttpRequestException):
|
|
16
|
+
pass
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from contextlib import contextmanager
|
|
3
|
+
from typing import Any, Dict, Optional, Type, Union
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
from requests import Response
|
|
7
|
+
from requests.adapters import HTTPAdapter
|
|
8
|
+
from urllib3 import Retry
|
|
9
|
+
|
|
10
|
+
from truefoundry.common.exceptions import BadRequestException, HttpRequestException
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# TODO (chiragjn): Rename this to json_response_handling
|
|
14
|
+
def request_handling(response: Response) -> Optional[Any]:
|
|
15
|
+
status_code = response.status_code
|
|
16
|
+
if 200 <= status_code <= 299:
|
|
17
|
+
if response.content == b"":
|
|
18
|
+
# TODO (chiragjn): Do we really need this empty check?
|
|
19
|
+
return None
|
|
20
|
+
try:
|
|
21
|
+
return response.json()
|
|
22
|
+
except json.JSONDecodeError as je:
|
|
23
|
+
raise ValueError(
|
|
24
|
+
f"Failed to parse response as json. Response: {response.text}",
|
|
25
|
+
) from je
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
message = str(response.json()["message"])
|
|
29
|
+
except Exception:
|
|
30
|
+
message = response.text
|
|
31
|
+
|
|
32
|
+
if 400 <= status_code <= 499:
|
|
33
|
+
raise BadRequestException(message=message, status_code=response.status_code)
|
|
34
|
+
if 500 <= status_code <= 599:
|
|
35
|
+
raise HttpRequestException(message=message, status_code=response.status_code)
|
|
36
|
+
|
|
37
|
+
raise HttpRequestException("Unknown error occurred", status_code=status_code)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def urllib3_retry(
|
|
41
|
+
retries: int = 2,
|
|
42
|
+
backoff_factor: float = 0.3,
|
|
43
|
+
status_forcelist=(408, 429, 500, 502, 503, 504, 524),
|
|
44
|
+
method_whitelist=frozenset({"GET", "POST"}),
|
|
45
|
+
raise_on_status: bool = False,
|
|
46
|
+
):
|
|
47
|
+
retry = Retry(
|
|
48
|
+
total=retries,
|
|
49
|
+
read=retries,
|
|
50
|
+
connect=retries,
|
|
51
|
+
status=retries,
|
|
52
|
+
backoff_factor=backoff_factor,
|
|
53
|
+
allowed_methods=method_whitelist,
|
|
54
|
+
status_forcelist=status_forcelist,
|
|
55
|
+
respect_retry_after_header=True,
|
|
56
|
+
raise_on_status=raise_on_status,
|
|
57
|
+
)
|
|
58
|
+
return retry
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def requests_retry_session(
|
|
62
|
+
retries: int = 2,
|
|
63
|
+
backoff_factor: float = 0.3,
|
|
64
|
+
status_forcelist=(408, 429, 417, 500, 502, 503, 504, 524),
|
|
65
|
+
method_whitelist=frozenset({"GET", "POST"}),
|
|
66
|
+
raise_on_status: bool = False,
|
|
67
|
+
session: Optional[requests.Session] = None,
|
|
68
|
+
) -> requests.Session:
|
|
69
|
+
"""
|
|
70
|
+
Returns a `requests` session with retry capabilities for certain HTTP status codes.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
retries (int): The number of retries for HTTP requests.
|
|
74
|
+
backoff_factor (float): The backoff factor for exponential backoff during retries.
|
|
75
|
+
status_forcelist (tuple): A tuple of HTTP status codes that should trigger a retry.
|
|
76
|
+
method_whitelist (frozenset): The set of HTTP methods that should be retried.
|
|
77
|
+
session (requests.Session, optional): An optional existing requests session to use.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
requests.Session: A session with retry capabilities.
|
|
81
|
+
"""
|
|
82
|
+
# Implementation taken from https://www.peterbe.com/plog/best-practice-with-retries-with-requests
|
|
83
|
+
session = session or requests.Session()
|
|
84
|
+
retry = urllib3_retry(
|
|
85
|
+
retries=retries,
|
|
86
|
+
backoff_factor=backoff_factor,
|
|
87
|
+
status_forcelist=status_forcelist,
|
|
88
|
+
method_whitelist=method_whitelist,
|
|
89
|
+
raise_on_status=raise_on_status,
|
|
90
|
+
)
|
|
91
|
+
adapter = HTTPAdapter(max_retries=retry)
|
|
92
|
+
session.mount("http://", adapter)
|
|
93
|
+
session.mount("https://", adapter)
|
|
94
|
+
return session
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def http_request(
|
|
98
|
+
*,
|
|
99
|
+
method: str,
|
|
100
|
+
url: str,
|
|
101
|
+
token: Optional[str] = None,
|
|
102
|
+
timeout=None,
|
|
103
|
+
headers: Optional[Dict[str, str]] = None,
|
|
104
|
+
session: Optional[requests.Session] = None,
|
|
105
|
+
exception_class: Type[HttpRequestException] = HttpRequestException,
|
|
106
|
+
**kwargs,
|
|
107
|
+
) -> requests.Response:
|
|
108
|
+
session = session or requests.Session()
|
|
109
|
+
headers = headers or {}
|
|
110
|
+
if token is not None:
|
|
111
|
+
headers["Authorization"] = f"Bearer {token}"
|
|
112
|
+
try:
|
|
113
|
+
response = session.request(
|
|
114
|
+
method=method, url=url, headers=headers, timeout=timeout, **kwargs
|
|
115
|
+
)
|
|
116
|
+
return response
|
|
117
|
+
except requests.exceptions.ConnectionError as ce:
|
|
118
|
+
raise exception_class("Failed to connect to TrueFoundry") from ce
|
|
119
|
+
except requests.exceptions.Timeout as te:
|
|
120
|
+
raise exception_class(f"Request to {url} timed out") from te
|
|
121
|
+
except Exception as e:
|
|
122
|
+
raise exception_class(f"Request to {url} failed with error {str(e)}") from e
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@contextmanager
|
|
126
|
+
def cloud_storage_http_request(
|
|
127
|
+
*,
|
|
128
|
+
method: str,
|
|
129
|
+
url: str,
|
|
130
|
+
session: Optional[requests.Session] = None,
|
|
131
|
+
timeout: Optional[Union[int, float]] = None,
|
|
132
|
+
exception_class: Type[HttpRequestException] = HttpRequestException,
|
|
133
|
+
**kwargs,
|
|
134
|
+
):
|
|
135
|
+
"""
|
|
136
|
+
Performs an HTTP PUT/GET request using Python's `requests` module with automatic retry.
|
|
137
|
+
"""
|
|
138
|
+
# Note: This does not support auth and is only meant to be used for pre-signed URLs.
|
|
139
|
+
session = session or requests_retry_session(retries=5, backoff_factor=0.5)
|
|
140
|
+
headers = kwargs.get("headers", {}) or {}
|
|
141
|
+
if "blob.core.windows.net" in url:
|
|
142
|
+
headers.update({"x-ms-blob-type": "BlockBlob"})
|
|
143
|
+
if method.lower() not in ("put", "get"):
|
|
144
|
+
raise ValueError(f"Illegal http method: {method}")
|
|
145
|
+
yield http_request(
|
|
146
|
+
method=method,
|
|
147
|
+
url=url,
|
|
148
|
+
session=session,
|
|
149
|
+
timeout=timeout,
|
|
150
|
+
headers=headers,
|
|
151
|
+
exception_class=exception_class,
|
|
152
|
+
**kwargs,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
# TODO: Try and eliminate this
|
|
157
|
+
def augmented_raise_for_status(
|
|
158
|
+
response, exception_class: Type[HttpRequestException] = HttpRequestException
|
|
159
|
+
):
|
|
160
|
+
try:
|
|
161
|
+
response.raise_for_status()
|
|
162
|
+
except requests.exceptions.HTTPError as he:
|
|
163
|
+
raise exception_class(
|
|
164
|
+
message=f"Request failed with status code {he.response.status_code}. Response: {he.response.text}",
|
|
165
|
+
status_code=he.response.status_code,
|
|
166
|
+
) from he
|
|
@@ -13,7 +13,10 @@ from truefoundry.common.entities import (
|
|
|
13
13
|
PythonSDKConfig,
|
|
14
14
|
TenantInfo,
|
|
15
15
|
)
|
|
16
|
-
from truefoundry.common.request_utils import
|
|
16
|
+
from truefoundry.common.request_utils import (
|
|
17
|
+
request_handling,
|
|
18
|
+
requests_retry_session,
|
|
19
|
+
)
|
|
17
20
|
from truefoundry.common.utils import (
|
|
18
21
|
get_tfy_servers_config,
|
|
19
22
|
timed_lru_cache,
|
|
@@ -25,19 +28,8 @@ from truefoundry.version import __version__
|
|
|
25
28
|
def check_min_cli_version(fn):
|
|
26
29
|
@functools.wraps(fn)
|
|
27
30
|
def inner(*args, **kwargs):
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# "0.0.0" indicates dev version
|
|
31
|
-
# noinspection PyProtectedMember
|
|
32
|
-
min_cli_version_required = client._min_cli_version_required
|
|
33
|
-
if version.parse(__version__) < version.parse(min_cli_version_required):
|
|
34
|
-
raise Exception(
|
|
35
|
-
"You are using an outdated version of `truefoundry`.\n"
|
|
36
|
-
f"Run `pip install truefoundry>={min_cli_version_required}` to install the supported version.",
|
|
37
|
-
)
|
|
38
|
-
else:
|
|
39
|
-
logger.debug("Ignoring minimum cli version check")
|
|
40
|
-
|
|
31
|
+
client: "ServiceFoundryServiceClient" = args[0]
|
|
32
|
+
client.check_min_cli_version()
|
|
41
33
|
return fn(*args, **kwargs)
|
|
42
34
|
|
|
43
35
|
return inner
|
|
@@ -51,34 +43,33 @@ def session_with_retries(
|
|
|
51
43
|
|
|
52
44
|
@timed_lru_cache(seconds=30 * 60)
|
|
53
45
|
def _cached_get_tenant_info(api_server_url: str, tenant_host: str) -> TenantInfo:
|
|
54
|
-
|
|
46
|
+
response = session_with_retries().get(
|
|
55
47
|
url=f"{api_server_url}/{VERSION_PREFIX}/tenant-id",
|
|
56
48
|
params={"hostName": tenant_host},
|
|
57
49
|
)
|
|
58
|
-
|
|
59
|
-
return TenantInfo.parse_obj(
|
|
50
|
+
response_data = request_handling(response)
|
|
51
|
+
return TenantInfo.parse_obj(response_data)
|
|
60
52
|
|
|
61
53
|
|
|
62
54
|
@timed_lru_cache(seconds=30 * 60)
|
|
63
55
|
def _cached_get_python_sdk_config(api_server_url: str) -> PythonSDKConfig:
|
|
64
|
-
|
|
56
|
+
response = session_with_retries().get(
|
|
65
57
|
url=f"{api_server_url}/{VERSION_PREFIX}/min-cli-version"
|
|
66
58
|
)
|
|
67
|
-
|
|
68
|
-
return PythonSDKConfig.parse_obj(
|
|
59
|
+
response_data = request_handling(response)
|
|
60
|
+
return PythonSDKConfig.parse_obj(response_data)
|
|
69
61
|
|
|
70
62
|
|
|
71
63
|
class ServiceFoundryServiceClient:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
tfy_servers_config = get_tfy_servers_config(self._base_url)
|
|
64
|
+
def __init__(self, tfy_host: str):
|
|
65
|
+
self._tfy_host = tfy_host.strip("/")
|
|
66
|
+
tfy_servers_config = get_tfy_servers_config(self._tfy_host)
|
|
76
67
|
self._tenant_host = tfy_servers_config.tenant_host
|
|
77
68
|
self._api_server_url = tfy_servers_config.servicefoundry_server_url
|
|
78
69
|
|
|
79
70
|
@property
|
|
80
|
-
def
|
|
81
|
-
return self.
|
|
71
|
+
def tfy_host(self) -> str:
|
|
72
|
+
return self._tfy_host
|
|
82
73
|
|
|
83
74
|
@property
|
|
84
75
|
def tenant_info(self) -> TenantInfo:
|
|
@@ -95,6 +86,17 @@ class ServiceFoundryServiceClient:
|
|
|
95
86
|
|
|
96
87
|
@functools.cached_property
|
|
97
88
|
def _min_cli_version_required(self) -> str:
|
|
98
|
-
return
|
|
99
|
-
|
|
100
|
-
|
|
89
|
+
return self.python_sdk_config.truefoundry_cli_min_version
|
|
90
|
+
|
|
91
|
+
def check_min_cli_version(self) -> None:
|
|
92
|
+
if __version__ != "0.0.0":
|
|
93
|
+
# "0.0.0" indicates dev version
|
|
94
|
+
# noinspection PyProtectedMember
|
|
95
|
+
min_cli_version_required = self._min_cli_version_required
|
|
96
|
+
if version.parse(__version__) < version.parse(min_cli_version_required):
|
|
97
|
+
raise Exception(
|
|
98
|
+
"You are using an outdated version of `truefoundry`.\n"
|
|
99
|
+
f"Run `pip install truefoundry>={min_cli_version_required}` to install the supported version.",
|
|
100
|
+
)
|
|
101
|
+
else:
|
|
102
|
+
logger.debug("Ignoring minimum cli version check")
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import threading
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
from truefoundry.common.credential_provider import (
|
|
7
|
+
CredentialProvider,
|
|
8
|
+
EnvCredentialProvider,
|
|
9
|
+
FileCredentialProvider,
|
|
10
|
+
)
|
|
11
|
+
from truefoundry.common.entities import UserInfo
|
|
12
|
+
from truefoundry.common.utils import relogin_error_message
|
|
13
|
+
from truefoundry.logger import logger
|
|
14
|
+
|
|
15
|
+
SESSION_LOCK = threading.RLock()
|
|
16
|
+
ACTIVE_SESSION: Optional["Session"] = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Session:
|
|
20
|
+
def __init__(self) -> None:
|
|
21
|
+
self._closed = False
|
|
22
|
+
self._cred_provider: Optional[CredentialProvider] = self._get_cred_provider()
|
|
23
|
+
self._user_info: Optional[UserInfo] = self._cred_provider.token.to_user_info()
|
|
24
|
+
|
|
25
|
+
@staticmethod
|
|
26
|
+
def _get_cred_provider() -> CredentialProvider:
|
|
27
|
+
final_cred_provider = None
|
|
28
|
+
for cred_provider in [EnvCredentialProvider, FileCredentialProvider]:
|
|
29
|
+
if cred_provider.can_provide():
|
|
30
|
+
final_cred_provider = cred_provider()
|
|
31
|
+
break
|
|
32
|
+
if final_cred_provider is None:
|
|
33
|
+
raise Exception(
|
|
34
|
+
relogin_error_message(
|
|
35
|
+
"No active session found. Perhaps you are not logged in?",
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
return final_cred_provider
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def new(cls) -> "Session":
|
|
42
|
+
global ACTIVE_SESSION
|
|
43
|
+
with SESSION_LOCK:
|
|
44
|
+
new_session = cls()
|
|
45
|
+
if ACTIVE_SESSION and ACTIVE_SESSION == new_session:
|
|
46
|
+
return ACTIVE_SESSION
|
|
47
|
+
|
|
48
|
+
if ACTIVE_SESSION:
|
|
49
|
+
ACTIVE_SESSION.close()
|
|
50
|
+
|
|
51
|
+
ACTIVE_SESSION = new_session
|
|
52
|
+
logger.info(
|
|
53
|
+
"Logged in to %r as %r (%s)",
|
|
54
|
+
new_session.tfy_host,
|
|
55
|
+
new_session.user_info.user_id,
|
|
56
|
+
new_session.user_info.email or new_session.user_info.user_type.value,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
return ACTIVE_SESSION
|
|
60
|
+
|
|
61
|
+
def close(self):
|
|
62
|
+
self._closed = True
|
|
63
|
+
self._user_info = None
|
|
64
|
+
self._cred_provider = None
|
|
65
|
+
|
|
66
|
+
def _assert_not_closed(self):
|
|
67
|
+
if self._closed:
|
|
68
|
+
raise Exception("This session has been deactivated.")
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def access_token(self) -> str:
|
|
72
|
+
assert self._cred_provider is not None
|
|
73
|
+
return self._cred_provider.token.access_token
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def tfy_host(self) -> str:
|
|
77
|
+
assert self._cred_provider is not None
|
|
78
|
+
return self._cred_provider.tfy_host
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def user_info(self) -> UserInfo:
|
|
82
|
+
self._assert_not_closed()
|
|
83
|
+
assert self._user_info is not None
|
|
84
|
+
return self._user_info
|
|
85
|
+
|
|
86
|
+
def __eq__(self, other: object) -> bool:
|
|
87
|
+
if not isinstance(other, Session):
|
|
88
|
+
return False
|
|
89
|
+
return (
|
|
90
|
+
type(self._cred_provider) == type(other._cred_provider) # noqa: E721
|
|
91
|
+
and self.user_info == other.user_info
|
|
92
|
+
and self.tfy_host == other.tfy_host
|
|
93
|
+
)
|