truss 0.10.9rc514__tar.gz → 0.10.9rc601__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 (406) hide show
  1. {truss-0.10.9rc514 → truss-0.10.9rc601}/PKG-INFO +1 -1
  2. {truss-0.10.9rc514 → truss-0.10.9rc601}/pyproject.toml +1 -1
  3. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/base/constants.py +1 -0
  4. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/logs/base_watcher.py +1 -1
  5. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +12 -5
  6. truss-0.10.9rc601/truss/cli/train/metrics_watcher.py +331 -0
  7. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/image_builder/cache_warmer.py +3 -1
  8. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/image_builder/serving_image_builder.py +1 -3
  9. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/base.Dockerfile.jinja +1 -24
  10. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/model_wrapper.py +12 -0
  11. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/truss_server.py +13 -0
  12. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server.Dockerfile.jinja +0 -10
  13. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/cli/train/test_deploy_checkpoints.py +10 -2
  14. truss-0.10.9rc601/truss/tests/cli/train/test_train_cli_core.py +191 -0
  15. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_openai/model/model.py +3 -0
  16. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/truss_handle.py +1 -0
  17. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-transfer/README.md +2 -2
  18. truss-0.10.9rc514/truss/cli/train/metrics_watcher.py +0 -220
  19. truss-0.10.9rc514/truss/tests/cli/train/test_train_cli_core.py +0 -95
  20. {truss-0.10.9rc514 → truss-0.10.9rc601}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {truss-0.10.9rc514 → truss-0.10.9rc601}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  22. {truss-0.10.9rc514 → truss-0.10.9rc601}/.github/pull_request_template.md +0 -0
  23. {truss-0.10.9rc514 → truss-0.10.9rc601}/.gitignore +0 -0
  24. {truss-0.10.9rc514 → truss-0.10.9rc601}/CODE_OF_CONDUCT.md +0 -0
  25. {truss-0.10.9rc514 → truss-0.10.9rc601}/CONTRIBUTING.md +0 -0
  26. {truss-0.10.9rc514 → truss-0.10.9rc601}/LICENSE +0 -0
  27. {truss-0.10.9rc514 → truss-0.10.9rc601}/README.md +0 -0
  28. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/README.md +0 -0
  29. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/README.md +0 -0
  30. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/android-arm-eabi/README.md +0 -0
  31. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/android-arm64/README.md +0 -0
  32. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/darwin-arm64/README.md +0 -0
  33. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/darwin-universal/README.md +0 -0
  34. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/darwin-x64/README.md +0 -0
  35. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/freebsd-x64/README.md +0 -0
  36. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/linux-arm-gnueabihf/README.md +0 -0
  37. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/linux-arm-musleabihf/README.md +0 -0
  38. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/linux-arm64-gnu/README.md +0 -0
  39. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/linux-arm64-musl/README.md +0 -0
  40. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/linux-riscv64-gnu/README.md +0 -0
  41. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/linux-x64-gnu/README.md +0 -0
  42. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/linux-x64-musl/README.md +0 -0
  43. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/win32-arm64-msvc/README.md +0 -0
  44. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/win32-ia32-msvc/README.md +0 -0
  45. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/node_bindings/npm/win32-x64-msvc/README.md +0 -0
  46. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/python_bindings/README.md +0 -0
  47. {truss-0.10.9rc514 → truss-0.10.9rc601}/baseten-performance-client/scripts/README_nodejs.md +0 -0
  48. {truss-0.10.9rc514 → truss-0.10.9rc601}/context_builder.Dockerfile +0 -0
  49. {truss-0.10.9rc514 → truss-0.10.9rc601}/docs/README.md +0 -0
  50. {truss-0.10.9rc514 → truss-0.10.9rc601}/docs/chains/doc_gen/README.md +0 -0
  51. {truss-0.10.9rc514 → truss-0.10.9rc601}/docs/contribute/base-images.md +0 -0
  52. {truss-0.10.9rc514 → truss-0.10.9rc601}/docs/contribute/release.md +0 -0
  53. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/__init__.py +0 -0
  54. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/api/__init__.py +0 -0
  55. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/api/definitions.py +0 -0
  56. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/base/__init__.py +0 -0
  57. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/base/custom_types.py +0 -0
  58. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/base/errors.py +0 -0
  59. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/base/trt_llm_config.py +0 -0
  60. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/base/truss_config.py +0 -0
  61. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/base/truss_spec.py +0 -0
  62. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/chains_commands.py +0 -0
  63. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/cli.py +0 -0
  64. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/logs/model_log_watcher.py +0 -0
  65. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/logs/training_log_watcher.py +0 -0
  66. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/logs/utils.py +0 -0
  67. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/remote_cli.py +0 -0
  68. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/common.py +0 -0
  69. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/core.py +0 -0
  70. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/deploy_checkpoints/__init__.py +0 -0
  71. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/deploy_checkpoints/deploy_checkpoints.py +0 -0
  72. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +0 -0
  73. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +0 -0
  74. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/deploy_from_checkpoint_config.yml +0 -0
  75. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/poller.py +0 -0
  76. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train/types.py +0 -0
  77. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/train_commands.py +0 -0
  78. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/utils/common.py +0 -0
  79. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/utils/output.py +0 -0
  80. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/cli/utils/self_upgrade.py +0 -0
  81. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/docker_build_setup.py +0 -0
  82. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/image_builder/image_builder.py +0 -0
  83. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/image_builder/util.py +0 -0
  84. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/local_loader/docker_build_emulator.py +0 -0
  85. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/local_loader/dockerfile_parser.py +0 -0
  86. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/local_loader/load_model_local.py +0 -0
  87. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/local_loader/truss_module_loader.py +0 -0
  88. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/local_loader/utils.py +0 -0
  89. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/contexts/truss_context.py +0 -0
  90. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/local/local_config.py +0 -0
  91. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/local/local_config_handler.py +0 -0
  92. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/patch/__init__.py +0 -0
  93. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/patch/hash.py +0 -0
  94. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/patch/signature.py +0 -0
  95. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/patch/truss_dir_patch_applier.py +0 -0
  96. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/__init__.py +0 -0
  97. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/api.py +0 -0
  98. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/auth.py +0 -0
  99. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/core.py +0 -0
  100. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/custom_types.py +0 -0
  101. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/error.py +0 -0
  102. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/remote.py +0 -0
  103. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/rest_client.py +0 -0
  104. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/service.py +0 -0
  105. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/utils/status.py +0 -0
  106. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/utils/tar.py +0 -0
  107. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/baseten/utils/transfer.py +0 -0
  108. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/remote_factory.py +0 -0
  109. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/remote/truss_remote.py +0 -0
  110. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/README.md.jinja +0 -0
  111. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/__init__.py +0 -0
  112. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/cache.Dockerfile.jinja +0 -0
  113. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/cache_requirements.txt +0 -0
  114. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/application.py +0 -0
  115. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/endpoints.py +0 -0
  116. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/context_managers.py +0 -0
  117. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/custom_types.py +0 -0
  118. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/errors.py +0 -0
  119. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/inference_server_controller.py +0 -0
  120. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/inference_server_process_controller.py +0 -0
  121. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/inference_server_starter.py +0 -0
  122. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/truss_patch/__init__.py +0 -0
  123. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/truss_patch/model_code_patch_applier.py +0 -0
  124. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/truss_patch/model_container_patch_applier.py +0 -0
  125. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +0 -0
  126. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/helpers/truss_patch/system_packages.py +0 -0
  127. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/control/server.py +0 -0
  128. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/control/requirements.txt +0 -0
  129. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/copy_cache_files.Dockerfile.jinja +0 -0
  130. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/custom/examples.yaml +0 -0
  131. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/custom/model/__init__.py +0 -0
  132. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/custom/model/model.py +0 -0
  133. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/custom_python_dx/my_model.py +0 -0
  134. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/docker_server/proxy.conf.jinja +0 -0
  135. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/docker_server/supervisord.conf.jinja +0 -0
  136. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/docker_server_requirements.txt +0 -0
  137. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/__init__.py +0 -0
  138. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/common/__init__.py +0 -0
  139. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/common/errors.py +0 -0
  140. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/common/patches/whisper/patch.py +0 -0
  141. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/common/patches.py +0 -0
  142. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/common/retry.py +0 -0
  143. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/common/schema.py +0 -0
  144. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/common/tracing.py +0 -0
  145. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/main.py +0 -0
  146. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/server/requirements.txt +0 -0
  147. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/shared/__init__.py +0 -0
  148. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/shared/dynamic_config_resolver.py +0 -0
  149. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/shared/lazy_data_resolver.py +0 -0
  150. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/shared/log_config.py +0 -0
  151. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/shared/secrets_resolver.py +0 -0
  152. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/shared/serialization.py +0 -0
  153. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/shared/util.py +0 -0
  154. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/model/model.py +0 -0
  155. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/sigint_patch.py +0 -0
  156. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +0 -0
  157. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/whisper_trt/assets.py +0 -0
  158. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/whisper_trt/batching.py +0 -0
  159. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +0 -0
  160. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +0 -0
  161. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +0 -0
  162. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-audio/packages/whisper_trt/utils.py +0 -0
  163. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-briton/README.md +0 -0
  164. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/templates/trtllm-briton/src/extension.py +0 -0
  165. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/__init__.py +0 -0
  166. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/cli/test_cli.py +0 -0
  167. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/cli/train/resources/test_deploy_from_checkpoint_config.yml +0 -0
  168. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/conftest.py +0 -0
  169. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/contexts/image_builder/test_serving_image_builder.py +1 -1
  170. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/contexts/local_loader/test_load_local.py +0 -0
  171. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/contexts/local_loader/test_truss_module_finder.py +0 -0
  172. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/helpers.py +0 -0
  173. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/local/test_local_config_handler.py +0 -0
  174. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/patch/test_calc_patch.py +0 -0
  175. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/patch/test_dir_signature.py +0 -0
  176. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/patch/test_hash.py +0 -0
  177. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/patch/test_signature.py +0 -0
  178. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/patch/test_truss_dir_patch_applier.py +0 -0
  179. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/patch/test_types.py +0 -0
  180. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/remote/baseten/test_api.py +0 -0
  181. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/remote/baseten/test_auth.py +0 -0
  182. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/remote/baseten/test_core.py +0 -0
  183. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/remote/baseten/test_remote.py +0 -0
  184. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/remote/baseten/test_service.py +0 -0
  185. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/remote/test_remote_factory.py +0 -0
  186. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/remote/test_truss_remote.py +0 -0
  187. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/control/control/helpers/test_context_managers.py +0 -0
  188. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +0 -0
  189. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +0 -0
  190. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/control/control/test_endpoints.py +0 -0
  191. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/control/control/test_server.py +0 -0
  192. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/control/control/test_server_integration.py +0 -0
  193. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/core/server/test_dynamic_config_resolver.py +0 -0
  194. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +0 -0
  195. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/core/server/test_secrets_resolver.py +0 -0
  196. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/server/common/test_retry.py +0 -0
  197. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/server/test_model_wrapper.py +0 -0
  198. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/server/test_schema.py +0 -0
  199. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/templates/server/test_truss_server.py +0 -0
  200. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_build.py +0 -0
  201. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_config.py +0 -0
  202. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_context_builder_image.py +0 -0
  203. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_control_truss_patching.py +0 -0
  204. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_custom_server.py +0 -0
  205. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/__init__.py +0 -0
  206. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/annotated_types_truss/__init__.py +0 -0
  207. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/annotated_types_truss/config.yaml +0 -0
  208. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/annotated_types_truss/model/__init__.py +0 -0
  209. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/annotated_types_truss/model/model.py +0 -0
  210. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/auto-mpg.data +0 -0
  211. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/context_builder_image_test/Dockerfile +0 -0
  212. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/context_builder_image_test/__init__.py +0 -0
  213. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/context_builder_image_test/test.py +0 -0
  214. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/gcs_fix/__init__.py +0 -0
  215. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/gcs_fix/config.yaml +0 -0
  216. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/gcs_fix/model/__init__.py +0 -0
  217. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/gcs_fix/model/model.py +0 -0
  218. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/happy.ipynb +0 -0
  219. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/model_load_failure_test/__init__.py +0 -0
  220. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/model_load_failure_test/config.yaml +0 -0
  221. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
  222. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/model_load_failure_test/model/model.py +0 -0
  223. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
  224. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/patch_ping_test_server/app.py +0 -0
  225. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/pima-indians-diabetes.csv +0 -0
  226. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/readme_int_example.md +0 -0
  227. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/readme_no_example.md +0 -0
  228. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/readme_str_example.md +0 -0
  229. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/server.Dockerfile +0 -0
  230. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
  231. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/server_conformance_test_truss/config.yaml +0 -0
  232. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
  233. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/server_conformance_test_truss/model/model.py +0 -0
  234. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_async_truss/__init__.py +0 -0
  235. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_async_truss/config.yaml +0 -0
  236. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
  237. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_async_truss/model/model.py +0 -0
  238. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_basic_truss/__init__.py +0 -0
  239. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_basic_truss/config.yaml +0 -0
  240. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
  241. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_basic_truss/model/model.py +0 -0
  242. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands/__init__.py +0 -0
  243. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands/config.yaml +0 -0
  244. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
  245. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands/model/model.py +0 -0
  246. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
  247. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands_failure/config.yaml +0 -0
  248. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
  249. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_build_commands_failure/model/model.py +0 -0
  250. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
  251. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_concurrency_truss/config.yaml +0 -0
  252. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
  253. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_concurrency_truss/model/model.py +0 -0
  254. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
  255. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/config.yaml +0 -0
  256. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +0 -0
  257. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +0 -0
  258. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +0 -0
  259. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
  260. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +0 -0
  261. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +0 -0
  262. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_env_vars/config.yaml +0 -0
  263. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_go_custom_server_truss/config.yaml +0 -0
  264. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_go_custom_server_truss/docker/Dockerfile +0 -0
  265. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_go_custom_server_truss/docker/README.md +0 -0
  266. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_go_custom_server_truss/docker/VERSION +0 -0
  267. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_go_custom_server_truss/docker/build_upload_new_image.sh +0 -0
  268. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_go_custom_server_truss/docker/main.go +0 -0
  269. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_openai/__init__.py +0 -0
  270. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_openai/config.yaml +0 -0
  271. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_openai/model/__init__.py +0 -0
  272. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
  273. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v1/config.yaml +0 -0
  274. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
  275. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v1/model/model.py +0 -0
  276. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v1/requirements.txt +0 -0
  277. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
  278. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v2/config.yaml +0 -0
  279. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
  280. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v2/model/model.py +0 -0
  281. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_pyantic_v2/requirements.txt +0 -0
  282. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
  283. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_requirements_file_truss/config.yaml +0 -0
  284. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
  285. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_requirements_file_truss/model/model.py +0 -0
  286. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_requirements_file_truss/requirements.txt +0 -0
  287. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
  288. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +0 -0
  289. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
  290. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +0 -0
  291. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
  292. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_read_timeout/config.yaml +0 -0
  293. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
  294. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_read_timeout/model/model.py +0 -0
  295. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
  296. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss/config.yaml +0 -0
  297. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
  298. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss/model/model.py +0 -0
  299. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
  300. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_error/config.yaml +0 -0
  301. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
  302. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_error/model/model.py +0 -0
  303. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
  304. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +0 -0
  305. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +0 -0
  306. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
  307. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +0 -0
  308. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
  309. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +0 -0
  310. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
  311. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_trt_llm_truss/config.yaml +0 -0
  312. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
  313. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_trt_llm_truss/model/model.py +0 -0
  314. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/__init__.py +0 -0
  315. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/config.yaml +0 -0
  316. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/examples.yaml +0 -0
  317. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/model/__init__.py +0 -0
  318. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/model/dummy +0 -0
  319. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/model/model.py +0 -0
  320. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/packages/__init__.py +0 -0
  321. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
  322. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss/packages/test_package/test.py +0 -0
  323. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v1/__init__.py +0 -0
  324. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v1/config.yaml +0 -0
  325. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v1/model/__init__.py +0 -0
  326. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v1/model/model.py +0 -0
  327. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v2/__init__.py +0 -0
  328. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v2/config.yaml +0 -0
  329. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v2/model/__init__.py +0 -0
  330. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_server_model_cache_v2/model/model.py +0 -0
  331. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
  332. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_with_error/config.yaml +0 -0
  333. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
  334. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_with_error/model/model.py +0 -0
  335. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
  336. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +0 -0
  337. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +0 -0
  338. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_docker.py +0 -0
  339. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_model_inference.py +0 -0
  340. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_model_schema.py +0 -0
  341. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_testing_utilities_for_other_tests.py +0 -0
  342. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_truss_gatherer.py +0 -0
  343. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_truss_handle.py +0 -0
  344. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/test_util.py +0 -0
  345. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/trt_llm/test_trt_llm_config.py +0 -0
  346. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/trt_llm/test_validation.py +0 -0
  347. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/util/test_basetenpointer.py +0 -0
  348. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/util/test_config_checks.py +0 -0
  349. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/util/test_env_vars.py +0 -0
  350. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/tests/util/test_path.py +0 -0
  351. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/trt_llm/config_checks.py +0 -0
  352. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/trt_llm/validation.py +0 -0
  353. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/__init__.py +0 -0
  354. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/build.py +0 -0
  355. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/decorators.py +0 -0
  356. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/__init__.py +0 -0
  357. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/calc_patch.py +0 -0
  358. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/constants.py +0 -0
  359. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/custom_types.py +0 -0
  360. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/dir_signature.py +0 -0
  361. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/hash.py +0 -0
  362. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/local_truss_patch_applier.py +0 -0
  363. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/signature.py +0 -0
  364. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/patch/truss_dir_patch_applier.py +0 -0
  365. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/readme_generator.py +0 -0
  366. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/truss_handle/truss_gatherer.py +0 -0
  367. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/.truss_ignore +0 -0
  368. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/basetenpointer.py +0 -0
  369. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/docker.py +0 -0
  370. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/download.py +0 -0
  371. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/env_vars.py +0 -0
  372. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/gpu.py +0 -0
  373. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/jinja.py +0 -0
  374. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/log_utils.py +0 -0
  375. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/notebook.py +0 -0
  376. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/path.py +0 -0
  377. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/requirements.py +0 -0
  378. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss/util/user_config.py +0 -0
  379. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/examples/README.md +0 -0
  380. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/examples/audio-transcription/README.md +0 -0
  381. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/examples/rag/README.md +0 -0
  382. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/tests/itest_chain/requirements.txt +0 -0
  383. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/__init__.py +0 -0
  384. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/deployment/__init__.py +0 -0
  385. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/deployment/code_gen.py +0 -0
  386. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/deployment/deployment_client.py +0 -0
  387. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/framework.py +0 -0
  388. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/private_types.py +0 -0
  389. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/public_api.py +0 -0
  390. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/public_types.py +0 -0
  391. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/py.typed +0 -0
  392. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/pydantic_numpy.py +0 -0
  393. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/reference_code/reference_chainlet.py +0 -0
  394. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/reference_code/reference_model.py +0 -0
  395. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/remote_chainlet/__init__.py +0 -0
  396. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/remote_chainlet/model_skeleton.py +0 -0
  397. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/remote_chainlet/stub.py +0 -0
  398. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/remote_chainlet/utils.py +0 -0
  399. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/streaming.py +0 -0
  400. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-chains/truss_chains/utils.py +0 -0
  401. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-train/truss_train/__init__.py +0 -0
  402. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-train/truss_train/definitions.py +0 -0
  403. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-train/truss_train/deployment.py +0 -0
  404. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-train/truss_train/loader.py +0 -0
  405. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-train/truss_train/public_api.py +0 -0
  406. {truss-0.10.9rc514 → truss-0.10.9rc601}/truss-transfer/tests/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truss
