truefoundry 0.6.6__tar.gz → 0.7.0__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 (383) hide show
  1. {truefoundry-0.6.6 → truefoundry-0.7.0}/PKG-INFO +3 -3
  2. {truefoundry-0.6.6 → truefoundry-0.7.0}/pyproject.toml +3 -3
  3. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/_client.py +1 -1
  4. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/cli/__main__.py +2 -0
  5. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/entities.py +6 -2
  6. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/session.py +8 -3
  7. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/__init__.py +1 -0
  8. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/_autogen/models.py +48 -16
  9. truefoundry-0.7.0/truefoundry/deploy/cli/commands/get_command.py +30 -0
  10. truefoundry-0.7.0/truefoundry/deploy/cli/commands/k8s_exec_credential_command.py +64 -0
  11. truefoundry-0.7.0/truefoundry/deploy/cli/commands/kubeconfig_command.py +129 -0
  12. truefoundry-0.7.0/truefoundry/deploy/cli/commands/utils.py +118 -0
  13. truefoundry-0.7.0/truefoundry/deploy/io/no_output_callback.py +27 -0
  14. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/clients/servicefoundry_client.py +8 -0
  15. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/model/entity.py +5 -0
  16. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/session.py +4 -2
  17. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/lib/deploy.py +5 -29
  18. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/lib/patched_models.py +5 -88
  19. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/prompt_utils.py +14 -9
  20. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/__init__.py +4 -1
  21. truefoundry-0.6.6/truefoundry/deploy/cli/commands/get_command.py +0 -216
  22. {truefoundry-0.6.6 → truefoundry-0.7.0}/.gitignore +0 -0
  23. {truefoundry-0.6.6 → truefoundry-0.7.0}/README.md +0 -0
  24. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/__init__.py +0 -0
  25. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/__init__.py +0 -0
  26. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/agents/__init__.py +0 -0
  27. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/agents/base.py +0 -0
  28. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/agents/developer.py +0 -0
  29. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/agents/project_identifier.py +0 -0
  30. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/agents/tester.py +0 -0
  31. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/cli.py +0 -0
  32. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/constants.py +0 -0
  33. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/exception.py +0 -0
  34. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/logger.py +0 -0
  35. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/__init__.py +0 -0
  36. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/ask.py +0 -0
  37. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/base.py +0 -0
  38. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/commit.py +0 -0
  39. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/docker_build.py +0 -0
  40. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/docker_run.py +0 -0
  41. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/file_type_counts.py +0 -0
  42. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/list_files.py +0 -0
  43. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/read_file.py +0 -0
  44. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/send_request.py +0 -0
  45. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/tools/write_file.py +0 -0
  46. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/utils/client.py +0 -0
  47. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/utils/diff.py +0 -0
  48. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/autodeploy/utils/pydantic_compat.py +0 -0
  49. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/cli/__init__.py +0 -0
  50. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/cli/config.py +0 -0
  51. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/cli/console.py +0 -0
  52. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/cli/const.py +0 -0
  53. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/cli/display_util.py +0 -0
  54. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/cli/util.py +0 -0
  55. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/__init__.py +0 -0
  56. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/auth_service_client.py +0 -0
  57. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/constants.py +0 -0
  58. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/credential_file_manager.py +0 -0
  59. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/credential_provider.py +0 -0
  60. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/exceptions.py +0 -0
  61. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/request_utils.py +0 -0
  62. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/servicefoundry_client.py +0 -0
  63. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/storage_provider_utils.py +0 -0
  64. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/types.py +0 -0
  65. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/utils.py +0 -0
  66. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/common/warnings.py +0 -0
  67. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/__init__.py +0 -0
  68. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/builders/__init__.py +0 -0
  69. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/builders/dockerfile.py +0 -0
  70. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py +0 -0
  71. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py +0 -0
  72. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py +0 -0
  73. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +0 -0
  74. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/constants.py +0 -0
  75. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/docker_service.py +0 -0
  76. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/builder/utils.py +0 -0
  77. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/__init__.py +0 -0
  78. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/__init__.py +0 -0
  79. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/apply_command.py +0 -0
  80. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/build_command.py +0 -0
  81. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/create_command.py +0 -0
  82. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/delete_command.py +0 -0
  83. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/deploy_command.py +0 -0
  84. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/deploy_init_command.py +0 -0
  85. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/list_command.py +0 -0
  86. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/login_command.py +0 -0
  87. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/logout_command.py +0 -0
  88. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/logs_command.py +0 -0
  89. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/patch_application_command.py +0 -0
  90. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/patch_command.py +0 -0
  91. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/redeploy_command.py +0 -0
  92. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/terminate_comand.py +0 -0
  93. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/cli/commands/trigger_command.py +0 -0
  94. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/core/__init__.py +0 -0
  95. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/core/login.py +0 -0
  96. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/core/logout.py +0 -0
  97. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/io/__init__.py +0 -0
  98. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/io/output_callback.py +0 -0
  99. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/io/rich_output_callback.py +0 -0
  100. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/__init__.py +0 -0
  101. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/clients/__init__.py +0 -0
  102. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/const.py +0 -0
  103. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/dao/__init__.py +0 -0
  104. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/dao/application.py +0 -0
  105. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/dao/apply.py +0 -0
  106. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/dao/delete.py +0 -0
  107. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/dao/version.py +0 -0
  108. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/dao/workspace.py +0 -0
  109. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/logs_utils.py +0 -0
  110. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/messages.py +0 -0
  111. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/model/__init__.py +0 -0
  112. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/util.py +0 -0
  113. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/lib/win32.py +0 -0
  114. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/python_deploy_codegen.py +0 -0
  115. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/__init__.py +0 -0
  116. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/lib/__init__.py +0 -0
  117. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/lib/deploy_workflow.py +0 -0
  118. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/lib/deployable_patched_models.py +0 -0
  119. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/lib/models.py +0 -0
  120. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/deploy/v2/lib/source.py +0 -0
  121. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/logger.py +0 -0
  122. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/__init__.py +0 -0
  123. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/__init__.py +0 -0
  124. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/__init__.py +0 -0
  125. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/__init__.py +0 -0
  126. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/auth_api.py +0 -0
  127. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/deprecated_api.py +0 -0
  128. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/experiments_api.py +0 -0
  129. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/generate_code_snippet_api.py +0 -0
  130. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/health_api.py +0 -0
  131. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/metrics_api.py +0 -0
  132. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/mlfoundry_artifacts_api.py +0 -0
  133. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/run_artifacts_api.py +0 -0
  134. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api/runs_api.py +0 -0
  135. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api_client.py +0 -0
  136. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/api_response.py +0 -0
  137. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/configuration.py +0 -0
  138. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/exceptions.py +0 -0
  139. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/__init__.py +0 -0
  140. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/agent_app.py +0 -0
  141. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/agent_manifest.py +0 -0
  142. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_manifest.py +0 -0
  143. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/agent_open_api_tool_with_fqn.py +0 -0
  144. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/agent_with_fqn.py +0 -0
  145. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/apply_request_dto.py +0 -0
  146. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/apply_response_dto.py +0 -0
  147. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_dto.py +0 -0
  148. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_manifest.py +0 -0
  149. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_path.py +0 -0
  150. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_response_dto.py +0 -0
  151. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_type.py +0 -0
  152. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_version_dto.py +0 -0
  153. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_version_response_dto.py +0 -0
  154. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_version_serialization_format.py +0 -0
  155. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/artifact_version_status.py +0 -0
  156. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/assistant_message.py +0 -0
  157. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_request_dto.py +0 -0
  158. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/authorize_user_for_model_version_request_dto.py +0 -0
  159. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/blob_storage_reference.py +0 -0
  160. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/body_get_search_runs_get.py +0 -0
  161. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest.py +0 -0
  162. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/chat_prompt_manifest_messages_inner.py +0 -0
  163. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/columns_dto.py +0 -0
  164. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/command.py +0 -0
  165. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/content.py +0 -0
  166. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/content1.py +0 -0
  167. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/content2.py +0 -0
  168. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/content2_any_of_inner.py +0 -0
  169. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_artifact_request_dto.py +0 -0
  170. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_artifact_response_dto.py +0 -0
  171. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_artifact_version_request_dto.py +0 -0
  172. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_artifact_version_response_dto.py +0 -0
  173. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_dataset_request_dto.py +0 -0
  174. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_experiment_request_dto.py +0 -0
  175. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_experiment_response_dto.py +0 -0
  176. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_model_version_request_dto.py +0 -0
  177. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_request_dto.py +0 -0
  178. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_for_dataset_response_dto.py +0 -0
  179. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_multi_part_upload_request_dto.py +0 -0
  180. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_request_dto.py +0 -0
  181. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_python_deployment_config_response_dto.py +0 -0
  182. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_run_request_dto.py +0 -0
  183. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_run_response_dto.py +0 -0
  184. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/create_workflow_task_config_request_dto.py +0 -0
  185. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/data_directory_manifest.py +0 -0
  186. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/dataset_dto.py +0 -0
  187. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/dataset_response_dto.py +0 -0
  188. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/delete_artifact_versions_request_dto.py +0 -0
  189. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/delete_dataset_request_dto.py +0 -0
  190. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/delete_files_for_dataset_request_dto.py +0 -0
  191. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/delete_model_version_request_dto.py +0 -0
  192. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/delete_run_request.py +0 -0
  193. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/delete_tag_request_dto.py +0 -0
  194. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/experiment_dto.py +0 -0
  195. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/experiment_id_request_dto.py +0 -0
  196. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/experiment_response_dto.py +0 -0
  197. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/experiment_tag_dto.py +0 -0
  198. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/export_deployment_files_request_dto.py +0 -0
  199. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/external_blob_storage_source.py +0 -0
  200. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/fast_ai_framework.py +0 -0
  201. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/file_info_dto.py +0 -0
  202. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/finalize_artifact_version_request_dto.py +0 -0
  203. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/framework.py +0 -0
  204. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_artifact_version_aliases_response_dto.py +0 -0
  205. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_experiment_response_dto.py +0 -0
  206. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_latest_run_log_response_dto.py +0 -0
  207. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_metric_history_response.py +0 -0
  208. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_url_for_dataset_write_request_dto.py +0 -0
  209. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_request_dto.py +0 -0
  210. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_read_response_dto.py +0 -0
  211. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_request_dto.py +0 -0
  212. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_artifact_version_write_response_dto.py +0 -0
  213. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_request_dto.py +0 -0
  214. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_read_response_dto.py +0 -0
  215. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_signed_urls_for_dataset_write_response_dto.py +0 -0
  216. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/get_tenant_id_response_dto.py +0 -0
  217. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/gluon_framework.py +0 -0
  218. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/h2_o_framework.py +0 -0
  219. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/http_validation_error.py +0 -0
  220. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/image_content_part.py +0 -0
  221. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/image_url.py +0 -0
  222. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/infer_method_name.py +0 -0
  223. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/keras_framework.py +0 -0
  224. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/latest_run_log_dto.py +0 -0
  225. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/library_name.py +0 -0
  226. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/light_gbm_framework.py +0 -0
  227. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_artifact_versions_request_dto.py +0 -0
  228. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_artifact_versions_response_dto.py +0 -0
  229. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_artifacts_request_dto.py +0 -0
  230. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_artifacts_response_dto.py +0 -0
  231. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_colums_response_dto.py +0 -0
  232. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_datasets_request_dto.py +0 -0
  233. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_datasets_response_dto.py +0 -0
  234. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_experiments_response_dto.py +0 -0
  235. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_version_request_dto.py +0 -0
  236. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_files_for_artifact_versions_response_dto.py +0 -0
  237. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_request_dto.py +0 -0
  238. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_files_for_dataset_response_dto.py +0 -0
  239. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_latest_run_logs_response_dto.py +0 -0
  240. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_metric_history_request_dto.py +0 -0
  241. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_metric_history_response_dto.py +0 -0
  242. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_model_version_response_dto.py +0 -0
  243. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_model_versions_request_dto.py +0 -0
  244. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_models_request_dto.py +0 -0
  245. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_models_response_dto.py +0 -0
  246. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_run_artifacts_response_dto.py +0 -0
  247. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/list_run_logs_response_dto.py +0 -0
  248. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/local_artifact_source.py +0 -0
  249. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/local_model_source.py +0 -0
  250. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/log_batch_request_dto.py +0 -0
  251. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/log_metric_request_dto.py +0 -0
  252. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/log_param_request_dto.py +0 -0
  253. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/manifest.py +0 -0
  254. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/manifest1.py +0 -0
  255. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/manifest2.py +0 -0
  256. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/method.py +0 -0
  257. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/metric_collection_dto.py +0 -0
  258. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/metric_dto.py +0 -0
  259. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/mime_type.py +0 -0
  260. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_configuration.py +0 -0
  261. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_dto.py +0 -0
  262. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_manifest.py +0 -0
  263. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_response_dto.py +0 -0
  264. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_server.py +0 -0
  265. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_version_dto.py +0 -0
  266. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_version_environment.py +0 -0
  267. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/model_version_response_dto.py +0 -0
  268. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/multi_part_upload_dto.py +0 -0
  269. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/multi_part_upload_response_dto.py +0 -0
  270. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/multi_part_upload_storage_provider.py +0 -0
  271. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/notify_artifact_version_failure_dto.py +0 -0
  272. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/onnx_framework.py +0 -0
  273. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/openapi_spec.py +0 -0
  274. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/paddle_framework.py +0 -0
  275. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/param_dto.py +0 -0
  276. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/parameters.py +0 -0
  277. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/py_torch_framework.py +0 -0
  278. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/resolve_agent_app_response_dto.py +0 -0
  279. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/restore_run_request_dto.py +0 -0
  280. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/run_data_dto.py +0 -0
  281. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/run_dto.py +0 -0
  282. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/run_info_dto.py +0 -0
  283. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/run_log_dto.py +0 -0
  284. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/run_log_input_dto.py +0 -0
  285. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/run_response_dto.py +0 -0
  286. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/run_tag_dto.py +0 -0
  287. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/search_runs_request_dto.py +0 -0
  288. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/search_runs_response_dto.py +0 -0
  289. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/set_experiment_tag_request_dto.py +0 -0
  290. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/set_tag_request_dto.py +0 -0
  291. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/signed_url_dto.py +0 -0
  292. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/sklearn_framework.py +0 -0
  293. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/sklearn_model_schema.py +0 -0
  294. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/sklearn_serialization_format.py +0 -0
  295. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/source.py +0 -0
  296. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/source1.py +0 -0
  297. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/source2.py +0 -0
  298. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/spa_cy_framework.py +0 -0
  299. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/stats_models_framework.py +0 -0
  300. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/stop.py +0 -0
  301. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/store_run_logs_request_dto.py +0 -0
  302. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/subject.py +0 -0
  303. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/subject_type.py +0 -0
  304. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/system_message.py +0 -0
  305. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/tensor_flow_framework.py +0 -0
  306. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/text.py +0 -0
  307. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/text_content_part.py +0 -0
  308. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/transformers_framework.py +0 -0
  309. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_request_dto.py +0 -0
  310. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/trigger_job_run_config_response_dto.py +0 -0
  311. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/true_foundry_managed_source.py +0 -0
  312. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/update_artifact_version_request_dto.py +0 -0
  313. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/update_dataset_request_dto.py +0 -0
  314. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/update_experiment_request_dto.py +0 -0
  315. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/update_model_version_request_dto.py +0 -0
  316. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/update_run_request_dto.py +0 -0
  317. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/update_run_response_dto.py +0 -0
  318. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/url.py +0 -0
  319. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/user_message.py +0 -0
  320. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_request_dto.py +0 -0
  321. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/validate_external_storage_root_response_dto.py +0 -0
  322. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/validation_error.py +0 -0
  323. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/validation_error_loc_inner.py +0 -0
  324. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/xg_boost_framework.py +0 -0
  325. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/xg_boost_model_schema.py +0 -0
  326. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/models/xg_boost_serialization_format.py +0 -0
  327. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client/rest.py +0 -0
  328. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/client_README.md +0 -0
  329. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/entities/artifacts.py +0 -0
  330. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/models/__init__.py +0 -0
  331. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/models/exceptions.py +0 -0
  332. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/models/schema.py +0 -0
  333. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/models/signature.py +0 -0
  334. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/_autogen/models/utils.py +0 -0
  335. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/artifact/__init__.py +0 -0
  336. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/artifact/truefoundry_artifact_repo.py +0 -0
  337. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/cli/__init__.py +0 -0
  338. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/cli/cli.py +0 -0
  339. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/cli/commands/__init__.py +0 -0
  340. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/cli/commands/download.py +0 -0
  341. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/cli/commands/model_init.py +0 -0
  342. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/cli/utils.py +0 -0
  343. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/clients/__init__.py +0 -0
  344. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/clients/servicefoundry_client.py +0 -0
  345. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/constants.py +0 -0
  346. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/entities.py +0 -0
  347. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/enums.py +0 -0
  348. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/exceptions.py +0 -0
  349. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/git_info.py +0 -0
  350. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/internal_namespace.py +0 -0
  351. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/__init__.py +0 -0
  352. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/artifacts/artifact.py +0 -0
  353. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/artifacts/constants.py +0 -0
  354. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/artifacts/dataset.py +0 -0
  355. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/artifacts/general_artifact.py +0 -0
  356. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/artifacts/model.py +0 -0
  357. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/artifacts/utils.py +0 -0
  358. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/image/__init__.py +0 -0
  359. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/image/constants.py +0 -0
  360. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/image/image.py +0 -0
  361. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/image/image_normalizer.py +0 -0
  362. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/image/types.py +0 -0
  363. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/plot.py +0 -0
  364. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/pydantic_base.py +0 -0
  365. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/log_types/utils.py +0 -0
  366. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/logger.py +0 -0
  367. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/mlfoundry_api.py +0 -0
  368. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/mlfoundry_run.py +0 -0
  369. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/model_framework.py +0 -0
  370. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/run_utils.py +0 -0
  371. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/session.py +0 -0
  372. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/ml/validation_utils.py +0 -0
  373. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/pydantic_v1.py +0 -0
  374. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/version.py +0 -0
  375. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/container_task.py +0 -0
  376. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/map_task.py +0 -0
  377. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/python_task.py +0 -0
  378. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/remote_filesystem/__init__.py +0 -0
  379. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/remote_filesystem/logger.py +0 -0
  380. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +0 -0
  381. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +0 -0
  382. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/task.py +0 -0
  383. {truefoundry-0.6.6 → truefoundry-0.7.0}/truefoundry/workflow/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truefoundry
