truefoundry 0.9.2rc1__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.

Files changed (387) hide show
  1. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/PKG-INFO +1 -1
  2. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/pyproject.toml +2 -1
  3. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/constants.py +2 -0
  4. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/_autogen/models.py +68 -15
  5. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/__init__.py +2 -1
  6. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/__init__.py +2 -0
  7. truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/__init__.py +76 -0
  8. truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/dockerfile_template.py +193 -0
  9. truefoundry-0.9.3rc1/truefoundry/deploy/builder/builders/tfy_spark_buildpack/execute_notebook.py +21 -0
  10. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/apply_command.py +17 -2
  11. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/deploy_command.py +15 -1
  12. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/clients/servicefoundry_client.py +8 -3
  13. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/apply.py +23 -5
  14. truefoundry-0.9.3rc1/truefoundry/deploy/lib/diff_utils.py +92 -0
  15. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/model/entity.py +4 -0
  16. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/deploy.py +2 -0
  17. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/deployable_patched_models.py +69 -4
  18. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/.gitignore +0 -0
  19. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/README.md +0 -0
  20. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/__init__.py +0 -0
  21. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/_ask/__init__.py +0 -0
  22. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/_ask/cli.py +0 -0
  23. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/_ask/client.py +0 -0
  24. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/_ask/llm_utils.py +0 -0
  25. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/_client.py +0 -0
  26. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/__init__.py +0 -0
  27. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/__init__.py +0 -0
  28. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/base.py +0 -0
  29. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/developer.py +0 -0
  30. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/project_identifier.py +0 -0
  31. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/agents/tester.py +0 -0
  32. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/cli.py +0 -0
  33. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/constants.py +0 -0
  34. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/exception.py +0 -0
  35. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/logger.py +0 -0
  36. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/__init__.py +0 -0
  37. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/ask.py +0 -0
  38. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/base.py +0 -0
  39. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/commit.py +0 -0
  40. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/docker_build.py +0 -0
  41. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/docker_run.py +0 -0
  42. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/file_type_counts.py +0 -0
  43. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/list_files.py +0 -0
  44. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/read_file.py +0 -0
  45. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/send_request.py +0 -0
  46. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/tools/write_file.py +0 -0
  47. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/utils/client.py +0 -0
  48. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/utils/diff.py +0 -0
  49. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/autodeploy/utils/pydantic_compat.py +0 -0
  50. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/cli/__init__.py +0 -0
  51. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/cli/__main__.py +0 -0
  52. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/cli/config.py +0 -0
  53. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/cli/console.py +0 -0
  54. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/cli/const.py +0 -0
  55. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/cli/display_util.py +0 -0
  56. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/cli/util.py +0 -0
  57. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/__init__.py +0 -0
  58. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/auth_service_client.py +0 -0
  59. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/credential_file_manager.py +0 -0
  60. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/credential_provider.py +0 -0
  61. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/entities.py +0 -0
  62. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/exceptions.py +0 -0
  63. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/request_utils.py +0 -0
  64. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/servicefoundry_client.py +0 -0
  65. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/session.py +0 -0
  66. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/storage_provider_utils.py +0 -0
  67. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/types.py +0 -0
  68. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/utils.py +0 -0
  69. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/common/warnings.py +0 -0
  70. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/__init__.py +0 -0
  71. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/dockerfile.py +0 -0
  72. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py +0 -0
  73. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py +0 -0
  74. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py +0 -0
  75. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +0 -0
  76. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/constants.py +0 -0
  77. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/docker_service.py +0 -0
  78. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/builder/utils.py +0 -0
  79. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/__init__.py +0 -0
  80. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/__init__.py +0 -0
  81. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/build_command.py +0 -0
  82. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/delete_command.py +0 -0
  83. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/deploy_init_command.py +0 -0
  84. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/get_command.py +0 -0
  85. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/k8s_exec_credential_command.py +0 -0
  86. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/kubeconfig_command.py +0 -0
  87. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/login_command.py +0 -0
  88. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/logout_command.py +0 -0
  89. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/logs_command.py +0 -0
  90. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/patch_application_command.py +0 -0
  91. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/patch_command.py +0 -0
  92. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/terminate_comand.py +0 -0
  93. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/trigger_command.py +0 -0
  94. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/cli/commands/utils.py +0 -0
  95. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/core/__init__.py +0 -0
  96. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/core/login.py +0 -0
  97. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/core/logout.py +0 -0
  98. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/__init__.py +0 -0
  99. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/no_output_callback.py +0 -0
  100. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/output_callback.py +0 -0
  101. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/io/rich_output_callback.py +0 -0
  102. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/__init__.py +0 -0
  103. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/clients/__init__.py +0 -0
  104. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/const.py +0 -0
  105. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/__init__.py +0 -0
  106. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/application.py +0 -0
  107. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/delete.py +0 -0
  108. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/version.py +0 -0
  109. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/dao/workspace.py +0 -0
  110. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/logs_utils.py +0 -0
  111. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/messages.py +0 -0
  112. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/model/__init__.py +0 -0
  113. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/session.py +0 -0
  114. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/util.py +0 -0
  115. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/lib/win32.py +0 -0
  116. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/python_deploy_codegen.py +0 -0
  117. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/__init__.py +0 -0
  118. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/__init__.py +0 -0
  119. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/deploy_workflow.py +0 -0
  120. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/models.py +0 -0
  121. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/patched_models.py +0 -0
  122. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/deploy/v2/lib/source.py +0 -0
  123. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/logger.py +0 -0
  124. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/__init__.py +0 -0
  125. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/__init__.py +0 -0
  126. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/__init__.py +0 -0
  127. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/__init__.py +0 -0
  128. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/auth_api.py +0 -0
  129. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/deprecated_api.py +0 -0
  130. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/experiments_api.py +0 -0
  131. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/generate_code_snippet_api.py +0 -0
  132. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/health_api.py +0 -0
  133. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/metrics_api.py +0 -0
  134. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/mlfoundry_artifacts_api.py +0 -0
  135. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/run_artifacts_api.py +0 -0
  136. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api/runs_api.py +0 -0
  137. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api_client.py +0 -0
  138. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/api_response.py +0 -0
  139. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/configuration.py +0 -0
  140. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/exceptions.py +0 -0
  141. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/__init__.py +0 -0
  142. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_app.py +0 -0
  143. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_manifest.py +0 -0
  144. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_manifest.py +0 -0
  145. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_with_fqn.py +0 -0
  146. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/agent_with_fqn.py +0 -0
  147. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/apply_request_dto.py +0 -0
  148. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/apply_response_dto.py +0 -0
  149. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_dto.py +0 -0
  150. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_manifest.py +0 -0
  151. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_path.py +0 -0
  152. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_response_dto.py +0 -0
  153. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_type.py +0 -0
  154. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_dto.py +0 -0
  155. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_response_dto.py +0 -0
  156. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_serialization_format.py +0 -0
  157. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/artifact_version_status.py +0 -0
  158. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/assistant_message.py +0 -0
  159. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_request_dto.py +0 -0
  160. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_version_request_dto.py +0 -0
  161. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/blob_storage_reference.py +0 -0
  162. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/body_get_search_runs_get.py +0 -0
  163. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest.py +0 -0
  164. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest_messages_inner.py +0 -0
  165. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/columns_dto.py +0 -0
  166. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/command.py +0 -0
  167. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content.py +0 -0
  168. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content1.py +0 -0
  169. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content2.py +0 -0
  170. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/content2_any_of_inner.py +0 -0
  171. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_request_dto.py +0 -0
  172. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_response_dto.py +0 -0
  173. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_version_request_dto.py +0 -0
  174. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_artifact_version_response_dto.py +0 -0
  175. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_dataset_request_dto.py +0 -0
  176. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_experiment_request_dto.py +0 -0
  177. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_experiment_response_dto.py +0 -0
  178. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_model_version_request_dto.py +0 -0
  179. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_request_dto.py +0 -0
  180. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_response_dto.py +0 -0
  181. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_request_dto.py +0 -0
  182. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_request_dto.py +0 -0
  183. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_response_dto.py +0 -0
  184. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_run_request_dto.py +0 -0
  185. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_run_response_dto.py +0 -0
  186. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/create_workflow_task_config_request_dto.py +0 -0
  187. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/data_directory_manifest.py +0 -0
  188. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/dataset_dto.py +0 -0
  189. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/dataset_response_dto.py +0 -0
  190. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_artifact_versions_request_dto.py +0 -0
  191. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_dataset_request_dto.py +0 -0
  192. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_files_for_dataset_request_dto.py +0 -0
  193. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_model_version_request_dto.py +0 -0
  194. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_run_request.py +0 -0
  195. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/delete_tag_request_dto.py +0 -0
  196. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_dto.py +0 -0
  197. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_id_request_dto.py +0 -0
  198. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_response_dto.py +0 -0
  199. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/experiment_tag_dto.py +0 -0
  200. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/export_deployment_files_request_dto.py +0 -0
  201. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/external_blob_storage_source.py +0 -0
  202. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/fast_ai_framework.py +0 -0
  203. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/file_info_dto.py +0 -0
  204. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/finalize_artifact_version_request_dto.py +0 -0
  205. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/framework.py +0 -0
  206. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_artifact_version_aliases_response_dto.py +0 -0
  207. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_experiment_response_dto.py +0 -0
  208. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_latest_run_log_response_dto.py +0 -0
  209. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_metric_history_response.py +0 -0
  210. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_url_for_dataset_write_request_dto.py +0 -0
  211. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_request_dto.py +0 -0
  212. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_response_dto.py +0 -0
  213. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_request_dto.py +0 -0
  214. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_response_dto.py +0 -0
  215. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_request_dto.py +0 -0
  216. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_response_dto.py +0 -0
  217. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_write_response_dto.py +0 -0
  218. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/get_tenant_id_response_dto.py +0 -0
  219. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/gluon_framework.py +0 -0
  220. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/h2_o_framework.py +0 -0
  221. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/http_validation_error.py +0 -0
  222. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/image_content_part.py +0 -0
  223. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/image_url.py +0 -0
  224. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/infer_method_name.py +0 -0
  225. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/keras_framework.py +0 -0
  226. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/latest_run_log_dto.py +0 -0
  227. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/library_name.py +0 -0
  228. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/light_gbm_framework.py +0 -0
  229. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifact_versions_request_dto.py +0 -0
  230. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifact_versions_response_dto.py +0 -0
  231. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifacts_request_dto.py +0 -0
  232. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_artifacts_response_dto.py +0 -0
  233. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_colums_response_dto.py +0 -0
  234. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_datasets_request_dto.py +0 -0
  235. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_datasets_response_dto.py +0 -0
  236. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_experiments_response_dto.py +0 -0
  237. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_version_request_dto.py +0 -0
  238. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_versions_response_dto.py +0 -0
  239. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_request_dto.py +0 -0
  240. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_response_dto.py +0 -0
  241. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_latest_run_logs_response_dto.py +0 -0
  242. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_metric_history_request_dto.py +0 -0
  243. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_metric_history_response_dto.py +0 -0
  244. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_model_version_response_dto.py +0 -0
  245. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_model_versions_request_dto.py +0 -0
  246. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_models_request_dto.py +0 -0
  247. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_models_response_dto.py +0 -0
  248. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_run_artifacts_response_dto.py +0 -0
  249. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/list_run_logs_response_dto.py +0 -0
  250. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/local_artifact_source.py +0 -0
  251. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/local_model_source.py +0 -0
  252. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/log_batch_request_dto.py +0 -0
  253. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/log_metric_request_dto.py +0 -0
  254. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/log_param_request_dto.py +0 -0
  255. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/manifest.py +0 -0
  256. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/manifest1.py +0 -0
  257. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/manifest2.py +0 -0
  258. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/method.py +0 -0
  259. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/metric_collection_dto.py +0 -0
  260. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/metric_dto.py +0 -0
  261. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/mime_type.py +0 -0
  262. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_configuration.py +0 -0
  263. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_dto.py +0 -0
  264. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_manifest.py +0 -0
  265. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_response_dto.py +0 -0
  266. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_server.py +0 -0
  267. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_version_dto.py +0 -0
  268. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_version_environment.py +0 -0
  269. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/model_version_response_dto.py +0 -0
  270. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/multi_part_upload_dto.py +0 -0
  271. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/multi_part_upload_response_dto.py +0 -0
  272. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/multi_part_upload_storage_provider.py +0 -0
  273. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/notify_artifact_version_failure_dto.py +0 -0
  274. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/onnx_framework.py +0 -0
  275. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/openapi_spec.py +0 -0
  276. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/paddle_framework.py +0 -0
  277. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/param_dto.py +0 -0
  278. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/parameters.py +0 -0
  279. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/py_torch_framework.py +0 -0
  280. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/resolve_agent_app_response_dto.py +0 -0
  281. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/restore_run_request_dto.py +0 -0
  282. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_data_dto.py +0 -0
  283. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_dto.py +0 -0
  284. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_info_dto.py +0 -0
  285. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_log_dto.py +0 -0
  286. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_log_input_dto.py +0 -0
  287. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_response_dto.py +0 -0
  288. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/run_tag_dto.py +0 -0
  289. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/search_runs_request_dto.py +0 -0
  290. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/search_runs_response_dto.py +0 -0
  291. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/set_experiment_tag_request_dto.py +0 -0
  292. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/set_tag_request_dto.py +0 -0
  293. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/signed_url_dto.py +0 -0
  294. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/sklearn_framework.py +0 -0
  295. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/sklearn_model_schema.py +0 -0
  296. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/sklearn_serialization_format.py +0 -0
  297. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/source.py +0 -0
  298. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/source1.py +0 -0
  299. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/source2.py +0 -0
  300. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/spa_cy_framework.py +0 -0
  301. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/stats_models_framework.py +0 -0
  302. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/stop.py +0 -0
  303. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/store_run_logs_request_dto.py +0 -0
  304. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/subject.py +0 -0
  305. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/subject_type.py +0 -0
  306. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/system_message.py +0 -0
  307. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/tensor_flow_framework.py +0 -0
  308. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/text.py +0 -0
  309. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/text_content_part.py +0 -0
  310. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/transformers_framework.py +0 -0
  311. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_request_dto.py +0 -0
  312. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_response_dto.py +0 -0
  313. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/true_foundry_managed_source.py +0 -0
  314. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_artifact_version_request_dto.py +0 -0
  315. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_dataset_request_dto.py +0 -0
  316. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_experiment_request_dto.py +0 -0
  317. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_model_version_request_dto.py +0 -0
  318. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_run_request_dto.py +0 -0
  319. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/update_run_response_dto.py +0 -0
  320. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/url.py +0 -0
  321. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/user_message.py +0 -0
  322. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_request_dto.py +0 -0
  323. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_response_dto.py +0 -0
  324. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validation_error.py +0 -0
  325. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/validation_error_loc_inner.py +0 -0
  326. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/xg_boost_framework.py +0 -0
  327. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/xg_boost_model_schema.py +0 -0
  328. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/models/xg_boost_serialization_format.py +0 -0
  329. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client/rest.py +0 -0
  330. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/client_README.md +0 -0
  331. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/entities/artifacts.py +0 -0
  332. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/__init__.py +0 -0
  333. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/exceptions.py +0 -0
  334. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/schema.py +0 -0
  335. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/signature.py +0 -0
  336. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/_autogen/models/utils.py +0 -0
  337. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/artifact/__init__.py +0 -0
  338. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/artifact/truefoundry_artifact_repo.py +0 -0
  339. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/__init__.py +0 -0
  340. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/cli.py +0 -0
  341. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/commands/__init__.py +0 -0
  342. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/commands/download.py +0 -0
  343. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/commands/model_init.py +0 -0
  344. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/cli/utils.py +0 -0
  345. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/clients/__init__.py +0 -0
  346. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/clients/servicefoundry_client.py +0 -0
  347. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/constants.py +0 -0
  348. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/entities.py +0 -0
  349. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/enums.py +0 -0
  350. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/exceptions.py +0 -0
  351. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/git_info.py +0 -0
  352. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/internal_namespace.py +0 -0
  353. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/__init__.py +0 -0
  354. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/artifact.py +0 -0
  355. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/constants.py +0 -0
  356. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/dataset.py +0 -0
  357. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/general_artifact.py +0 -0
  358. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/model.py +0 -0
  359. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/artifacts/utils.py +0 -0
  360. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/__init__.py +0 -0
  361. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/constants.py +0 -0
  362. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/image.py +0 -0
  363. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/image_normalizer.py +0 -0
  364. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/image/types.py +0 -0
  365. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/plot.py +0 -0
  366. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/pydantic_base.py +0 -0
  367. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/log_types/utils.py +0 -0
  368. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/logger.py +0 -0
  369. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/mlfoundry_api.py +0 -0
  370. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/mlfoundry_run.py +0 -0
  371. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/model_framework.py +0 -0
  372. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/prompt_utils.py +0 -0
  373. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/run_utils.py +0 -0
  374. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/session.py +0 -0
  375. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/ml/validation_utils.py +0 -0
  376. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/pydantic_v1.py +0 -0
  377. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/version.py +0 -0
  378. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/__init__.py +0 -0
  379. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/container_task.py +0 -0
  380. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/map_task.py +0 -0
  381. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/python_task.py +0 -0
  382. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/__init__.py +0 -0
  383. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/logger.py +0 -0
  384. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +0 -0
  385. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +0 -0
  386. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/task.py +0 -0
  387. {truefoundry-0.9.2rc1 → truefoundry-0.9.3rc1}/truefoundry/workflow/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truefoundry
