truss 0.11.8rc11__tar.gz → 0.11.9__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 truss might be problematic. Click here for more details.

Files changed (419) hide show
  1. {truss-0.11.8rc11 → truss-0.11.9}/PKG-INFO +1 -1
  2. {truss-0.11.8rc11 → truss-0.11.9}/pyproject.toml +1 -1
  3. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/logs/base_watcher.py +31 -12
  4. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/logs/model_log_watcher.py +24 -1
  5. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/core.py +13 -11
  6. truss-0.11.9/truss/cli/train/deploy_checkpoints/__init__.py +3 -0
  7. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/deploy_checkpoints/deploy_checkpoints.py +211 -106
  8. truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +1 -0
  9. truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +35 -0
  10. truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +34 -0
  11. truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_whisper_checkpoints.py +10 -0
  12. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/types.py +1 -11
  13. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train_commands.py +5 -15
  14. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/api.py +87 -0
  15. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/application.py +48 -26
  16. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/endpoints.py +1 -5
  17. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/model_container_patch_applier.py +33 -18
  18. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/docker_server/proxy.conf.jinja +2 -2
  19. truss-0.11.9/truss/tests/cli/train/test_deploy_checkpoints.py +277 -0
  20. truss-0.11.9/truss/tests/templates/control/control/conftest.py +20 -0
  21. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/control/control/test_endpoints.py +4 -0
  22. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/control/control/test_server.py +8 -24
  23. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/control/control/test_server_integration.py +4 -2
  24. truss-0.11.9/truss/util/__init__.py +0 -0
  25. {truss-0.11.8rc11 → truss-0.11.9}/truss-train/truss_train/definitions.py +0 -1
  26. truss-0.11.8rc11/truss/cli/train/deploy_checkpoints/__init__.py +0 -3
  27. truss-0.11.8rc11/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +0 -52
  28. truss-0.11.8rc11/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +0 -94
  29. truss-0.11.8rc11/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +0 -117
  30. truss-0.11.8rc11/truss/cli/train/deploy_checkpoints/deploy_whisper_checkpoints.py +0 -63
  31. truss-0.11.8rc11/truss/tests/cli/train/test_deploy_checkpoints.py +0 -1120
  32. {truss-0.11.8rc11 → truss-0.11.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  33. {truss-0.11.8rc11 → truss-0.11.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  34. {truss-0.11.8rc11 → truss-0.11.9}/.github/pull_request_template.md +0 -0
  35. {truss-0.11.8rc11 → truss-0.11.9}/.gitignore +0 -0
  36. {truss-0.11.8rc11 → truss-0.11.9}/CODE_OF_CONDUCT.md +0 -0
  37. {truss-0.11.8rc11 → truss-0.11.9}/CONTRIBUTING.md +0 -0
  38. {truss-0.11.8rc11 → truss-0.11.9}/LICENSE +0 -0
  39. {truss-0.11.8rc11 → truss-0.11.9}/README.md +0 -0
  40. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/README.md +0 -0
  41. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/README.md +0 -0
  42. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/android-arm-eabi/README.md +0 -0
  43. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/android-arm64/README.md +0 -0
  44. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/darwin-arm64/README.md +0 -0
  45. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/darwin-universal/README.md +0 -0
  46. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/darwin-x64/README.md +0 -0
  47. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/freebsd-x64/README.md +0 -0
  48. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm-gnueabihf/README.md +0 -0
  49. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm-musleabihf/README.md +0 -0
  50. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm64-gnu/README.md +0 -0
  51. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm64-musl/README.md +0 -0
  52. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-riscv64-gnu/README.md +0 -0
  53. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-x64-gnu/README.md +0 -0
  54. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-x64-musl/README.md +0 -0
  55. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/win32-arm64-msvc/README.md +0 -0
  56. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/win32-ia32-msvc/README.md +0 -0
  57. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/win32-x64-msvc/README.md +0 -0
  58. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/python_bindings/README.md +0 -0
  59. {truss-0.11.8rc11 → truss-0.11.9}/baseten-performance-client/scripts/README_nodejs.md +0 -0
  60. {truss-0.11.8rc11 → truss-0.11.9}/context_builder.Dockerfile +0 -0
  61. {truss-0.11.8rc11 → truss-0.11.9}/docs/README.md +0 -0
  62. {truss-0.11.8rc11 → truss-0.11.9}/docs/chains/doc_gen/README.md +0 -0
  63. {truss-0.11.8rc11 → truss-0.11.9}/docs/contribute/base-images.md +0 -0
  64. {truss-0.11.8rc11 → truss-0.11.9}/docs/contribute/release.md +0 -0
  65. {truss-0.11.8rc11 → truss-0.11.9}/truss/__init__.py +0 -0
  66. {truss-0.11.8rc11 → truss-0.11.9}/truss/api/__init__.py +0 -0
  67. {truss-0.11.8rc11 → truss-0.11.9}/truss/api/definitions.py +0 -0
  68. {truss-0.11.8rc11 → truss-0.11.9}/truss/base/__init__.py +0 -0
  69. {truss-0.11.8rc11 → truss-0.11.9}/truss/base/constants.py +0 -0
  70. {truss-0.11.8rc11 → truss-0.11.9}/truss/base/custom_types.py +0 -0
  71. {truss-0.11.8rc11 → truss-0.11.9}/truss/base/errors.py +0 -0
  72. {truss-0.11.8rc11 → truss-0.11.9}/truss/base/trt_llm_config.py +0 -0
  73. {truss-0.11.8rc11 → truss-0.11.9}/truss/base/truss_config.py +0 -0
  74. {truss-0.11.8rc11 → truss-0.11.9}/truss/base/truss_spec.py +0 -0
  75. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/chains_commands.py +0 -0
  76. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/cli.py +0 -0
  77. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/logs/training_log_watcher.py +0 -0
  78. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/logs/utils.py +0 -0
  79. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/remote_cli.py +0 -0
  80. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/common.py +0 -0
  81. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/deploy_from_checkpoint_config.yml +0 -0
  82. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/deploy_from_checkpoint_config_whisper.yml +0 -0
  83. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/metrics_watcher.py +0 -0
  84. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/train/poller.py +0 -0
  85. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/utils/common.py +0 -0
  86. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/utils/output.py +0 -0
  87. {truss-0.11.8rc11 → truss-0.11.9}/truss/cli/utils/self_upgrade.py +0 -0
  88. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/docker_build_setup.py +0 -0
  89. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/image_builder/cache_warmer.py +0 -0
  90. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/image_builder/image_builder.py +0 -0
  91. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/image_builder/serving_image_builder.py +0 -0
  92. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/image_builder/util.py +0 -0
  93. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/local_loader/docker_build_emulator.py +0 -0
  94. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/local_loader/dockerfile_parser.py +0 -0
  95. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/local_loader/load_model_local.py +0 -0
  96. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/local_loader/truss_module_loader.py +0 -0
  97. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/local_loader/utils.py +0 -0
  98. {truss-0.11.8rc11 → truss-0.11.9}/truss/contexts/truss_context.py +0 -0
  99. {truss-0.11.8rc11 → truss-0.11.9}/truss/local/local_config.py +0 -0
  100. {truss-0.11.8rc11 → truss-0.11.9}/truss/local/local_config_handler.py +0 -0
  101. {truss-0.11.8rc11 → truss-0.11.9}/truss/patch/__init__.py +0 -0
  102. {truss-0.11.8rc11 → truss-0.11.9}/truss/patch/hash.py +0 -0
  103. {truss-0.11.8rc11 → truss-0.11.9}/truss/patch/signature.py +0 -0
  104. {truss-0.11.8rc11 → truss-0.11.9}/truss/patch/truss_dir_patch_applier.py +0 -0
  105. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/__init__.py +0 -0
  106. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/auth.py +0 -0
  107. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/core.py +0 -0
  108. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/custom_types.py +0 -0
  109. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/error.py +0 -0
  110. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/remote.py +0 -0
  111. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/rest_client.py +0 -0
  112. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/service.py +0 -0
  113. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/utils/status.py +0 -0
  114. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/utils/tar.py +0 -0
  115. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/utils/time.py +0 -0
  116. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/baseten/utils/transfer.py +0 -0
  117. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/remote_factory.py +0 -0
  118. {truss-0.11.8rc11 → truss-0.11.9}/truss/remote/truss_remote.py +0 -0
  119. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/README.md.jinja +0 -0
  120. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/__init__.py +0 -0
  121. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/base.Dockerfile.jinja +0 -0
  122. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/cache.Dockerfile.jinja +0 -0
  123. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/cache_requirements.txt +0 -0
  124. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/context_managers.py +0 -0
  125. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/custom_types.py +0 -0
  126. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/errors.py +0 -0
  127. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/inference_server_controller.py +0 -0
  128. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/inference_server_process_controller.py +0 -0
  129. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/inference_server_starter.py +0 -0
  130. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/__init__.py +0 -0
  131. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/model_code_patch_applier.py +0 -0
  132. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +0 -0
  133. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/system_packages.py +0 -0
  134. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/control/server.py +0 -0
  135. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/control/requirements.txt +0 -0
  136. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/copy_cache_files.Dockerfile.jinja +0 -0
  137. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/custom/examples.yaml +0 -0
  138. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/custom/model/__init__.py +0 -0
  139. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/custom/model/model.py +0 -0
  140. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/custom_python_dx/my_model.py +0 -0
  141. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/docker_server/supervisord.conf.jinja +0 -0
  142. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/docker_server_requirements.txt +0 -0
  143. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/__init__.py +0 -0
  144. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/common/__init__.py +0 -0
  145. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/common/errors.py +0 -0
  146. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/common/patches/whisper/patch.py +0 -0
  147. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/common/patches.py +0 -0
  148. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/common/retry.py +0 -0
  149. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/common/schema.py +0 -0
  150. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/common/tracing.py +0 -0
  151. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/main.py +0 -0
  152. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/model_wrapper.py +0 -0
  153. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/requirements.txt +0 -0
  154. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server/truss_server.py +0 -0
  155. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/server.Dockerfile.jinja +0 -0
  156. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/shared/__init__.py +0 -0
  157. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/shared/dynamic_config_resolver.py +0 -0
  158. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/shared/lazy_data_resolver.py +0 -0
  159. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/shared/log_config.py +0 -0
  160. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/shared/secrets_resolver.py +0 -0
  161. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/shared/serialization.py +0 -0
  162. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/shared/util.py +0 -0
  163. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/train/config.py +0 -0
  164. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/train/run.sh +0 -0
  165. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/model/model.py +0 -0
  166. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/sigint_patch.py +0 -0
  167. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +0 -0
  168. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/assets.py +0 -0
  169. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/batching.py +0 -0
  170. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +0 -0
  171. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +0 -0
  172. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +0 -0
  173. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/utils.py +0 -0
  174. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-briton/README.md +0 -0
  175. {truss-0.11.8rc11 → truss-0.11.9}/truss/templates/trtllm-briton/src/extension.py +0 -0
  176. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/__init__.py +0 -0
  177. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/cli/test_cli.py +0 -0
  178. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/cli/train/resources/test_deploy_from_checkpoint_config.yml +0 -0
  179. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/cli/train/test_cache_view.py +0 -0
  180. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/cli/train/test_train_cli_core.py +0 -0
  181. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/cli/train/test_train_init.py +0 -0
  182. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/conftest.py +0 -0
  183. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/contexts/image_builder/test_serving_image_builder.py +0 -0
  184. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/contexts/local_loader/test_load_local.py +0 -0
  185. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/contexts/local_loader/test_truss_module_finder.py +0 -0
  186. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/helpers.py +0 -0
  187. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/local/test_local_config_handler.py +0 -0
  188. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/patch/test_calc_patch.py +0 -0
  189. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/patch/test_dir_signature.py +0 -0
  190. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/patch/test_hash.py +0 -0
  191. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/patch/test_signature.py +0 -0
  192. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/patch/test_truss_dir_patch_applier.py +0 -0
  193. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/patch/test_types.py +0 -0
  194. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/baseten/conftest.py +0 -0
  195. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/baseten/test_api.py +0 -0
  196. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/baseten/test_auth.py +0 -0
  197. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/baseten/test_core.py +0 -0
  198. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/baseten/test_remote.py +0 -0
  199. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/baseten/test_service.py +0 -0
  200. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/test_remote_factory.py +0 -0
  201. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/remote/test_truss_remote.py +0 -0
  202. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/control/control/helpers/test_context_managers.py +0 -0
  203. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +0 -0
  204. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +0 -0
  205. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/core/server/test_dynamic_config_resolver.py +0 -0
  206. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +0 -0
  207. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/core/server/test_secrets_resolver.py +0 -0
  208. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/server/common/test_retry.py +0 -0
  209. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/server/test_model_wrapper.py +0 -0
  210. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/server/test_schema.py +0 -0
  211. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/templates/server/test_truss_server.py +0 -0
  212. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_build.py +0 -0
  213. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_config.py +0 -0
  214. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_context_builder_image.py +0 -0
  215. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_control_truss_patching.py +0 -0
  216. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_custom_server.py +0 -0
  217. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/__init__.py +0 -0
  218. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/__init__.py +0 -0
  219. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/config.yaml +0 -0
  220. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/model/__init__.py +0 -0
  221. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/model/model.py +0 -0
  222. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/auto-mpg.data +0 -0
  223. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/context_builder_image_test/Dockerfile +0 -0
  224. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/context_builder_image_test/__init__.py +0 -0
  225. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/context_builder_image_test/test.py +0 -0
  226. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/gcs_fix/__init__.py +0 -0
  227. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/gcs_fix/config.yaml +0 -0
  228. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/gcs_fix/model/__init__.py +0 -0
  229. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/gcs_fix/model/model.py +0 -0
  230. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/happy.ipynb +0 -0
  231. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/__init__.py +0 -0
  232. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/config.yaml +0 -0
  233. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
  234. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/model/model.py +0 -0
  235. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
  236. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/patch_ping_test_server/app.py +0 -0
  237. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/pima-indians-diabetes.csv +0 -0
  238. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/readme_int_example.md +0 -0
  239. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/readme_no_example.md +0 -0
  240. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/readme_str_example.md +0 -0
  241. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/server.Dockerfile +0 -0
  242. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
  243. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/config.yaml +0 -0
  244. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
  245. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/model/model.py +0 -0
  246. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_async_truss/__init__.py +0 -0
  247. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_async_truss/config.yaml +0 -0
  248. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
  249. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_async_truss/model/model.py +0 -0
  250. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/__init__.py +0 -0
  251. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/config.yaml +0 -0
  252. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
  253. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/model/model.py +0 -0
  254. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands/__init__.py +0 -0
  255. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands/config.yaml +0 -0
  256. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
  257. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands/model/model.py +0 -0
  258. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
  259. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/config.yaml +0 -0
  260. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
  261. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/model/model.py +0 -0
  262. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
  263. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/config.yaml +0 -0
  264. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
  265. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/model/model.py +0 -0
  266. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
  267. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/config.yaml +0 -0
  268. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +0 -0
  269. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +0 -0
  270. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +0 -0
  271. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
  272. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +0 -0
  273. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +0 -0
  274. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_env_vars/config.yaml +0 -0
  275. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/config.yaml +0 -0
  276. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/Dockerfile +0 -0
  277. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/README.md +0 -0
  278. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/VERSION +0 -0
  279. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/build_upload_new_image.sh +0 -0
  280. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/main.go +0 -0
  281. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_openai/__init__.py +0 -0
  282. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_openai/config.yaml +0 -0
  283. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_openai/model/__init__.py +0 -0
  284. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_openai/model/model.py +0 -0
  285. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
  286. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/config.yaml +0 -0
  287. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
  288. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/model/model.py +0 -0
  289. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/requirements.txt +0 -0
  290. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
  291. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/config.yaml +0 -0
  292. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
  293. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/model/model.py +0 -0
  294. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/requirements.txt +0 -0
  295. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
  296. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/config.yaml +0 -0
  297. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
  298. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/model/model.py +0 -0
  299. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/requirements.txt +0 -0
  300. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
  301. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +0 -0
  302. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
  303. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +0 -0
  304. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
  305. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/config.yaml +0 -0
  306. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
  307. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/model/model.py +0 -0
  308. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
  309. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/config.yaml +0 -0
  310. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
  311. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/model/model.py +0 -0
  312. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
  313. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/config.yaml +0 -0
  314. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
  315. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/model/model.py +0 -0
  316. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
  317. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +0 -0
  318. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +0 -0
  319. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
  320. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +0 -0
  321. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
  322. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +0 -0
  323. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
  324. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/config.yaml +0 -0
  325. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
  326. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/model/model.py +0 -0
  327. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/__init__.py +0 -0
  328. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/config.yaml +0 -0
  329. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/examples.yaml +0 -0
  330. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/model/__init__.py +0 -0
  331. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/model/dummy +0 -0
  332. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/model/model.py +0 -0
  333. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/packages/__init__.py +0 -0
  334. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
  335. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss/packages/test_package/test.py +0 -0
  336. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/__init__.py +0 -0
  337. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/config.yaml +0 -0
  338. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/model/__init__.py +0 -0
  339. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/model/model.py +0 -0
  340. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/__init__.py +0 -0
  341. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/config.yaml +0 -0
  342. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/model/__init__.py +0 -0
  343. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/model/model.py +0 -0
  344. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
  345. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/config.yaml +0 -0
  346. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
  347. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/model/model.py +0 -0
  348. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
  349. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +0 -0
  350. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +0 -0
  351. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_docker.py +0 -0
  352. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_model_inference.py +0 -0
  353. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_model_schema.py +0 -0
  354. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_testing_utilities_for_other_tests.py +0 -0
  355. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_truss_gatherer.py +0 -0
  356. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_truss_handle.py +0 -0
  357. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/test_util.py +0 -0
  358. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/trt_llm/test_trt_llm_config.py +0 -0
  359. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/trt_llm/test_validation.py +0 -0
  360. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/util/test_config_checks.py +0 -0
  361. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/util/test_env_vars.py +0 -0
  362. {truss-0.11.8rc11 → truss-0.11.9}/truss/tests/util/test_path.py +0 -0
  363. {truss-0.11.8rc11 → truss-0.11.9}/truss/trt_llm/config_checks.py +0 -0
  364. {truss-0.11.8rc11 → truss-0.11.9}/truss/trt_llm/validation.py +0 -0
  365. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/__init__.py +0 -0
  366. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/build.py +0 -0
  367. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/decorators.py +0 -0
  368. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/__init__.py +0 -0
  369. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/calc_patch.py +0 -0
  370. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/constants.py +0 -0
  371. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/custom_types.py +0 -0
  372. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/dir_signature.py +0 -0
  373. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/hash.py +0 -0
  374. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/local_truss_patch_applier.py +0 -0
  375. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/signature.py +0 -0
  376. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/patch/truss_dir_patch_applier.py +0 -0
  377. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/readme_generator.py +0 -0
  378. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/truss_gatherer.py +0 -0
  379. {truss-0.11.8rc11 → truss-0.11.9}/truss/truss_handle/truss_handle.py +0 -0
  380. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/.truss_ignore +0 -0
  381. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/docker.py +0 -0
  382. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/download.py +0 -0
  383. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/env_vars.py +0 -0
  384. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/gpu.py +0 -0
  385. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/jinja.py +0 -0
  386. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/log_utils.py +0 -0
  387. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/notebook.py +0 -0
  388. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/path.py +0 -0
  389. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/requirements.py +0 -0
  390. {truss-0.11.8rc11 → truss-0.11.9}/truss/util/user_config.py +0 -0
  391. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/examples/README.md +0 -0
  392. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/examples/audio-transcription/README.md +0 -0
  393. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/examples/rag/README.md +0 -0
  394. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/tests/itest_chain/requirements.txt +0 -0
  395. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/__init__.py +0 -0
  396. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/deployment/__init__.py +0 -0
  397. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/deployment/code_gen.py +0 -0
  398. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/deployment/deployment_client.py +0 -0
  399. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/framework.py +0 -0
  400. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/private_types.py +0 -0
  401. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/public_api.py +0 -0
  402. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/public_types.py +0 -0
  403. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/py.typed +0 -0
  404. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/pydantic_numpy.py +0 -0
  405. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/reference_code/reference_chainlet.py +0 -0
  406. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/reference_code/reference_model.py +0 -0
  407. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/__init__.py +0 -0
  408. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/model_skeleton.py +0 -0
  409. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/stub.py +0 -0
  410. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/utils.py +0 -0
  411. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/streaming.py +0 -0
  412. {truss-0.11.8rc11 → truss-0.11.9}/truss-chains/truss_chains/utils.py +0 -0
  413. {truss-0.11.8rc11 → truss-0.11.9}/truss-train/truss_train/__init__.py +0 -0
  414. {truss-0.11.8rc11 → truss-0.11.9}/truss-train/truss_train/deployment.py +0 -0
  415. {truss-0.11.8rc11 → truss-0.11.9}/truss-train/truss_train/loader.py +0 -0
  416. {truss-0.11.8rc11 → truss-0.11.9}/truss-train/truss_train/public_api.py +0 -0
  417. {truss-0.11.8rc11 → truss-0.11.9}/truss-train/truss_train/restore_from_checkpoint.py +0 -0
  418. {truss-0.11.8rc11 → truss-0.11.9}/truss-transfer/README.md +0 -0
  419. {truss-0.11.8rc11 → truss-0.11.9}/truss-transfer/tests/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truss
3
- Version: 0.11.8rc11
3
+ Version: 0.11.9
4
4
  Summary: A seamless bridge from model development to model delivery
5
5
  Project-URL: Repository, https://github.com/basetenlabs/truss
6
6
  Project-URL: Homepage, https://truss.baseten.co
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "truss"
3
- version = "0.11.8rc11"
3
+ version = "0.11.9"
4
4
  description = "A seamless bridge from model development to model delivery"
5
5
  authors = [
6
6
  { name = "Pankaj Gupta", email = "no-reply@baseten.co" },
@@ -17,7 +17,9 @@ class LogWatcher(ABC):
17
17
  # NB(nikhil): we add buffer for clock skew, so this helps us detect duplicates.
18
18
  # TODO(nikhil): clean up hashes so this doesn't grow indefinitely.
19
19
  _log_hashes: set[str] = set()
20
- _last_poll_time: Optional[int] = None
20
+
21
+ _last_poll_time_ms: Optional[int] = None
22
+ _last_log_time_ms: Optional[int] = None
21
23
 
22
24
  def __init__(self, api: BasetenApi):
23
25
  self.api = api
@@ -26,37 +28,54 @@ class LogWatcher(ABC):
26
28
  log_str = f"{log.timestamp}-{log.message}-{log.replica}"
27
29
  return hashlib.sha256(log_str.encode("utf-8")).hexdigest()
28
30
 
29
- def _poll(self) -> Iterator[ParsedLog]:
30
- start_epoch: Optional[int] = None
31
- now = int(time.time() * 1000)
32
- if self._last_poll_time is not None:
33
- start_epoch = self._last_poll_time - CLOCK_SKEW_BUFFER_MS
31
+ def get_start_epoch_ms(self, now_ms: int) -> Optional[int]:
32
+ if self._last_poll_time_ms:
33
+ return self._last_poll_time_ms - CLOCK_SKEW_BUFFER_MS
34
+
35
+ return None
34
36
 
37
+ def fetch_and_parse_logs(
38
+ self, start_epoch_millis: Optional[int], end_epoch_millis: Optional[int]
39
+ ) -> Iterator[ParsedLog]:
35
40
  api_logs = self.fetch_logs(
36
- start_epoch_millis=start_epoch, end_epoch_millis=now + CLOCK_SKEW_BUFFER_MS
41
+ start_epoch_millis=start_epoch_millis, end_epoch_millis=end_epoch_millis
37
42
  )
38
43
 
39
44
  parsed_logs = parse_logs(api_logs)
45
+
40
46
  for log in parsed_logs:
41
- h = self._hash_log(log)
42
- if h not in self._log_hashes:
47
+ if (h := self._hash_log(log)) not in self._log_hashes:
43
48
  self._log_hashes.add(h)
49
+
44
50
  yield log
45
51
 
46
- self._last_poll_time = now
52
+ def poll(self) -> Iterator[ParsedLog]:
53
+ now_ms = int(time.time() * 1000)
54
+ start_epoch_ms = self.get_start_epoch_ms(now_ms)
55
+
56
+ for log in self.fetch_and_parse_logs(
57
+ start_epoch_millis=start_epoch_ms,
58
+ end_epoch_millis=now_ms + CLOCK_SKEW_BUFFER_MS,
59
+ ):
60
+ yield log
61
+
62
+ epoch_ns = int(log.timestamp)
63
+ self._last_log_time_ms = int(epoch_ns / 1e6)
64
+
65
+ self._last_poll_time_ms = now_ms
47
66
 
48
67
  def watch(self) -> Iterator[ParsedLog]:
49
68
  self.before_polling()
50
69
  with console.status("Polling logs", spinner="aesthetic"):
51
70
  while True:
52
- for log in self._poll():
71
+ for log in self.poll():
53
72
  yield log
54
73
  if self._log_hashes:
55
74
  break
56
75
  time.sleep(POLL_INTERVAL_SEC)
57
76
 
58
77
  while self.should_poll_again():
59
- for log in self._poll():
78
+ for log in self.poll():
60
79
  yield log
61
80
  time.sleep(POLL_INTERVAL_SEC)
62
81
  self.post_poll()
@@ -1,9 +1,12 @@
1
+ from functools import cached_property
1
2
  from typing import Any, List, Optional
2
3
 
3
4
  from truss.cli.logs.base_watcher import LogWatcher
4
5
  from truss.remote.baseten.api import BasetenApi
5
6
  from truss.remote.baseten.utils.status import MODEL_RUNNING_STATES
6
7
 
8
+ MAX_LOOK_BACK_MS = 1000 * 60 * 60 # 1 hour.
9
+
7
10
 
8
11
  class ModelDeploymentLogWatcher(LogWatcher):
9
12
  _model_id: str
@@ -25,11 +28,31 @@ class ModelDeploymentLogWatcher(LogWatcher):
25
28
  self._model_id, self._deployment_id, start_epoch_millis, end_epoch_millis
26
29
  )
27
30
 
31
+ def get_start_epoch_ms(self, now_ms: int) -> Optional[int]:
32
+ # NOTE(Tyron): If there can be multiple replicas,
33
+ # we can't use a timestamp cursor to poll for logs.
34
+ if not self._is_development:
35
+ return super().get_start_epoch_ms(now_ms)
36
+
37
+ # Cursor logic.
38
+
39
+ if self._last_log_time_ms:
40
+ return max(self._last_log_time_ms, now_ms - MAX_LOOK_BACK_MS)
41
+
42
+ return None
43
+
28
44
  def should_poll_again(self) -> bool:
29
45
  return self._current_status in MODEL_RUNNING_STATES
30
46
 
47
+ def _get_deployment(self) -> Any:
48
+ return self.api.get_deployment(self._model_id, self._deployment_id)
49
+
31
50
  def _get_current_status(self) -> str:
32
- return self.api.get_deployment(self._model_id, self._deployment_id)["status"]
51
+ return self._get_deployment()["status"]
52
+
53
+ @cached_property
54
+ def _is_development(self) -> bool:
55
+ return self._get_deployment()["is_development"]
33
56
 
34
57
  def post_poll(self) -> None:
35
58
  self._current_status = self._get_current_status()
@@ -16,7 +16,7 @@ from rich.text import Text
16
16
 
17
17
  from truss.cli.train import common, deploy_checkpoints
18
18
  from truss.cli.train.metrics_watcher import MetricsWatcher
19
- from truss.cli.train.types import PrepareCheckpointArgs, PrepareCheckpointResult
19
+ from truss.cli.train.types import DeployCheckpointArgs, DeployCheckpointsConfigComplete
20
20
  from truss.cli.utils import common as cli_common
21
21
  from truss.cli.utils.output import console
22
22
  from truss.remote.baseten.custom_types import (
@@ -242,35 +242,35 @@ def view_training_job_metrics(
242
242
  metrics_display.watch()
243
243
 
244
244
 
245
- def prepare_checkpoint_deploy(
246
- remote_provider: BasetenRemote, args: PrepareCheckpointArgs
247
- ) -> PrepareCheckpointResult:
245
+ def create_model_version_from_inference_template(
246
+ remote_provider: BasetenRemote, args: DeployCheckpointArgs
247
+ ) -> DeployCheckpointsConfigComplete:
248
248
  if not args.deploy_config_path:
249
- return deploy_checkpoints.prepare_checkpoint_deploy(
249
+ return deploy_checkpoints.create_model_version_from_inference_template(
250
250
  remote_provider, DeployCheckpointsConfig(), args.project_id, args.job_id
251
251
  )
252
252
  #### User provided a checkpoint deploy config file
253
253
  with loader.import_deploy_checkpoints_config(
254
254
  Path(args.deploy_config_path)
255
255
  ) as checkpoint_deploy:
256
- return deploy_checkpoints.prepare_checkpoint_deploy(
256
+ return deploy_checkpoints.create_model_version_from_inference_template(
257
257
  remote_provider, checkpoint_deploy, args.project_id, args.job_id
258
258
  )
259
259
 
260
260
 
261
261
  def _get_checkpoint_names(
262
- prepare_checkpoint_result: PrepareCheckpointResult,
262
+ checkpoint_deploy_config: DeployCheckpointsConfigComplete,
263
263
  ) -> list[str]:
264
264
  return [
265
265
  checkpoint.paths[0].strip("/").split("/")[-1]
266
- for checkpoint in prepare_checkpoint_result.checkpoint_deploy_config.checkpoint_details.checkpoints
266
+ for checkpoint in checkpoint_deploy_config.checkpoint_details.checkpoints
267
267
  ]
268
268
 
269
269
 
270
270
  def print_deploy_checkpoints_success_message(
271
- prepare_checkpoint_result: PrepareCheckpointResult,
271
+ checkpoint_deploy_config: DeployCheckpointsConfigComplete,
272
272
  ):
273
- checkpoint_names = _get_checkpoint_names(prepare_checkpoint_result)
273
+ checkpoint_names = _get_checkpoint_names(checkpoint_deploy_config)
274
274
  console.print(
275
275
  Text("\nTo run the model"),
276
276
  Text("ensure your `model` parameter is set to one of"),
@@ -279,7 +279,9 @@ def print_deploy_checkpoints_success_message(
279
279
  style="magenta",
280
280
  ),
281
281
  Text("in your request. An example request body might look like this:"),
282
- Text(f"\n{{'model': {checkpoint_names[0]}, 'messages': [...]}}", style="green"),
282
+ Text(
283
+ f'\n{{"model": "{checkpoint_names[0]}", "messages": [...]}}', style="green"
284
+ ),
283
285
  )
284
286
 
285
287
 
@@ -0,0 +1,3 @@
1
+ from .deploy_checkpoints import create_model_version_from_inference_template
2
+
3
+ __all__ = ["create_model_version_from_inference_template"]
@@ -1,7 +1,5 @@
1
1
  import re
2
- import tempfile
3
2
  from collections import OrderedDict
4
- from pathlib import Path
5
3
  from typing import List, Optional, Union
6
4
 
7
5
  import rich_click as click
@@ -9,10 +7,7 @@ from InquirerPy import inquirer
9
7
 
10
8
  from truss.base import truss_config
11
9
  from truss.cli.train import common
12
- from truss.cli.train.types import (
13
- DeployCheckpointsConfigComplete,
14
- PrepareCheckpointResult,
15
- )
10
+ from truss.cli.train.types import DeployCheckpointsConfigComplete
16
11
  from truss.cli.utils.output import console
17
12
  from truss.remote.baseten.remote import BasetenRemote
18
13
  from truss_train.definitions import (
@@ -25,18 +20,9 @@ from truss_train.definitions import (
25
20
  SecretReference,
26
21
  )
27
22
 
28
- from .deploy_full_checkpoints import (
29
- hydrate_full_checkpoint,
30
- render_vllm_full_truss_config,
31
- )
32
- from .deploy_lora_checkpoints import (
33
- hydrate_lora_checkpoint,
34
- render_vllm_lora_truss_config,
35
- )
36
- from .deploy_whisper_checkpoints import (
37
- hydrate_whisper_checkpoint,
38
- render_vllm_whisper_truss_config,
39
- )
23
+ from .deploy_full_checkpoints import hydrate_full_checkpoint
24
+ from .deploy_lora_checkpoints import hydrate_lora_checkpoint
25
+ from .deploy_whisper_checkpoints import hydrate_whisper_checkpoint
40
26
 
41
27
  HF_TOKEN_ENVVAR_NAME = "HF_TOKEN"
42
28
  # If we change this, make sure to update the logic in backend codebase
@@ -44,28 +30,162 @@ CHECKPOINT_PATTERN = re.compile(r".*checkpoint-\d+(?:-\d+)?$")
44
30
  ALLOWED_DEPLOYMENT_NAMES = re.compile(r"^[0-9a-zA-Z_\-\.]*$")
45
31
 
46
32
 
47
- def prepare_checkpoint_deploy(
33
+ def create_model_version_from_inference_template(
48
34
  remote_provider: BasetenRemote,
49
35
  checkpoint_deploy_config: DeployCheckpointsConfig,
50
36
  project_id: Optional[str],
51
37
  job_id: Optional[str],
52
- ) -> PrepareCheckpointResult:
38
+ ) -> DeployCheckpointsConfigComplete:
53
39
  checkpoint_deploy_config = _hydrate_deploy_config(
54
40
  checkpoint_deploy_config, remote_provider, project_id, job_id
55
41
  )
56
- rendered_truss = _render_truss_config_for_checkpoint_deployment(
57
- checkpoint_deploy_config
42
+
43
+ request_data = _build_inference_template_request(
44
+ checkpoint_deploy_config, remote_provider
58
45
  )
59
- truss_directory = Path(tempfile.mkdtemp())
60
- truss_config_path = truss_directory / "config.yaml"
61
- rendered_truss.write_to_yaml_file(truss_config_path)
62
- console.print(rendered_truss, style="green")
63
- console.print(f"Writing truss config to {truss_config_path}", style="yellow")
64
- return PrepareCheckpointResult(
65
- truss_directory=truss_directory,
66
- checkpoint_deploy_config=checkpoint_deploy_config,
46
+
47
+ # Call the GraphQL mutation to create model version from inference template
48
+ try:
49
+ result = remote_provider.api.create_model_version_from_inference_template(
50
+ request_data
51
+ )
52
+
53
+ if result and result.get("model_version"):
54
+ console.print(
55
+ f"Successfully created model version: {result['model_version']['name']}",
56
+ style="green",
57
+ )
58
+ console.print(
59
+ f"Model version ID: {result['model_version']['id']}", style="yellow"
60
+ )
61
+ else:
62
+ console.print(
63
+ "Warning: Unexpected response format from server", style="yellow"
64
+ )
65
+ console.print(f"Response: {result}", style="yellow")
66
+
67
+ except Exception as e:
68
+ console.print(f"Error creating model version: {e}", style="red")
69
+ raise
70
+
71
+ return checkpoint_deploy_config
72
+
73
+
74
+ def _build_inference_template_request(
75
+ checkpoint_deploy_config: DeployCheckpointsConfigComplete,
76
+ remote_provider: BasetenRemote,
77
+ ) -> dict:
78
+ """
79
+ Build the GraphQL request data structure for createModelVersionFromInferenceTemplate mutation.
80
+ """
81
+
82
+ # Build weights sources
83
+ weights_sources = []
84
+ for checkpoint in checkpoint_deploy_config.checkpoint_details.checkpoints:
85
+ # Extract checkpoint name from the first path
86
+ checkpoint_name = (
87
+ checkpoint.paths[0].strip("/").split("/")[-1]
88
+ if checkpoint.paths
89
+ else "checkpoint"
90
+ )
91
+
92
+ weights_source = {
93
+ "weight_source_type": "B10_CHECKPOINTING",
94
+ "b10_training_checkpoint_weights_source": {
95
+ "checkpoint": {
96
+ "training_job_id": checkpoint.training_job_id,
97
+ "checkpoint_name": checkpoint_name,
98
+ }
99
+ },
100
+ }
101
+ weights_sources.append(weights_source)
102
+
103
+ # Build environment variables
104
+ environment_variables = []
105
+ for name, value in checkpoint_deploy_config.runtime.environment_variables.items():
106
+ if isinstance(value, SecretReference):
107
+ env_var = {"name": name, "value": value.name, "is_secret_reference": True}
108
+ else:
109
+ env_var = {"name": name, "value": str(value), "is_secret_reference": False}
110
+ environment_variables.append(env_var)
111
+
112
+ # Build inference stack
113
+ inference_stack = {
114
+ "stack_type": "VLLM",
115
+ "environment_variables": environment_variables,
116
+ }
117
+
118
+ # Get instance type ID from compute spec
119
+ instance_type_id = _get_instance_type_id(
120
+ checkpoint_deploy_config.compute, remote_provider
67
121
  )
68
122
 
123
+ # Build the complete request
124
+ request_data = {
125
+ "metadata": {"oracle_name": checkpoint_deploy_config.model_name},
126
+ "weights_sources": weights_sources,
127
+ "inference_stack": inference_stack,
128
+ "instance_type_id": instance_type_id,
129
+ }
130
+
131
+ return request_data
132
+
133
+
134
+ def _get_instance_type_id(compute: Compute, remote_provider: BasetenRemote) -> str:
135
+ """
136
+ Get the instance type ID based on the compute specification.
137
+ Fetches available instance types from the API and maps compute specs to instance type IDs.
138
+ Only considers single-node instances (node_count == 1).
139
+ """
140
+ # step 1: fetch the instance types from the API
141
+ instance_types = remote_provider.api.get_instance_types()
142
+ # step 2: sort them into two different dictionaries, excluding multi-node instances:
143
+ cpu_instance_types = {
144
+ it.id: it for it in instance_types if it.gpu_count == 0 and it.node_count == 1
145
+ }
146
+ gpu_instance_types = {
147
+ it.id: it for it in instance_types if it.gpu_count > 0 and it.node_count == 1
148
+ }
149
+ # step 3: if compute is cpu, find the smallest such cpu that matches the compute request
150
+ if not compute.accelerator or compute.accelerator.accelerator is None:
151
+ compute_as_truss_config = compute.to_truss_config()
152
+ smallest_cpu_instance_type = None
153
+ for it in cpu_instance_types.values():
154
+ if (
155
+ it.millicpu_limit / 1000 >= compute.cpu_count
156
+ and it.memory_limit >= compute_as_truss_config.memory_in_bytes
157
+ ):
158
+ if (
159
+ smallest_cpu_instance_type is None
160
+ or it.millicpu_limit < smallest_cpu_instance_type.millicpu_limit
161
+ ):
162
+ smallest_cpu_instance_type = it
163
+ if not smallest_cpu_instance_type:
164
+ raise ValueError(
165
+ f"Unable to find single-node instance type for {compute.cpu_count} CPU and {compute.memory} memory. Reach out to Baseten for support if this persists."
166
+ )
167
+ return smallest_cpu_instance_type.id
168
+ # step 4: if compute is gpu, find the smallest such gpu by instance type
169
+ else:
170
+ assert compute.accelerator.accelerator is not None
171
+ compute_as_truss_config = compute.to_truss_config()
172
+ smallest_gpu_instance_type = None
173
+ for it in gpu_instance_types.values():
174
+ if (
175
+ it.gpu_type == compute.accelerator.accelerator.value
176
+ and it.gpu_count >= compute.accelerator.count
177
+ ):
178
+ if (
179
+ smallest_gpu_instance_type is None
180
+ or it.gpu_count < smallest_gpu_instance_type.gpu_count
181
+ ):
182
+ smallest_gpu_instance_type = it
183
+ if not smallest_gpu_instance_type:
184
+ raise ValueError(
185
+ f"Unable to find single-node instance type for {compute.accelerator}:{compute.accelerator.count}. Reach out to Baseten for support if this persists."
186
+ )
187
+ return smallest_gpu_instance_type.id
188
+
69
189
 
70
190
  def _validate_base_model_id(
71
191
  base_model_id: Optional[str], model_weight_format: ModelWeightsFormat
@@ -93,18 +213,12 @@ def _get_model_name(
93
213
  else ""
94
214
  )
95
215
 
96
- model_name = inquirer.text(
216
+ return inquirer.text(
97
217
  message=f"Enter the model name for your {model_weight_format.value} model.",
98
218
  validate=lambda s: s and s.strip(),
99
219
  default=default,
100
220
  ).execute()
101
221
 
102
- if model_weight_format == ModelWeightsFormat.FULL:
103
- model_name += "-vLLM-Full"
104
- elif model_weight_format == ModelWeightsFormat.LORA:
105
- model_name += "-vLLM-LORA"
106
- return model_name
107
-
108
222
 
109
223
  def _hydrate_deploy_config(
110
224
  deploy_config: DeployCheckpointsConfig,
@@ -123,53 +237,18 @@ def _hydrate_deploy_config(
123
237
  else:
124
238
  model_name = _get_model_name(model_weight_format, base_model_id)
125
239
 
126
- compute = _ensure_compute_spec(deploy_config.compute)
240
+ compute = _ensure_compute_spec(deploy_config.compute, remote_provider)
127
241
 
128
242
  runtime = _ensure_runtime_config(deploy_config.runtime)
129
- deployment_name = _ensure_deployment_name(
130
- deploy_config.deployment_name, checkpoint_details.checkpoints
131
- )
132
243
 
133
244
  return DeployCheckpointsConfigComplete(
134
245
  checkpoint_details=checkpoint_details,
135
246
  model_name=model_name,
136
- deployment_name=deployment_name,
137
247
  runtime=runtime,
138
248
  compute=compute,
139
- model_weight_format=model_weight_format.to_truss_config(), # type: ignore[attr-defined]
140
249
  )
141
250
 
142
251
 
143
- def _ensure_deployment_name(
144
- deploy_config_deployment_name: Optional[str], checkpoints: List[Checkpoint]
145
- ) -> str:
146
- if deploy_config_deployment_name:
147
- return deploy_config_deployment_name
148
-
149
- default_deployment_name = "checkpoint"
150
-
151
- if checkpoints and checkpoints[0].paths:
152
- first_checkpoint_name = checkpoints[0].paths[0].strip("/").split("/")[-1]
153
-
154
- if ALLOWED_DEPLOYMENT_NAMES.match(first_checkpoint_name):
155
- # Allow autoincrementing if the checkpoint matches both regexes
156
- if (
157
- CHECKPOINT_PATTERN.match(first_checkpoint_name)
158
- and len(checkpoints) == 1
159
- ):
160
- return first_checkpoint_name
161
-
162
- # If no valid autoincrementing checkpoint name is found, prompt the user
163
- deployment_name = inquirer.text(
164
- message="Enter the deployment name.", default=default_deployment_name
165
- ).execute()
166
-
167
- if not deployment_name:
168
- raise click.UsageError("Deployment name is required.")
169
-
170
- return deployment_name
171
-
172
-
173
252
  def hydrate_checkpoint(
174
253
  job_id: str, checkpoint_id: str, checkpoint: dict, checkpoint_type: str
175
254
  ) -> Checkpoint:
@@ -190,26 +269,6 @@ def hydrate_checkpoint(
190
269
  )
191
270
 
192
271
 
193
- def _render_truss_config_for_checkpoint_deployment(
194
- checkpoint_deploy: DeployCheckpointsConfigComplete,
195
- ) -> truss_config.TrussConfig:
196
- """
197
- Render truss config for checkpoint deployment.
198
- Currently supports LoRA checkpoints via vLLM, but can be extended for other formats.
199
- """
200
- # Delegate to specific rendering function based on model weight format
201
- if checkpoint_deploy.model_weight_format == ModelWeightsFormat.LORA:
202
- return render_vllm_lora_truss_config(checkpoint_deploy)
203
- elif checkpoint_deploy.model_weight_format == ModelWeightsFormat.FULL:
204
- return render_vllm_full_truss_config(checkpoint_deploy)
205
- elif checkpoint_deploy.model_weight_format == ModelWeightsFormat.WHISPER:
206
- return render_vllm_whisper_truss_config(checkpoint_deploy)
207
- else:
208
- raise ValueError(
209
- f"Unsupported model weight format: {checkpoint_deploy.model_weight_format}. Please upgrade to the latest Truss version to access the latest supported formats. Contact Baseten if you would like us to support additional formats."
210
- )
211
-
212
-
213
272
  def _ensure_checkpoint_details(
214
273
  remote_provider: BasetenRemote,
215
274
  checkpoint_details: Optional[CheckpointList],
@@ -309,31 +368,77 @@ def _select_multiple_checkpoints(checkpoint_id_options: List[str]) -> List[str]:
309
368
  return checkpoint_ids
310
369
 
311
370
 
312
- def _ensure_compute_spec(compute: Optional[Compute]) -> Compute:
371
+ def _ensure_compute_spec(
372
+ compute: Optional[Compute], remote_provider: BasetenRemote
373
+ ) -> Compute:
313
374
  if not compute:
314
375
  compute = Compute(cpu_count=0, memory="0Mi")
315
- compute.accelerator = _get_accelerator_if_specified(compute.accelerator)
376
+ compute = _get_accelerator_if_specified(compute, remote_provider)
316
377
  return compute
317
378
 
318
379
 
319
380
  def _get_accelerator_if_specified(
320
- user_input: Optional[truss_config.AcceleratorSpec],
321
- ) -> Optional[truss_config.AcceleratorSpec]:
322
- if user_input:
381
+ user_input: Optional[Compute], remote_provider: BasetenRemote
382
+ ) -> Compute:
383
+ if user_input and user_input.accelerator:
323
384
  return user_input
385
+
386
+ # Fetch available instance types to get valid GPU options
387
+ instance_types = remote_provider.api.get_instance_types()
388
+
389
+ # Extract unique accelerator types from instance types
390
+ accelerator_options = set()
391
+ for it in instance_types:
392
+ if it.gpu_type and it.gpu_count > 0:
393
+ accelerator_options.add(it.gpu_type)
394
+
395
+ # Convert to sorted list and add CPU option
396
+ choices = sorted(list(accelerator_options)) + [None]
397
+
398
+ if not choices or choices == [None]:
399
+ console.print("No GPU instance types available, using CPU", style="yellow")
400
+ return Compute(cpu_count=0, memory="0Mi", accelerator=None)
401
+
324
402
  # prompt user for accelerator
325
403
  gpu_type = inquirer.select(
326
404
  message="Select the GPU type to use for deployment. Select None for CPU.",
327
- choices=[x.value for x in truss_config.Accelerator] + [None],
405
+ choices=choices,
328
406
  ).execute()
407
+
329
408
  if gpu_type is None:
330
- return None
331
- count = inquirer.text(
332
- message="Enter the number of accelerators to use for deployment.",
333
- default="1",
334
- validate=lambda x: x.isdigit() and int(x) > 0 and int(x) <= 8,
335
- ).execute()
336
- return truss_config.AcceleratorSpec(accelerator=gpu_type, count=int(count))
409
+ return Compute(cpu_count=0, memory="0Mi", accelerator=None)
410
+
411
+ # Get available counts for the selected GPU type
412
+ available_counts = set()
413
+ for it in instance_types:
414
+ if it.gpu_type == gpu_type and it.gpu_count > 0:
415
+ available_counts.add(it.gpu_count)
416
+ if not available_counts:
417
+ raise ValueError(
418
+ f"No available counts for {gpu_type}. Reach out to Baseten for support if this persists."
419
+ )
420
+
421
+ if available_counts:
422
+ count_choices = sorted(list(available_counts))
423
+ count = inquirer.select(
424
+ message=f"Select the number of {gpu_type} GPUs to use for deployment.",
425
+ choices=count_choices,
426
+ default=str(count_choices[0]),
427
+ ).execute()
428
+ else:
429
+ count = inquirer.text(
430
+ message=f"Enter the number of {gpu_type} accelerators to use for deployment.",
431
+ default="1",
432
+ validate=lambda x: x.isdigit() and int(x) > 0 and int(x) <= 8,
433
+ ).execute()
434
+
435
+ return Compute(
436
+ cpu_count=0,
437
+ memory="0Mi",
438
+ accelerator=truss_config.AcceleratorSpec(
439
+ accelerator=gpu_type.replace("-", "_"), count=int(count)
440
+ ),
441
+ )
337
442
 
338
443
 
339
444
  def _get_base_model_id(user_input: Optional[str], checkpoint: dict) -> Optional[str]:
@@ -0,0 +1 @@
1
+ # This file is kept for potential future use but currently contains no active code
@@ -0,0 +1,35 @@
1
+ from pathlib import Path
2
+
3
+ from truss_train.definitions import FullCheckpoint
4
+
5
+
6
+ def hydrate_full_checkpoint(
7
+ job_id: str, checkpoint_id: str, checkpoint: dict
8
+ ) -> FullCheckpoint:
9
+ """Create a Checkpoint object for full model weights."""
10
+ # NOTE: Slash at the end is important since it means the checkpoint is a directory
11
+ paths = [f"rank-0/{checkpoint_id}/"]
12
+ return FullCheckpoint(training_job_id=job_id, paths=paths)
13
+
14
+
15
+ def build_full_checkpoint_string(truss_deploy_config) -> str:
16
+ """Build checkpoint string from artifact references for full checkpoints.
17
+
18
+ Args:
19
+ truss_deploy_config: The truss deploy configuration containing training checkpoints.
20
+
21
+ Returns:
22
+ A space-separated string of checkpoint paths.
23
+ """
24
+ checkpoint_parts = []
25
+ for (
26
+ truss_checkpoint
27
+ ) in truss_deploy_config.training_checkpoints.artifact_references: # type: ignore
28
+ ckpt_path = Path(
29
+ truss_deploy_config.training_checkpoints.download_folder, # type: ignore
30
+ truss_checkpoint.training_job_id,
31
+ truss_checkpoint.paths[0],
32
+ )
33
+ checkpoint_parts.append(str(ckpt_path))
34
+
35
+ return " ".join(checkpoint_parts)