3
- Version: 0.6.6
3
+ Version: 0.7.0
4
4
  Summary: TrueFoundry CLI
5
5
  Author-email: TrueFoundry Team <abhishek@truefoundry.com>
6
6
  Requires-Python: <3.14,>=3.8.1
@@ -30,12 +30,12 @@ Requires-Dist: requirements-parser<0.12.0,>=0.11.0
30
30
  Requires-Dist: rich-click<2.0.0,>=1.2.1
31
31
  Requires-Dist: rich<14.0.0,>=13.7.1
32
32
  Requires-Dist: tqdm<5.0.0,>=4.0.0
33
- Requires-Dist: truefoundry-sdk==0.0.10
33
+ Requires-Dist: truefoundry-sdk==0.0.15
34
34
  Requires-Dist: typing-extensions>=4.0
35
35
  Requires-Dist: urllib3<3,>=1.26.18
36
36
  Requires-Dist: yq<4.0.0,>=3.1.0
37
37
  Provides-Extra: workflow
38
- Requires-Dist: flytekit==1.13.13; extra == 'workflow'
38
+ Requires-Dist: flytekit==1.15.3; (python_version >= '3.9' and python_version < '3.13') and extra == 'workflow'
39
39
  Description-Content-Type: text/markdown
40
40
 