3
- Version: 0.9.2rc1
3
+ Version: 0.9.3rc1
4
4
  Summary: TrueFoundry CLI
5
5
  Author-email: TrueFoundry Team <abhishek@truefoundry.com>
6
6
  Requires-Python: <3.14,>=3.8.1
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "truefoundry"
3
- version = "0.9.2rc1" # This is a placeholder version, it will be replaced when releasing
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-05-15T05:28:11+00:00
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
- 300,
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: str = Field(..., description="The commit SHA.")
289
- branch_name: Optional[str] = Field(
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*$") = Field(
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[str] = Field(
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,8 +840,40 @@ 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
- ui_endpoint: Endpoint
845
877
  resources: Optional[Resources] = None
846
878
 
847
879
 
@@ -870,11 +902,11 @@ class SparkImage(BaseModel):
870
902
  "3.5.2",
871
903
  description="Spark version should match the spark version installed in the image.",
872
904
  )
873
- image_uri: constr(regex=r"^\S*$") = Field(
905
+ image_uri: constr(regex=r"^\S+$") = Field(
874
906
  ...,
875
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",
876
908
  )
877
- docker_registry: Optional[str] = Field(
909
+ docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
878
910
  None,
879
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",
880
912
  )
@@ -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
- ..., description="The main application file to be executed by the spark job."
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."
@@ -1113,7 +1146,7 @@ class Build(BaseModel):
1113
1146
  """
1114
1147
 
1115
1148
  type: Literal["build"] = Field(..., description="")
1116
- docker_registry: Optional[str] = Field(
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
  )
@@ -1399,6 +1432,23 @@ class SSHServer(BaseWorkbenchInput):
1399
1432
  )
1400
1433
 
1401
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
+
1402
1452
  class SparkExecutorConfig(BaseModel):
1403
1453
  instances: Union[SparkExecutorFixedInstances, SparkExecutorDynamicScaling] = Field(
1404
1454
  {"type": "fixed", "count": 1}, description=""
@@ -1411,7 +1461,10 @@ class SparkJob(BaseModel):
1411
1461
  name: constr(regex=r"^[a-z](?:[a-z0-9]|-(?!-)){1,30}[a-z0-9]$") = Field(
1412
1462
  ..., description="Name of the job"
1413
1463
  )
1414
- 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
+ )
1415
1468
  entrypoint: Union[
1416
1469
  SparkJobPythonEntrypoint, SparkJobScalaEntrypoint, SparkJobJavaEntrypoint
1417
1470
  ] = Field(..., description="")
@@ -1604,8 +1657,8 @@ class Job(BaseModel):
1604
1657
  trigger: Union[Manual, Schedule] = Field(
1605
1658
  {"type": "manual"}, description="Specify the trigger"
1606
1659
  )
1607
- trigger_on_deploy: bool = Field(
1608
- False, description="Trigger the job after deploy immediately"
1660
+ trigger_on_deploy: Optional[bool] = Field(
1661
+ None, description="Trigger the job after deploy immediately"
1609
1662
  )
1610
1663
  params: Optional[List[Param]] = Field(
1611
1664
  None, description="Configure params and pass it to create different job runs"
@@ -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
@@ -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
@@ -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(files: Tuple[str, ...], dry_run: bool = False):
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(file, client, dry_run):
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:
@@ -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(workspace_fqn=workspace_fqn, wait=wait, force=force)
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(
@@ -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(self, manifest: Dict[str, Any], dry_run: bool = False) -> Dict[str, Any]:
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]: