truefoundry 0.9.2__tar.gz → 0.9.3rc1__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.2 → truefoundry-0.9.3rc1}/PKG-INFO +1 -1
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/pyproject.toml +2 -1
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/constants.py +2 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/_autogen/models.py +66 -12
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/__init__.py +2 -1
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/__init__.py +2 -0
- truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/__init__.py +76 -0
- truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/dockerfile_template.py +193 -0
- truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/execute_notebook.py +21 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/apply_command.py +17 -2
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/clients/servicefoundry_client.py +6 -3
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/apply.py +23 -5
- truefoundry-0.9.3rc1/truefoundry/deploy/lib/diff_utils.py +92 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/model/entity.py +4 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/.gitignore +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/README.md +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/_ask/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/_ask/cli.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/_ask/client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/_ask/llm_utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/_client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/base.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/developer.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/project_identifier.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/tester.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/cli.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/constants.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/exception.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/logger.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/ask.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/base.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/commit.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/docker_build.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/docker_run.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/file_type_counts.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/list_files.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/read_file.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/send_request.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/write_file.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/utils/client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/utils/diff.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/utils/pydantic_compat.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/cli/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/cli/__main__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/cli/config.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/cli/console.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/cli/const.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/cli/display_util.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/cli/util.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/auth_service_client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/credential_file_manager.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/credential_provider.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/entities.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/exceptions.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/request_utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/servicefoundry_client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/session.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/storage_provider_utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/types.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/common/warnings.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/dockerfile.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/constants.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/docker_service.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/build_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/delete_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/deploy_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/deploy_init_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/get_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/k8s_exec_credential_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/kubeconfig_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/login_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/logout_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/logs_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/patch_application_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/patch_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/terminate_comand.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/trigger_command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/core/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/core/login.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/core/logout.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/no_output_callback.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/output_callback.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/rich_output_callback.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/clients/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/const.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/application.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/delete.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/version.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/workspace.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/logs_utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/messages.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/model/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/session.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/util.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/win32.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/python_deploy_codegen.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/deploy.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/deploy_workflow.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/deployable_patched_models.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/models.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/patched_models.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/source.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/logger.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/auth_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/deprecated_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/experiments_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/generate_code_snippet_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/health_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/metrics_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/mlfoundry_artifacts_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/run_artifacts_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/runs_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api_client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api_response.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/configuration.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/exceptions.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_app.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_manifest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_manifest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_with_fqn.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_with_fqn.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/apply_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/apply_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_manifest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_path.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_type.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_serialization_format.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_status.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/assistant_message.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/blob_storage_reference.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/body_get_search_runs_get.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest_messages_inner.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/columns_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/command.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content1.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content2.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content2_any_of_inner.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_version_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_experiment_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_experiment_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_run_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_run_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_workflow_task_config_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/data_directory_manifest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/dataset_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/dataset_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_artifact_versions_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_files_for_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_run_request.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_tag_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_id_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_tag_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/export_deployment_files_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/external_blob_storage_source.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/fast_ai_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/file_info_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/finalize_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_artifact_version_aliases_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_experiment_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_latest_run_log_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_metric_history_response.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_url_for_dataset_write_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_write_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_tenant_id_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/gluon_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/h2_o_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/http_validation_error.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/image_content_part.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/image_url.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/infer_method_name.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/keras_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/latest_run_log_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/library_name.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/light_gbm_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifact_versions_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifact_versions_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifacts_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifacts_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_colums_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_datasets_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_datasets_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_experiments_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_versions_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_latest_run_logs_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_metric_history_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_metric_history_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_model_version_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_model_versions_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_models_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_models_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_run_artifacts_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_run_logs_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/local_artifact_source.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/local_model_source.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/log_batch_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/log_metric_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/log_param_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/manifest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/manifest1.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/manifest2.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/method.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/metric_collection_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/metric_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/mime_type.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_configuration.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_manifest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_server.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_version_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_version_environment.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_version_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/multi_part_upload_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/multi_part_upload_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/multi_part_upload_storage_provider.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/notify_artifact_version_failure_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/onnx_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/openapi_spec.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/paddle_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/param_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/parameters.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/py_torch_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/resolve_agent_app_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/restore_run_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_data_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_info_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_log_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_log_input_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_tag_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/search_runs_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/search_runs_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/set_experiment_tag_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/set_tag_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/signed_url_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/sklearn_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/sklearn_model_schema.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/sklearn_serialization_format.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/source.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/source1.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/source2.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/spa_cy_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/stats_models_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/stop.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/store_run_logs_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/subject.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/subject_type.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/system_message.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/tensor_flow_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/text.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/text_content_part.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/transformers_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/true_foundry_managed_source.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_artifact_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_dataset_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_experiment_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_model_version_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_run_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_run_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/url.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/user_message.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_request_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_response_dto.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validation_error.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validation_error_loc_inner.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/xg_boost_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/xg_boost_model_schema.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/xg_boost_serialization_format.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/rest.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client_README.md +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/entities/artifacts.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/exceptions.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/schema.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/signature.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/artifact/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/artifact/truefoundry_artifact_repo.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/cli.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/commands/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/commands/download.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/commands/model_init.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/clients/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/clients/servicefoundry_client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/constants.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/entities.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/enums.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/exceptions.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/git_info.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/internal_namespace.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/artifact.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/constants.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/dataset.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/general_artifact.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/model.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/constants.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/image.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/image_normalizer.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/types.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/plot.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/pydantic_base.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/logger.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/mlfoundry_api.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/mlfoundry_run.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/model_framework.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/prompt_utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/run_utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/session.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/ml/validation_utils.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/pydantic_v1.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/version.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/container_task.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/map_task.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/python_task.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/__init__.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/logger.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/truefoundry/workflow/task.py +0 -0
- {truefoundry-0.9.2 → truefoundry-0.9.3rc1}/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.3rc1" # 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=apache/spark",
|
|
181
182
|
]
|
|
182
183
|
|
|
183
184
|
[tool.uv]
|
|
@@ -65,6 +65,8 @@ 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
|
+
TFY_SPARK_BUILD_SPARK_IMAGE_REPO: str = "apache/spark"
|
|
69
|
+
|
|
68
70
|
# For local development, this enables futher configuration via _TFYServersConfig
|
|
69
71
|
TFY_CLI_LOCAL_DEV_MODE: bool = False
|
|
70
72
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: application.json
|
|
3
|
-
# timestamp: 2025-
|
|
3
|
+
# timestamp: 2025-06-08T14:28:34+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
|
)
|
|
@@ -840,6 +840,39 @@ class SlackWebhook(BaseModel):
|
|
|
840
840
|
)
|
|
841
841
|
|
|
842
842
|
|
|
843
|
+
class SparkBuildSpec(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
|
+
python_version: Optional[constr(regex=r"^\d+(\.\d+){1,2}([\-\.a-z0-9]+)?$")] = (
|
|
854
|
+
Field(
|
|
855
|
+
None,
|
|
856
|
+
description="Python version to run your application. Should be one of the tags listed on [Official Python Docker Page](https://hub.docker.com/_/python)",
|
|
857
|
+
)
|
|
858
|
+
)
|
|
859
|
+
build_context_path: str = Field(
|
|
860
|
+
"./", description="Build path relative to project root path."
|
|
861
|
+
)
|
|
862
|
+
requirements_path: Optional[str] = Field(
|
|
863
|
+
None,
|
|
864
|
+
description="Path to `requirements.txt` relative to\n`Path to build context`",
|
|
865
|
+
)
|
|
866
|
+
pip_packages: Optional[List[str]] = Field(
|
|
867
|
+
None,
|
|
868
|
+
description='Define pip package requirements.\nIn Python/YAML E.g. ["fastapi>=0.90,<1.0", "uvicorn"]',
|
|
869
|
+
)
|
|
870
|
+
apt_packages: Optional[List[str]] = Field(
|
|
871
|
+
None,
|
|
872
|
+
description='Debian packages to install via `apt get`.\nIn Python/YAML E.g. ["git", "ffmpeg", "htop"]',
|
|
873
|
+
)
|
|
874
|
+
|
|
875
|
+
|
|
843
876
|
class SparkDriverConfig(BaseModel):
|
|
844
877
|
resources: Optional[Resources] = None
|
|
845
878
|
|
|
@@ -869,11 +902,11 @@ class SparkImage(BaseModel):
|
|
|
869
902
|
"3.5.2",
|
|
870
903
|
description="Spark version should match the spark version installed in the image.",
|
|
871
904
|
)
|
|
872
|
-
image_uri: constr(regex=r"^\S
|
|
905
|
+
image_uri: constr(regex=r"^\S+$") = Field(
|
|
873
906
|
...,
|
|
874
907
|
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",
|
|
875
908
|
)
|
|
876
|
-
docker_registry: Optional[
|
|
909
|
+
docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
|
|
877
910
|
None,
|
|
878
911
|
description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
|
|
879
912
|
)
|
|
@@ -895,7 +928,8 @@ class SparkJobJavaEntrypoint(BaseModel):
|
|
|
895
928
|
class SparkJobPythonEntrypoint(BaseModel):
|
|
896
929
|
type: Literal["python"] = Field(..., description="")
|
|
897
930
|
main_application_file: str = Field(
|
|
898
|
-
...,
|
|
931
|
+
...,
|
|
932
|
+
description="The main application file to be executed by the spark job. Relative path in case of git repository.",
|
|
899
933
|
)
|
|
900
934
|
arguments: Optional[str] = Field(
|
|
901
935
|
None, description="Arguments to be passed to the main application file."
|
|
@@ -1112,7 +1146,7 @@ class Build(BaseModel):
|
|
|
1112
1146
|
"""
|
|
1113
1147
|
|
|
1114
1148
|
type: Literal["build"] = Field(..., description="")
|
|
1115
|
-
docker_registry: Optional[
|
|
1149
|
+
docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
|
|
1116
1150
|
None,
|
|
1117
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",
|
|
1118
1152
|
)
|
|
@@ -1398,6 +1432,23 @@ class SSHServer(BaseWorkbenchInput):
|
|
|
1398
1432
|
)
|
|
1399
1433
|
|
|
1400
1434
|
|
|
1435
|
+
class SparkBuild(BaseModel):
|
|
1436
|
+
"""
|
|
1437
|
+
Describes that we are building a new image based on the spec
|
|
1438
|
+
"""
|
|
1439
|
+
|
|
1440
|
+
type: Literal["build"] = Field(..., description="")
|
|
1441
|
+
docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
|
|
1442
|
+
None,
|
|
1443
|
+
description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
|
|
1444
|
+
)
|
|
1445
|
+
build_source: Union[GitSource, LocalSource] = Field(..., description="")
|
|
1446
|
+
build_spec: Union[SparkBuildSpec, PythonBuild] = Field(
|
|
1447
|
+
...,
|
|
1448
|
+
description="Instructions to build a container image out of the build source",
|
|
1449
|
+
)
|
|
1450
|
+
|
|
1451
|
+
|
|
1401
1452
|
class SparkExecutorConfig(BaseModel):
|
|
1402
1453
|
instances: Union[SparkExecutorFixedInstances, SparkExecutorDynamicScaling] = Field(
|
|
1403
1454
|
{"type": "fixed", "count": 1}, description=""
|
|
@@ -1410,7 +1461,10 @@ class SparkJob(BaseModel):
|
|
|
1410
1461
|
name: constr(regex=r"^[a-z](?:[a-z0-9]|-(?!-)){1,30}[a-z0-9]$") = Field(
|
|
1411
1462
|
..., description="Name of the job"
|
|
1412
1463
|
)
|
|
1413
|
-
image: SparkImage
|
|
1464
|
+
image: Union[SparkImage, SparkBuild] = Field(
|
|
1465
|
+
...,
|
|
1466
|
+
description="The image to use for driver and executors. Must have spark installed. Spark version must match the version in the image.",
|
|
1467
|
+
)
|
|
1414
1468
|
entrypoint: Union[
|
|
1415
1469
|
SparkJobPythonEntrypoint, SparkJobScalaEntrypoint, SparkJobJavaEntrypoint
|
|
1416
1470
|
] = Field(..., description="")
|
|
@@ -2,6 +2,7 @@ from typing import Any, Dict, List, Optional, Union
|
|
|
2
2
|
|
|
3
3
|
from truefoundry.deploy._autogen.models import (
|
|
4
4
|
DockerFileBuild,
|
|
5
|
+
SparkBuildSpec,
|
|
5
6
|
PythonBuild,
|
|
6
7
|
TaskDockerFileBuild,
|
|
7
8
|
TaskPythonBuild,
|
|
@@ -20,6 +21,7 @@ class _BuildConfig(BaseModel):
|
|
|
20
21
|
NotebookImageBuild,
|
|
21
22
|
TaskPythonBuild,
|
|
22
23
|
TaskDockerFileBuild,
|
|
24
|
+
SparkBuildSpec,
|
|
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,76 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
from tempfile import TemporaryDirectory
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
from truefoundry.deploy._autogen.models import DockerFileBuild, SparkBuildSpec
|
|
7
|
+
from truefoundry.deploy.builder.builders import dockerfile
|
|
8
|
+
from truefoundry.deploy.builder.builders.tfy_spark_buildpack.dockerfile_template import (
|
|
9
|
+
generate_dockerfile_content,
|
|
10
|
+
)
|
|
11
|
+
from truefoundry.deploy.builder.utils import has_python_package_manager_conf_secret
|
|
12
|
+
|
|
13
|
+
__all__ = ["generate_dockerfile_content", "build"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _convert_to_dockerfile_build_config(
|
|
17
|
+
build_configuration: SparkBuildSpec,
|
|
18
|
+
dockerfile_path: str,
|
|
19
|
+
mount_python_package_manager_conf_secret: bool = False,
|
|
20
|
+
) -> DockerFileBuild:
|
|
21
|
+
dockerfile_content = generate_dockerfile_content(
|
|
22
|
+
build_configuration=build_configuration,
|
|
23
|
+
mount_python_package_manager_conf_secret=mount_python_package_manager_conf_secret,
|
|
24
|
+
)
|
|
25
|
+
with open(dockerfile_path, "w", encoding="utf8") as fp:
|
|
26
|
+
fp.write(dockerfile_content)
|
|
27
|
+
|
|
28
|
+
return DockerFileBuild(
|
|
29
|
+
type="dockerfile",
|
|
30
|
+
dockerfile_path=dockerfile_path,
|
|
31
|
+
build_context_path=build_configuration.build_context_path,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def build(
|
|
36
|
+
tag: str,
|
|
37
|
+
build_configuration: SparkBuildSpec,
|
|
38
|
+
extra_opts: Optional[List[str]] = None,
|
|
39
|
+
):
|
|
40
|
+
if not build_configuration.spark_version:
|
|
41
|
+
raise ValueError(
|
|
42
|
+
"`spark_version` is required for `tfy-spark-buildpack` builder"
|
|
43
|
+
)
|
|
44
|
+
mount_python_package_manager_conf_secret = (
|
|
45
|
+
has_python_package_manager_conf_secret(extra_opts) if extra_opts else False
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# Copy execute_notebook.py to the build context
|
|
49
|
+
execute_notebook_src = os.path.join(os.path.dirname(__file__), "execute_notebook.py")
|
|
50
|
+
execute_notebook_dst = os.path.join(build_configuration.build_context_path, "execute_notebook.py")
|
|
51
|
+
|
|
52
|
+
# Track if we copied the file to clean it up later
|
|
53
|
+
copied_execute_notebook = False
|
|
54
|
+
if not os.path.exists(execute_notebook_dst):
|
|
55
|
+
shutil.copy2(execute_notebook_src, execute_notebook_dst)
|
|
56
|
+
copied_execute_notebook = True
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
with TemporaryDirectory() as local_dir:
|
|
60
|
+
docker_build_configuration = _convert_to_dockerfile_build_config(
|
|
61
|
+
build_configuration,
|
|
62
|
+
dockerfile_path=os.path.join(local_dir, "Dockerfile"),
|
|
63
|
+
mount_python_package_manager_conf_secret=mount_python_package_manager_conf_secret,
|
|
64
|
+
)
|
|
65
|
+
dockerfile.build(
|
|
66
|
+
tag=tag,
|
|
67
|
+
build_configuration=docker_build_configuration,
|
|
68
|
+
extra_opts=extra_opts,
|
|
69
|
+
)
|
|
70
|
+
finally:
|
|
71
|
+
# Clean up the copied file if we copied it
|
|
72
|
+
if copied_execute_notebook and os.path.exists(execute_notebook_dst):
|
|
73
|
+
try:
|
|
74
|
+
os.remove(execute_notebook_dst)
|
|
75
|
+
except OSError:
|
|
76
|
+
pass # Ignore errors when cleaning up
|
truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/dockerfile_template.py
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import shlex
|
|
2
|
+
from typing import Dict, 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 SparkBuildSpec
|
|
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
|
+
DEFAULT_PYTHON_IMAGE_REPO = "apache/spark"
|
|
21
|
+
|
|
22
|
+
_POST_PYTHON_INSTALL_TEMPLATE = """
|
|
23
|
+
% if apt_install_command is not None:
|
|
24
|
+
RUN ${apt_install_command}
|
|
25
|
+
% endif
|
|
26
|
+
% if requirements_path is not None:
|
|
27
|
+
COPY ${requirements_path} ${requirements_destination_path}
|
|
28
|
+
% endif
|
|
29
|
+
% if python_packages_install_command is not None:
|
|
30
|
+
RUN ${package_manager_config_secret_mount} ${python_packages_install_command}
|
|
31
|
+
% endif
|
|
32
|
+
COPY . /app
|
|
33
|
+
WORKDIR /app
|
|
34
|
+
USER spark
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
DOCKERFILE_TEMPLATE = Template(
|
|
38
|
+
"""
|
|
39
|
+
FROM ${spark_image_repo}:${spark_version}
|
|
40
|
+
USER root
|
|
41
|
+
RUN apt update && \
|
|
42
|
+
DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends git && \
|
|
43
|
+
rm -rf /var/lib/apt/lists/*
|
|
44
|
+
COPY execute_notebook.py /app/execute_notebook.py
|
|
45
|
+
"""
|
|
46
|
+
# + _POST_PYTHON_INSTALL_TEMPLATE
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
ADDITIONAL_PIP_PACKAGES = ['papermill']
|
|
50
|
+
|
|
51
|
+
def generate_apt_install_command(apt_packages: Optional[List[str]]) -> Optional[str]:
|
|
52
|
+
packages_list = None
|
|
53
|
+
if apt_packages:
|
|
54
|
+
packages_list = " ".join(p.strip() for p in apt_packages if p.strip())
|
|
55
|
+
if not packages_list:
|
|
56
|
+
return None
|
|
57
|
+
apt_update_command = "apt update"
|
|
58
|
+
apt_install_command = f"DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends {packages_list}"
|
|
59
|
+
clear_apt_lists_command = "rm -rf /var/lib/apt/lists/*"
|
|
60
|
+
return " && ".join(
|
|
61
|
+
[apt_update_command, apt_install_command, clear_apt_lists_command]
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def generate_pip_install_command(
|
|
66
|
+
requirements_path: Optional[str],
|
|
67
|
+
pip_packages: Optional[List[str]],
|
|
68
|
+
mount_pip_conf_secret: bool = False,
|
|
69
|
+
) -> Optional[str]:
|
|
70
|
+
upgrade_pip_command = "python -m pip install -U pip setuptools wheel"
|
|
71
|
+
envs = []
|
|
72
|
+
if mount_pip_conf_secret:
|
|
73
|
+
envs.append(PIP_CONF_SECRET_MOUNT_AS_ENV)
|
|
74
|
+
|
|
75
|
+
command = ["python", "-m", "pip", "install", "--use-pep517", "--no-cache-dir"]
|
|
76
|
+
args = []
|
|
77
|
+
if requirements_path:
|
|
78
|
+
args.append("-r")
|
|
79
|
+
args.append(requirements_path)
|
|
80
|
+
|
|
81
|
+
if pip_packages:
|
|
82
|
+
args.extend(pip_packages)
|
|
83
|
+
|
|
84
|
+
if not args:
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
final_pip_install_command = shlex.join(envs + command + args)
|
|
88
|
+
final_docker_run_command = " && ".join(
|
|
89
|
+
[upgrade_pip_command, final_pip_install_command]
|
|
90
|
+
)
|
|
91
|
+
return final_docker_run_command
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def generate_uv_pip_install_command(
|
|
95
|
+
requirements_path: Optional[str],
|
|
96
|
+
pip_packages: Optional[List[str]],
|
|
97
|
+
mount_uv_conf_secret: bool = False,
|
|
98
|
+
) -> Optional[str]:
|
|
99
|
+
upgrade_pip_command = "python -m pip install -U pip setuptools wheel"
|
|
100
|
+
uv_mount = f"--mount=from={ENV_VARS.TFY_PYTHON_BUILD_UV_IMAGE_URI},source=/uv,target=/usr/local/bin/uv"
|
|
101
|
+
envs = [
|
|
102
|
+
"UV_LINK_MODE=copy",
|
|
103
|
+
"UV_PYTHON_DOWNLOADS=never",
|
|
104
|
+
"UV_INDEX_STRATEGY=unsafe-best-match",
|
|
105
|
+
]
|
|
106
|
+
if mount_uv_conf_secret:
|
|
107
|
+
envs.append(UV_CONF_SECRET_MOUNT_AS_ENV)
|
|
108
|
+
|
|
109
|
+
command = ["uv", "pip", "install", "--no-cache-dir"]
|
|
110
|
+
|
|
111
|
+
args = []
|
|
112
|
+
|
|
113
|
+
if requirements_path:
|
|
114
|
+
args.append("-r")
|
|
115
|
+
args.append(requirements_path)
|
|
116
|
+
|
|
117
|
+
if pip_packages:
|
|
118
|
+
args.extend(pip_packages)
|
|
119
|
+
|
|
120
|
+
if not args:
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
uv_pip_install_command = shlex.join(envs + command + args)
|
|
124
|
+
shell_commands = " && ".join([upgrade_pip_command, uv_pip_install_command])
|
|
125
|
+
final_docker_run_command = " ".join([uv_mount, shell_commands])
|
|
126
|
+
|
|
127
|
+
return final_docker_run_command
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def generate_dockerfile_content(
|
|
131
|
+
build_configuration: SparkBuildSpec,
|
|
132
|
+
package_manager: str = ENV_VARS.TFY_PYTHON_BUILD_PACKAGE_MANAGER,
|
|
133
|
+
mount_python_package_manager_conf_secret: bool = False,
|
|
134
|
+
) -> str:
|
|
135
|
+
# TODO (chiragjn): Handle recursive references to other requirements files e.g. `-r requirements-gpu.txt`
|
|
136
|
+
requirements_path = _resolve_requirements_path(
|
|
137
|
+
build_context_path=build_configuration.build_context_path,
|
|
138
|
+
requirements_path=build_configuration.requirements_path,
|
|
139
|
+
)
|
|
140
|
+
requirements_destination_path = (
|
|
141
|
+
"/tmp/requirements.txt" if requirements_path else None
|
|
142
|
+
)
|
|
143
|
+
if not build_configuration.spark_version:
|
|
144
|
+
raise ValueError(
|
|
145
|
+
"`spark_version` is required for `tfy-spark-buildpack` builder"
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Handle pip packages - SparkBuildSpec pip_packages is Optional[List[str]], so we need to handle None
|
|
149
|
+
pip_packages = build_configuration.pip_packages or []
|
|
150
|
+
|
|
151
|
+
if package_manager == PythonPackageManager.PIP.value:
|
|
152
|
+
python_packages_install_command = generate_pip_install_command(
|
|
153
|
+
requirements_path=requirements_destination_path,
|
|
154
|
+
pip_packages=pip_packages + ADDITIONAL_PIP_PACKAGES,
|
|
155
|
+
mount_pip_conf_secret=mount_python_package_manager_conf_secret,
|
|
156
|
+
)
|
|
157
|
+
elif package_manager == PythonPackageManager.UV.value:
|
|
158
|
+
python_packages_install_command = generate_uv_pip_install_command(
|
|
159
|
+
requirements_path=requirements_destination_path,
|
|
160
|
+
pip_packages=pip_packages + ADDITIONAL_PIP_PACKAGES,
|
|
161
|
+
mount_uv_conf_secret=mount_python_package_manager_conf_secret,
|
|
162
|
+
)
|
|
163
|
+
else:
|
|
164
|
+
raise ValueError(f"Unsupported package manager: {package_manager}")
|
|
165
|
+
|
|
166
|
+
apt_install_command = generate_apt_install_command(
|
|
167
|
+
apt_packages=build_configuration.apt_packages
|
|
168
|
+
)
|
|
169
|
+
template_args = {
|
|
170
|
+
"spark_image_repo": ENV_VARS.TFY_SPARK_BUILD_SPARK_IMAGE_REPO,
|
|
171
|
+
"spark_version": build_configuration.spark_version,
|
|
172
|
+
"apt_install_command": apt_install_command,
|
|
173
|
+
"requirements_path": requirements_path,
|
|
174
|
+
"requirements_destination_path": requirements_destination_path,
|
|
175
|
+
"python_packages_install_command": python_packages_install_command,
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if mount_python_package_manager_conf_secret:
|
|
179
|
+
if package_manager == PythonPackageManager.PIP.value:
|
|
180
|
+
template_args["package_manager_config_secret_mount"] = (
|
|
181
|
+
PIP_CONF_BUILDKIT_SECRET_MOUNT
|
|
182
|
+
)
|
|
183
|
+
elif package_manager == PythonPackageManager.UV.value:
|
|
184
|
+
template_args["package_manager_config_secret_mount"] = (
|
|
185
|
+
UV_CONF_BUILDKIT_SECRET_MOUNT
|
|
186
|
+
)
|
|
187
|
+
else:
|
|
188
|
+
raise ValueError(f"Unsupported package manager: {package_manager}")
|
|
189
|
+
else:
|
|
190
|
+
template_args["package_manager_config_secret_mount"] = ""
|
|
191
|
+
|
|
192
|
+
dockerfile_content = DOCKERFILE_TEMPLATE.render(**template_args)
|
|
193
|
+
return dockerfile_content
|
truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/execute_notebook.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
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 papermill as pm
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
if __name__ == "__main__":
|
|
10
|
+
|
|
11
|
+
if len(sys.argv) != 2:
|
|
12
|
+
print("Usage: python execute_notebook.py <notebook_path>")
|
|
13
|
+
sys.exit(1)
|
|
14
|
+
|
|
15
|
+
notebook_path = sys.argv[1]
|
|
16
|
+
|
|
17
|
+
pm.execute_notebook(
|
|
18
|
+
notebook_path,
|
|
19
|
+
"output.ipynb",
|
|
20
|
+
parameters=dict(),
|
|
21
|
+
)
|
|
@@ -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.2 → truefoundry-0.9.3rc1}/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,
|
|
@@ -682,14 +683,16 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
|
|
|
682
683
|
return parse_obj_as(List[Deployment], response)
|
|
683
684
|
|
|
684
685
|
@check_min_cli_version
|
|
685
|
-
def apply(
|
|
686
|
+
def apply(
|
|
687
|
+
self, manifest: Dict[str, Any], dry_run: bool = False
|
|
688
|
+
) -> TFYApplyResponse:
|
|
686
689
|
url = f"{self._api_server_url}/{VERSION_PREFIX}/apply"
|
|
687
690
|
body = {"manifest": manifest, "dryRun": dry_run}
|
|
688
691
|
response = session_with_retries().put(
|
|
689
692
|
url, headers=self._get_headers(), json=body
|
|
690
693
|
)
|
|
691
|
-
response_data = cast(Dict[str, Any], request_handling(response))
|
|
692
|
-
return response_data
|
|
694
|
+
response_data = cast(Dict[str, Any], request_handling(response) or {})
|
|
695
|
+
return TFYApplyResponse.parse_obj(response_data)
|
|
693
696
|
|
|
694
697
|
@check_min_cli_version
|
|
695
698
|
def delete(self, manifest: Dict[str, Any]) -> Dict[str, Any]:
|
|
@@ -3,9 +3,11 @@ from typing import Any, Dict, Iterator, Optional
|
|
|
3
3
|
|
|
4
4
|
import yaml
|
|
5
5
|
|
|
6
|
+
from truefoundry.cli.console import console
|
|
6
7
|
from truefoundry.deploy.lib.clients.servicefoundry_client import (
|
|
7
8
|
ServiceFoundryServiceClient,
|
|
8
9
|
)
|
|
10
|
+
from truefoundry.deploy.lib.diff_utils import print_manifest_diff
|
|
9
11
|
from truefoundry.deploy.lib.model.entity import ApplyResult, ManifestLike
|
|
10
12
|
from truefoundry.pydantic_v1 import ValidationError
|
|
11
13
|
|
|
@@ -16,6 +18,7 @@ def _apply_manifest(
|
|
|
16
18
|
filename: Optional[str] = None,
|
|
17
19
|
index: Optional[int] = None,
|
|
18
20
|
dry_run: bool = False,
|
|
21
|
+
show_diff: bool = False,
|
|
19
22
|
) -> ApplyResult:
|
|
20
23
|
client = client or ServiceFoundryServiceClient()
|
|
21
24
|
|
|
@@ -26,7 +29,7 @@ def _apply_manifest(
|
|
|
26
29
|
file_metadata += f" from file {filename}"
|
|
27
30
|
|
|
28
31
|
try:
|
|
29
|
-
|
|
32
|
+
parsed_manifest = ManifestLike.parse_obj(manifest)
|
|
30
33
|
except ValidationError as ex:
|
|
31
34
|
return ApplyResult(
|
|
32
35
|
success=False,
|
|
@@ -35,20 +38,30 @@ def _apply_manifest(
|
|
|
35
38
|
|
|
36
39
|
prefix = "[Dry Run] " if dry_run else ""
|
|
37
40
|
suffix = " (No changes were applied)" if dry_run else ""
|
|
41
|
+
|
|
38
42
|
try:
|
|
39
|
-
client.apply(
|
|
43
|
+
api_response = client.apply(parsed_manifest.dict(), dry_run)
|
|
44
|
+
|
|
45
|
+
# Show diff for dry runs only when show_diff is enabled
|
|
46
|
+
if dry_run and show_diff and api_response.existing_manifest:
|
|
47
|
+
print_manifest_diff(
|
|
48
|
+
existing_manifest=api_response.existing_manifest,
|
|
49
|
+
new_manifest=parsed_manifest.dict(),
|
|
50
|
+
manifest_name=f"{parsed_manifest.name} ({parsed_manifest.type})",
|
|
51
|
+
console=console,
|
|
52
|
+
)
|
|
40
53
|
|
|
41
54
|
return ApplyResult(
|
|
42
55
|
success=True,
|
|
43
56
|
message=(
|
|
44
|
-
f"{prefix}Successfully configured manifest {
|
|
57
|
+
f"{prefix}Successfully configured manifest {parsed_manifest.name} of type {parsed_manifest.type}.{suffix}"
|
|
45
58
|
),
|
|
46
59
|
)
|
|
47
60
|
except Exception as ex:
|
|
48
61
|
return ApplyResult(
|
|
49
62
|
success=False,
|
|
50
63
|
message=(
|
|
51
|
-
f"{prefix}Failed to apply manifest {
|
|
64
|
+
f"{prefix}Failed to apply manifest {parsed_manifest.name} of type {parsed_manifest.type}. Error: {ex}.{suffix}"
|
|
52
65
|
),
|
|
53
66
|
)
|
|
54
67
|
|
|
@@ -57,14 +70,18 @@ def apply_manifest(
|
|
|
57
70
|
manifest: Dict[str, Any],
|
|
58
71
|
client: Optional[ServiceFoundryServiceClient] = None,
|
|
59
72
|
dry_run: bool = False,
|
|
73
|
+
show_diff: bool = False,
|
|
60
74
|
) -> ApplyResult:
|
|
61
|
-
return _apply_manifest(
|
|
75
|
+
return _apply_manifest(
|
|
76
|
+
manifest=manifest, client=client, dry_run=dry_run, show_diff=show_diff
|
|
77
|
+
)
|
|
62
78
|
|
|
63
79
|
|
|
64
80
|
def apply_manifest_file(
|
|
65
81
|
filepath: str,
|
|
66
82
|
client: Optional[ServiceFoundryServiceClient] = None,
|
|
67
83
|
dry_run: bool = False,
|
|
84
|
+
show_diff: bool = False,
|
|
68
85
|
) -> Iterator[ApplyResult]:
|
|
69
86
|
client = client or ServiceFoundryServiceClient()
|
|
70
87
|
filename = Path(filepath).name
|
|
@@ -92,4 +109,5 @@ def apply_manifest_file(
|
|
|
92
109
|
filename=filename,
|
|
93
110
|
index=index,
|
|
94
111
|
dry_run=dry_run,
|
|
112
|
+
show_diff=show_diff,
|
|
95
113
|
)
|