3
- Version: 0.10.9rc514
3
+ Version: 0.10.9rc601
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.10.9rc514"
3
+ version = "0.10.9rc601"
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" },
@@ -29,6 +29,7 @@ BEI_REQUIRED_MAX_NUM_TOKENS = 16384
29
29
  TRTLLM_MIN_MEMORY_REQUEST_GI = 10
30
30
  HF_MODELS_API_URL = "https://huggingface.co/api/models"
31
31
  HF_ACCESS_TOKEN_KEY = "hf_access_token"
32
+ HF_ACCESS_TOKEN_FILE_NAME = "hf_access_token"
32
33
  TRUSSLESS_MAX_PAYLOAD_SIZE = "64M"
33
34
  # Alias for TEMPLATES_DIR
34
35
  SERVING_DIR: pathlib.Path = TEMPLATES_DIR
@@ -9,7 +9,7 @@ from truss.remote.baseten.api import BasetenApi
9
9
 
10
10
  POLL_INTERVAL_SEC = 2
11
11
  # NB(nikhil): This helps account for (1) log processing delays (2) clock skews
12
- CLOCK_SKEW_BUFFER_MS = 10000
12
+ CLOCK_SKEW_BUFFER_MS = 60000
13
13
 
14
14
 
15
15
  class LogWatcher(ABC):
