truefoundry 0.9.2__tar.gz → 0.9.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of truefoundry might be problematic. Click here for more details.

Files changed (387) hide show
  1. {truefoundry-0.9.2 → truefoundry-0.9.3}/PKG-INFO +1 -1
  2. {truefoundry-0.9.2 → truefoundry-0.9.3}/pyproject.toml +2 -1
  3. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/constants.py +3 -0
  4. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/__init__.py +3 -0
  5. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/_autogen/models.py +52 -15
  6. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/__init__.py +2 -1
  7. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/__init__.py +2 -0
  8. truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/__init__.py +79 -0
  9. truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/dockerfile_template.py +172 -0
  10. truefoundry-0.9.3/truefoundry/deploy/builder/builders/tfy_spark_buildpack/tfy_execute_notebook.py +56 -0
  11. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/apply_command.py +17 -2
  12. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/clients/servicefoundry_client.py +6 -3
  13. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/apply.py +23 -5
  14. truefoundry-0.9.3/truefoundry/deploy/lib/diff_utils.py +92 -0
  15. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/model/entity.py +4 -0
  16. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/patched_models.py +20 -0
  17. {truefoundry-0.9.2 → truefoundry-0.9.3}/.gitignore +0 -0
  18. {truefoundry-0.9.2 → truefoundry-0.9.3}/README.md +0 -0
  19. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/__init__.py +0 -0
  20. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/_ask/__init__.py +0 -0
  21. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/_ask/cli.py +0 -0
  22. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/_ask/client.py +0 -0
  23. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/_ask/llm_utils.py +0 -0
  24. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/_client.py +0 -0
  25. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/__init__.py +0 -0
  26. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/__init__.py +0 -0
  27. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/base.py +0 -0
  28. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/developer.py +0 -0
  29. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/project_identifier.py +0 -0
  30. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/agents/tester.py +0 -0
  31. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/cli.py +0 -0
  32. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/constants.py +0 -0
  33. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/exception.py +0 -0
  34. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/logger.py +0 -0
  35. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/__init__.py +0 -0
  36. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/ask.py +0 -0
  37. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/base.py +0 -0
  38. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/commit.py +0 -0
  39. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/docker_build.py +0 -0
  40. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/docker_run.py +0 -0
  41. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/file_type_counts.py +0 -0
  42. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/list_files.py +0 -0
  43. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/read_file.py +0 -0
  44. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/send_request.py +0 -0
  45. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/tools/write_file.py +0 -0
  46. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/utils/client.py +0 -0
  47. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/utils/diff.py +0 -0
  48. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/autodeploy/utils/pydantic_compat.py +0 -0
  49. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/cli/__init__.py +0 -0
  50. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/cli/__main__.py +0 -0
  51. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/cli/config.py +0 -0
  52. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/cli/console.py +0 -0
  53. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/cli/const.py +0 -0
  54. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/cli/display_util.py +0 -0
  55. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/cli/util.py +0 -0
  56. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/__init__.py +0 -0
  57. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/auth_service_client.py +0 -0
  58. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/credential_file_manager.py +0 -0
  59. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/credential_provider.py +0 -0
  60. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/entities.py +0 -0
  61. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/exceptions.py +0 -0
  62. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/request_utils.py +0 -0
  63. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/servicefoundry_client.py +0 -0
  64. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/session.py +0 -0
  65. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/storage_provider_utils.py +0 -0
  66. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/types.py +0 -0
  67. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/utils.py +0 -0
  68. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/common/warnings.py +0 -0
  69. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/dockerfile.py +0 -0
  70. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py +0 -0
  71. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py +0 -0
  72. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py +0 -0
  73. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +0 -0
  74. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/constants.py +0 -0
  75. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/docker_service.py +0 -0
  76. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/builder/utils.py +0 -0
  77. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/__init__.py +0 -0
  78. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/__init__.py +0 -0
  79. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/build_command.py +0 -0
  80. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/delete_command.py +0 -0
  81. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/deploy_command.py +0 -0
  82. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/deploy_init_command.py +0 -0
  83. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/get_command.py +0 -0
  84. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/k8s_exec_credential_command.py +0 -0
  85. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/kubeconfig_command.py +0 -0
  86. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/login_command.py +0 -0
  87. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/logout_command.py +0 -0
  88. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/logs_command.py +0 -0
  89. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/patch_application_command.py +0 -0
  90. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/patch_command.py +0 -0
  91. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/terminate_comand.py +0 -0
  92. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/trigger_command.py +0 -0
  93. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/cli/commands/utils.py +0 -0
  94. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/core/__init__.py +0 -0
  95. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/core/login.py +0 -0
  96. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/core/logout.py +0 -0
  97. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/io/__init__.py +0 -0
  98. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/io/no_output_callback.py +0 -0
  99. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/io/output_callback.py +0 -0
  100. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/io/rich_output_callback.py +0 -0
  101. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/__init__.py +0 -0
  102. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/clients/__init__.py +0 -0
  103. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/const.py +0 -0
  104. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/__init__.py +0 -0
  105. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/application.py +0 -0
  106. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/delete.py +0 -0
  107. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/version.py +0 -0
  108. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/dao/workspace.py +0 -0
  109. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/logs_utils.py +0 -0
  110. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/messages.py +0 -0
  111. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/model/__init__.py +0 -0
  112. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/session.py +0 -0
  113. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/util.py +0 -0
  114. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/lib/win32.py +0 -0
  115. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/python_deploy_codegen.py +0 -0
  116. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/__init__.py +0 -0
  117. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/__init__.py +0 -0
  118. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/deploy.py +0 -0
  119. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/deploy_workflow.py +0 -0
  120. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/deployable_patched_models.py +0 -0
  121. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/models.py +0 -0
  122. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/deploy/v2/lib/source.py +0 -0
  123. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/logger.py +0 -0
  124. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/__init__.py +0 -0
  125. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/__init__.py +0 -0
  126. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/__init__.py +0 -0
  127. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/__init__.py +0 -0
  128. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/auth_api.py +0 -0
  129. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/deprecated_api.py +0 -0
  130. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/experiments_api.py +0 -0
  131. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/generate_code_snippet_api.py +0 -0
  132. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/health_api.py +0 -0
  133. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/metrics_api.py +0 -0
  134. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/mlfoundry_artifacts_api.py +0 -0
  135. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/run_artifacts_api.py +0 -0
  136. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api/runs_api.py +0 -0
  137. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api_client.py +0 -0
  138. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/api_response.py +0 -0
  139. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/configuration.py +0 -0
  140. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/exceptions.py +0 -0
  141. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/__init__.py +0 -0
  142. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_app.py +0 -0
  143. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_manifest.py +0 -0
  144. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_manifest.py +0 -0
  145. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_with_fqn.py +0 -0
  146. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/agent_with_fqn.py +0 -0
  147. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/apply_request_dto.py +0 -0
  148. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/apply_response_dto.py +0 -0
  149. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_dto.py +0 -0
  150. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_manifest.py +0 -0
  151. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_path.py +0 -0
  152. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_response_dto.py +0 -0
  153. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_type.py +0 -0
  154. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_dto.py +0 -0
  155. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_response_dto.py +0 -0
  156. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_serialization_format.py +0 -0
  157. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/artifact_version_status.py +0 -0
  158. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/assistant_message.py +0 -0
  159. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_request_dto.py +0 -0
  160. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_version_request_dto.py +0 -0
  161. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/blob_storage_reference.py +0 -0
  162. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/body_get_search_runs_get.py +0 -0
  163. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest.py +0 -0
  164. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest_messages_inner.py +0 -0
  165. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/columns_dto.py +0 -0
  166. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/command.py +0 -0
  167. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content.py +0 -0
  168. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content1.py +0 -0
  169. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content2.py +0 -0
  170. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/content2_any_of_inner.py +0 -0
  171. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_request_dto.py +0 -0
  172. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_response_dto.py +0 -0
  173. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_version_request_dto.py +0 -0
  174. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_artifact_version_response_dto.py +0 -0
  175. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_dataset_request_dto.py +0 -0
  176. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_experiment_request_dto.py +0 -0
  177. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_experiment_response_dto.py +0 -0
  178. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_model_version_request_dto.py +0 -0
  179. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_request_dto.py +0 -0
  180. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_response_dto.py +0 -0
  181. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_request_dto.py +0 -0
  182. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_request_dto.py +0 -0
  183. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_response_dto.py +0 -0
  184. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_run_request_dto.py +0 -0
  185. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_run_response_dto.py +0 -0
  186. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/create_workflow_task_config_request_dto.py +0 -0
  187. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/data_directory_manifest.py +0 -0
  188. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/dataset_dto.py +0 -0
  189. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/dataset_response_dto.py +0 -0
  190. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_artifact_versions_request_dto.py +0 -0
  191. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_dataset_request_dto.py +0 -0
  192. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_files_for_dataset_request_dto.py +0 -0
  193. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_model_version_request_dto.py +0 -0
  194. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_run_request.py +0 -0
  195. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/delete_tag_request_dto.py +0 -0
  196. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_dto.py +0 -0
  197. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_id_request_dto.py +0 -0
  198. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_response_dto.py +0 -0
  199. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/experiment_tag_dto.py +0 -0
  200. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/export_deployment_files_request_dto.py +0 -0
  201. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/external_blob_storage_source.py +0 -0
  202. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/fast_ai_framework.py +0 -0
  203. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/file_info_dto.py +0 -0
  204. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/finalize_artifact_version_request_dto.py +0 -0
  205. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/framework.py +0 -0
  206. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_artifact_version_aliases_response_dto.py +0 -0
  207. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_experiment_response_dto.py +0 -0
  208. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_latest_run_log_response_dto.py +0 -0
  209. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_metric_history_response.py +0 -0
  210. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_url_for_dataset_write_request_dto.py +0 -0
  211. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_request_dto.py +0 -0
  212. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_response_dto.py +0 -0
  213. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_request_dto.py +0 -0
  214. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_response_dto.py +0 -0
  215. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_request_dto.py +0 -0
  216. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_response_dto.py +0 -0
  217. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_write_response_dto.py +0 -0
  218. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/get_tenant_id_response_dto.py +0 -0
  219. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/gluon_framework.py +0 -0
  220. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/h2_o_framework.py +0 -0
  221. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/http_validation_error.py +0 -0
  222. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/image_content_part.py +0 -0
  223. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/image_url.py +0 -0
  224. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/infer_method_name.py +0 -0
  225. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/keras_framework.py +0 -0
  226. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/latest_run_log_dto.py +0 -0
  227. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/library_name.py +0 -0
  228. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/light_gbm_framework.py +0 -0
  229. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifact_versions_request_dto.py +0 -0
  230. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifact_versions_response_dto.py +0 -0
  231. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifacts_request_dto.py +0 -0
  232. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_artifacts_response_dto.py +0 -0
  233. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_colums_response_dto.py +0 -0
  234. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_datasets_request_dto.py +0 -0
  235. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_datasets_response_dto.py +0 -0
  236. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_experiments_response_dto.py +0 -0
  237. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_version_request_dto.py +0 -0
  238. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_versions_response_dto.py +0 -0
  239. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_request_dto.py +0 -0
  240. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_response_dto.py +0 -0
  241. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_latest_run_logs_response_dto.py +0 -0
  242. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_metric_history_request_dto.py +0 -0
  243. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_metric_history_response_dto.py +0 -0
  244. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_model_version_response_dto.py +0 -0
  245. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_model_versions_request_dto.py +0 -0
  246. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_models_request_dto.py +0 -0
  247. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_models_response_dto.py +0 -0
  248. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_run_artifacts_response_dto.py +0 -0
  249. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/list_run_logs_response_dto.py +0 -0
  250. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/local_artifact_source.py +0 -0
  251. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/local_model_source.py +0 -0
  252. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/log_batch_request_dto.py +0 -0
  253. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/log_metric_request_dto.py +0 -0
  254. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/log_param_request_dto.py +0 -0
  255. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/manifest.py +0 -0
  256. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/manifest1.py +0 -0
  257. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/manifest2.py +0 -0
  258. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/method.py +0 -0
  259. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/metric_collection_dto.py +0 -0
  260. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/metric_dto.py +0 -0
  261. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/mime_type.py +0 -0
  262. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_configuration.py +0 -0
  263. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_dto.py +0 -0
  264. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_manifest.py +0 -0
  265. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_response_dto.py +0 -0
  266. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_server.py +0 -0
  267. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_version_dto.py +0 -0
  268. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_version_environment.py +0 -0
  269. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/model_version_response_dto.py +0 -0
  270. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/multi_part_upload_dto.py +0 -0
  271. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/multi_part_upload_response_dto.py +0 -0
  272. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/multi_part_upload_storage_provider.py +0 -0
  273. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/notify_artifact_version_failure_dto.py +0 -0
  274. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/onnx_framework.py +0 -0
  275. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/openapi_spec.py +0 -0
  276. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/paddle_framework.py +0 -0
  277. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/param_dto.py +0 -0
  278. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/parameters.py +0 -0
  279. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/py_torch_framework.py +0 -0
  280. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/resolve_agent_app_response_dto.py +0 -0
  281. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/restore_run_request_dto.py +0 -0
  282. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_data_dto.py +0 -0
  283. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_dto.py +0 -0
  284. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_info_dto.py +0 -0
  285. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_log_dto.py +0 -0
  286. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_log_input_dto.py +0 -0
  287. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_response_dto.py +0 -0
  288. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/run_tag_dto.py +0 -0
  289. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/search_runs_request_dto.py +0 -0
  290. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/search_runs_response_dto.py +0 -0
  291. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/set_experiment_tag_request_dto.py +0 -0
  292. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/set_tag_request_dto.py +0 -0
  293. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/signed_url_dto.py +0 -0
  294. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/sklearn_framework.py +0 -0
  295. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/sklearn_model_schema.py +0 -0
  296. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/sklearn_serialization_format.py +0 -0
  297. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/source.py +0 -0
  298. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/source1.py +0 -0
  299. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/source2.py +0 -0
  300. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/spa_cy_framework.py +0 -0
  301. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/stats_models_framework.py +0 -0
  302. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/stop.py +0 -0
  303. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/store_run_logs_request_dto.py +0 -0
  304. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/subject.py +0 -0
  305. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/subject_type.py +0 -0
  306. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/system_message.py +0 -0
  307. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/tensor_flow_framework.py +0 -0
  308. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/text.py +0 -0
  309. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/text_content_part.py +0 -0
  310. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/transformers_framework.py +0 -0
  311. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_request_dto.py +0 -0
  312. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_response_dto.py +0 -0
  313. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/true_foundry_managed_source.py +0 -0
  314. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_artifact_version_request_dto.py +0 -0
  315. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_dataset_request_dto.py +0 -0
  316. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_experiment_request_dto.py +0 -0
  317. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_model_version_request_dto.py +0 -0
  318. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_run_request_dto.py +0 -0
  319. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/update_run_response_dto.py +0 -0
  320. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/url.py +0 -0
  321. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/user_message.py +0 -0
  322. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_request_dto.py +0 -0
  323. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_response_dto.py +0 -0
  324. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validation_error.py +0 -0
  325. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/validation_error_loc_inner.py +0 -0
  326. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/xg_boost_framework.py +0 -0
  327. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/xg_boost_model_schema.py +0 -0
  328. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/models/xg_boost_serialization_format.py +0 -0
  329. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client/rest.py +0 -0
  330. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/client_README.md +0 -0
  331. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/entities/artifacts.py +0 -0
  332. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/__init__.py +0 -0
  333. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/exceptions.py +0 -0
  334. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/schema.py +0 -0
  335. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/signature.py +0 -0
  336. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/_autogen/models/utils.py +0 -0
  337. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/artifact/__init__.py +0 -0
  338. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/artifact/truefoundry_artifact_repo.py +0 -0
  339. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/cli/__init__.py +0 -0
  340. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/cli/cli.py +0 -0
  341. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/cli/commands/__init__.py +0 -0
  342. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/cli/commands/download.py +0 -0
  343. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/cli/commands/model_init.py +0 -0
  344. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/cli/utils.py +0 -0
  345. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/clients/__init__.py +0 -0
  346. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/clients/servicefoundry_client.py +0 -0
  347. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/constants.py +0 -0
  348. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/entities.py +0 -0
  349. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/enums.py +0 -0
  350. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/exceptions.py +0 -0
  351. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/git_info.py +0 -0
  352. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/internal_namespace.py +0 -0
  353. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/__init__.py +0 -0
  354. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/artifact.py +0 -0
  355. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/constants.py +0 -0
  356. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/dataset.py +0 -0
  357. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/general_artifact.py +0 -0
  358. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/model.py +0 -0
  359. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/artifacts/utils.py +0 -0
  360. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/__init__.py +0 -0
  361. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/constants.py +0 -0
  362. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/image.py +0 -0
  363. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/image_normalizer.py +0 -0
  364. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/image/types.py +0 -0
  365. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/plot.py +0 -0
  366. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/pydantic_base.py +0 -0
  367. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/log_types/utils.py +0 -0
  368. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/logger.py +0 -0
  369. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/mlfoundry_api.py +0 -0
  370. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/mlfoundry_run.py +0 -0
  371. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/model_framework.py +0 -0
  372. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/prompt_utils.py +0 -0
  373. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/run_utils.py +0 -0
  374. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/session.py +0 -0
  375. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/ml/validation_utils.py +0 -0
  376. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/pydantic_v1.py +0 -0
  377. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/version.py +0 -0
  378. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/__init__.py +0 -0
  379. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/container_task.py +0 -0
  380. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/map_task.py +0 -0
  381. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/python_task.py +0 -0
  382. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/__init__.py +0 -0
  383. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/logger.py +0 -0
  384. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +0 -0
  385. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +0 -0
  386. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/task.py +0 -0
  387. {truefoundry-0.9.2 → truefoundry-0.9.3}/truefoundry/workflow/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truefoundry