41
41
  # TrueFoundry
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "truefoundry"
3
- version = "0.6.6" # This is a placeholder version, it will be replaced when releasing
3
+ version = "0.7.0" # 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" }]
@@ -31,7 +31,7 @@ dependencies = [
31
31
  "rich>=13.7.1,<14.0.0",
32
32
  "rich-click>=1.2.1,<2.0.0",
33
33
  "tqdm>=4.0.0,<5.0.0",
34
- "truefoundry-sdk==0.0.10",
34
+ "truefoundry-sdk==0.0.15",
35
35
  "typing-extensions>=4.0",
36
36
  "urllib3>=1.26.18,<3",
37
37
  "yq>=3.1.0,<4.0.0",
@@ -40,7 +40,7 @@ dependencies = [
40
40
  ]
41
41
 
42
42
  [project.optional-dependencies]
43
- workflow = ["flytekit==1.13.13"]
43
+ workflow = ["flytekit==1.15.3; python_version >= '3.9' and python_version < '3.13'"]
44
44
 
45
45
  [project.scripts]
46
46
  tfy = "truefoundry.cli.__main__:main"
@@ -33,4 +33,4 @@ class _LazyTrueFoundry(truefoundry_sdk.TrueFoundry):
33
33
  )
34
34
 
35
35
 
36
- client = _LazyTrueFoundry()
36
+ client = _LazyTrueFoundry().v1
@@ -14,6 +14,7 @@ from truefoundry.deploy.cli.commands import (
14
14
  get_delete_command,
15
15
  get_deploy_command,
16
16
  get_deploy_init_command,
17
+ get_get_command,
17
18
  get_login_command,
18
19
  get_logout_command,
19
20
  get_patch_application_command,
@@ -88,6 +89,7 @@ def create_truefoundry_cli() -> click.Group:
88
89
  cli.add_command(get_trigger_command())
89
90
  cli.add_command(get_terminate_command())
90
91
  cli.add_command(get_ml_cli())
92
+ cli.add_command(get_get_command())
91
93
 
92
94
  if not (sys.platform.startswith("win32") or sys.platform.startswith("cygwin")):
93
95
  cli.add_command(get_patch_command())
@@ -58,10 +58,14 @@ class Token(BaseModel):
58
58
  assert self.decoded_value is not None
59
59
  return self.decoded_value["tenantName"]
60
60
 
61
+ @property
62
+ def exp(self) -> int:
63
+ assert self.decoded_value is not None
64
+ return self.decoded_value["exp"]
65
+
61
66
  def is_going_to_be_expired(self, buffer_in_seconds: int = 120) -> bool:
62
67
  assert self.decoded_value is not None
63
- exp = int(self.decoded_value["exp"])
64
- return (exp - time.time()) < buffer_in_seconds
68
+ return (self.exp - time.time()) < buffer_in_seconds
65
69
 
66
70
  def to_user_info(self) -> UserInfo:
67
71
  assert self.decoded_value is not None
@@ -8,7 +8,7 @@ from truefoundry.common.credential_provider import (
8
8
  EnvCredentialProvider,
9
9
  FileCredentialProvider,
10
10
  )
11
- from truefoundry.common.entities import UserInfo
11
+ from truefoundry.common.entities import Token, UserInfo
12
12
  from truefoundry.common.utils import relogin_error_message
13
13
  from truefoundry.logger import logger
14
14
 
@@ -20,7 +20,7 @@ class Session:
20
20
  def __init__(self) -> None:
21
21
  self._closed = False
22
22
  self._cred_provider: Optional[CredentialProvider] = self._get_cred_provider()
23
- self._user_info: Optional[UserInfo] = self._cred_provider.token.to_user_info()
23
+ self._user_info: Optional[UserInfo] = self.token.to_user_info()
24
24
 
25
25
  @staticmethod
26
26
  def _get_cred_provider() -> CredentialProvider:
@@ -69,7 +69,12 @@ class Session:
69
69
  @property
70
70
  def access_token(self) -> str:
71
71
  assert self._cred_provider is not None
72
- return self._cred_provider.token.access_token
72
+ return self.token.access_token
73
+
74
+ @property
75
+ def token(self) -> Token:
76
+ assert self._cred_provider is not None
77
+ return self._cred_provider.token
73
78
 
74
79
  @property
75
80
  def tfy_host(self) -> str:
@@ -111,6 +111,7 @@ from truefoundry.deploy.v2.lib.patched_models import (
111
111
  Schedule,
112
112
  SecretMount,
113
113
  ServiceAutoscaling,
114
+ SlackBot,
114
115
  SlackWebhook,
115
116
  SparkJobJavaEntrypoint,
116
117
  SparkJobPythonEntrypoint,
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: application.json
3
- # timestamp: 2025-04-07T11:22:45+00:00
3
+ # timestamp: 2025-04-21T06:26:10+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -360,6 +360,13 @@ class Image(BaseModel):
360
360
  )
361
361
 
362
362
 
363
+ class JobEvent(str, Enum):
364
+ START = "START"
365
+ SUCCEEDED = "SUCCEEDED"
366
+ FAILED = "FAILED"
367
+ TERMINATED = "TERMINATED"
368
+
369
+
363
370
  class Claim(BaseModel):
364
371
  key: str
365
372
  values: List[str]
@@ -466,10 +473,6 @@ class NodeSelector(BaseModel):
466
473
  """
467
474
 
468
475
  type: Literal["node_selector"] = Field(..., description="")
469
- gpu_type: Optional[str] = Field(
470
- None,
471
- description="Name of the Nvidia GPU. One of [P4, P100, V100, T4, A10G, A100_40GB, A100_80GB]\nOne instance of the card contains the following amount of memory -\nP4: 8 GB, P100: 16 GB, V100: 16 GB, T4: 16 GB, A10G: 24 GB, A100_40GB: 40GB, A100_80GB: 80 GB",
472
- )
473
476
  instance_families: Optional[List[str]] = Field(
474
477
  None,
475
478
  description="Instance family of the underlying machine to use. Multiple instance families can be supplied.\nThe workload is guaranteed to be scheduled on one of them.",
@@ -699,10 +702,6 @@ class Resources(BaseModel):
699
702
  2000,
700
703
  description="Disk storage limit. The unit of memory is in megabytes(MB). Exceeding this limit will result in eviction.\nIt should be greater than the request. This is ephemeral storage and will be wiped out on pod restarts or eviction",
701
704
  )
702
- gpu_count: Optional[conint(ge=0, le=16)] = Field(
703
- None,
704
- description="Count of GPUs to provide to the application\nNote the exact count and max count available for a given GPU type depends on cloud provider and cluster type.",
705
- )
706
705
  shared_memory_size: Optional[conint(ge=64, le=2000000)] = Field(
707
706
  None,
708
707
  description="Define the shared memory requirements for your workload. Machine learning libraries like Pytorch can use Shared Memory\nfor inter-process communication. If you use this, we will mount a `tmpfs` backed volume at the `/dev/shm` directory.\nAny usage will also count against the workload's memory limit (`resources.memory_limit`) along with your workload's memory usage.\nIf the overall usage goes above `resources.memory_limit` the user process may get killed.\nShared Memory Size cannot be more than the defined Memory Limit for the workload.",
@@ -829,6 +828,16 @@ class ServiceAutoscaling(BaseAutoscaling):
829
828
  )
830
829
 
831
830
 
831
+ class SlackBot(BaseModel):
832
+ type: Literal["slack-bot"] = Field(..., description="")
833
+ notification_channel: constr(min_length=1) = Field(
834
+ ..., description="Specify the notification channel to send alerts to"
835
+ )
836
+ channels: List[constr(regex=r"^#[a-z0-9\-_]{2,80}$")] = Field(
837
+ ..., description="List of channels to send messages to."
838
+ )
839
+
840
+
832
841
  class SlackWebhook(BaseModel):
833
842
  type: Literal["slack-webhook"] = Field(..., description="")
834
843
  notification_channel: constr(min_length=1) = Field(
@@ -856,6 +865,26 @@ class SparkExecutorFixedInstances(BaseModel):
856
865
  count: conint(ge=0, le=500) = Field(1, description="Number of instances to start")
857
866
 
858
867
 
868
+ class SparkImage(BaseModel):
869
+ """
870
+ Describes that we are using a pre-built image stored in a Docker Image registry
871
+ """
872
+
873
+ type: Literal["image"] = Field(..., description="")
874
+ spark_version: str = Field(
875
+ "3.5.2",
876
+ description="Spark version should match the spark version installed in the image.",
877
+ )
878
+ image_uri: constr(regex=r"^\S*$") = Field(
879
+ ...,
880
+ 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",
881
+ )
882
+ docker_registry: Optional[str] = Field(
883
+ None,
884
+ description="FQN of the container registry. If you can't find your registry here,\nadd it through the [Integrations](/integrations?tab=docker-registry) page",
885
+ )
886
+
887
+
859
888
  class SparkJobJavaEntrypoint(BaseModel):
860
889
  type: Literal["java"] = Field(..., description="")
861
890
  main_application_file: str = Field(
@@ -1031,6 +1060,13 @@ class WorkbenchImage(BaseModel):
1031
1060
  )
1032
1061
 
1033
1062
 
1063
+ class WorkflowEvent(str, Enum):
1064
+ SUCCEEDED = "SUCCEEDED"
1065
+ FAILED = "FAILED"
1066
+ ABORTED = "ABORTED"
1067
+ TIMED_OUT = "TIMED_OUT"
1068
+
1069
+
1034
1070
  class ArtifactsDownload(BaseModel):
1035
1071
  """
1036
1072
  Download and cache models in a volume to enhance loading speeds and reduce costs by avoiding repeated downloads. [Docs](https://docs.truefoundry.com/docs/download-and-cache-models)
@@ -1385,14 +1421,10 @@ class SparkJob(BaseModel):
1385
1421
  name: constr(regex=r"^[a-z](?:[a-z0-9]|-(?!-)){1,30}[a-z0-9]$") = Field(
1386
1422
  ..., description="Name of the job"
1387
1423
  )
1424
+ image: SparkImage
1388
1425
  entrypoint: Union[
1389
1426
  SparkJobPythonEntrypoint, SparkJobScalaEntrypoint, SparkJobJavaEntrypoint
1390
1427
  ] = Field(..., description="")
1391
- image: Image
1392
- spark_version: str = Field(
1393
- "3.5.2",
1394
- description="Spark version should match the spark version installed in the image.",
1395
- )
1396
1428
  driver_config: SparkDriverConfig
1397
1429
  executor_config: SparkExecutorConfig
1398
1430
  env: Optional[Dict[str, Any]] = Field(
@@ -1452,7 +1484,7 @@ class WorkflowAlert(BaseModel):
1452
1484
  Describes the configuration for the workflow alerts
1453
1485
  """
1454
1486
 
1455
- notification_target: Optional[Union[Email, SlackWebhook]] = None
1487
+ notification_target: Optional[Union[Email, SlackWebhook, SlackBot]] = None
1456
1488
  on_completion: bool = Field(
1457
1489
  False, description="Send an alert when the job completes"
1458
1490
  )
@@ -1519,7 +1551,7 @@ class JobAlert(BaseModel):
1519
1551
  None,
1520
1552
  description="List of recipients' email addresses if the notification channel is Email.",
1521
1553
  )
1522
- notification_target: Optional[Union[Email, SlackWebhook]] = None
1554
+ notification_target: Optional[Union[Email, SlackWebhook, SlackBot]] = None
1523
1555
  on_start: bool = Field(False, description="Send an alert when the job starts")
1524
1556
  on_completion: bool = Field(
1525
1557
  False, description="Send an alert when the job completes"
@@ -0,0 +1,30 @@
1
+ import rich_click as click
2
+
3
+ from truefoundry.cli.const import GROUP_CLS
4
+ from truefoundry.common.utils import is_internal_env_set
5
+ from truefoundry.deploy.cli.commands.k8s_exec_credential_command import (
6
+ k8s_exec_credential_command,
7
+ )
8
+ from truefoundry.deploy.cli.commands.kubeconfig_command import kubeconfig_command
9
+
10
+ # TODO (chiragjn): --json should disable all non json console prints
11
+
12
+
13
+ @click.group(name="get", cls=GROUP_CLS)
14
+ def get_command():
15
+ # TODO (chiragjn): Figure out a way to update supported resources based on ENABLE_* flags
16
+ """
17
+ Get TrueFoundry resources
18
+
19
+ \b
20
+ Supported resources:
21
+ - Kubeconfig
22
+ """
23
+ pass
24
+
25
+
26
+ def get_get_command():
27
+ get_command.add_command(kubeconfig_command)
28
+ if is_internal_env_set():
29
+ get_command.add_command(k8s_exec_credential_command)
30
+ return get_command
@@ -0,0 +1,64 @@
1
+ import json
2
+ from datetime import datetime, timezone
3
+ from typing import Any, Dict, Optional
4
+ from urllib.parse import urlparse
5
+
6
+ import rich_click as click
7
+
8
+ from truefoundry.cli.const import COMMAND_CLS
9
+ from truefoundry.cli.util import handle_exception_wrapper
10
+ from truefoundry.common.session import Session
11
+ from truefoundry.deploy.cli.commands.utils import (
12
+ CONTEXT_NAME_FORMAT,
13
+ get_cluster_server_url,
14
+ get_kubeconfig_content,
15
+ get_kubeconfig_path,
16
+ )
17
+ from truefoundry.deploy.io.no_output_callback import NoOutputCallBack
18
+ from truefoundry.deploy.lib.session import login
19
+
20
+
21
+ @click.command(
22
+ name="k8s-exec-credential",
23
+ cls=COMMAND_CLS,
24
+ help="Generate a Kubernetes exec credential for the specified cluster user",
25
+ )
26
+ @click.option(
27
+ "-c",
28
+ "--cluster",
29
+ type=str,
30
+ required=True,
31
+ help="The cluster id from TrueFoundry",
32
+ )
33
+ @handle_exception_wrapper
34
+ def k8s_exec_credential_command(cluster: str) -> None:
35
+ """
36
+ Generate a Kubernetes exec credential for the specified cluster.
37
+ This command retrieves the cluster server URL from the kubeconfig file,
38
+ """
39
+ path = get_kubeconfig_path()
40
+ kubeconfig: Dict[str, Any] = get_kubeconfig_content(path=path)
41
+ server_url: Optional[str] = get_cluster_server_url(kubeconfig, cluster)
42
+ if not server_url:
43
+ raise click.ClickException(
44
+ f"\nContext {CONTEXT_NAME_FORMAT.format(cluster=cluster)!r} for cluster {cluster!r} not found in kubeconfig. \n\nPlease run 'tfy get kubeconfig --cluster {cluster}' first."
45
+ )
46
+ host: str = f"{urlparse(server_url).scheme}://{urlparse(server_url).netloc}"
47
+ login(host=host, output_hook=NoOutputCallBack())
48
+
49
+ session = Session.new()
50
+ token: str = session.access_token
51
+
52
+ exec_credential: Dict[str, Any] = {
53
+ "kind": "ExecCredential",
54
+ "apiVersion": "client.authentication.k8s.io/v1beta1",
55
+ "spec": {},
56
+ "status": {
57
+ "expirationTimestamp": datetime.fromtimestamp(
58
+ session.token.exp, tz=timezone.utc
59
+ ).strftime("%Y-%m-%dT%H:%M:%SZ"),
60
+ "token": token,
61
+ },
62
+ }
63
+
64
+ print(json.dumps(exec_credential, indent=4))
@@ -0,0 +1,129 @@
1
+ from typing import Any, Dict, Optional
2
+ from urllib.parse import urljoin
3
+
4
+ import questionary
5
+ import rich_click as click
6
+ from rich.console import Console
7
+
8
+ from truefoundry.cli.const import COMMAND_CLS
9
+ from truefoundry.cli.util import handle_exception_wrapper
10
+ from truefoundry.common.session import Session
11
+ from truefoundry.deploy.cli.commands.utils import (
12
+ CONTEXT_NAME_FORMAT,
13
+ add_update_cluster_context,
14
+ get_cluster_server_url,
15
+ get_kubeconfig_content,
16
+ get_kubeconfig_path,
17
+ save_kubeconfig,
18
+ )
19
+
20
+ console = Console()
21
+
22
+
23
+ def _select_cluster(cluster: Optional[str] = None) -> str:
24
+ """
25
+ Retrieve available clusters and either return the specified one after validation
26
+ or allow the user to interactively select from the list.
27
+ """
28
+ from truefoundry.deploy.lib.clients.servicefoundry_client import (
29
+ ServiceFoundryServiceClient,
30
+ )
31
+
32
+ clusters = ServiceFoundryServiceClient().list_clusters()
33
+
34
+ if not clusters:
35
+ raise click.ClickException("No clusters found in your account.")
36
+
37
+ if cluster:
38
+ if not any(c.id == cluster for c in clusters):
39
+ raise click.ClickException(
40
+ f"Cluster {cluster} not found. Either it does not exist or you might not be autthorized to access it"
41
+ )
42
+ return cluster
43
+
44
+ choices = {cluster.id: cluster for cluster in clusters}
45
+ cluster = questionary.select(
46
+ "Available Clusters:", choices=list(choices.keys())
47
+ ).ask()
48
+ if not cluster:
49
+ raise click.ClickException("No cluster selected.")
50
+ return cluster
51
+
52
+
53
+ def _construct_k8s_proxy_server(host: str, cluster: str) -> str:
54
+ """
55
+ Construct the Kubernetes proxy server URL.
56
+ """
57
+ return urljoin(host, f"api/svc/v1/k8s/proxy/{cluster}")
58
+
59
+
60
+ def _should_update_existing_context(cluster: str, kubeconfig: Dict[str, Any]) -> bool:
61
+ """
62
+ Prompt the user whether to overwrite an existing kubeconfig context.
63
+ """
64
+ server_url = get_cluster_server_url(kubeconfig, cluster)
65
+ if server_url is not None:
66
+ console.print(
67
+ f"\nContext {CONTEXT_NAME_FORMAT.format(cluster=cluster)!r} for cluster {cluster!r} already exists in kubeconfig.\n"
68
+ )
69
+ return click.confirm(
70
+ text="Do you want to update the context?", default=False, err=True
71
+ )
72
+ return True
73
+
74
+
75
+ @click.command(name="kubeconfig", cls=COMMAND_CLS)
76
+ @click.option(
77
+ "-c",
78
+ "--cluster",
79
+ type=str,
80
+ required=False,
81
+ help="The cluster id from TrueFoundry. If not provided, an interactive prompt will list available clusters",
82
+ )
83
+ @click.option(
84
+ "--overwrite",
85
+ is_flag=True,
86
+ default=False,
87
+ show_default=True,
88
+ help="Overwrites existing cluster entry without prompting",
89
+ )
90
+ @handle_exception_wrapper
91
+ def kubeconfig_command(cluster: Optional[str] = None, overwrite: bool = False) -> None:
92
+ """
93
+ Update kubeconfig file to access cluster attached to TrueFoundry Control Plane.
94
+
95
+ By default, credentials are written to ~/.kube/config. You can provide an alternate path by setting the KUBECONFIG environment variable. If KUBECONFIG contains multiple paths, the first one is used.
96
+ """
97
+ session = Session.new()
98
+ cluster = _select_cluster(cluster)
99
+
100
+ path = get_kubeconfig_path()
101
+ kubeconfig = get_kubeconfig_content(path=path)
102
+
103
+ if not overwrite and not _should_update_existing_context(cluster, kubeconfig):
104
+ console.print(
105
+ "Existing context found. Use '--overwrite' to force update the context."
106
+ )
107
+ return
108
+
109
+ k8s_proxy_server = _construct_k8s_proxy_server(session.tfy_host, cluster)
110
+ context_name = add_update_cluster_context(
111
+ kubeconfig,
112
+ cluster,
113
+ k8s_proxy_server,
114
+ exec_command=[
115
+ "tfy",
116
+ "--json",
117
+ "get",
118
+ "k8s-exec-credential",
119
+ "--cluster",
120
+ cluster,
121
+ ],
122
+ envs={"TFY_INTERNAL": "1"},
123
+ )
124
+
125
+ save_kubeconfig(kubeconfig, path=path)
126
+ console.print(
127
+ f"\nUpdated kubeconfig at {str(path)!r} with context {context_name!r} for cluster {cluster!r}\n\n"
128
+ f"Run 'kubectl config use-context {context_name}' to use this context.\n"
129
+ )
@@ -0,0 +1,118 @@
1
+ import os
2
+ from pathlib import Path
3
+ from typing import Any, Dict, List, Optional
4
+
5
+ import yaml
6
+
7
+ DEFAULT_KUBECONFIG_PATH: Path = Path.home() / ".kube" / "config"
8
+ CLUSTER_NAME_FORMAT: str = "tfy-{cluster}-cluster"
9
+ USER_NAME_FORMAT: str = "tfy-{cluster}-user"
10
+ CONTEXT_NAME_FORMAT: str = "tfy-{cluster}-context"
11
+ KUBE_CONFIG_CONTENT = {
12
+ "apiVersion": "v1",
13
+ "kind": "Config",
14
+ "clusters": [],
15
+ "users": [],
16
+ "contexts": [],
17
+ }
18
+
19
+
20
+ def get_kubeconfig_path() -> Path:
21
+ """
22
+ Returns the kubeconfig path to use.
23
+ If KUBECONFIG is set, returns the first path from the environment variable.
24
+ Otherwise, returns the default kubeconfig path.
25
+ """
26
+ kubeconfig_env = os.environ.get("KUBECONFIG")
27
+ if kubeconfig_env:
28
+ # Use the first path in KUBECONFIG if multiple are provided
29
+ first_path = kubeconfig_env.split(os.pathsep)[0]
30
+ return Path(first_path)
31
+ return DEFAULT_KUBECONFIG_PATH
32
+
33
+
34
+ def get_kubeconfig_content(path: Path = DEFAULT_KUBECONFIG_PATH) -> Dict[str, Any]:
35
+ if path.exists():
36
+ with open(path, "r") as f:
37
+ return yaml.safe_load(f) or KUBE_CONFIG_CONTENT
38
+ else:
39
+ return KUBE_CONFIG_CONTENT
40
+
41
+
42
+ def save_kubeconfig(config: Dict[str, Any], path: Path) -> None:
43
+ config["apiVersion"] = "v1"
44
+ config["kind"] = "Config"
45
+ path.parent.mkdir(parents=True, exist_ok=True)
46
+ with open(path, "w") as f:
47
+ yaml.safe_dump(config, f, default_flow_style=False)
48
+
49
+
50
+ def add_update_cluster_context(
51
+ config: Dict[str, Any],
52
+ cluster: str,
53
+ server_url: str,
54
+ exec_command: List[str],
55
+ envs: Optional[Dict[str, str]] = None,
56
+ ) -> str:
57
+ """
58
+ Adds a new cluster context to the given kubeconfig dictionary using exec-based authentication.
59
+ """
60
+ cluster_name: str = CLUSTER_NAME_FORMAT.format(cluster=cluster)
61
+ user_name: str = USER_NAME_FORMAT.format(cluster=cluster)
62
+ context_name: str = CONTEXT_NAME_FORMAT.format(cluster=cluster)
63
+
64
+ # Add or update cluster
65
+ config["clusters"] = [
66
+ c for c in config.get("clusters", []) if c["name"] != cluster_name
67
+ ]
68
+ config["clusters"].append(
69
+ {
70
+ "name": cluster_name,
71
+ "cluster": {"server": server_url},
72
+ }
73
+ )
74
+
75
+ # Add or update user with exec command
76
+ config["users"] = [u for u in config.get("users", []) if u["name"] != user_name]
77
+ config["users"].append(
78
+ {
79
+ "name": user_name,
80
+ "user": {
81
+ "exec": {
82
+ "apiVersion": "client.authentication.k8s.io/v1beta1",
83
+ "command": exec_command[0],
84
+ "args": exec_command[1:],
85
+ "env": (
86
+ [{"name": k, "value": v} for k, v in envs.items()]
87
+ if envs
88
+ else []
89
+ ),
90
+ }
91
+ },
92
+ }
93
+ )
94
+
95
+ # Add or update context
96
+ config["contexts"] = [
97
+ c for c in config.get("contexts", []) if c["name"] != context_name
98
+ ]
99
+ config["contexts"].append(
100
+ {"name": context_name, "context": {"cluster": cluster_name, "user": user_name}}
101
+ )
102
+ return context_name
103
+
104
+
105
+ def get_cluster_context(
106
+ config: Dict[str, Any], cluster: str
107
+ ) -> Optional[Dict[str, Any]]:
108
+ cluster_name: str = CLUSTER_NAME_FORMAT.format(cluster=cluster)
109
+ return next(
110
+ (c for c in config.get("clusters", []) if c["name"] == cluster_name), None
111
+ )
112
+
113
+
114
+ def get_cluster_server_url(config: Dict[str, Any], cluster: str) -> Optional[str]:
115
+ cluster: Optional[Dict[str, Any]] = get_cluster_context(config, cluster)
116
+ if cluster:
117
+ return cluster["cluster"].get("server")
118
+ return None
@@ -0,0 +1,27 @@
1
+ from typing import Any, List, Optional
2
+
3
+ from truefoundry.deploy.io.output_callback import OutputCallBack
4
+
5
+
6
+ class NoOutputCallBack(OutputCallBack):
7
+ def print_header(self, line: Any) -> None:
8
+ pass
9
+
10
+ def _print_separator(self) -> None:
11
+ pass
12
+
13
+ def print_line(self, line: str) -> None:
14
+ pass
15
+
16
+ def print_lines_in_panel(
17
+ self, lines: List[str], header: Optional[str] = None
18
+ ) -> None:
19
+ pass
20
+
21
+ def print_code_in_panel(
22
+ self, lines: List[str], header: Optional[str] = None
23
+ ) -> None:
24
+ pass
25
+
26
+ def print(self, line: Any) -> None:
27
+ pass
@@ -32,6 +32,7 @@ from truefoundry.deploy._autogen import models as autogen_models
32
32
  from truefoundry.deploy.io.output_callback import OutputCallBack
33
33
  from truefoundry.deploy.lib.model.entity import (
34
34
  Application,
35
+ Cluster,
35
36
  CreateDockerRepositoryResponse,
36
37
  Deployment,
37
38
  DockerRegistryCredentials,
@@ -110,6 +111,13 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
110
111
  )
111
112
  return request_handling(response)
112
113
 
114
+ @check_min_cli_version
115
+ def list_clusters(self) -> List[Cluster]:
116
+ url = f"{self._api_server_url}/{VERSION_PREFIX}/clusters"
117
+ response = session_with_retries().get(url, headers=self._get_headers())
118
+ response = request_handling(response)
119
+ return parse_obj_as(List[Cluster], response["data"])
120
+
113
121
  @check_min_cli_version
114
122
  def list_workspaces(
115
123
  self,
@@ -34,6 +34,11 @@ class Entity(Base):
34
34
  updatedAt: datetime.datetime = Field(repr=False)
35
35
 
36
36
 
37
+ class Cluster(Entity):
38
+ id: str
39
+ cloudProvider: str
40
+
41
+
37
42
  class Workspace(Entity):
38
43
  id: str = Field(repr=False)
39
44
  name: str