@@ -14,12 +14,19 @@ from .deploy_checkpoints_helpers import (
14
14
  setup_environment_variables_and_secrets,
15
15
  )
16
16
 
17
+ # NB(aghilan): Transformers was recently changed to save a chat_template.jinja file instead of inside the tokenizer_config.json file.
18
+ # Old Models will not have this file, so we check for it and use it if it exists.
19
+ # vLLM will not automatically resolve the chat_template.jinja file, so we need to pass it to the start command.
20
+ # This logic is needed for any models trained using Transformers v4.51.3 or later
17
21
  VLLM_FULL_START_COMMAND = Template(
18
- 'sh -c "{%if envvars %}{{ envvars }} {% endif %}vllm serve {{ model_path }}'
19
- + " --port 8000"
20
- + " --tensor-parallel-size {{ specify_tensor_parallelism }}"
21
- + " --dtype bfloat16"
22
- + '"'
22
+ "sh -c '{% if envvars %}{{ envvars }} {% endif %}"
23
+ 'HF_TOKEN="$$(cat /secrets/hf_access_token)" && export HF_TOKEN && '
24
+ "if [ -f {{ model_path }}/chat_template.jinja ]; then "
25
+ " vllm serve {{ model_path }} --chat-template {{ model_path }}/chat_template.jinja "
26
+ " --port 8000 --tensor-parallel-size {{ specify_tensor_parallelism }} --dtype bfloat16; "
27
+ "else "
28
+ " vllm serve {{ model_path }} --port 8000 --tensor-parallel-size {{ specify_tensor_parallelism }} --dtype bfloat16; "
29
+ "fi'"
23
30
  )
24
31
 
25
32
 
@@ -0,0 +1,331 @@
1
+ import signal
2
+ import time
3
+ import traceback
4
+ from typing import Any, Dict, List, Optional, Tuple, cast
5
+
6
+ from rich.columns import Columns
7
+ from rich.layout import Layout
8
+ from rich.live import Live
9
+ from rich.table import Table
10
+ from rich.text import Text
11
+
12
+ from truss.cli.train.poller import TrainingPollerMixin
13
+ from truss.cli.utils import common
14
+ from truss.cli.utils.output import console
15
+ from truss.remote.baseten.api import BasetenApi
16
+
17
+ METRICS_POLL_INTERVAL_SEC = 30
18
+
19
+
20
+ class MetricsWatcher(TrainingPollerMixin):
21
+ live: Optional[Live]
22
+
23
+ def __init__(self, api: BasetenApi, project_id: str, job_id: str):
24
+ super().__init__(api, project_id, job_id)
25
+
26
+ self.live = None
27
+ signal.signal(signal.SIGINT, self._handle_sigint)
28
+
29
+ def _handle_sigint(self, signum: int, frame: Any) -> None:
30
+ if self.live:
31
+ self.live.stop()
32
+ msg = f"\n\nExiting training job metrics. To stop the job, run `truss train stop --job-id {self.job_id}`"
33
+ console.print(msg, style="yellow")
34
+ raise KeyboardInterrupt()
35
+
36
+ def _format_bytes(self, bytes_val: float) -> Tuple[str, str]:
37
+ """Convert bytes to human readable format"""
38
+ color_map = {"MB": "green", "GB": "cyan", "TB": "magenta"}
39
+ unit = "MB"
40
+ if bytes_val > 1024 * 1024 * 1024 * 1024:
41
+ unit = "TB"
42
+ elif bytes_val > 1024 * 1024 * 1024:
43
+ unit = "GB"
44
+
45
+ if unit == "MB":
46
+ return f"{bytes_val / (1024 * 1024):.2f} MB", color_map[unit]
47
+ elif unit == "GB":
48
+ return f"{bytes_val / (1024 * 1024 * 1024):.2f} GB", color_map[unit]
49
+ return f"{bytes_val:.2f} bytes", color_map[unit]
50
+
51
+ def _format_storage_utilization(self, utilization: float) -> Tuple[str, str]:
52
+ percent = round(utilization * 100, 4)
53
+ if percent > 90:
54
+ return f"{percent}%", "red"
55
+ elif percent > 70:
56
+ return f"{percent}%", "yellow"
57
+ return f"{percent}%", "green"
58
+
59
+ def _get_latest_metric(self, metrics: List[Dict]) -> Optional[float]:
60
+ """Get the most recent metric value"""
61
+ if not metrics:
62
+ return None
63
+ return metrics[-1].get("value")
64
+
65
+ def _get_latest_storage_metrics(
66
+ self, storage_data: Optional[Dict[str, List[Dict]]]
67
+ ) -> Optional[Tuple[int, float]]:
68
+ if not storage_data:
69
+ return None
70
+ usage_data = storage_data.get("usage_bytes")
71
+ utilization_data = storage_data.get("utilization")
72
+ if not usage_data or not utilization_data:
73
+ return None
74
+ usage_value = usage_data[-1].get("value", None)
75
+ utilization_value = utilization_data[-1].get("value", None)
76
+ if not usage_value or not utilization_value:
77
+ return None
78
+ return cast(int, usage_value), cast(float, utilization_value)
79
+
80
+ def _maybe_format_storage_table_row(
81
+ self, table: Table, label: str, storage_data: Optional[Dict[str, List[Dict]]]
82
+ ) -> bool:
83
+ if not storage_data:
84
+ return False
85
+ maybe_values = self._get_latest_storage_metrics(storage_data)
86
+ if not maybe_values:
87
+ return False
88
+ raw_usage, raw_utilization = maybe_values
89
+ usage_value, usage_color = self._format_bytes(raw_usage)
90
+ utilization_value, utilization_color = self._format_storage_utilization(
91
+ raw_utilization
92
+ )
93
+ table.add_row(
94
+ label,
95
+ Text(usage_value, style=usage_color),
96
+ Text(utilization_value, style=utilization_color),
97
+ )
98
+ return True
99
+
100
+ def create_metrics_table(self, metrics_data: Dict) -> Layout:
101
+ """Create a Rich table with the metrics"""
102
+ tables = []
103
+
104
+ timestamp = self._get_timestamp_from_metrics(metrics_data)
105
+
106
+ node_tables = self._create_unified_node_metrics_tables(metrics_data)
107
+ tables.extend(node_tables)
108
+
109
+ storage_tables = self._create_storage_tables(metrics_data)
110
+ tables.extend(storage_tables)
111
+
112
+ columns = Columns(tables, title="Training Job Metrics")
113
+
114
+ layout = Layout()
115
+
116
+ if timestamp:
117
+ from rich.panel import Panel
118
+
119
+ layout.split_column(
120
+ Layout(
121
+ Panel(
122
+ f"🕐 Last Updated: {timestamp}\n💡 Press Ctrl+C to exit",
123
+ style="bold cyan",
124
+ ),
125
+ size=4,
126
+ ),
127
+ Layout(columns),
128
+ )
129
+ else:
130
+ layout.split_column(Layout(columns))
131
+
132
+ return layout
133
+
134
+ def _get_timestamp_from_metrics(self, metrics_data: Dict) -> Optional[str]:
135
+ """Extract timestamp from metrics data for display"""
136
+ # Try to get timestamp from per_node_metrics first. Fall back to main metrics if not there.
137
+ per_node_metrics = metrics_data.get("per_node_metrics", [])
138
+ if per_node_metrics and len(per_node_metrics) > 0:
139
+ first_node_metrics = per_node_metrics[0].get("metrics", {})
140
+ cpu_usage_data = first_node_metrics.get("cpu_usage", [])
141
+ if cpu_usage_data and len(cpu_usage_data) > 0:
142
+ timestamp = cpu_usage_data[-1].get("timestamp")
143
+ if timestamp:
144
+ return common.format_localized_time(timestamp)
145
+
146
+ cpu_usage_data = metrics_data.get("cpu_usage", [])
147
+ if cpu_usage_data and len(cpu_usage_data) > 0:
148
+ timestamp = cpu_usage_data[-1].get("timestamp")
149
+ if timestamp:
150
+ return common.format_localized_time(timestamp)
151
+
152
+ return None
153
+
154
+ def _create_unified_node_metrics_tables(self, metrics_data: Dict) -> List[Table]:
155
+ """Create tables for node metrics, handling both single and multi-node scenarios"""
156
+ tables = []
157
+
158
+ per_node_metrics = metrics_data.get("per_node_metrics", [])
159
+
160
+ if not per_node_metrics:
161
+ # Job is likely just starting up - it takes some type for the
162
+ # the metrics to become available after the job starts running.
163
+ from rich.text import Text
164
+
165
+ waiting_table = Table(title="Training Job Status")
166
+ waiting_table.add_column("Status")
167
+ waiting_table.add_column("Message")
168
+
169
+ waiting_table.add_row(
170
+ "Status",
171
+ Text("⏳ Waiting for metrics to become available...", style="yellow"),
172
+ )
173
+ waiting_table.add_row(
174
+ "Note",
175
+ Text(
176
+ "Metrics will appear once the training job starts running.",
177
+ style="dim",
178
+ ),
179
+ )
180
+
181
+ tables.append(waiting_table)
182
+ return tables
183
+
184
+ for node_metrics in per_node_metrics:
185
+ node_id = node_metrics.get("node_id", "Unknown")
186
+ metrics = node_metrics.get("metrics", {})
187
+
188
+ if not metrics:
189
+ continue
190
+
191
+ table = self._create_node_table(node_id, metrics)
192
+ tables.append(table)
193
+
194
+ return tables
195
+
196
+ def _create_node_table(self, node_id: str, metrics: Dict) -> Table:
197
+ """Create a table for a single node's metrics"""
198
+ table = Table(title=f"Node: {node_id}")
199
+ table.add_column("Metric")
200
+ table.add_column("Value")
201
+
202
+ cpu_usage = self._get_latest_metric(metrics.get("cpu_usage", []))
203
+ if cpu_usage is not None:
204
+ table.add_row("CPU usage", f"{cpu_usage:.2f} cores")
205
+
206
+ cpu_memory = self._get_latest_metric(metrics.get("cpu_memory_usage_bytes", []))
207
+ if cpu_memory is not None:
208
+ formatted_value, color = self._format_bytes(cpu_memory)
209
+ table.add_row("CPU memory", Text(formatted_value, style=color))
210
+
211
+ if cpu_usage is not None or cpu_memory is not None:
212
+ table.add_section()
213
+
214
+ gpu_utilization = metrics.get("gpu_utilization", {})
215
+ gpu_memory = metrics.get("gpu_memory_usage_bytes", {})
216
+
217
+ # API should return same GPU IDs for utilization and memory
218
+ keys = gpu_utilization.keys()
219
+ for idx, gpu_id in enumerate(keys):
220
+ latest_util = self._get_latest_metric(gpu_utilization.get(gpu_id, []))
221
+ if latest_util is not None:
222
+ table.add_row(f"GPU {gpu_id} utilization", f"{latest_util * 100:.1f}%")
223
+
224
+ latest_memory = self._get_latest_metric(gpu_memory.get(gpu_id, []))
225
+ if latest_memory is not None:
226
+ formatted_value, color = self._format_bytes(latest_memory)
227
+ table.add_row(
228
+ f"GPU {gpu_id} memory", Text(formatted_value, style=color)
229
+ )
230
+
231
+ if idx != len(keys) - 1:
232
+ table.add_section()
233
+
234
+ ephemeral_storage = metrics.get("ephemeral_storage")
235
+ if ephemeral_storage:
236
+ if gpu_utilization or gpu_memory:
237
+ table.add_section()
238
+
239
+ usage_bytes = self._get_latest_metric(
240
+ ephemeral_storage.get("usage_bytes", [])
241
+ )
242
+ utilization = self._get_latest_metric(
243
+ ephemeral_storage.get("utilization", [])
244
+ )
245
+
246
+ if usage_bytes is not None:
247
+ formatted_value, color = self._format_bytes(usage_bytes)
248
+ table.add_row("Eph. storage usage", Text(formatted_value, style=color))
249
+
250
+ if utilization is not None:
251
+ utilization_percent = utilization * 100
252
+ if utilization_percent > 90:
253
+ color = "red"
254
+ elif utilization_percent > 70:
255
+ color = "yellow"
256
+ else:
257
+ color = "green"
258
+ table.add_row(
259
+ "Eph. storage utilization",
260
+ Text(f"{utilization_percent:.1f}%", style=color),
261
+ )
262
+
263
+ return table
264
+
265
+ def _create_storage_tables(self, metrics_data: Dict) -> List[Table]:
266
+ """Create storage tables - only cache per job (ephemeral is now in node tables)"""
267
+ tables = []
268
+
269
+ # Create cache storage table (job-level, shown once)
270
+ cache_storage = metrics_data.get("cache")
271
+ if cache_storage:
272
+ table = self._create_cache_storage_table(cache_storage)
273
+ if table:
274
+ tables.append(table)
275
+
276
+ return tables
277
+
278
+ def _create_cache_storage_table(self, cache_storage: Dict) -> Optional[Table]:
279
+ """Create table for cache storage metrics (job-level)"""
280
+ usage_bytes = self._get_latest_metric(cache_storage.get("usage_bytes", []))
281
+ utilization = self._get_latest_metric(cache_storage.get("utilization", []))
282
+
283
+ if usage_bytes is None and utilization is None:
284
+ return None
285
+
286
+ table = Table(title="Cache storage")
287
+ table.add_column("Storage Type")
288
+ table.add_column("Usage")
289
+ table.add_column("Utilization")
290
+
291
+ self._maybe_format_storage_table_row(table, "Cache storage", cache_storage)
292
+
293
+ return table
294
+
295
+ def watch(self, refresh_rate: int = METRICS_POLL_INTERVAL_SEC):
296
+ """Display continuously updating metrics"""
297
+ self.before_polling()
298
+ with Live(auto_refresh=False) as live:
299
+ self.live = live
300
+ while True:
301
+ # our first instance of fetching metrics passes no explicit time range. We do this so that we can fetch metrics
302
+ # for inactive jobs, using the job's completion time to set the time range.
303
+ # Subsequent queries will fetch only the most recent data to avoid unnecessary load on VM
304
+ metrics = self.api.get_training_job_metrics(
305
+ self.project_id, self.job_id
306
+ )
307
+ try:
308
+ # range of one minute since we only want the last recording
309
+ table = self.create_metrics_table(metrics)
310
+ live.update(table, refresh=True)
311
+ if not self.should_poll_again():
312
+ live.stop()
313
+ break
314
+ time.sleep(refresh_rate)
315
+ end_epoch_millis = int(time.time() * 1000)
316
+ start_epoch_millis = end_epoch_millis - 60 * 1000
317
+ metrics = self.api.get_training_job_metrics(
318
+ self.project_id,
319
+ self.job_id,
320
+ end_epoch_millis=end_epoch_millis,
321
+ start_epoch_millis=start_epoch_millis,
322
+ )
323
+ self.post_poll()
324
+ except Exception as e:
325
+ live.stop()
326
+ console.print(
327
+ f"Error fetching metrics: {e}: {traceback.format_exc()}",
328
+ style="red",
329
+ )
330
+ break
331
+ self.after_polling()
@@ -15,6 +15,8 @@ from botocore.exceptions import ClientError, NoCredentialsError
15
15
  from google.cloud import storage
