truefoundry 0.9.2rc1__tar.gz → 0.9.3__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.9.2rc1 → truefoundry-0.9.3}/PKG-INFO +1 -1
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/pyproject.toml +2 -1
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/constants.py +3 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/__init__.py +3 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/_autogen/models.py +54 -18
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/__init__.py +2 -1
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/__init__.py +2 -0
- truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/__init__.py +79 -0
- truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/dockerfile_template.py +172 -0
- truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/tfy_execute_notebook.py +56 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/apply_command.py +17 -2
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/deploy_command.py +15 -1
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/clients/servicefoundry_client.py +8 -3
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/apply.py +23 -5
- truefoundry-0.9.3/truefoundry/deploy/lib/diff_utils.py +92 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/model/entity.py +4 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/deploy.py +2 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/deployable_patched_models.py +69 -4
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/patched_models.py +20 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/.gitignore +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/README.md +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/_ask/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/_ask/cli.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/_ask/client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/_ask/llm_utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/_client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/base.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/developer.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/project_identifier.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/tester.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/cli.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/constants.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/exception.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/logger.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/ask.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/base.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/commit.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/docker_build.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/docker_run.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/file_type_counts.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/list_files.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/read_file.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/send_request.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/write_file.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/utils/client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/utils/diff.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/autodeploy/utils/pydantic_compat.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/cli/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/cli/__main__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/cli/config.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/cli/console.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/cli/const.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/cli/display_util.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/cli/util.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/auth_service_client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/credential_file_manager.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/credential_provider.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/entities.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/exceptions.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/request_utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/servicefoundry_client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/session.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/storage_provider_utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/types.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/common/warnings.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/dockerfile.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/constants.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/docker_service.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/builder/utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/build_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/delete_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/deploy_init_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/get_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/k8s_exec_credential_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/kubeconfig_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/login_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/logout_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/logs_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/patch_application_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/patch_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/terminate_comand.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/trigger_command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/core/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/core/login.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/core/logout.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/io/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/io/no_output_callback.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/io/output_callback.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/io/rich_output_callback.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/clients/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/const.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/application.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/delete.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/version.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/workspace.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/logs_utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/messages.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/model/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/session.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/util.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/win32.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/python_deploy_codegen.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/deploy_workflow.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/models.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/source.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/logger.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/auth_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/deprecated_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/experiments_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/generate_code_snippet_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/health_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/metrics_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/mlfoundry_artifacts_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/run_artifacts_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/runs_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api_client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api_response.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/configuration.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/exceptions.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_app.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_manifest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_manifest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_with_fqn.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_with_fqn.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/apply_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/apply_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_manifest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_path.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_type.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_serialization_format.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_status.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/assistant_message.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/blob_storage_reference.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/body_get_search_runs_get.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest_messages_inner.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/columns_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/command.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content1.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content2.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content2_any_of_inner.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_version_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_experiment_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_experiment_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_run_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_run_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_workflow_task_config_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/data_directory_manifest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/dataset_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/dataset_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_artifact_versions_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_files_for_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_run_request.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_tag_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_id_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_tag_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/export_deployment_files_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/external_blob_storage_source.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/fast_ai_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/file_info_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/finalize_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_artifact_version_aliases_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_experiment_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_latest_run_log_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_metric_history_response.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_url_for_dataset_write_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_write_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_tenant_id_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/gluon_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/h2_o_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/http_validation_error.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/image_content_part.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/image_url.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/infer_method_name.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/keras_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/latest_run_log_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/library_name.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/light_gbm_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifact_versions_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifact_versions_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifacts_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifacts_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_colums_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_datasets_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_datasets_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_experiments_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_versions_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_latest_run_logs_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_metric_history_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_metric_history_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_model_version_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_model_versions_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_models_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_models_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_run_artifacts_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_run_logs_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/local_artifact_source.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/local_model_source.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/log_batch_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/log_metric_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/log_param_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/manifest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/manifest1.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/manifest2.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/method.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/metric_collection_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/metric_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/mime_type.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_configuration.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_manifest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_server.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_version_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_version_environment.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_version_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/multi_part_upload_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/multi_part_upload_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/multi_part_upload_storage_provider.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/notify_artifact_version_failure_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/onnx_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/openapi_spec.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/paddle_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/param_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/parameters.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/py_torch_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/resolve_agent_app_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/restore_run_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_data_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_info_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_log_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_log_input_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_tag_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/search_runs_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/search_runs_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/set_experiment_tag_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/set_tag_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/signed_url_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/sklearn_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/sklearn_model_schema.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/sklearn_serialization_format.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/source.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/source1.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/source2.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/spa_cy_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/stats_models_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/stop.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/store_run_logs_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/subject.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/subject_type.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/system_message.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/tensor_flow_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/text.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/text_content_part.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/transformers_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/true_foundry_managed_source.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_experiment_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_run_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_run_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/url.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/user_message.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_request_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_response_dto.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validation_error.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validation_error_loc_inner.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/xg_boost_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/xg_boost_model_schema.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/xg_boost_serialization_format.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/rest.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client_README.md +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/entities/artifacts.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/exceptions.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/schema.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/signature.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/artifact/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/artifact/truefoundry_artifact_repo.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/cli/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/cli/cli.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/cli/commands/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/cli/commands/download.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/cli/commands/model_init.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/cli/utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/clients/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/clients/servicefoundry_client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/constants.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/entities.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/enums.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/exceptions.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/git_info.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/internal_namespace.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/artifact.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/constants.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/dataset.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/general_artifact.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/model.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/constants.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/image.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/image_normalizer.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/types.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/plot.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/pydantic_base.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/log_types/utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/logger.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/mlfoundry_api.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/mlfoundry_run.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/model_framework.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/prompt_utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/run_utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/session.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/ml/validation_utils.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/pydantic_v1.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/version.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/container_task.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/map_task.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/python_task.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/__init__.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/logger.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/task.py +0 -0
- {truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/workflow/workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "truefoundry"
|
|
3
|
-
version = "0.9.
|
|
3
|
+
version = "0.9.3" # This is a placeholder version, it will be replaced when releasing
|
|
4
4
|
requires-python = ">=3.8.1,<3.14"
|
|
5
5
|
description = "TrueFoundry CLI"
|
|
6
6
|
authors = [{ name = "TrueFoundry Team", email = "abhishek@truefoundry.com" }]
|
|
@@ -178,6 +178,7 @@ warn_required_dynamic_aliases = true
|
|
|
178
178
|
[tool.pytest.ini_options]
|
|
179
179
|
env = [
|
|
180
180
|
"TFY_PYTHONBUILD_PYTHON_IMAGE_REPO=docker.io/truefoundrycloud/test/python",
|
|
181
|
+
"TFY_SPARK_BUILD_SPARK_IMAGE_REPO=public.ecr.aws/bitnami/spark",
|
|
181
182
|
]
|
|
182
183
|
|
|
183
184
|
[tool.uv]
|
|
@@ -65,6 +65,9 @@ class TrueFoundrySdkEnv(BaseSettings):
|
|
|
65
65
|
# Fo customizing the python image used for building via PythonBuild
|
|
66
66
|
TFY_PYTHONBUILD_PYTHON_IMAGE_REPO: str = "public.ecr.aws/docker/library/python"
|
|
67
67
|
|
|
68
|
+
# TODO(gw): Use another image with more linient rate limits
|
|
69
|
+
TFY_SPARK_BUILD_SPARK_IMAGE_REPO: str = "public.ecr.aws/bitnami/spark"
|
|
70
|
+
|
|
68
71
|
# For local development, this enables futher configuration via _TFYServersConfig
|
|
69
72
|
TFY_CLI_LOCAL_DEV_MODE: bool = False
|
|
70
73
|
|
|
@@ -113,6 +113,9 @@ from truefoundry.deploy.v2.lib.patched_models import (
|
|
|
113
113
|
ServiceAutoscaling,
|
|
114
114
|
SlackBot,
|
|
115
115
|
SlackWebhook,
|
|
116
|
+
SparkBuild,
|
|
117
|
+
SparkImage,
|
|
118
|
+
SparkImageBuild,
|
|
116
119
|
SparkJobJavaEntrypoint,
|
|
117
120
|
SparkJobPythonEntrypoint,
|
|
118
121
|
SparkJobScalaEntrypoint,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: application.json
|
|
3
|
-
# timestamp: 2025-
|
|
3
|
+
# timestamp: 2025-06-09T12:01:27+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -104,8 +104,8 @@ class AsyncProcessorSidecar(BaseModel):
|
|
|
104
104
|
|
|
105
105
|
class Autoshutdown(BaseModel):
|
|
106
106
|
wait_time: conint(ge=0) = Field(
|
|
107
|
-
|
|
108
|
-
description="The period to wait after the last received request before scaling the replicas to 0",
|
|
107
|
+
900,
|
|
108
|
+
description="The period to wait after the last received request before scaling the replicas to 0. This value should be high enough to allow for the replicas of the service to come up to avoid premature scaling down.",
|
|
109
109
|
)
|
|
110
110
|
|
|
111
111
|
|
|
@@ -285,8 +285,8 @@ class GitSource(BaseModel):
|
|
|
285
285
|
repo_url: constr(regex=r"^(https?://)\S+$") = Field(
|
|
286
286
|
..., description="The repository URL."
|
|
287
287
|
)
|
|
288
|
-
ref:
|
|
289
|
-
branch_name: Optional[
|
|
288
|
+
ref: constr(regex=r"^\S+$") = Field(..., description="The commit SHA.")
|
|
289
|
+
branch_name: Optional[constr(regex=r"^\S+$")] = Field(
|
|
290
290
|
None,
|
|
291
291
|
description="Selecting branch will select latest commit SHA of the branch.",
|
|
292
292
|
)
|
|
@@ -346,11 +346,11 @@ class Image(BaseModel):
|
|
|
346
346
|
"""
|
|
347
347
|
|
|
348
348
|
type: Literal["image"] = Field(..., description="")
|
|
349
|
-
image_uri: constr(regex=r"^\S
|
|
349
|
+
image_uri: constr(regex=r"^\S+$") = Field(
|
|
350
350
|
...,
|
|
351
351
|
description="The image URI. Specify the name of the image and the tag.\nIf the image is in Dockerhub, you can skip registry-url (for e.g. `tensorflow/tensorflow`).\nYou can use an image from a private registry using Advanced fields",
|
|
352
352
|
)
|
|
353
|
-
docker_registry: Optional[
|
|
353
|
+
docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
|
|
354
354
|
None,
|
|
355
355
|
description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
|
|
356
356
|
)
|
|
@@ -643,7 +643,7 @@ class PythonBuild(BaseModel):
|
|
|
643
643
|
)
|
|
644
644
|
cuda_version: Optional[
|
|
645
645
|
constr(
|
|
646
|
-
regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8)$"
|
|
646
|
+
regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8|12\.3-cudnn9|12\.4-cudnn9|12\.5-cudnn9|12\.6-cudnn9)$"
|
|
647
647
|
)
|
|
648
648
|
] = Field(
|
|
649
649
|
None,
|
|
@@ -840,8 +840,26 @@ class SlackWebhook(BaseModel):
|
|
|
840
840
|
)
|
|
841
841
|
|
|
842
842
|
|
|
843
|
+
class SparkBuild(BaseModel):
|
|
844
|
+
"""
|
|
845
|
+
Describes that we are using python to build a container image with a specific python version and pip packages installed.
|
|
846
|
+
"""
|
|
847
|
+
|
|
848
|
+
type: Literal["tfy-spark-buildpack"] = Field(..., description="")
|
|
849
|
+
spark_version: str = Field(
|
|
850
|
+
"3.5.2",
|
|
851
|
+
description="Spark version should match the spark version installed in the image.",
|
|
852
|
+
)
|
|
853
|
+
build_context_path: str = Field(
|
|
854
|
+
"./", description="Build path relative to project root path."
|
|
855
|
+
)
|
|
856
|
+
requirements_path: Optional[str] = Field(
|
|
857
|
+
None,
|
|
858
|
+
description="Path to `requirements.txt` relative to\n`Path to build context`",
|
|
859
|
+
)
|
|
860
|
+
|
|
861
|
+
|
|
843
862
|
class SparkDriverConfig(BaseModel):
|
|
844
|
-
ui_endpoint: Endpoint
|
|
845
863
|
resources: Optional[Resources] = None
|
|
846
864
|
|
|
847
865
|
|
|
@@ -865,19 +883,33 @@ class SparkImage(BaseModel):
|
|
|
865
883
|
Describes that we are using a pre-built image stored in a Docker Image registry
|
|
866
884
|
"""
|
|
867
885
|
|
|
868
|
-
type: Literal["image"] = Field(..., description="")
|
|
886
|
+
type: Literal["spark-image"] = Field(..., description="")
|
|
869
887
|
spark_version: str = Field(
|
|
870
888
|
"3.5.2",
|
|
871
889
|
description="Spark version should match the spark version installed in the image.",
|
|
872
890
|
)
|
|
873
|
-
image_uri: constr(regex=r"^\S
|
|
891
|
+
image_uri: constr(regex=r"^\S+$") = Field(
|
|
874
892
|
...,
|
|
875
893
|
description="The image URI. Specify the name of the image and the tag.\nIf the image is in Dockerhub, you can skip registry-url (for e.g. `tensorflow/tensorflow`).\nYou can use an image from a private registry using Advanced fields",
|
|
876
894
|
)
|
|
877
|
-
docker_registry: Optional[
|
|
895
|
+
docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
|
|
896
|
+
None,
|
|
897
|
+
description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
|
|
898
|
+
)
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
class SparkImageBuild(BaseModel):
|
|
902
|
+
"""
|
|
903
|
+
Describes that we are building a new image based on the spec
|
|
904
|
+
"""
|
|
905
|
+
|
|
906
|
+
type: Literal["spark-image-build"] = Field(..., description="")
|
|
907
|
+
docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
|
|
878
908
|
None,
|
|
879
909
|
description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
|
|
880
910
|
)
|
|
911
|
+
build_source: GitSource
|
|
912
|
+
build_spec: SparkBuild
|
|
881
913
|
|
|
882
914
|
|
|
883
915
|
class SparkJobJavaEntrypoint(BaseModel):
|
|
@@ -896,7 +928,8 @@ class SparkJobJavaEntrypoint(BaseModel):
|
|
|
896
928
|
class SparkJobPythonEntrypoint(BaseModel):
|
|
897
929
|
type: Literal["python"] = Field(..., description="")
|
|
898
930
|
main_application_file: str = Field(
|
|
899
|
-
...,
|
|
931
|
+
...,
|
|
932
|
+
description="The main application file to be executed by the spark job. Relative path in case of git repository.",
|
|
900
933
|
)
|
|
901
934
|
arguments: Optional[str] = Field(
|
|
902
935
|
None, description="Arguments to be passed to the main application file."
|
|
@@ -978,7 +1011,7 @@ class TaskPythonBuild(BaseModel):
|
|
|
978
1011
|
)
|
|
979
1012
|
cuda_version: Optional[
|
|
980
1013
|
constr(
|
|
981
|
-
regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8)$"
|
|
1014
|
+
regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8|12\.3-cudnn9|12\.4-cudnn9|12\.5-cudnn9|12\.6-cudnn9)$"
|
|
982
1015
|
)
|
|
983
1016
|
] = Field(
|
|
984
1017
|
None,
|
|
@@ -1113,7 +1146,7 @@ class Build(BaseModel):
|
|
|
1113
1146
|
"""
|
|
1114
1147
|
|
|
1115
1148
|
type: Literal["build"] = Field(..., description="")
|
|
1116
|
-
docker_registry: Optional[
|
|
1149
|
+
docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
|
|
1117
1150
|
None,
|
|
1118
1151
|
description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
|
|
1119
1152
|
)
|
|
@@ -1411,7 +1444,10 @@ class SparkJob(BaseModel):
|
|
|
1411
1444
|
name: constr(regex=r"^[a-z](?:[a-z0-9]|-(?!-)){1,30}[a-z0-9]$") = Field(
|
|
1412
1445
|
..., description="Name of the job"
|
|
1413
1446
|
)
|
|
1414
|
-
image: SparkImage
|
|
1447
|
+
image: Union[SparkImage, SparkImageBuild] = Field(
|
|
1448
|
+
...,
|
|
1449
|
+
description="The image to use for driver and executors. Must have spark installed. Spark version must match the version in the image.",
|
|
1450
|
+
)
|
|
1415
1451
|
entrypoint: Union[
|
|
1416
1452
|
SparkJobPythonEntrypoint, SparkJobScalaEntrypoint, SparkJobJavaEntrypoint
|
|
1417
1453
|
] = Field(..., description="")
|
|
@@ -1604,8 +1640,8 @@ class Job(BaseModel):
|
|
|
1604
1640
|
trigger: Union[Manual, Schedule] = Field(
|
|
1605
1641
|
{"type": "manual"}, description="Specify the trigger"
|
|
1606
1642
|
)
|
|
1607
|
-
trigger_on_deploy: bool = Field(
|
|
1608
|
-
|
|
1643
|
+
trigger_on_deploy: Optional[bool] = Field(
|
|
1644
|
+
None, description="Trigger the job after deploy immediately"
|
|
1609
1645
|
)
|
|
1610
1646
|
params: Optional[List[Param]] = Field(
|
|
1611
1647
|
None, description="Configure params and pass it to create different job runs"
|
|
@@ -3,6 +3,7 @@ from typing import Any, Dict, List, Optional, Union
|
|
|
3
3
|
from truefoundry.deploy._autogen.models import (
|
|
4
4
|
DockerFileBuild,
|
|
5
5
|
PythonBuild,
|
|
6
|
+
SparkBuild,
|
|
6
7
|
TaskDockerFileBuild,
|
|
7
8
|
TaskPythonBuild,
|
|
8
9
|
)
|
|
@@ -20,6 +21,7 @@ class _BuildConfig(BaseModel):
|
|
|
20
21
|
NotebookImageBuild,
|
|
21
22
|
TaskPythonBuild,
|
|
22
23
|
TaskDockerFileBuild,
|
|
24
|
+
SparkBuild,
|
|
23
25
|
] = Field(discriminator="type")
|
|
24
26
|
|
|
25
27
|
|
|
@@ -37,7 +39,6 @@ def build(
|
|
|
37
39
|
build_configuration_dict = build_configuration.dict()
|
|
38
40
|
build_configuration_dict.update({"type": "dockerfile"})
|
|
39
41
|
build_configuration = DockerFileBuild.parse_obj(build_configuration_dict)
|
|
40
|
-
|
|
41
42
|
builder = get_builder(build_configuration.type)
|
|
42
43
|
return builder(
|
|
43
44
|
build_configuration=build_configuration,
|
|
@@ -4,12 +4,14 @@ from truefoundry.deploy.builder.builders import (
|
|
|
4
4
|
dockerfile,
|
|
5
5
|
tfy_notebook_buildpack,
|
|
6
6
|
tfy_python_buildpack,
|
|
7
|
+
tfy_spark_buildpack,
|
|
7
8
|
)
|
|
8
9
|
|
|
9
10
|
BUILD_REGISTRY: Dict[str, Callable] = {
|
|
10
11
|
"dockerfile": dockerfile.build,
|
|
11
12
|
"tfy-python-buildpack": tfy_python_buildpack.build,
|
|
12
13
|
"tfy-notebook-buildpack": tfy_notebook_buildpack.build,
|
|
14
|
+
"tfy-spark-buildpack": tfy_spark_buildpack.build,
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
__all__ = ["get_builder"]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
from tempfile import TemporaryDirectory
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
from truefoundry.common.constants import PythonPackageManager
|
|
7
|
+
from truefoundry.deploy._autogen.models import DockerFileBuild, SparkBuild
|
|
8
|
+
from truefoundry.deploy.builder.builders import dockerfile
|
|
9
|
+
from truefoundry.deploy.builder.builders.tfy_spark_buildpack.dockerfile_template import (
|
|
10
|
+
generate_dockerfile_content,
|
|
11
|
+
)
|
|
12
|
+
from truefoundry.deploy.builder.utils import has_python_package_manager_conf_secret
|
|
13
|
+
|
|
14
|
+
__all__ = ["generate_dockerfile_content", "build"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _convert_to_dockerfile_build_config(
|
|
18
|
+
build_configuration: SparkBuild,
|
|
19
|
+
dockerfile_path: str,
|
|
20
|
+
mount_python_package_manager_conf_secret: bool = False,
|
|
21
|
+
) -> DockerFileBuild:
|
|
22
|
+
dockerfile_content = generate_dockerfile_content(
|
|
23
|
+
build_configuration=build_configuration,
|
|
24
|
+
mount_python_package_manager_conf_secret=mount_python_package_manager_conf_secret,
|
|
25
|
+
package_manager=PythonPackageManager.PIP.value,
|
|
26
|
+
)
|
|
27
|
+
with open(dockerfile_path, "w", encoding="utf8") as fp:
|
|
28
|
+
fp.write(dockerfile_content)
|
|
29
|
+
|
|
30
|
+
return DockerFileBuild(
|
|
31
|
+
type="dockerfile",
|
|
32
|
+
dockerfile_path=dockerfile_path,
|
|
33
|
+
build_context_path=build_configuration.build_context_path,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def build(
|
|
38
|
+
tag: str,
|
|
39
|
+
build_configuration: SparkBuild,
|
|
40
|
+
extra_opts: Optional[List[str]] = None,
|
|
41
|
+
):
|
|
42
|
+
mount_python_package_manager_conf_secret = (
|
|
43
|
+
has_python_package_manager_conf_secret(extra_opts) if extra_opts else False
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# Copy tfy_execute_notebook.py to the build context
|
|
47
|
+
execute_notebook_src = os.path.join(
|
|
48
|
+
os.path.dirname(__file__), "tfy_execute_notebook.py"
|
|
49
|
+
)
|
|
50
|
+
execute_notebook_dst = os.path.join(
|
|
51
|
+
build_configuration.build_context_path, "tfy_execute_notebook.py"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Verify the source file exists before copying
|
|
55
|
+
if not os.path.isfile(execute_notebook_src):
|
|
56
|
+
raise FileNotFoundError(f"Required file not found: {execute_notebook_src}")
|
|
57
|
+
|
|
58
|
+
# Always copy the file, overwrite if exists
|
|
59
|
+
shutil.copy2(execute_notebook_src, execute_notebook_dst)
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
with TemporaryDirectory() as local_dir:
|
|
63
|
+
docker_build_configuration = _convert_to_dockerfile_build_config(
|
|
64
|
+
build_configuration,
|
|
65
|
+
dockerfile_path=os.path.join(local_dir, "Dockerfile"),
|
|
66
|
+
mount_python_package_manager_conf_secret=mount_python_package_manager_conf_secret,
|
|
67
|
+
)
|
|
68
|
+
dockerfile.build(
|
|
69
|
+
tag=tag,
|
|
70
|
+
build_configuration=docker_build_configuration,
|
|
71
|
+
extra_opts=extra_opts,
|
|
72
|
+
)
|
|
73
|
+
finally:
|
|
74
|
+
# Clean up the copied file if we copied it
|
|
75
|
+
if os.path.exists(execute_notebook_dst):
|
|
76
|
+
try:
|
|
77
|
+
os.remove(execute_notebook_dst)
|
|
78
|
+
except OSError:
|
|
79
|
+
pass # Ignore errors when cleaning up
|
truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/dockerfile_template.py
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import shlex
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
from mako.template import Template
|
|
5
|
+
|
|
6
|
+
from truefoundry.common.constants import ENV_VARS, PythonPackageManager
|
|
7
|
+
from truefoundry.deploy._autogen.models import SparkBuild
|
|
8
|
+
from truefoundry.deploy.builder.constants import (
|
|
9
|
+
PIP_CONF_BUILDKIT_SECRET_MOUNT,
|
|
10
|
+
PIP_CONF_SECRET_MOUNT_AS_ENV,
|
|
11
|
+
UV_CONF_BUILDKIT_SECRET_MOUNT,
|
|
12
|
+
UV_CONF_SECRET_MOUNT_AS_ENV,
|
|
13
|
+
)
|
|
14
|
+
from truefoundry.deploy.v2.lib.patched_models import (
|
|
15
|
+
_resolve_requirements_path,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
# TODO (chiragjn): Switch to a non-root user inside the container
|
|
19
|
+
|
|
20
|
+
_POST_PYTHON_INSTALL_TEMPLATE = """
|
|
21
|
+
% if requirements_path is not None:
|
|
22
|
+
COPY ${requirements_path} ${requirements_destination_path}
|
|
23
|
+
% endif
|
|
24
|
+
% if python_packages_install_command is not None:
|
|
25
|
+
RUN ${package_manager_config_secret_mount} ${python_packages_install_command}
|
|
26
|
+
% endif
|
|
27
|
+
USER spark
|
|
28
|
+
COPY . /app
|
|
29
|
+
WORKDIR /app
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
_POST_USER_TEMPLATE = """
|
|
33
|
+
COPY tfy_execute_notebook.py /app/tfy_execute_notebook.py
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
DOCKERFILE_TEMPLATE = Template(
|
|
37
|
+
"""
|
|
38
|
+
FROM ${spark_image_repo}:${spark_version}
|
|
39
|
+
USER root
|
|
40
|
+
RUN apt update && \
|
|
41
|
+
DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends git && \
|
|
42
|
+
rm -rf /var/lib/apt/lists/*
|
|
43
|
+
"""
|
|
44
|
+
+ _POST_PYTHON_INSTALL_TEMPLATE
|
|
45
|
+
+ _POST_USER_TEMPLATE
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
ADDITIONAL_PIP_PACKAGES = ["papermill>=2.6.0,<2.7.0"]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def generate_pip_install_command(
|
|
52
|
+
requirements_path: Optional[str],
|
|
53
|
+
pip_packages: Optional[List[str]],
|
|
54
|
+
mount_pip_conf_secret: bool = False,
|
|
55
|
+
) -> Optional[str]:
|
|
56
|
+
upgrade_pip_command = "python3 -m pip install -U pip setuptools wheel"
|
|
57
|
+
envs = []
|
|
58
|
+
if mount_pip_conf_secret:
|
|
59
|
+
envs.append(PIP_CONF_SECRET_MOUNT_AS_ENV)
|
|
60
|
+
|
|
61
|
+
command = ["python3", "-m", "pip", "install", "--use-pep517", "--no-cache-dir"]
|
|
62
|
+
args = []
|
|
63
|
+
if requirements_path:
|
|
64
|
+
args.append("-r")
|
|
65
|
+
args.append(requirements_path)
|
|
66
|
+
|
|
67
|
+
if pip_packages:
|
|
68
|
+
args.extend(pip_packages)
|
|
69
|
+
|
|
70
|
+
if not args:
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
final_pip_install_command = shlex.join(envs + command + args)
|
|
74
|
+
final_docker_run_command = " && ".join(
|
|
75
|
+
[upgrade_pip_command, final_pip_install_command]
|
|
76
|
+
)
|
|
77
|
+
return final_docker_run_command
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def generate_uv_pip_install_command(
|
|
81
|
+
requirements_path: Optional[str],
|
|
82
|
+
pip_packages: Optional[List[str]],
|
|
83
|
+
mount_uv_conf_secret: bool = False,
|
|
84
|
+
) -> Optional[str]:
|
|
85
|
+
upgrade_pip_command = "python3 -m pip install -U pip setuptools wheel"
|
|
86
|
+
uv_mount = f"--mount=from={ENV_VARS.TFY_PYTHON_BUILD_UV_IMAGE_URI},source=/uv,target=/usr/local/bin/uv"
|
|
87
|
+
envs = [
|
|
88
|
+
"UV_LINK_MODE=copy",
|
|
89
|
+
"UV_PYTHON_DOWNLOADS=never",
|
|
90
|
+
"UV_INDEX_STRATEGY=unsafe-best-match",
|
|
91
|
+
]
|
|
92
|
+
if mount_uv_conf_secret:
|
|
93
|
+
envs.append(UV_CONF_SECRET_MOUNT_AS_ENV)
|
|
94
|
+
|
|
95
|
+
command = ["uv", "pip", "install", "--no-cache-dir"]
|
|
96
|
+
|
|
97
|
+
args = []
|
|
98
|
+
|
|
99
|
+
if requirements_path:
|
|
100
|
+
args.append("-r")
|
|
101
|
+
args.append(requirements_path)
|
|
102
|
+
|
|
103
|
+
if pip_packages:
|
|
104
|
+
args.extend(pip_packages)
|
|
105
|
+
|
|
106
|
+
if not args:
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
uv_pip_install_command = shlex.join(envs + command + args)
|
|
110
|
+
shell_commands = " && ".join([upgrade_pip_command, uv_pip_install_command])
|
|
111
|
+
final_docker_run_command = " ".join([uv_mount, shell_commands])
|
|
112
|
+
|
|
113
|
+
return final_docker_run_command
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def generate_dockerfile_content(
|
|
117
|
+
build_configuration: SparkBuild,
|
|
118
|
+
package_manager: str = ENV_VARS.TFY_PYTHON_BUILD_PACKAGE_MANAGER,
|
|
119
|
+
mount_python_package_manager_conf_secret: bool = False,
|
|
120
|
+
) -> str:
|
|
121
|
+
# TODO (chiragjn): Handle recursive references to other requirements files e.g. `-r requirements-gpu.txt`
|
|
122
|
+
requirements_path = _resolve_requirements_path(
|
|
123
|
+
build_context_path=build_configuration.build_context_path,
|
|
124
|
+
requirements_path=build_configuration.requirements_path,
|
|
125
|
+
)
|
|
126
|
+
requirements_destination_path = (
|
|
127
|
+
"/tmp/requirements.txt" if requirements_path else None
|
|
128
|
+
)
|
|
129
|
+
if not build_configuration.spark_version:
|
|
130
|
+
raise ValueError(
|
|
131
|
+
"`spark_version` is required for `tfy-spark-buildpack` builder"
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
if package_manager == PythonPackageManager.PIP.value:
|
|
135
|
+
python_packages_install_command = generate_pip_install_command(
|
|
136
|
+
requirements_path=requirements_destination_path,
|
|
137
|
+
pip_packages=ADDITIONAL_PIP_PACKAGES,
|
|
138
|
+
mount_pip_conf_secret=mount_python_package_manager_conf_secret,
|
|
139
|
+
)
|
|
140
|
+
elif package_manager == PythonPackageManager.UV.value:
|
|
141
|
+
python_packages_install_command = generate_uv_pip_install_command(
|
|
142
|
+
requirements_path=requirements_destination_path,
|
|
143
|
+
pip_packages=ADDITIONAL_PIP_PACKAGES,
|
|
144
|
+
mount_uv_conf_secret=mount_python_package_manager_conf_secret,
|
|
145
|
+
)
|
|
146
|
+
else:
|
|
147
|
+
raise ValueError(f"Unsupported package manager: {package_manager}")
|
|
148
|
+
|
|
149
|
+
template_args = {
|
|
150
|
+
"spark_image_repo": ENV_VARS.TFY_SPARK_BUILD_SPARK_IMAGE_REPO,
|
|
151
|
+
"spark_version": build_configuration.spark_version,
|
|
152
|
+
"requirements_path": requirements_path,
|
|
153
|
+
"requirements_destination_path": requirements_destination_path,
|
|
154
|
+
"python_packages_install_command": python_packages_install_command,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if mount_python_package_manager_conf_secret:
|
|
158
|
+
if package_manager == PythonPackageManager.PIP.value:
|
|
159
|
+
template_args["package_manager_config_secret_mount"] = (
|
|
160
|
+
PIP_CONF_BUILDKIT_SECRET_MOUNT
|
|
161
|
+
)
|
|
162
|
+
elif package_manager == PythonPackageManager.UV.value:
|
|
163
|
+
template_args["package_manager_config_secret_mount"] = (
|
|
164
|
+
UV_CONF_BUILDKIT_SECRET_MOUNT
|
|
165
|
+
)
|
|
166
|
+
else:
|
|
167
|
+
raise ValueError(f"Unsupported package manager: {package_manager}")
|
|
168
|
+
else:
|
|
169
|
+
template_args["package_manager_config_secret_mount"] = ""
|
|
170
|
+
|
|
171
|
+
dockerfile_content = DOCKERFILE_TEMPLATE.render(**template_args)
|
|
172
|
+
return dockerfile_content
|
truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/tfy_execute_notebook.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# This script is used as the main application file for spark applications
|
|
2
|
+
# when the application to be run is a notebook, the actual notebook to be
|
|
3
|
+
# executed is passed as an argument to this script.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
import papermill as pm
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def execute_notebook(notebook_path, output_path="output.ipynb", parameters=None):
|
|
13
|
+
"""
|
|
14
|
+
Execute a Jupyter notebook using papermill.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
notebook_path: Path to the input notebook
|
|
18
|
+
output_path: Path for the output notebook
|
|
19
|
+
parameters: Dictionary of parameters to pass to the notebook
|
|
20
|
+
|
|
21
|
+
Raises:
|
|
22
|
+
Exception: If notebook execution fails
|
|
23
|
+
"""
|
|
24
|
+
if parameters is None:
|
|
25
|
+
parameters = {}
|
|
26
|
+
|
|
27
|
+
print(f"Starting execution of notebook: {notebook_path}")
|
|
28
|
+
pm.execute_notebook(
|
|
29
|
+
notebook_path,
|
|
30
|
+
output_path,
|
|
31
|
+
parameters=parameters,
|
|
32
|
+
# TODO(gw): Replace with kernel name for venv
|
|
33
|
+
kernel_name="python3",
|
|
34
|
+
)
|
|
35
|
+
print(f"Successfully executed notebook: {notebook_path}")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
if __name__ == "__main__":
|
|
39
|
+
parser = argparse.ArgumentParser(
|
|
40
|
+
description="Execute a Jupyter notebook using papermill for Spark applications"
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument("notebook_path", help="Path to the notebook file to execute")
|
|
43
|
+
|
|
44
|
+
args = parser.parse_args()
|
|
45
|
+
|
|
46
|
+
# TODO(gw): Add support for passing parameters to the notebook
|
|
47
|
+
try:
|
|
48
|
+
execute_notebook(args.notebook_path)
|
|
49
|
+
except Exception as e:
|
|
50
|
+
print(f"Error executing notebook {args.notebook_path}: {e}")
|
|
51
|
+
print(
|
|
52
|
+
"Exiting with status code 1 to signal failure to parent process/orchestrator"
|
|
53
|
+
)
|
|
54
|
+
sys.exit(1)
|
|
55
|
+
|
|
56
|
+
# TODO(gw): Publish the output notebook to blob storage from where it could be rendered
|
|
@@ -37,13 +37,28 @@ from truefoundry.deploy.lib.model.entity import ApplyResult
|
|
|
37
37
|
show_default=True,
|
|
38
38
|
help="Simulate the process without actually applying the manifest",
|
|
39
39
|
)
|
|
40
|
+
@click.option(
|
|
41
|
+
"--show-diff",
|
|
42
|
+
"--show_diff",
|
|
43
|
+
is_flag=True,
|
|
44
|
+
show_default=True,
|
|
45
|
+
help="Print manifest differences when using --dry-run",
|
|
46
|
+
)
|
|
40
47
|
@handle_exception_wrapper
|
|
41
|
-
def apply_command(
|
|
48
|
+
def apply_command(
|
|
49
|
+
files: Tuple[str, ...], dry_run: bool = False, show_diff: bool = False
|
|
50
|
+
):
|
|
51
|
+
# Validate that show_diff is only used with dry_run
|
|
52
|
+
if show_diff and not dry_run:
|
|
53
|
+
raise click.ClickException("--show-diff requires --dry-run")
|
|
54
|
+
|
|
42
55
|
apply_results: List[ApplyResult] = []
|
|
43
56
|
client = ServiceFoundryServiceClient()
|
|
44
57
|
for file in files:
|
|
45
58
|
with console.status(PROMPT_APPLYING_MANIFEST.format(file), spinner="dots"):
|
|
46
|
-
for apply_result in apply_lib.apply_manifest_file(
|
|
59
|
+
for apply_result in apply_lib.apply_manifest_file(
|
|
60
|
+
file, client, dry_run, show_diff
|
|
61
|
+
):
|
|
47
62
|
if apply_result.success:
|
|
48
63
|
console.print(f"[green]\u2714 {apply_result.message}[/]")
|
|
49
64
|
else:
|
{truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/deploy_command.py
RENAMED
|
@@ -62,6 +62,14 @@ def _get_default_spec_file():
|
|
|
62
62
|
default=False,
|
|
63
63
|
help="Force create a new deployment by canceling any ongoing deployments",
|
|
64
64
|
)
|
|
65
|
+
@click.option(
|
|
66
|
+
"--trigger-on-deploy/--no-trigger-on-deploy",
|
|
67
|
+
"--trigger_on_deploy/--no_trigger_on_deploy",
|
|
68
|
+
is_flag=True,
|
|
69
|
+
show_default=True,
|
|
70
|
+
default=False,
|
|
71
|
+
help="Trigger a Job run after deployment succeeds. Has no effect for non Job type deployments",
|
|
72
|
+
)
|
|
65
73
|
@click.pass_context
|
|
66
74
|
@handle_exception_wrapper
|
|
67
75
|
def deploy_command(
|
|
@@ -70,6 +78,7 @@ def deploy_command(
|
|
|
70
78
|
workspace_fqn: Optional[str],
|
|
71
79
|
wait: bool,
|
|
72
80
|
force: bool = False,
|
|
81
|
+
trigger_on_deploy: bool = False,
|
|
73
82
|
):
|
|
74
83
|
if ctx.invoked_subcommand is not None:
|
|
75
84
|
return
|
|
@@ -86,7 +95,12 @@ def deploy_command(
|
|
|
86
95
|
application_definition = yaml.safe_load(f)
|
|
87
96
|
|
|
88
97
|
application = Application.parse_obj(application_definition)
|
|
89
|
-
application.deploy(
|
|
98
|
+
application.deploy(
|
|
99
|
+
workspace_fqn=workspace_fqn,
|
|
100
|
+
wait=wait,
|
|
101
|
+
force=force,
|
|
102
|
+
trigger_on_deploy=trigger_on_deploy,
|
|
103
|
+
)
|
|
90
104
|
sys.exit(0)
|
|
91
105
|
|
|
92
106
|
click.echo(
|
{truefoundry-0.9.2rc1 → truefoundry-0.9.3}/truefoundry/deploy/lib/clients/servicefoundry_client.py
RENAMED
|
@@ -39,6 +39,7 @@ from truefoundry.deploy.lib.model.entity import (
|
|
|
39
39
|
JobRun,
|
|
40
40
|
LogBody,
|
|
41
41
|
SocketEvent,
|
|
42
|
+
TFYApplyResponse,
|
|
42
43
|
TriggerJobResult,
|
|
43
44
|
Workspace,
|
|
44
45
|
WorkspaceResources,
|
|
@@ -222,12 +223,14 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
|
|
|
222
223
|
workspace_id: str,
|
|
223
224
|
application: autogen_models.Workflow,
|
|
224
225
|
force: bool = False,
|
|
226
|
+
trigger_on_deploy: bool = False,
|
|
225
227
|
) -> Deployment:
|
|
226
228
|
data = {
|
|
227
229
|
"workspaceId": workspace_id,
|
|
228
230
|
"name": application.name,
|
|
229
231
|
"manifest": application.dict(exclude_none=True),
|
|
230
232
|
"forceDeploy": force,
|
|
233
|
+
"triggerOnDeploy": trigger_on_deploy,
|
|
231
234
|
}
|
|
232
235
|
logger.debug(json.dumps(data))
|
|
233
236
|
url = f"{self._api_server_url}/{VERSION_PREFIX}/deployment"
|
|
@@ -680,14 +683,16 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
|
|
|
680
683
|
return parse_obj_as(List[Deployment], response)
|
|
681
684
|
|
|
682
685
|
@check_min_cli_version
|
|
683
|
-
def apply(
|
|
686
|
+
def apply(
|
|
687
|
+
self, manifest: Dict[str, Any], dry_run: bool = False
|
|
688
|
+
) -> TFYApplyResponse:
|
|
684
689
|
url = f"{self._api_server_url}/{VERSION_PREFIX}/apply"
|
|
685
690
|
body = {"manifest": manifest, "dryRun": dry_run}
|
|
686
691
|
response = session_with_retries().put(
|
|
687
692
|
url, headers=self._get_headers(), json=body
|
|
688
693
|
)
|
|
689
|
-
response_data = cast(Dict[str, Any], request_handling(response))
|
|
690
|
-
return response_data
|
|
694
|
+
response_data = cast(Dict[str, Any], request_handling(response) or {})
|
|
695
|
+
return TFYApplyResponse.parse_obj(response_data)
|
|
691
696
|
|
|
692
697
|
@check_min_cli_version
|
|
693
698
|
def delete(self, manifest: Dict[str, Any]) -> Dict[str, Any]:
|