3
- Version: 0.9.2
3
+ Version: 0.9.3
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.2" # This is a placeholder version, it will be replaced when releasing
3
+ version = "0.9.3" # This is a placeholder version, it will be replaced when releasing
4
4
  requires-python = ">=3.8.1,<3.14"
5
5
  description = "TrueFoundry CLI"
6
6
  authors = [{ name = "TrueFoundry Team", email = "abhishek@truefoundry.com" }]
@@ -178,6 +178,7 @@ warn_required_dynamic_aliases = true
178
178
  [tool.pytest.ini_options]
179
179
  env = [
180
180
  "TFY_PYTHONBUILD_PYTHON_IMAGE_REPO=docker.io/truefoundrycloud/test/python",
181
+ "TFY_SPARK_BUILD_SPARK_IMAGE_REPO=public.ecr.aws/bitnami/spark",
181
182
  ]
182
183
 
183
184
  [tool.uv]
@@ -65,6 +65,9 @@ class TrueFoundrySdkEnv(BaseSettings):
65
65
  # Fo customizing the python image used for building via PythonBuild
66
66
  TFY_PYTHONBUILD_PYTHON_IMAGE_REPO: str = "public.ecr.aws/docker/library/python"
67
67
 
68
+ # TODO(gw): Use another image with more linient rate limits
69
+ TFY_SPARK_BUILD_SPARK_IMAGE_REPO: str = "public.ecr.aws/bitnami/spark"
70
+
68
71
  # For local development, this enables futher configuration via _TFYServersConfig
