truss 0.11.1rc15__tar.gz → 0.11.2rc500__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 (411) hide show
  1. {truss-0.11.1rc15 → truss-0.11.2rc500}/PKG-INFO +1 -1
  2. {truss-0.11.1rc15 → truss-0.11.2rc500}/pyproject.toml +1 -1
  3. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/base/constants.py +0 -1
  4. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/core.py +0 -156
  5. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_checkpoints/deploy_checkpoints.py +1 -13
  6. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train_commands.py +0 -72
  7. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/base.Dockerfile.jinja +3 -1
  8. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/endpoints.py +33 -82
  9. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/requirements.txt +1 -1
  10. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/common/errors.py +0 -1
  11. truss-0.11.2rc500/truss/templates/server/entrypoint.sh +16 -0
  12. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/truss_server.py +3 -5
  13. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server.Dockerfile.jinja +4 -2
  14. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/cli/train/test_deploy_checkpoints.py +3 -3
  15. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/control/control/test_endpoints.py +14 -20
  16. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/public_types.py +0 -1
  17. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/remote_chainlet/utils.py +0 -18
  18. truss-0.11.1rc15/truss/templates/train/config.py +0 -46
  19. truss-0.11.1rc15/truss/templates/train/run.sh +0 -11
  20. truss-0.11.1rc15/truss/tests/cli/train/test_train_init.py +0 -499
  21. {truss-0.11.1rc15 → truss-0.11.2rc500}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {truss-0.11.1rc15 → truss-0.11.2rc500}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  23. {truss-0.11.1rc15 → truss-0.11.2rc500}/.github/pull_request_template.md +0 -0
  24. {truss-0.11.1rc15 → truss-0.11.2rc500}/.gitignore +0 -0
  25. {truss-0.11.1rc15 → truss-0.11.2rc500}/CODE_OF_CONDUCT.md +0 -0
  26. {truss-0.11.1rc15 → truss-0.11.2rc500}/CONTRIBUTING.md +0 -0
  27. {truss-0.11.1rc15 → truss-0.11.2rc500}/LICENSE +0 -0
  28. {truss-0.11.1rc15 → truss-0.11.2rc500}/README.md +0 -0
  29. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/README.md +0 -0
  30. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/README.md +0 -0
  31. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/android-arm-eabi/README.md +0 -0
  32. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/android-arm64/README.md +0 -0
  33. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/darwin-arm64/README.md +0 -0
  34. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/darwin-universal/README.md +0 -0
  35. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/darwin-x64/README.md +0 -0
  36. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/freebsd-x64/README.md +0 -0
  37. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/linux-arm-gnueabihf/README.md +0 -0
  38. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/linux-arm-musleabihf/README.md +0 -0
  39. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/linux-arm64-gnu/README.md +0 -0
  40. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/linux-arm64-musl/README.md +0 -0
  41. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/linux-riscv64-gnu/README.md +0 -0
  42. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/linux-x64-gnu/README.md +0 -0
  43. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/linux-x64-musl/README.md +0 -0
  44. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/win32-arm64-msvc/README.md +0 -0
  45. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/win32-ia32-msvc/README.md +0 -0
  46. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/node_bindings/npm/win32-x64-msvc/README.md +0 -0
  47. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/python_bindings/README.md +0 -0
  48. {truss-0.11.1rc15 → truss-0.11.2rc500}/baseten-performance-client/scripts/README_nodejs.md +0 -0
  49. {truss-0.11.1rc15 → truss-0.11.2rc500}/context_builder.Dockerfile +0 -0
  50. {truss-0.11.1rc15 → truss-0.11.2rc500}/docs/README.md +0 -0
  51. {truss-0.11.1rc15 → truss-0.11.2rc500}/docs/chains/doc_gen/README.md +0 -0
  52. {truss-0.11.1rc15 → truss-0.11.2rc500}/docs/contribute/base-images.md +0 -0
  53. {truss-0.11.1rc15 → truss-0.11.2rc500}/docs/contribute/release.md +0 -0
  54. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/__init__.py +0 -0
  55. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/api/__init__.py +0 -0
  56. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/api/definitions.py +0 -0
  57. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/base/__init__.py +0 -0
  58. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/base/custom_types.py +0 -0
  59. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/base/errors.py +0 -0
  60. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/base/trt_llm_config.py +0 -0
  61. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/base/truss_config.py +0 -0
  62. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/base/truss_spec.py +0 -0
  63. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/chains_commands.py +0 -0
  64. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/cli.py +0 -0
  65. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/logs/base_watcher.py +0 -0
  66. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/logs/model_log_watcher.py +0 -0
  67. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/logs/training_log_watcher.py +0 -0
  68. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/logs/utils.py +0 -0
  69. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/remote_cli.py +0 -0
  70. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/common.py +0 -0
  71. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_checkpoints/__init__.py +0 -0
  72. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +0 -0
  73. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +0 -0
  74. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +0 -0
  75. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_checkpoints/deploy_whisper_checkpoints.py +0 -0
  76. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_from_checkpoint_config.yml +0 -0
  77. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/deploy_from_checkpoint_config_whisper.yml +0 -0
  78. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/metrics_watcher.py +0 -0
  79. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/poller.py +0 -0
  80. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/train/types.py +0 -0
  81. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/utils/common.py +0 -0
  82. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/utils/output.py +0 -0
  83. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/cli/utils/self_upgrade.py +0 -0
  84. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/docker_build_setup.py +0 -0
  85. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/image_builder/cache_warmer.py +0 -0
  86. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/image_builder/image_builder.py +0 -0
  87. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/image_builder/serving_image_builder.py +0 -0
  88. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/image_builder/util.py +0 -0
  89. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/local_loader/docker_build_emulator.py +0 -0
  90. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/local_loader/dockerfile_parser.py +0 -0
  91. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/local_loader/load_model_local.py +0 -0
  92. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/local_loader/truss_module_loader.py +0 -0
  93. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/local_loader/utils.py +0 -0
  94. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/contexts/truss_context.py +0 -0
  95. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/local/local_config.py +0 -0
  96. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/local/local_config_handler.py +0 -0
  97. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/patch/__init__.py +0 -0
  98. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/patch/hash.py +0 -0
  99. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/patch/signature.py +0 -0
  100. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/patch/truss_dir_patch_applier.py +0 -0
  101. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/__init__.py +0 -0
  102. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/api.py +0 -0
  103. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/auth.py +0 -0
  104. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/core.py +0 -0
  105. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/custom_types.py +0 -0
  106. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/error.py +0 -0
  107. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/remote.py +0 -0
  108. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/rest_client.py +0 -0
  109. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/service.py +0 -0
  110. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/utils/status.py +0 -0
  111. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/utils/tar.py +0 -0
  112. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/utils/time.py +0 -0
  113. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/baseten/utils/transfer.py +0 -0
  114. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/remote_factory.py +0 -0
  115. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/remote/truss_remote.py +0 -0
  116. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/README.md.jinja +0 -0
  117. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/__init__.py +0 -0
  118. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/cache.Dockerfile.jinja +0 -0
  119. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/cache_requirements.txt +0 -0
  120. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/application.py +0 -0
  121. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/context_managers.py +0 -0
  122. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/custom_types.py +0 -0
  123. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/errors.py +0 -0
  124. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/inference_server_controller.py +0 -0
  125. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/inference_server_process_controller.py +0 -0
  126. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/inference_server_starter.py +0 -0
  127. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/truss_patch/__init__.py +0 -0
  128. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/truss_patch/model_code_patch_applier.py +0 -0
  129. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/truss_patch/model_container_patch_applier.py +0 -0
  130. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +0 -0
  131. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/helpers/truss_patch/system_packages.py +0 -0
  132. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/control/control/server.py +0 -0
  133. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/copy_cache_files.Dockerfile.jinja +0 -0
  134. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/custom/examples.yaml +0 -0
  135. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/custom/model/__init__.py +0 -0
  136. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/custom/model/model.py +0 -0
  137. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/custom_python_dx/my_model.py +0 -0
  138. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/docker_server/proxy.conf.jinja +0 -0
  139. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/docker_server/supervisord.conf.jinja +0 -0
  140. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/docker_server_requirements.txt +0 -0
  141. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/__init__.py +0 -0
  142. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/common/__init__.py +0 -0
  143. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/common/patches/whisper/patch.py +0 -0
  144. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/common/patches.py +0 -0
  145. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/common/retry.py +0 -0
  146. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/common/schema.py +0 -0
  147. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/common/tracing.py +0 -0
  148. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/main.py +0 -0
  149. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/model_wrapper.py +0 -0
  150. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/server/requirements.txt +0 -0
  151. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/shared/__init__.py +0 -0
  152. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/shared/dynamic_config_resolver.py +0 -0
  153. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/shared/lazy_data_resolver.py +0 -0
  154. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/shared/log_config.py +0 -0
  155. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/shared/secrets_resolver.py +0 -0
  156. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/shared/serialization.py +0 -0
  157. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/shared/util.py +0 -0
  158. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/model/model.py +0 -0
  159. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/sigint_patch.py +0 -0
  160. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +0 -0
  161. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/whisper_trt/assets.py +0 -0
  162. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/whisper_trt/batching.py +0 -0
  163. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +0 -0
  164. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +0 -0
  165. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +0 -0
  166. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-audio/packages/whisper_trt/utils.py +0 -0
  167. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-briton/README.md +0 -0
  168. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/templates/trtllm-briton/src/extension.py +0 -0
  169. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/__init__.py +0 -0
  170. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/cli/test_cli.py +0 -0
  171. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/cli/train/resources/test_deploy_from_checkpoint_config.yml +0 -0
  172. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/cli/train/test_cache_view.py +0 -0
  173. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/cli/train/test_train_cli_core.py +0 -0
  174. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/conftest.py +0 -0
  175. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/contexts/image_builder/test_serving_image_builder.py +0 -0
  176. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/contexts/local_loader/test_load_local.py +0 -0
  177. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/contexts/local_loader/test_truss_module_finder.py +0 -0
  178. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/helpers.py +0 -0
  179. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/local/test_local_config_handler.py +0 -0
  180. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/patch/test_calc_patch.py +0 -0
  181. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/patch/test_dir_signature.py +0 -0
  182. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/patch/test_hash.py +0 -0
  183. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/patch/test_signature.py +0 -0
  184. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/patch/test_truss_dir_patch_applier.py +0 -0
  185. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/patch/test_types.py +0 -0
  186. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/baseten/conftest.py +0 -0
  187. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/baseten/test_api.py +0 -0
  188. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/baseten/test_auth.py +0 -0
  189. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/baseten/test_core.py +0 -0
  190. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/baseten/test_remote.py +0 -0
  191. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/baseten/test_service.py +0 -0
  192. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/test_remote_factory.py +0 -0
  193. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/remote/test_truss_remote.py +0 -0
  194. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/control/control/helpers/test_context_managers.py +0 -0
  195. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +0 -0
  196. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +0 -0
  197. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/control/control/test_server.py +0 -0
  198. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/control/control/test_server_integration.py +0 -0
  199. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/core/server/test_dynamic_config_resolver.py +0 -0
  200. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +0 -0
  201. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/core/server/test_secrets_resolver.py +0 -0
  202. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/server/common/test_retry.py +0 -0
  203. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/server/test_model_wrapper.py +0 -0
  204. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/server/test_schema.py +0 -0
  205. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/templates/server/test_truss_server.py +0 -0
  206. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_build.py +0 -0
  207. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_config.py +0 -0
  208. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_context_builder_image.py +0 -0
  209. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_control_truss_patching.py +0 -0
  210. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_custom_server.py +0 -0
  211. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/__init__.py +0 -0
  212. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/annotated_types_truss/__init__.py +0 -0
  213. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/annotated_types_truss/config.yaml +0 -0
  214. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/annotated_types_truss/model/__init__.py +0 -0
  215. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/annotated_types_truss/model/model.py +0 -0
  216. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/auto-mpg.data +0 -0
  217. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/context_builder_image_test/Dockerfile +0 -0
  218. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/context_builder_image_test/__init__.py +0 -0
  219. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/context_builder_image_test/test.py +0 -0
  220. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/gcs_fix/__init__.py +0 -0
  221. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/gcs_fix/config.yaml +0 -0
  222. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/gcs_fix/model/__init__.py +0 -0
  223. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/gcs_fix/model/model.py +0 -0
  224. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/happy.ipynb +0 -0
  225. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/model_load_failure_test/__init__.py +0 -0
  226. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/model_load_failure_test/config.yaml +0 -0
  227. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
  228. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/model_load_failure_test/model/model.py +0 -0
  229. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
  230. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/patch_ping_test_server/app.py +0 -0
  231. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/pima-indians-diabetes.csv +0 -0
  232. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/readme_int_example.md +0 -0
  233. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/readme_no_example.md +0 -0
  234. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/readme_str_example.md +0 -0
  235. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/server.Dockerfile +0 -0
  236. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
  237. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/server_conformance_test_truss/config.yaml +0 -0
  238. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
  239. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/server_conformance_test_truss/model/model.py +0 -0
  240. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_async_truss/__init__.py +0 -0
  241. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_async_truss/config.yaml +0 -0
  242. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
  243. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_async_truss/model/model.py +0 -0
  244. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_basic_truss/__init__.py +0 -0
  245. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_basic_truss/config.yaml +0 -0
  246. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
  247. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_basic_truss/model/model.py +0 -0
  248. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands/__init__.py +0 -0
  249. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands/config.yaml +0 -0
  250. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
  251. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands/model/model.py +0 -0
  252. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
  253. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands_failure/config.yaml +0 -0
  254. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
  255. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_build_commands_failure/model/model.py +0 -0
  256. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
  257. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_concurrency_truss/config.yaml +0 -0
  258. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
  259. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_concurrency_truss/model/model.py +0 -0
  260. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
  261. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/config.yaml +0 -0
  262. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +0 -0
  263. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +0 -0
  264. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +0 -0
  265. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
  266. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +0 -0
  267. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +0 -0
  268. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_env_vars/config.yaml +0 -0
  269. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_go_custom_server_truss/config.yaml +0 -0
  270. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_go_custom_server_truss/docker/Dockerfile +0 -0
  271. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_go_custom_server_truss/docker/README.md +0 -0
  272. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_go_custom_server_truss/docker/VERSION +0 -0
  273. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_go_custom_server_truss/docker/build_upload_new_image.sh +0 -0
  274. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_go_custom_server_truss/docker/main.go +0 -0
  275. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_openai/__init__.py +0 -0
  276. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_openai/config.yaml +0 -0
  277. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_openai/model/__init__.py +0 -0
  278. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_openai/model/model.py +0 -0
  279. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
  280. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v1/config.yaml +0 -0
  281. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
  282. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v1/model/model.py +0 -0
  283. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v1/requirements.txt +0 -0
  284. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
  285. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v2/config.yaml +0 -0
  286. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
  287. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v2/model/model.py +0 -0
  288. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_pyantic_v2/requirements.txt +0 -0
  289. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
  290. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_requirements_file_truss/config.yaml +0 -0
  291. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
  292. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_requirements_file_truss/model/model.py +0 -0
  293. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_requirements_file_truss/requirements.txt +0 -0
  294. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
  295. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +0 -0
  296. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
  297. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +0 -0
  298. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
  299. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_read_timeout/config.yaml +0 -0
  300. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
  301. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_read_timeout/model/model.py +0 -0
  302. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
  303. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss/config.yaml +0 -0
  304. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
  305. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss/model/model.py +0 -0
  306. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
  307. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_error/config.yaml +0 -0
  308. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
  309. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_error/model/model.py +0 -0
  310. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
  311. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +0 -0
  312. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +0 -0
  313. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
  314. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +0 -0
  315. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
  316. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +0 -0
  317. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
  318. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_trt_llm_truss/config.yaml +0 -0
  319. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
  320. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_trt_llm_truss/model/model.py +0 -0
  321. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/__init__.py +0 -0
  322. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/config.yaml +0 -0
  323. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/examples.yaml +0 -0
  324. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/model/__init__.py +0 -0
  325. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/model/dummy +0 -0
  326. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/model/model.py +0 -0
  327. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/packages/__init__.py +0 -0
  328. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
  329. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss/packages/test_package/test.py +0 -0
  330. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v1/__init__.py +0 -0
  331. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v1/config.yaml +0 -0
  332. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v1/model/__init__.py +0 -0
  333. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v1/model/model.py +0 -0
  334. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v2/__init__.py +0 -0
  335. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v2/config.yaml +0 -0
  336. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v2/model/__init__.py +0 -0
  337. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_server_model_cache_v2/model/model.py +0 -0
  338. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
  339. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_with_error/config.yaml +0 -0
  340. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
  341. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_with_error/model/model.py +0 -0
  342. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
  343. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +0 -0
  344. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +0 -0
  345. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_docker.py +0 -0
  346. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_model_inference.py +0 -0
  347. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_model_schema.py +0 -0
  348. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_testing_utilities_for_other_tests.py +0 -0
  349. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_truss_gatherer.py +0 -0
  350. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_truss_handle.py +0 -0
  351. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/test_util.py +0 -0
  352. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/trt_llm/test_trt_llm_config.py +0 -0
  353. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/trt_llm/test_validation.py +0 -0
  354. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/util/test_config_checks.py +0 -0
  355. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/util/test_env_vars.py +0 -0
  356. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/tests/util/test_path.py +0 -0
  357. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/trt_llm/config_checks.py +0 -0
  358. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/trt_llm/validation.py +0 -0
  359. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/__init__.py +0 -0
  360. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/build.py +0 -0
  361. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/decorators.py +0 -0
  362. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/__init__.py +0 -0
  363. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/calc_patch.py +0 -0
  364. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/constants.py +0 -0
  365. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/custom_types.py +0 -0
  366. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/dir_signature.py +0 -0
  367. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/hash.py +0 -0
  368. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/local_truss_patch_applier.py +0 -0
  369. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/signature.py +0 -0
  370. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/patch/truss_dir_patch_applier.py +0 -0
  371. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/readme_generator.py +0 -0
  372. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/truss_gatherer.py +0 -0
  373. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/truss_handle/truss_handle.py +0 -0
  374. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/.truss_ignore +0 -0
  375. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/docker.py +0 -0
  376. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/download.py +0 -0
  377. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/env_vars.py +0 -0
  378. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/gpu.py +0 -0
  379. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/jinja.py +0 -0
  380. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/log_utils.py +0 -0
  381. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/notebook.py +0 -0
  382. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/path.py +0 -0
  383. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/requirements.py +0 -0
  384. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss/util/user_config.py +0 -0
  385. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/examples/README.md +0 -0
  386. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/examples/audio-transcription/README.md +0 -0
  387. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/examples/rag/README.md +0 -0
  388. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/tests/itest_chain/requirements.txt +0 -0
  389. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/__init__.py +0 -0
  390. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/deployment/__init__.py +0 -0
  391. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/deployment/code_gen.py +0 -0
  392. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/deployment/deployment_client.py +0 -0
  393. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/framework.py +0 -0
  394. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/private_types.py +0 -0
  395. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/public_api.py +0 -0
  396. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/py.typed +0 -0
  397. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/pydantic_numpy.py +0 -0
  398. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/reference_code/reference_chainlet.py +0 -0
  399. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/reference_code/reference_model.py +0 -0
  400. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/remote_chainlet/__init__.py +0 -0
  401. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/remote_chainlet/model_skeleton.py +0 -0
  402. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/remote_chainlet/stub.py +0 -0
  403. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/streaming.py +0 -0
  404. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-chains/truss_chains/utils.py +0 -0
  405. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-train/truss_train/__init__.py +0 -0
  406. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-train/truss_train/definitions.py +0 -0
  407. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-train/truss_train/deployment.py +0 -0
  408. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-train/truss_train/loader.py +0 -0
  409. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-train/truss_train/public_api.py +0 -0
  410. {truss-0.11.1rc15 → truss-0.11.2rc500}/truss-transfer/README.md +0 -0
  411. {truss-0.11.1rc15 → truss-0.11.2rc500}/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.1rc15
3
+ Version: 0.11.2rc500
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.1rc15"
3
+ version = "0.11.2rc500"
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" },
@@ -18,7 +18,6 @@ SHARED_SERVING_AND_TRAINING_CODE_DIR: pathlib.Path = (
18
18
  CONTROL_SERVER_CODE_DIR: pathlib.Path = TEMPLATES_DIR / "control"
19
19
  CHAINS_CODE_DIR: pathlib.Path = _TRUSS_ROOT.parent / "truss-chains" / "truss_chains"
20
20
  TRUSS_CODE_DIR: pathlib.Path = _TRUSS_ROOT.parent / "truss"
21
- TRAINING_TEMPLATE_DIR = TEMPLATES_DIR / "train"
22
21
  # Must be sorted ascendingly.
23
22
  SUPPORTED_PYTHON_VERSIONS = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
24
23
 
@@ -1,4 +1,3 @@
1
- import base64
2
1
  import json
3
2
  import os
4
3
  import tarfile
@@ -9,7 +8,6 @@ from pathlib import Path
9
8
  from typing import Any, Callable, Dict, Optional, Tuple
10
9
 
11
10
  import click
12
- import requests
13
11
  import rich
14
12
  from InquirerPy import inquirer
15
13
  from rich.text import Text
@@ -357,7 +355,6 @@ def download_training_job_data(
357
355
  temp_path.write_bytes(content)
358
356
 
359
357
  unzip_dir = output_dir / artifact_base_name
360
- unzip_dir = Path(str(unzip_dir).replace(" ", "-"))
361
358
  if unzip_dir.exists():
362
359
  raise click.ClickException(
363
360
  f"Directory '{unzip_dir}' already exists. "
@@ -370,7 +367,6 @@ def download_training_job_data(
370
367
 
371
368
  return unzip_dir
372
369
  else:
373
- target_path = Path(str(target_path).replace(" ", "-"))
374
370
  target_path.write_bytes(content)
375
371
  return target_path
376
372
 
@@ -421,158 +417,6 @@ def status_page_url(remote_url: str, training_job_id: str) -> str:
421
417
  return f"{remote_url}/training/jobs/{training_job_id}"
422
418
 
423
419
 
424
- def _get_all_train_init_example_options(
425
- repo_id: str = "ml-cookbook",
426
- examples_subdir: str = "examples",
427
- token: Optional[str] = None,
428
- ) -> list[str]:
429
- """
430
- Retrieve a list of all example options from the ml-cookbook repository to
431
- copy locally for training initialization. This method generates a list
432
- of examples and URL paths to show the user for selection.
433
- """
434
- headers = {}
435
- if token:
436
- headers["Authorization"] = f"token {token}"
437
-
438
- url = (
439
- f"https://api.github.com/repos/basetenlabs/{repo_id}/contents/{examples_subdir}"
440
- )
441
- try:
442
- response = requests.get(url, headers=headers)
443
- response.raise_for_status()
444
-
445
- items = response.json()
446
- if not isinstance(items, list):
447
- items = [items]
448
- items = [item["name"] for item in items if item["type"] == "dir"]
449
- return items
450
-
451
- except requests.exceptions.RequestException as e:
452
- click.echo(
453
- f"Error exploring directory: {e}. Please file an issue at https://github.com/basetenlabs/truss/issues"
454
- )
455
- return []
456
-
457
-
458
- def _get_train_init_example_info(
459
- repo_id: str = "ml-cookbook",
460
- examples_subdir: str = "examples",
461
- example_name: Optional[str] = None,
462
- token: Optional[str] = None,
463
- ) -> list[Dict[str, str]]:
464
- """
465
- Retrieve directory download links for the example from the ml-cookbook repository to
466
- copy locally for training initialization.
467
- """
468
- headers = {}
469
- if token:
470
- headers["Authorization"] = f"token {token}"
471
-
472
- url = f"https://api.github.com/repos/basetenlabs/{repo_id}/contents/{examples_subdir}/{example_name}"
473
-
474
- try:
475
- response = requests.get(url, headers=headers)
476
- response.raise_for_status()
477
-
478
- items = response.json()
479
- if not isinstance(items, list):
480
- items = [items]
481
- return items
482
-
483
- except requests.exceptions.HTTPError as e:
484
- if response.status_code == 404:
485
- # example_name does not exist, return empty list
486
- return []
487
- else:
488
- # Other HTTP errors
489
- click.echo(
490
- f"Error exploring directory: {e}. Please file an issue at https://github.com/basetenlabs/truss/issues"
491
- )
492
- return []
493
- except requests.exceptions.RequestException as e:
494
- # Network or other request errors
495
- click.echo(
496
- f"Error exploring directory: {e}. Please file an issue at https://github.com/basetenlabs/truss/issues"
497
- )
498
- return []
499
-
500
-
501
- def download_git_directory(
502
- git_api_url: str, local_dir: str, token: Optional[str] = None
503
- ):
504
- """
505
- Recursively download directory contents from git api url.
506
- Special handling for 'training' directory: downloads its contents directly
507
- to local_dir without creating a 'training' subdirectory.
508
- Args:
509
- git_api_url (str): Example format "https://api.github.com/repos/basetenlabs/ml-cookbook/contents/examples/llama-finetune-8b-lora?ref=main"
510
- local_dir(str): Local directory to download this directory to
511
- """
512
- headers = {}
513
- if token:
514
- headers["Authorization"] = f"token {token}"
515
- try:
516
- response = requests.get(git_api_url, headers=headers)
517
- response.raise_for_status()
518
- items = response.json()
519
-
520
- # Handle single file case
521
- if not isinstance(items, list):
522
- items = [items]
523
-
524
- # Create local directory
525
- print(f"Creating directory {local_dir}")
526
- os.makedirs(local_dir, exist_ok=True)
527
-
528
- # Check if there's a 'training' directory in the items
529
- training_dir = None
530
- other_items = []
531
-
532
- for item in items:
533
- if item["name"] == "training" and item["type"] == "dir":
534
- training_dir = item
535
- else:
536
- other_items.append(item)
537
-
538
- # If training directory exists, download its contents directly to local_dir
539
- if training_dir:
540
- print(
541
- f"📁 Found training directory, downloading its contents to {local_dir}"
542
- )
543
- return download_git_directory(training_dir["url"], local_dir)
544
-
545
- # If no training directory, download all files normally
546
- for item in other_items:
547
- item_name = item["name"]
548
- local_item_path = os.path.join(local_dir, item_name)
549
-
550
- if item["type"] == "file":
551
- print(f"📄 Downloading {item_name}")
552
- if item.get("download_url"):
553
- # Download file directly
554
- file_response = requests.get(item["download_url"])
555
- file_response.raise_for_status()
556
- with open(local_item_path, "wb") as f:
557
- f.write(file_response.content)
558
- elif item.get("content"):
559
- # Decode base64 content (for small files)
560
- try:
561
- content = base64.b64decode(item["content"])
562
- with open(local_item_path, "wb") as f:
563
- f.write(content)
564
- except Exception as e:
565
- print(f"⚠️ Could not decode {item_name}: {e}")
566
- elif item["type"] == "dir":
567
- print(f"📁 Entering directory {item_name}")
568
- # Use the API URL from the response for subdirectories
569
- download_git_directory(item["url"], local_item_path)
570
- return True
571
- except Exception as e:
572
- print(f"Error processing response: {e}")
573
- return False
574
-
575
-
576
420
  def fetch_project_by_name_or_id(
577
421
  remote_provider: BasetenRemote, project_identifier: str
578
422
  ) -> dict:
@@ -296,22 +296,10 @@ def _get_checkpoint_ids_to_deploy(
296
296
  return checkpoint_ids
297
297
 
298
298
 
299
- def _select_single_checkpoint(checkpoint_id_options: List[str]) -> List[str]:
300
- """Select a single checkpoint using interactive prompt."""
301
- checkpoint_id = inquirer.select(
302
- message="Select the checkpoints to deploy:", choices=checkpoint_id_options
303
- ).execute()
304
-
305
- if not checkpoint_id:
306
- raise click.UsageError("A checkpoint must be selected.")
307
-
308
- return [checkpoint_id]
309
-
310
-
311
299
  def _select_multiple_checkpoints(checkpoint_id_options: List[str]) -> List[str]:
312
300
  """Select multiple checkpoints using interactive checkbox."""
313
301
  checkpoint_ids = inquirer.checkbox(
314
- message="Use spacebar to select/deselect checkpoints to deploy. Press enter when done.",
302
+ message="Select the checkpoint to deploy. Use spacebar to select/deselect.",
315
303
  choices=checkpoint_id_options,
316
304
  ).execute()
317
305
 
@@ -1,4 +1,3 @@
1
- import os
2
1
  import sys
3
2
  from pathlib import Path
4
3
  from typing import Optional, cast
@@ -6,7 +5,6 @@ from typing import Optional, cast
6
5
  import rich_click as click
7
6
 
8
7
  import truss.cli.train.core as train_cli
9
- from truss.base.constants import TRAINING_TEMPLATE_DIR
10
8
  from truss.cli import remote_cli
11
9
  from truss.cli.cli import push, truss_cli
12
10
  from truss.cli.logs import utils as cli_log_utils
@@ -27,7 +25,6 @@ from truss.cli.utils.output import console, error_console
27
25
  from truss.remote.baseten.core import get_training_job_logs_with_pagination
28
26
  from truss.remote.baseten.remote import BasetenRemote
29
27
  from truss.remote.remote_factory import RemoteFactory
30
- from truss.util.path import copy_tree_path
31
28
  from truss_train import TrainingJob
32
29
 
33
30
 
@@ -384,75 +381,6 @@ def download_checkpoint_artifacts(job_id: Optional[str], remote: Optional[str])
384
381
  sys.exit(1)
385
382
 
386
383
 
387
- @train.command(name="init")
388
- @click.option("--list-examples", is_flag=True, help="List all available examples.")
389
- @click.option("--target-directory", type=str, required=False)
390
- @click.option("--examples", type=str, required=False)
391
- @common.common_options()
392
- def init_training_job(
393
- list_examples: Optional[bool],
394
- target_directory: Optional[str],
395
- examples: Optional[str],
396
- ) -> None:
397
- try:
398
- if list_examples:
399
- all_examples = train_cli._get_all_train_init_example_options()
400
- console.print("Available training examples:", style="bold")
401
- for example in all_examples:
402
- console.print(f"- {example}")
403
- console.print(
404
- "To launch, run `truss train init --examples <example1,example2>`",
405
- style="bold",
406
- )
407
- return
408
-
409
- selected_options = examples.split(",") if examples else []
410
-
411
- # No examples selected, initialize empty training project structure
412
- if not selected_options:
413
- if target_directory is None:
414
- target_directory = "truss-train-init"
415
- console.print(f"Initializing empty training project at {target_directory}")
416
- os.makedirs(target_directory)
417
- copy_tree_path(Path(TRAINING_TEMPLATE_DIR), Path(target_directory))
418
- console.print(
419
- f"✨ Empty training project initialized at {target_directory}",
420
- style="bold green",
421
- )
422
- return
423
-
424
- if target_directory is None:
425
- target_directory = os.getcwd()
426
- for example_to_download in selected_options:
427
- download_info = train_cli._get_train_init_example_info(
428
- example_name=example_to_download
429
- )
430
- local_dir = os.path.join(target_directory, example_to_download)
431
-
432
- if not download_info:
433
- all_examples = train_cli._get_all_train_init_example_options()
434
- error_console.print(
435
- f"Example {example_to_download} not found in the ml-cookbook repository. Examples have to be one or more comma separated values from: {', '.join(all_examples)}"
436
- )
437
- continue
438
- success = train_cli.download_git_directory(
439
- git_api_url=download_info[0]["url"], local_dir=local_dir
440
- )
441
- if success:
442
- console.print(
443
- f"✨ Training directory for {example_to_download} initialized at {local_dir}",
444
- style="bold green",
445
- )
446
- else:
447
- error_console.print(
448
- f"Failed to initialize training artifacts to {local_dir}"
449
- )
450
-
451
- except Exception as e:
452
- error_console.print(f"Failed to initialize training artifacts: {str(e)}")
453
- sys.exit(1)
454
-
455
-
456
384
  @train.group(name="cache")
457
385
  def cache():
458
386
  """Cache-related subcommands for truss train"""
@@ -18,6 +18,8 @@ ENV PYTHON_EXECUTABLE="{{ python_executable }}"
18
18
  ENV HOME=/home/{{ app_username }}
19
19
  {# Directory containing inference server code. #}
20
20
  ENV APP_HOME=/{{ app_username }}
21
+ {# Directory for truss-transfer cache #}
22
+ ENV TRUSS_TRANSFER_CACHE_DIR=${APP_HOME}/.cache/truss_transfer
21
23
  RUN mkdir -p ${APP_HOME} {{ control_server_dir }}
22
24
  {# Create a non-root user to run model containers. #}
23
25
  RUN useradd -u {{ app_user_uid }} -ms /bin/bash {{ app_username }}
@@ -30,7 +32,7 @@ ENV DEBIAN_FRONTEND=noninteractive
30
32
  {# to allow the non-root user to install packages. #}
31
33
  {%- if non_root_user and enable_model_container_admin_commands %}
32
34
  RUN apt update && apt install -y sudo
33
- {%- set allowed_admin_commands = ["/usr/bin/apt install *", "/usr/bin/apt update"] %}
35
+ {%- set allowed_admin_commands = ["/usr/bin/apt install *", "/usr/bin/apt update", "sudo chown -R app:app /cache/model", "sudo chown -R app:app /cache/org"] %}
34
36
  RUN echo "Defaults:{{ app_username }} passwd_tries=0\n{{ app_username }} ALL=(root) NOPASSWD: {{ allowed_admin_commands | join(", ") }}" > /etc/sudoers.d/app-packages
35
37
  RUN chmod 0440 /etc/sudoers.d/app-packages
36
38
  {#- optional but good practice: check if the sudoers file is valid #}
@@ -1,15 +1,14 @@
1
1
  import asyncio
2
2
  import logging
3
- from typing import Any, Callable, Dict, Optional, Protocol
3
+ from typing import Any, Callable, Dict
4
4
 
5
5
  import httpx
6
6
  from fastapi import APIRouter, WebSocket
7
7
  from fastapi.responses import JSONResponse, StreamingResponse
8
- from httpx_ws import AsyncWebSocketSession, WebSocketDisconnect, aconnect_ws
9
8
  from httpx_ws import _exceptions as httpx_ws_exceptions
9
+ from httpx_ws import aconnect_ws
10
10
  from starlette.requests import ClientDisconnect, Request
11
11
  from starlette.responses import Response
12
- from starlette.websockets import WebSocketDisconnect as StartletteWebSocketDisconnect
13
12
  from tenacity import RetryCallState, Retrying, retry_if_exception_type, wait_fixed
14
13
  from wsproto.events import BytesMessage, TextMessage
15
14
 
@@ -30,15 +29,6 @@ BASE_RETRY_EXCEPTIONS = (
30
29
 
31
30
  control_app = APIRouter()
32
31
 
33
- WEBSOCKET_NORMAL_CLOSURE_CODE = 1000
34
- WEBSOCKET_SERVER_ERROR_CODE = 1011
35
-
36
-
37
- class CloseableWebsocket(Protocol):
38
- async def close(
39
- self, code: int = WEBSOCKET_NORMAL_CLOSURE_CODE, reason: Optional[str] = None
40
- ) -> None: ...
41
-
42
32
 
43
33
  @control_app.get("/")
44
34
  def index():
@@ -128,79 +118,13 @@ def inference_retries(
128
118
  yield attempt
129
119
 
130
120
 
131
- async def _safe_close_ws(
132
- ws: CloseableWebsocket,
133
- logger: logging.Logger,
134
- code: int,
135
- reason: Optional[str] = None,
136
- ):
121
+ async def _safe_close_ws(ws: WebSocket, logger: logging.Logger):
137
122
  try:
138
- await ws.close(code, reason)
123
+ await ws.close()
139
124
  except RuntimeError as close_error:
140
125
  logger.debug(f"Duplicate close of websocket: `{close_error}`.")
141
126
 
142
127
 
143
- async def forward_to_server(
144
- client_ws: WebSocket, server_ws: AsyncWebSocketSession
145
- ) -> None:
146
- while True:
147
- message = await client_ws.receive()
148
- if message.get("type") == "websocket.disconnect":
149
- raise StartletteWebSocketDisconnect(
150
- message.get("code", 1000), message.get("reason")
151
- )
152
- if "text" in message:
153
- await server_ws.send_text(message["text"])
154
- elif "bytes" in message:
155
- await server_ws.send_bytes(message["bytes"])
156
-
157
-
158
- async def forward_to_client(client_ws: WebSocket, server_ws: AsyncWebSocketSession):
159
- while True:
160
- message = await server_ws.receive()
161
- if isinstance(message, TextMessage):
162
- await client_ws.send_text(message.data)
163
- elif isinstance(message, BytesMessage):
164
- await client_ws.send_bytes(message.data)
165
-
166
-
167
- # NB(nikhil): _handle_websocket_forwarding uses some py311 specific syntax, but in newer
168
- # versions of truss we're guaranteed to be running the control server with at least that version.
169
- async def _handle_websocket_forwarding(
170
- client_ws: WebSocket, server_ws: AsyncWebSocketSession
171
- ):
172
- logger = client_ws.app.state.logger
173
- try:
174
- async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
175
- tg.create_task(forward_to_client(client_ws, server_ws))
176
- tg.create_task(forward_to_server(client_ws, server_ws))
177
- except ExceptionGroup as eg: # type: ignore[name-defined] # noqa: F821
178
- # NB(nikhil): The first websocket proxy method to raise an error will
179
- # be surfaced here, and that contains the information we want to forward to the
180
- # other websocket. Further errors might raise as a result of cancellation, but we
181
- # can safely ignore those.
182
- exc = eg.exceptions[0]
183
- if isinstance(exc, WebSocketDisconnect):
184
- await _safe_close_ws(client_ws, logger, exc.code, exc.reason)
185
- elif isinstance(exc, StartletteWebSocketDisconnect):
186
- await _safe_close_ws(server_ws, logger, exc.code, exc.reason)
187
- else:
188
- logger.warning(f"Ungraceful websocket close: {exc}")
189
- finally:
190
- # NB(nikhil): In most common cases, both websockets would have been successfully
191
- # closed with applicable codes above, these lines are just a failsafe.
192
- await _safe_close_ws(client_ws, logger, code=WEBSOCKET_SERVER_ERROR_CODE)
193
- await _safe_close_ws(server_ws, logger, code=WEBSOCKET_SERVER_ERROR_CODE)
194
-
195
-
196
- async def _attempt_websocket_proxy(
197
- client_ws: WebSocket, proxy_client: httpx.AsyncClient, logger
198
- ):
199
- async with aconnect_ws("/v1/websocket", proxy_client) as server_ws: # type: ignore
200
- await client_ws.accept()
201
- await _handle_websocket_forwarding(client_ws, server_ws)
202
-
203
-
204
128
  async def proxy_ws(client_ws: WebSocket):
205
129
  proxy_client: httpx.AsyncClient = client_ws.app.state.proxy_client
206
130
  logger = client_ws.app.state.logger
@@ -208,10 +132,37 @@ async def proxy_ws(client_ws: WebSocket):
208
132
  for attempt in inference_retries():
209
133
  with attempt:
210
134
  try:
211
- await _attempt_websocket_proxy(client_ws, proxy_client, logger)
135
+ async with aconnect_ws("/v1/websocket", proxy_client) as server_ws: # type: ignore
136
+ # Unfortunate, but FastAPI and httpx-ws have slightly different abstractions
137
+ # for sending data, so it's not easy to create a unified wrapper.
138
+ async def forward_to_server():
139
+ while True:
140
+ message = await client_ws.receive()
141
+ if message.get("type") == "websocket.disconnect":
142
+ break
143
+ if "text" in message:
144
+ await server_ws.send_text(message["text"])
145
+ elif "bytes" in message:
146
+ await server_ws.send_bytes(message["bytes"])
147
+
148
+ async def forward_to_client():
149
+ while True:
150
+ message = await server_ws.receive()
151
+ if message is None:
152
+ break
153
+ if isinstance(message, TextMessage):
154
+ await client_ws.send_text(message.data)
155
+ elif isinstance(message, BytesMessage):
156
+ await client_ws.send_bytes(message.data)
157
+
158
+ await client_ws.accept()
159
+ try:
160
+ await asyncio.gather(forward_to_client(), forward_to_server())
161
+ finally:
162
+ await _safe_close_ws(client_ws, logger)
212
163
  except httpx_ws_exceptions.HTTPXWSException as e:
213
164
  logger.warning(f"WebSocket connection rejected: {e}")
214
- await _safe_close_ws(client_ws, logger, WEBSOCKET_SERVER_ERROR_CODE)
165
+ await _safe_close_ws(client_ws, logger)
215
166
  break
216
167
 
217
168
 
@@ -6,7 +6,7 @@ loguru>=0.7.2
6
6
  python-json-logger>=2.0.2
7
7
  tenacity>=8.1.0
8
8
  # To avoid divergence, this should follow the latest release.
9
- truss==0.11.1rc15
9
+ truss==0.9.100
10
10
  uvicorn>=0.24.0
11
11
  uvloop>=0.19.0
12
12
  websockets>=10.0
@@ -18,7 +18,6 @@ _BASETEN_DOWNSTREAM_ERROR_CODE = 600
18
18
  _BASETEN_CLIENT_ERROR_CODE = 700
19
19
 
20
20
  MODEL_ERROR_MESSAGE = "Internal Server Error (in model/chainlet)."
21
- WEBSOCKET_SERVER_ERROR_CODE = 1011
22
21
 
23
22
 
24
23
  class ModelMissingError(Exception):
@@ -0,0 +1,16 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Fix ownership of cache directories if they exist
5
+ if [ -d "/cache/model" ]; then
6
+ echo "Setting ownership for /cache/model"
7
+ sudo chown -R app:app /cache/model
8
+ fi
9
+
10
+ if [ -d "/cache/org" ]; then
11
+ echo "Setting ownership for /cache/org"
12
+ sudo chown -R app:app /cache/org
13
+ fi
14
+
15
+ # Execute the original command
16
+ exec "$@"
@@ -76,7 +76,7 @@ async def parse_body(request: Request) -> bytes:
76
76
 
77
77
 
78
78
  async def _safe_close_websocket(
79
- ws: WebSocket, status_code: int = 1000, reason: Optional[str] = None
79
+ ws: WebSocket, reason: Optional[str], status_code: int = 1000
80
80
  ) -> None:
81
81
  try:
82
82
  await ws.close(code=status_code, reason=reason)
@@ -257,16 +257,14 @@ class BasetenEndpoints:
257
257
  try:
258
258
  await ws.accept()
259
259
  await self._model.websocket(ws)
260
- await _safe_close_websocket(ws, status_code=1000, reason=None)
260
+ await _safe_close_websocket(ws, None, status_code=1000)
261
261
  except WebSocketDisconnect as ws_error:
262
262
  logging.info(
263
263
  f"Client terminated websocket connection: `{ws_error}`."
264
264
  )
265
265
  except Exception:
266
266
  await _safe_close_websocket(
267
- ws,
268
- status_code=errors.WEBSOCKET_SERVER_ERROR_CODE,
269
- reason=errors.MODEL_ERROR_MESSAGE,
267
+ ws, errors.MODEL_ERROR_MESSAGE, status_code=1011
270
268
  )
271
269
  raise # Re raise to let `intercept_exceptions` deal with it.
272
270
 
@@ -141,9 +141,11 @@ ENTRYPOINT ["/control/.env/bin/python", "/control/control/server.py"]
141
141
 
142
142
  {%- else %} {#- else (default inference server) #}
143
143
  ENV INFERENCE_SERVER_PORT="8080"
144
- ENV SERVER_START_CMD="{{ python_executable }} /app/main.py"
144
+ ENV SERVER_START_CMD="/app/entrypoint.sh {{ python_executable }} /app/main.py"
145
+ COPY --chown={{ default_owner }} ./server/entrypoint.sh /app/entrypoint.sh
146
+ RUN chmod +x /app/entrypoint.sh
145
147
  {{ chown_and_switch_to_regular_user_if_enabled() }}
146
- ENTRYPOINT ["{{ python_executable }}", "/app/main.py"]
148
+ ENTRYPOINT ["/app/entrypoint.sh", "{{ python_executable }}", "/app/main.py"]
147
149
  {%- endif %} {#- endif config.docker_server / live_reload #}
148
150
 
149
151
  {% endblock %} {#- endblock run #}
@@ -584,7 +584,7 @@ def test_get_checkpoint_ids_to_deploy_full_checkpoints():
584
584
  mock_checkbox.assert_called_once()
585
585
  assert (
586
586
  mock_checkbox.call_args[1]["message"]
587
- == "Use spacebar to select/deselect checkpoints to deploy. Press enter when done."
587
+ == "Select the checkpoint to deploy. Use spacebar to select/deselect."
588
588
  )
589
589
  assert mock_checkbox.call_args[1]["choices"] == checkpoint_options
590
590
 
@@ -621,7 +621,7 @@ def test_get_checkpoint_ids_to_deploy_lora_checkpoints():
621
621
  mock_checkbox.assert_called_once()
622
622
  assert (
623
623
  mock_checkbox.call_args[1]["message"]
624
- == "Use spacebar to select/deselect checkpoints to deploy. Press enter when done."
624
+ == "Select the checkpoint to deploy. Use spacebar to select/deselect."
625
625
  )
626
626
  assert mock_checkbox.call_args[1]["choices"] == checkpoint_options
627
627
 
@@ -656,7 +656,7 @@ def test_get_checkpoint_ids_to_deploy_mixed_checkpoints():
656
656
  mock_checkbox.assert_called_once()
657
657
  assert (
658
658
  mock_checkbox.call_args[1]["message"]
659
- == "Use spacebar to select/deselect checkpoints to deploy. Press enter when done."
659
+ == "Select the checkpoint to deploy. Use spacebar to select/deselect."
660
660
  )
661
661
  assert mock_checkbox.call_args[1]["choices"] == checkpoint_options
662
662