16
16
  from huggingface_hub import hf_hub_download
17
17
 
18
+ from truss.base import constants
19
+
18
20
  B10CP_PATH_TRUSS_ENV_VAR_NAME = "B10CP_PATH_TRUSS"
19
21
 
20
22
  GCS_CREDENTIALS = "/app/data/service_account.json"
@@ -108,7 +110,7 @@ class RepositoryFile(ABC):
108
110
 
109
111
  class HuggingFaceFile(RepositoryFile):
110
112
  def download_to_cache(self):
111
- secret_path = Path("/etc/secrets/hf-access-token")
113
+ secret_path = Path(f"/etc/secrets/{constants.HF_ACCESS_TOKEN_FILE_NAME}")
112
114
  secret = secret_path.read_text().strip() if secret_path.exists() else None
113
115
  try:
114
116
  hf_hub_download(
@@ -93,8 +93,6 @@ USER_TRUSS_IGNORE_FILE = ".truss_ignore"
93
93
  GCS_CREDENTIALS = "service_account.json"
94
94
  S3_CREDENTIALS = "s3_credentials.json"
95
95
 
96
- HF_ACCESS_TOKEN_FILE_NAME = "hf-access-token"
97
-
98
96
  CLOUD_BUCKET_CACHE = MODEL_CACHE_PATH
99
97
 
100
98
  HF_SOURCE_DIR = Path("./root/.cache/huggingface/hub/")
@@ -821,7 +819,7 @@ class ServingImageBuilder(ImageBuilder):
821
819
  model_cache_v1=config.model_cache.is_v1,
822
820
  model_cache_v2=config.model_cache.is_v2,
823
821
  hf_access_token=hf_access_token,
824
- hf_access_token_file_name=HF_ACCESS_TOKEN_FILE_NAME,
822
+ hf_access_token_file_name=constants.HF_ACCESS_TOKEN_FILE_NAME,
825
823
  external_data_files=external_data_files,
826
824
  build_commands=build_commands,
827
825
  use_local_src=config.use_local_src,
@@ -8,30 +8,6 @@ FROM {{ base_image_name_and_tag }} AS truss_server
8
8
  {%- set python_executable = config.base_image.python_executable_path or 'python3' %}
9
9
  ENV PYTHON_EXECUTABLE="{{ python_executable }}"
10
10
 
11
- # Non-root user for the app.
12
- ENV APP_USERNAME app
13
- # We choose a high number for user ID to avoid conflicts with existing users.
14
- ENV APP_USER_UID 60000
15
- # Directories owned by the non-root user.
16
- # Directory containing inference server code.
17
- ENV APP_HOME /app
18
- # Directory containing control server code.
19
- ENV CONTROL_SERVER_DIR /control
20
- # The non-root user's home directory.
21
- ENV HOME /home/app
22
- # Create a non-root user to run model containers.
23
- RUN useradd -u ${APP_USER_UID} -ms /bin/bash ${APP_USERNAME} \
24
- && mkdir ${APP_HOME} \
25
- && mkdir ${CONTROL_SERVER_DIR} \
26
- && chmod -R a=rwx ${APP_HOME} ${HOME} ${CONTROL_SERVER_DIR}
27
- ENV PATH=${PATH}:${HOME}/.local/bin
28
- # CAUTION: COPY directives use the root user, so we need to chown the directories to the non-root user.
29
- # If we have COPY directives after this, we need to run chown again. (or use COPY --chown ...)
30
- # RUN chown -R ${APP_USERNAME}:${APP_USERNAME} ${HOME} ${APP_HOME} ${CONTROL_SERVER_DIR}
31
- # Now switch to the non-root user early, we will switch back to root where needed.
32
- # USER ${APP_USERNAME}
33
- ENV PATH="${HOME}/.local/bin:$PATH"
34
-
35
11
  {%- set UV_VERSION = "0.7.19" %}
36
12
  {#
37
13
  NB(nikhil): We use a semi-complex uv installation command across the board:
@@ -63,6 +39,7 @@ RUN if ! command -v uv >/dev/null 2>&1; then \
63
39
  command -v curl >/dev/null 2>&1 || (apt update && apt install -y curl) && \
64
40
  curl -LsSf --retry 5 --retry-delay 5 https://astral.sh/uv/{{ UV_VERSION }}/install.sh | sh; \
65
41
  fi
42
+ ENV PATH="/root/.local/bin:$PATH"
66
43
  {% endblock %}
67
44
 
68
45
  {% block base_image_patch %}
@@ -59,6 +59,7 @@ class MethodName(str, enum.Enum):
59
59
  CHAT_COMPLETIONS = enum.auto()
60
60
  COMPLETIONS = enum.auto()
61
61
  IS_HEALTHY = enum.auto()
62
+ MESSAGES = enum.auto()
62
63
  POSTPROCESS = enum.auto()
63
64
  PREDICT = enum.auto()
64
65
  PREPROCESS = enum.auto()
@@ -244,6 +245,7 @@ class ModelDescriptor:
244
245
  is_healthy: Optional[MethodDescriptor]
245
246
  completions: Optional[MethodDescriptor]
246
247
  chat_completions: Optional[MethodDescriptor]
248
+ messages: Optional[MethodDescriptor]
247
249
  websocket: Optional[MethodDescriptor]
248
250
 
249
251
  @cached_property
@@ -291,6 +293,7 @@ class ModelDescriptor:
291
293
  setup = cls._safe_extract_descriptor(model_cls, MethodName.SETUP_ENVIRONMENT)
292
294
  completions = cls._safe_extract_descriptor(model_cls, MethodName.COMPLETIONS)
293
295
  chats = cls._safe_extract_descriptor(model_cls, MethodName.CHAT_COMPLETIONS)
296
+ messages = cls._safe_extract_descriptor(model_cls, MethodName.MESSAGES)
294
297
  is_healthy = cls._safe_extract_descriptor(model_cls, MethodName.IS_HEALTHY)
295
298
  if is_healthy and is_healthy.arg_config != ArgConfig.NONE:
296
299
  raise errors.ModelDefinitionError(
@@ -359,6 +362,7 @@ class ModelDescriptor:
359
362
  is_healthy=is_healthy,
360
363
  completions=completions,
361
364
  chat_completions=chats,
365
+ messages=messages,
362
366
  websocket=websocket,
363
367
  )
364
368
 
@@ -925,6 +929,14 @@ class ModelWrapper:
925
929
  )
926
930
  return await self._execute_model_endpoint(inputs, request, descriptor)
927
931
 
932
+ async def messages(
933
+ self, inputs: InputType, request: starlette.requests.Request
934
+ ) -> OutputType:
935
+ descriptor = self._get_descriptor_or_raise(
936
+ self.model_descriptor.messages, MethodName.MESSAGES
937
+ )
938
+ return await self._execute_model_endpoint(inputs, request, descriptor)
939
+
928
940
  async def websocket(self, ws: WebSocket) -> None:
929
941
  descriptor = self.model_descriptor.websocket
930
942
  assert descriptor, "websocket can only be invoked if present on model."
@@ -231,6 +231,13 @@ class BasetenEndpoints:
231
231
  method=self._model.completions, request=request, body_raw=body_raw
232
232
  )
233
233
 
234
+ async def messages(
235
+ self, request: Request, body_raw: bytes = Depends(parse_body)
236
+ ) -> Response:
237
+ return await self._execute_request(
238
+ method=self._model.messages, request=request, body_raw=body_raw
239
+ )
240
+
234
241
  async def websocket(self, ws: WebSocket) -> None:
235
242
  self.check_healthy()
236
243
  trace_ctx = otel_propagate.extract(ws.headers) or None
@@ -428,6 +435,12 @@ class TrussServer:
428
435
  methods=["POST"],
429
436
  tags=["V1"],
430
437
  ),
438
+ FastAPIRoute(
439
+ r"/v1/messages",
440
+ self._endpoints.messages,
441
+ methods=["POST"],
442
+ tags=["V1"],
443
+ ),
431
444
  # Websocket endpoint
432
445
  FastAPIWebSocketRoute(r"/v1/websocket", self._endpoints.websocket),
433
446
  # Endpoint aliases for Sagemaker hosting
@@ -120,26 +120,16 @@ RUN mkdir -p {{ supervisor_log_dir }}
120
120
  COPY supervisord.conf {{ supervisor_config_path }}
121
121
  ENV SUPERVISOR_SERVER_URL="{{ supervisor_server_url }}"
122
122
  ENV SERVER_START_CMD="/docker_server/.venv/bin/supervisord -c {{ supervisor_config_path }}"
123
- RUN chown -R ${APP_USERNAME}:${APP_USERNAME} ${HOME} ${APP_HOME}
124
- {#- nginx writes to these directories #}
125
- {% set nginx_dirs = ["/var/lib/nginx", "/var/log/nginx", "/run"] %}
126
- RUN mkdir -p {{ nginx_dirs | join(" ") }} && \
127
- chown -R ${APP_USERNAME}:${APP_USERNAME} {{ nginx_dirs | join(" ") }}
128
- USER ${APP_USERNAME}
129
123
  ENTRYPOINT ["/docker_server/.venv/bin/supervisord", "-c", "{{ supervisor_config_path }}"]
130
124
  {%- elif requires_live_reload %} {#- elif requires_live_reload #}
131
125
  ENV HASH_TRUSS="{{ truss_hash }}"
132
126
  ENV CONTROL_SERVER_PORT="8080"
133
127
  ENV INFERENCE_SERVER_PORT="8090"
134
128
  ENV SERVER_START_CMD="/control/.env/bin/python /control/control/server.py"
135
- RUN chown -R ${APP_USERNAME}:${APP_USERNAME} ${HOME} ${APP_HOME}
136
- USER ${APP_USERNAME}
137
129
  ENTRYPOINT ["/control/.env/bin/python", "/control/control/server.py"]
138
130
  {%- else %} {#- else (default inference server) #}
139
131
  ENV INFERENCE_SERVER_PORT="8080"
140
132
  ENV SERVER_START_CMD="{{ python_executable }} /app/main.py"
141
- RUN chown -R ${APP_USERNAME}:${APP_USERNAME} ${HOME} ${APP_HOME}
142
- USER ${APP_USERNAME}
143
133
  ENTRYPOINT ["{{ python_executable }}", "/app/main.py"]
144
134
  {%- endif %} {#- endif config.docker_server / live_reload #}
145
135
  {% endblock %} {#- endblock run #}
@@ -505,8 +505,16 @@ def test_render_vllm_full_truss_config():
505
505
  )
506
506
 
507
507
  result = render_vllm_full_truss_config(deploy_config)
508
-
509
- expected_vllm_command = 'sh -c "HF_TOKEN=$(cat /secrets/hf_token) vllm serve /tmp/training_checkpoints/job123/rank-0/checkpoint-1 --port 8000 --tensor-parallel-size 2 --dtype bfloat16"'
508
+ expected_vllm_command = (
509
+ "sh -c 'HF_TOKEN=$(cat /secrets/hf_token) "
510
+ 'HF_TOKEN="$$(cat /secrets/hf_access_token)" && export HF_TOKEN && '
511
+ "if [ -f /tmp/training_checkpoints/job123/rank-0/checkpoint-1/chat_template.jinja ]; then "
512
+ "vllm serve /tmp/training_checkpoints/job123/rank-0/checkpoint-1 "
513
+ "--chat-template /tmp/training_checkpoints/job123/rank-0/checkpoint-1/chat_template.jinja "
514
+ "--port 8000 --tensor-parallel-size 2 --dtype bfloat16; else "
515
+ "vllm serve /tmp/training_checkpoints/job123/rank-0/checkpoint-1 "
516
+ "--port 8000 --tensor-parallel-size 2 --dtype bfloat16; fi'"
517
+ )
510
518
 
511
519
  assert isinstance(result, truss_config.TrussConfig)
512
520
  assert result.model_name == "test-full-model"