69
72
  TFY_CLI_LOCAL_DEV_MODE: bool = False
70
73
 
@@ -113,6 +113,9 @@ from truefoundry.deploy.v2.lib.patched_models import (
113
113
  ServiceAutoscaling,
114
114
  SlackBot,
115
115
  SlackWebhook,
116
+ SparkBuild,
117
+ SparkImage,
118
+ SparkImageBuild,
116
119
  SparkJobJavaEntrypoint,
117
120
  SparkJobPythonEntrypoint,
118
121
  SparkJobScalaEntrypoint,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: application.json
3
- # timestamp: 2025-05-27T08:27:32+00:00
3
+ # timestamp: 2025-06-09T12:01:27+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -104,8 +104,8 @@ class AsyncProcessorSidecar(BaseModel):
104
104
 
105
105
  class Autoshutdown(BaseModel):
106
106
  wait_time: conint(ge=0) = Field(
107
- 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
  )
@@ -643,7 +643,7 @@ class PythonBuild(BaseModel):
643
643
  )
644
644
  cuda_version: Optional[
645
645
  constr(
646
- regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8)$"
646
+ regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8|12\.3-cudnn9|12\.4-cudnn9|12\.5-cudnn9|12\.6-cudnn9)$"
647
647
  )
648
648
  ] = Field(
649
649
  None,
@@ -840,6 +840,25 @@ class SlackWebhook(BaseModel):
840
840
  )
841
841
 
842
842
 
843
+ class SparkBuild(BaseModel):
844
+ """
845
+ Describes that we are using python to build a container image with a specific python version and pip packages installed.
846
+ """
847
+
848
+ type: Literal["tfy-spark-buildpack"] = Field(..., description="")
849
+ spark_version: str = Field(
850
+ "3.5.2",
851
+ description="Spark version should match the spark version installed in the image.",
852
+ )
853
+ build_context_path: str = Field(
854
+ "./", description="Build path relative to project root path."
855
+ )
856
+ requirements_path: Optional[str] = Field(
857
+ None,
858
+ description="Path to `requirements.txt` relative to\n`Path to build context`",
859
+ )
860
+
861
+
843
862
  class SparkDriverConfig(BaseModel):
844
863
  resources: Optional[Resources] = None
845
864
 
@@ -864,19 +883,33 @@ class SparkImage(BaseModel):
864
883
  Describes that we are using a pre-built image stored in a Docker Image registry
865
884
  """
866
885
 
867
- type: Literal["image"] = Field(..., description="")
886
+ type: Literal["spark-image"] = Field(..., description="")
868
887
  spark_version: str = Field(
869
888
  "3.5.2",
870
889
  description="Spark version should match the spark version installed in the image.",
871
890
  )
872
- image_uri: constr(regex=r"^\S*$") = Field(
891
+ image_uri: constr(regex=r"^\S+$") = Field(
873
892
  ...,
874
893
  description="The image URI. Specify the name of the image and the tag.\nIf the image is in Dockerhub, you can skip registry-url (for e.g. `tensorflow/tensorflow`).\nYou can use an image from a private registry using Advanced fields",
875
894
  )
876
- docker_registry: Optional[str] = Field(
895
+ docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
896
+ None,
897
+ description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
898
+ )
899
+
900
+
901
+ class SparkImageBuild(BaseModel):
902
+ """
903
+ Describes that we are building a new image based on the spec
904
+ """
905
+
906
+ type: Literal["spark-image-build"] = Field(..., description="")
907
+ docker_registry: Optional[constr(regex=r"^\S+$")] = Field(
877
908
  None,
878
909
  description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
879
910
  )
911
+ build_source: GitSource
912
+ build_spec: SparkBuild
880
913
 
881
914
 
882
915
  class SparkJobJavaEntrypoint(BaseModel):
@@ -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
- ..., 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.",
899
933
  )
900
934
  arguments: Optional[str] = Field(
901
935
  None, description="Arguments to be passed to the main application file."
@@ -977,7 +1011,7 @@ class TaskPythonBuild(BaseModel):
977
1011
  )
978
1012
  cuda_version: Optional[
979
1013
  constr(
980
- regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8)$"
1014
+ regex=r"^((\d+\.\d+(\.\d+)?-cudnn\d+-(runtime|devel)-ubuntu\d+\.\d+)|11\.0-cudnn8|11\.1-cudnn8|11\.2-cudnn8|11\.3-cudnn8|11\.4-cudnn8|11\.5-cudnn8|11\.6-cudnn8|11\.7-cudnn8|11\.8-cudnn8|12\.0-cudnn8|12\.1-cudnn8|12\.2-cudnn8|12\.3-cudnn9|12\.4-cudnn9|12\.5-cudnn9|12\.6-cudnn9)$"
981
1015
  )
982
1016
  ] = Field(
983
1017
  None,
@@ -1112,7 +1146,7 @@ class Build(BaseModel):
1112
1146
  """
1113
1147
 
1114
1148
  type: Literal["build"] = Field(..., description="")
1115
- docker_registry: Optional[str] = Field(
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
  )
@@ -1410,7 +1444,10 @@ class SparkJob(BaseModel):
1410
1444
  name: constr(regex=r"^[a-z](?:[a-z0-9]|-(?!-)){1,30}[a-z0-9]$") = Field(
1411
1445
  ..., description="Name of the job"
1412
1446
  )
1413
- image: SparkImage
1447
+ image: Union[SparkImage, SparkImageBuild] = Field(
1448
+ ...,
1449
+ description="The image to use for driver and executors. Must have spark installed. Spark version must match the version in the image.",
1450
+ )
1414
1451
  entrypoint: Union[
1415
1452
  SparkJobPythonEntrypoint, SparkJobScalaEntrypoint, SparkJobJavaEntrypoint
1416
1453
  ] = Field(..., description="")
@@ -3,6 +3,7 @@ from typing import Any, Dict, List, Optional, Union
3
3
  from truefoundry.deploy._autogen.models import (
4
4
  DockerFileBuild,
5
5
  PythonBuild,
6
+ SparkBuild,
6
7
  TaskDockerFileBuild,
7
8
  TaskPythonBuild,
8
9
  )
@@ -20,6 +21,7 @@ class _BuildConfig(BaseModel):
20
21
  NotebookImageBuild,
21
22
  TaskPythonBuild,
22
23
  TaskDockerFileBuild,
24
+ SparkBuild,
23
25
  ] = Field(discriminator="type")
24
26
 
25
27
 
@@ -37,7 +39,6 @@ def build(
37
39
  build_configuration_dict = build_configuration.dict()
38
40
  build_configuration_dict.update({"type": "dockerfile"})
39
41
  build_configuration = DockerFileBuild.parse_obj(build_configuration_dict)
40
-
41
42
  builder = get_builder(build_configuration.type)
42
43
  return builder(
43
44
  build_configuration=build_configuration,
@@ -4,12 +4,14 @@ from truefoundry.deploy.builder.builders import (
4
4
  dockerfile,
5
5
  tfy_notebook_buildpack,
6
6
  tfy_python_buildpack,
7
+ tfy_spark_buildpack,
7
8
  )
8
9
 
9
10
  BUILD_REGISTRY: Dict[str, Callable] = {
10
11
  "dockerfile": dockerfile.build,
11
12
  "tfy-python-buildpack": tfy_python_buildpack.build,
12
13
  "tfy-notebook-buildpack": tfy_notebook_buildpack.build,
14
+ "tfy-spark-buildpack": tfy_spark_buildpack.build,
13
15
  }
14
16
 
15
17
  __all__ = ["get_builder"]
@@ -0,0 +1,79 @@
1
+ import os
2
+ import shutil
3
+ from tempfile import TemporaryDirectory
4
+ from typing import List, Optional
5
+
6
+ from truefoundry.common.constants import PythonPackageManager
7
+ from truefoundry.deploy._autogen.models import DockerFileBuild, SparkBuild
8
+ from truefoundry.deploy.builder.builders import dockerfile
9
+ from truefoundry.deploy.builder.builders.tfy_spark_buildpack.dockerfile_template import (
10
+ generate_dockerfile_content,
11
+ )
12
+ from truefoundry.deploy.builder.utils import has_python_package_manager_conf_secret
13
+
14
+ __all__ = ["generate_dockerfile_content", "build"]
15
+
16
+
17
+ def _convert_to_dockerfile_build_config(
18
+ build_configuration: SparkBuild,
19
+ dockerfile_path: str,
20
+ mount_python_package_manager_conf_secret: bool = False,
21
+ ) -> DockerFileBuild:
22
+ dockerfile_content = generate_dockerfile_content(
23
+ build_configuration=build_configuration,
24
+ mount_python_package_manager_conf_secret=mount_python_package_manager_conf_secret,
25
+ package_manager=PythonPackageManager.PIP.value,
26
+ )
27
+ with open(dockerfile_path, "w", encoding="utf8") as fp:
28
+ fp.write(dockerfile_content)
29
+
30
+ return DockerFileBuild(
31
+ type="dockerfile",
32
+ dockerfile_path=dockerfile_path,
33
+ build_context_path=build_configuration.build_context_path,
34
+ )
35
+
36
+
37
+ def build(
38
+ tag: str,
39
+ build_configuration: SparkBuild,
40
+ extra_opts: Optional[List[str]] = None,
41
+ ):
42
+ mount_python_package_manager_conf_secret = (
43
+ has_python_package_manager_conf_secret(extra_opts) if extra_opts else False
44
+ )
45
+
46
+ # Copy tfy_execute_notebook.py to the build context
47
+ execute_notebook_src = os.path.join(
48
+ os.path.dirname(__file__), "tfy_execute_notebook.py"
49
+ )
50
+ execute_notebook_dst = os.path.join(
51
+ build_configuration.build_context_path, "tfy_execute_notebook.py"
52
+ )
53
+
54
+ # Verify the source file exists before copying
55
+ if not os.path.isfile(execute_notebook_src):
56
+ raise FileNotFoundError(f"Required file not found: {execute_notebook_src}")
57
+
58
+ # Always copy the file, overwrite if exists
59
+ shutil.copy2(execute_notebook_src, execute_notebook_dst)
60
+
61
+ try:
62
+ with TemporaryDirectory() as local_dir:
63
+ docker_build_configuration = _convert_to_dockerfile_build_config(
64
+ build_configuration,
65
+ dockerfile_path=os.path.join(local_dir, "Dockerfile"),
66
+ mount_python_package_manager_conf_secret=mount_python_package_manager_conf_secret,
67
+ )
68
+ dockerfile.build(
69
+ tag=tag,
70
+ build_configuration=docker_build_configuration,
71
+ extra_opts=extra_opts,
72
+ )
73
+ finally:
74
+ # Clean up the copied file if we copied it
75
+ if os.path.exists(execute_notebook_dst):
76
+ try:
77
+ os.remove(execute_notebook_dst)
78
+ except OSError:
79
+ pass # Ignore errors when cleaning up
@@ -0,0 +1,172 @@
1
+ import shlex
2
+ from typing import List, Optional
3
+
4
+ from mako.template import Template
5
+
6
+ from truefoundry.common.constants import ENV_VARS, PythonPackageManager
7
+ from truefoundry.deploy._autogen.models import SparkBuild
8
+ from truefoundry.deploy.builder.constants import (
9
+ PIP_CONF_BUILDKIT_SECRET_MOUNT,
10
+ PIP_CONF_SECRET_MOUNT_AS_ENV,
11
+ UV_CONF_BUILDKIT_SECRET_MOUNT,
12
+ UV_CONF_SECRET_MOUNT_AS_ENV,
13
+ )
14
+ from truefoundry.deploy.v2.lib.patched_models import (
15
+ _resolve_requirements_path,
16
+ )
17
+
18
+ # TODO (chiragjn): Switch to a non-root user inside the container
19
+
20
+ _POST_PYTHON_INSTALL_TEMPLATE = """
21
+ % if requirements_path is not None:
22
+ COPY ${requirements_path} ${requirements_destination_path}
23
+ % endif
24
+ % if python_packages_install_command is not None:
25
+ RUN ${package_manager_config_secret_mount} ${python_packages_install_command}
26
+ % endif
27
+ USER spark
28
+ COPY . /app
29
+ WORKDIR /app
30
+ """
31
+
32
+ _POST_USER_TEMPLATE = """
33
+ COPY tfy_execute_notebook.py /app/tfy_execute_notebook.py
34
+ """
35
+
36
+ DOCKERFILE_TEMPLATE = Template(
37
+ """
38
+ FROM ${spark_image_repo}:${spark_version}
39
+ USER root
40
+ RUN apt update && \
41
+ DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends git && \
42
+ rm -rf /var/lib/apt/lists/*
43
+ """
44
+ + _POST_PYTHON_INSTALL_TEMPLATE
45
+ + _POST_USER_TEMPLATE
46
+ )
47
+
48
+ ADDITIONAL_PIP_PACKAGES = ["papermill>=2.6.0,<2.7.0"]
49
+
50
+
51
+ def generate_pip_install_command(
52
+ requirements_path: Optional[str],
53
+ pip_packages: Optional[List[str]],
54
+ mount_pip_conf_secret: bool = False,
55
+ ) -> Optional[str]:
56
+ upgrade_pip_command = "python3 -m pip install -U pip setuptools wheel"
57
+ envs = []
58
+ if mount_pip_conf_secret:
59
+ envs.append(PIP_CONF_SECRET_MOUNT_AS_ENV)
60
+
61
+ command = ["python3", "-m", "pip", "install", "--use-pep517", "--no-cache-dir"]
62
+ args = []
63
+ if requirements_path:
64
+ args.append("-r")
65
+ args.append(requirements_path)
66
+
67
+ if pip_packages:
68
+ args.extend(pip_packages)
69
+
70
+ if not args:
71
+ return None
72
+
73
+ final_pip_install_command = shlex.join(envs + command + args)
74
+ final_docker_run_command = " && ".join(
75
+ [upgrade_pip_command, final_pip_install_command]
76
+ )
77
+ return final_docker_run_command
78
+
79
+
80
+ def generate_uv_pip_install_command(
81
+ requirements_path: Optional[str],
82
+ pip_packages: Optional[List[str]],
83
+ mount_uv_conf_secret: bool = False,
84
+ ) -> Optional[str]:
85
+ upgrade_pip_command = "python3 -m pip install -U pip setuptools wheel"
86
+ uv_mount = f"--mount=from={ENV_VARS.TFY_PYTHON_BUILD_UV_IMAGE_URI},source=/uv,target=/usr/local/bin/uv"
87
+ envs = [
88
+ "UV_LINK_MODE=copy",
89
+ "UV_PYTHON_DOWNLOADS=never",
90
+ "UV_INDEX_STRATEGY=unsafe-best-match",
91
+ ]
92
+ if mount_uv_conf_secret:
93
+ envs.append(UV_CONF_SECRET_MOUNT_AS_ENV)
94
+
95
+ command = ["uv", "pip", "install", "--no-cache-dir"]
96
+
97
+ args = []
98
+
99
+ if requirements_path:
100
+ args.append("-r")
101
+ args.append(requirements_path)
102
+
103
+ if pip_packages:
104
+ args.extend(pip_packages)
105
+
106
+ if not args:
107
+ return None
108
+
109
+ uv_pip_install_command = shlex.join(envs + command + args)
110
+ shell_commands = " && ".join([upgrade_pip_command, uv_pip_install_command])
111
+ final_docker_run_command = " ".join([uv_mount, shell_commands])
112
+
113
+ return final_docker_run_command
114
+
115
+
116
+ def generate_dockerfile_content(
117
+ build_configuration: SparkBuild,
118
+ package_manager: str = ENV_VARS.TFY_PYTHON_BUILD_PACKAGE_MANAGER,
119
+ mount_python_package_manager_conf_secret: bool = False,
120
+ ) -> str:
121
+ # TODO (chiragjn): Handle recursive references to other requirements files e.g. `-r requirements-gpu.txt`
122
+ requirements_path = _resolve_requirements_path(
123
+ build_context_path=build_configuration.build_context_path,
124
+ requirements_path=build_configuration.requirements_path,
125
+ )
126
+ requirements_destination_path = (
127
+ "/tmp/requirements.txt" if requirements_path else None
128
+ )
129
+ if not build_configuration.spark_version:
130
+ raise ValueError(
131
+ "`spark_version` is required for `tfy-spark-buildpack` builder"
132
+ )
133
+
134
+ if package_manager == PythonPackageManager.PIP.value:
135
+ python_packages_install_command = generate_pip_install_command(
136
+ requirements_path=requirements_destination_path,
137
+ pip_packages=ADDITIONAL_PIP_PACKAGES,
138
+ mount_pip_conf_secret=mount_python_package_manager_conf_secret,
139
+ )
140
+ elif package_manager == PythonPackageManager.UV.value:
141
+ python_packages_install_command = generate_uv_pip_install_command(
142
+ requirements_path=requirements_destination_path,
143
+ pip_packages=ADDITIONAL_PIP_PACKAGES,
144
+ mount_uv_conf_secret=mount_python_package_manager_conf_secret,
145
+ )
146
+ else:
147
+ raise ValueError(f"Unsupported package manager: {package_manager}")
148
+
149
+ template_args = {
150
+ "spark_image_repo": ENV_VARS.TFY_SPARK_BUILD_SPARK_IMAGE_REPO,
151
+ "spark_version": build_configuration.spark_version,
152
+ "requirements_path": requirements_path,
153
+ "requirements_destination_path": requirements_destination_path,
154
+ "python_packages_install_command": python_packages_install_command,
155
+ }
156
+
157
+ if mount_python_package_manager_conf_secret:
158
+ if package_manager == PythonPackageManager.PIP.value:
159
+ template_args["package_manager_config_secret_mount"] = (
160
+ PIP_CONF_BUILDKIT_SECRET_MOUNT
161
+ )
162
+ elif package_manager == PythonPackageManager.UV.value:
163
+ template_args["package_manager_config_secret_mount"] = (
164
+ UV_CONF_BUILDKIT_SECRET_MOUNT
165
+ )
166
+ else:
167
+ raise ValueError(f"Unsupported package manager: {package_manager}")
168
+ else:
169
+ template_args["package_manager_config_secret_mount"] = ""
170
+
171
+ dockerfile_content = DOCKERFILE_TEMPLATE.render(**template_args)
172
+ return dockerfile_content
@@ -0,0 +1,56 @@
1
+ # This script is used as the main application file for spark applications
2
+ # when the application to be run is a notebook, the actual notebook to be
3
+ # executed is passed as an argument to this script.
4
+
5
+
6
+ import argparse
7
+ import sys
8
+
9
+ import papermill as pm
10
+
11
+
12
+ def execute_notebook(notebook_path, output_path="output.ipynb", parameters=None):
13
+ """
14
+ Execute a Jupyter notebook using papermill.
15
+
16
+ Args:
17
+ notebook_path: Path to the input notebook
18
+ output_path: Path for the output notebook
19
+ parameters: Dictionary of parameters to pass to the notebook
20
+
21
+ Raises:
22
+ Exception: If notebook execution fails
23
+ """
24
+ if parameters is None:
25
+ parameters = {}
26
+
27
+ print(f"Starting execution of notebook: {notebook_path}")
28
+ pm.execute_notebook(
29
+ notebook_path,
30
+ output_path,
31
+ parameters=parameters,
32
+ # TODO(gw): Replace with kernel name for venv
33
+ kernel_name="python3",
34
+ )
35
+ print(f"Successfully executed notebook: {notebook_path}")
36
+
37
+
38
+ if __name__ == "__main__":
39
+ parser = argparse.ArgumentParser(
40
+ description="Execute a Jupyter notebook using papermill for Spark applications"
41
+ )
42
+ parser.add_argument("notebook_path", help="Path to the notebook file to execute")
43
+
44
+ args = parser.parse_args()
45
+
46
+ # TODO(gw): Add support for passing parameters to the notebook
47
+ try:
48
+ execute_notebook(args.notebook_path)
49
+ except Exception as e:
50
+ print(f"Error executing notebook {args.notebook_path}: {e}")
51
+ print(
52
+ "Exiting with status code 1 to signal failure to parent process/orchestrator"
53
+ )
54
+ sys.exit(1)
55
+
56
+ # TODO(gw): Publish the output notebook to blob storage from where it could be rendered
@@ -37,13 +37,28 @@ from truefoundry.deploy.lib.model.entity import ApplyResult
37
37
  show_default=True,
38
38
  help="Simulate the process without actually applying the manifest",
39
39
  )
40
+ @click.option(
41
+ "--show-diff",
42
+ "--show_diff",
43
+ is_flag=True,
44
+ show_default=True,
45
+ help="Print manifest differences when using --dry-run",
46
+ )
40
47
  @handle_exception_wrapper
41
- def apply_command(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:
@@ -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(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:
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]: