truss 0.10.0rc1__py3-none-any.whl → 0.60.0__py3-none-any.whl

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 (362) hide show
  1. truss/__init__.py +10 -3
  2. truss/api/__init__.py +123 -0
  3. truss/api/definitions.py +51 -0
  4. truss/base/constants.py +116 -0
  5. truss/base/custom_types.py +29 -0
  6. truss/{errors.py → base/errors.py} +4 -0
  7. truss/base/trt_llm_config.py +310 -0
  8. truss/{truss_config.py → base/truss_config.py} +344 -31
  9. truss/{truss_spec.py → base/truss_spec.py} +20 -6
  10. truss/{validation.py → base/validation.py} +60 -11
  11. truss/cli/cli.py +841 -88
  12. truss/{remote → cli}/remote_cli.py +2 -7
  13. truss/contexts/docker_build_setup.py +67 -0
  14. truss/contexts/image_builder/cache_warmer.py +2 -8
  15. truss/contexts/image_builder/image_builder.py +1 -1
  16. truss/contexts/image_builder/serving_image_builder.py +292 -46
  17. truss/contexts/image_builder/util.py +1 -3
  18. truss/contexts/local_loader/docker_build_emulator.py +58 -0
  19. truss/contexts/local_loader/load_model_local.py +2 -2
  20. truss/contexts/local_loader/truss_module_loader.py +1 -1
  21. truss/contexts/local_loader/utils.py +1 -1
  22. truss/local/local_config.py +2 -6
  23. truss/local/local_config_handler.py +20 -5
  24. truss/patch/__init__.py +1 -0
  25. truss/patch/hash.py +4 -70
  26. truss/patch/signature.py +4 -16
  27. truss/patch/truss_dir_patch_applier.py +3 -78
  28. truss/remote/baseten/api.py +308 -23
  29. truss/remote/baseten/auth.py +3 -3
  30. truss/remote/baseten/core.py +257 -50
  31. truss/remote/baseten/custom_types.py +44 -0
  32. truss/remote/baseten/error.py +4 -0
  33. truss/remote/baseten/remote.py +369 -118
  34. truss/remote/baseten/service.py +118 -11
  35. truss/remote/baseten/utils/status.py +29 -0
  36. truss/remote/baseten/utils/tar.py +34 -22
  37. truss/remote/baseten/utils/transfer.py +36 -23
  38. truss/remote/remote_factory.py +14 -5
  39. truss/remote/truss_remote.py +72 -45
  40. truss/templates/base.Dockerfile.jinja +18 -16
  41. truss/templates/cache.Dockerfile.jinja +3 -3
  42. truss/{server → templates/control}/control/application.py +14 -35
  43. truss/{server → templates/control}/control/endpoints.py +39 -9
  44. truss/{server/control/patch/types.py → templates/control/control/helpers/custom_types.py} +13 -52
  45. truss/{server → templates/control}/control/helpers/inference_server_controller.py +4 -8
  46. truss/{server → templates/control}/control/helpers/inference_server_process_controller.py +2 -4
  47. truss/{server → templates/control}/control/helpers/inference_server_starter.py +5 -10
  48. truss/{server/control → templates/control/control/helpers}/truss_patch/model_code_patch_applier.py +8 -6
  49. truss/{server/control/patch → templates/control/control/helpers/truss_patch}/model_container_patch_applier.py +18 -26
  50. truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +66 -0
  51. truss/{server → templates/control}/control/server.py +11 -6
  52. truss/templates/control/requirements.txt +9 -0
  53. truss/templates/custom_python_dx/my_model.py +28 -0
  54. truss/templates/docker_server/proxy.conf.jinja +42 -0
  55. truss/templates/docker_server/supervisord.conf.jinja +27 -0
  56. truss/templates/docker_server_requirements.txt +1 -0
  57. truss/templates/server/common/errors.py +231 -0
  58. truss/{server → templates/server}/common/patches/whisper/patch.py +1 -0
  59. truss/{server/common/patches/__init__.py → templates/server/common/patches.py} +1 -3
  60. truss/{server → templates/server}/common/retry.py +1 -0
  61. truss/{server → templates/server}/common/schema.py +11 -9
  62. truss/templates/server/common/tracing.py +157 -0
  63. truss/templates/server/main.py +9 -0
  64. truss/templates/server/model_wrapper.py +961 -0
  65. truss/templates/server/requirements.txt +21 -0
  66. truss/templates/server/truss_server.py +447 -0
  67. truss/templates/server.Dockerfile.jinja +62 -14
  68. truss/templates/shared/dynamic_config_resolver.py +28 -0
  69. truss/templates/shared/lazy_data_resolver.py +164 -0
  70. truss/templates/shared/log_config.py +125 -0
  71. truss/{server → templates}/shared/secrets_resolver.py +1 -2
  72. truss/{server → templates}/shared/serialization.py +31 -9
  73. truss/{server → templates}/shared/util.py +3 -13
  74. truss/templates/trtllm-audio/model/model.py +49 -0
  75. truss/templates/trtllm-audio/packages/sigint_patch.py +14 -0
  76. truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +215 -0
  77. truss/templates/trtllm-audio/packages/whisper_trt/assets.py +25 -0
  78. truss/templates/trtllm-audio/packages/whisper_trt/batching.py +52 -0
  79. truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +26 -0
  80. truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +184 -0
  81. truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +185 -0
  82. truss/templates/trtllm-audio/packages/whisper_trt/utils.py +245 -0
  83. truss/templates/trtllm-briton/src/extension.py +64 -0
  84. truss/tests/conftest.py +302 -94
  85. truss/tests/contexts/image_builder/test_serving_image_builder.py +74 -31
  86. truss/tests/contexts/local_loader/test_load_local.py +2 -2
  87. truss/tests/contexts/local_loader/test_truss_module_finder.py +1 -1
  88. truss/tests/patch/test_calc_patch.py +439 -127
  89. truss/tests/patch/test_dir_signature.py +3 -12
  90. truss/tests/patch/test_hash.py +1 -1
  91. truss/tests/patch/test_signature.py +1 -1
  92. truss/tests/patch/test_truss_dir_patch_applier.py +23 -11
  93. truss/tests/patch/test_types.py +2 -2
  94. truss/tests/remote/baseten/test_api.py +153 -58
  95. truss/tests/remote/baseten/test_auth.py +2 -1
  96. truss/tests/remote/baseten/test_core.py +160 -12
  97. truss/tests/remote/baseten/test_remote.py +489 -77
  98. truss/tests/remote/baseten/test_service.py +55 -0
  99. truss/tests/remote/test_remote_factory.py +16 -18
  100. truss/tests/remote/test_truss_remote.py +26 -17
  101. truss/tests/templates/control/control/helpers/test_context_managers.py +11 -0
  102. truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +184 -0
  103. truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +89 -0
  104. truss/tests/{server → templates/control}/control/test_server.py +79 -24
  105. truss/tests/{server → templates/control}/control/test_server_integration.py +24 -16
  106. truss/tests/templates/core/server/test_dynamic_config_resolver.py +108 -0
  107. truss/tests/templates/core/server/test_lazy_data_resolver.py +329 -0
  108. truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +79 -0
  109. truss/tests/{server → templates}/core/server/test_secrets_resolver.py +1 -1
  110. truss/tests/{server → templates/server}/common/test_retry.py +3 -3
  111. truss/tests/templates/server/test_model_wrapper.py +248 -0
  112. truss/tests/{server → templates/server}/test_schema.py +3 -5
  113. truss/tests/{server/core/server/common → templates/server}/test_truss_server.py +8 -5
  114. truss/tests/test_build.py +9 -52
  115. truss/tests/test_config.py +336 -77
  116. truss/tests/test_context_builder_image.py +3 -11
  117. truss/tests/test_control_truss_patching.py +7 -12
  118. truss/tests/test_custom_server.py +38 -0
  119. truss/tests/test_data/context_builder_image_test/test.py +3 -0
  120. truss/tests/test_data/happy.ipynb +56 -0
  121. truss/tests/test_data/model_load_failure_test/config.yaml +2 -0
  122. truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
  123. truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
  124. truss/{test_data → tests/test_data}/patch_ping_test_server/app.py +3 -9
  125. truss/{test_data → tests/test_data}/server.Dockerfile +20 -21
  126. truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
  127. truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
  128. truss/{test_data → tests/test_data}/server_conformance_test_truss/model/model.py +1 -3
  129. truss/tests/test_data/test_async_truss/__init__.py +0 -0
  130. truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
  131. truss/tests/test_data/test_basic_truss/__init__.py +0 -0
  132. truss/tests/test_data/test_basic_truss/config.yaml +16 -0
  133. truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
  134. truss/tests/test_data/test_build_commands/__init__.py +0 -0
  135. truss/tests/test_data/test_build_commands/config.yaml +13 -0
  136. truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
  137. truss/{test_data/test_streaming_async_generator_truss → tests/test_data/test_build_commands}/model/model.py +2 -3
  138. truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
  139. truss/tests/test_data/test_build_commands_failure/config.yaml +14 -0
  140. truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
  141. truss/tests/test_data/test_build_commands_failure/model/model.py +17 -0
  142. truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
  143. truss/tests/test_data/test_concurrency_truss/config.yaml +4 -0
  144. truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
  145. truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
  146. truss/tests/test_data/test_custom_server_truss/config.yaml +20 -0
  147. truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +17 -0
  148. truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +10 -0
  149. truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +1 -0
  150. truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
  151. truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +19 -0
  152. truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +6 -0
  153. truss/tests/test_data/test_openai/__init__.py +0 -0
  154. truss/{test_data/test_basic_truss → tests/test_data/test_openai}/config.yaml +1 -2
  155. truss/tests/test_data/test_openai/model/__init__.py +0 -0
  156. truss/tests/test_data/test_openai/model/model.py +15 -0
  157. truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
  158. truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
  159. truss/tests/test_data/test_pyantic_v1/model/model.py +28 -0
  160. truss/tests/test_data/test_pyantic_v1/requirements.txt +1 -0
  161. truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
  162. truss/tests/test_data/test_pyantic_v2/config.yaml +13 -0
  163. truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
  164. truss/tests/test_data/test_pyantic_v2/model/model.py +30 -0
  165. truss/tests/test_data/test_pyantic_v2/requirements.txt +1 -0
  166. truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
  167. truss/tests/test_data/test_requirements_file_truss/config.yaml +13 -0
  168. truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
  169. truss/{test_data → tests/test_data}/test_requirements_file_truss/model/model.py +1 -0
  170. truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
  171. truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +4 -0
  172. truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
  173. truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +7 -0
  174. truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
  175. truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
  176. truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
  177. truss/tests/test_data/test_streaming_truss/config.yaml +4 -0
  178. truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
  179. truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
  180. truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
  181. truss/{test_data → tests/test_data}/test_streaming_truss_with_error/model/model.py +3 -11
  182. truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
  183. truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +5 -0
  184. truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +2 -0
  185. truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
  186. truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +43 -0
  187. truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
  188. truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +65 -0
  189. truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
  190. truss/tests/test_data/test_trt_llm_truss/config.yaml +15 -0
  191. truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
  192. truss/tests/test_data/test_trt_llm_truss/model/model.py +15 -0
  193. truss/tests/test_data/test_truss/__init__.py +0 -0
  194. truss/tests/test_data/test_truss/config.yaml +4 -0
  195. truss/tests/test_data/test_truss/model/__init__.py +0 -0
  196. truss/tests/test_data/test_truss/model/dummy +0 -0
  197. truss/tests/test_data/test_truss/packages/__init__.py +0 -0
  198. truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
  199. truss/tests/test_data/test_truss_server_caching_truss/__init__.py +0 -0
  200. truss/tests/test_data/test_truss_server_caching_truss/model/__init__.py +0 -0
  201. truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
  202. truss/tests/test_data/test_truss_with_error/config.yaml +4 -0
  203. truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
  204. truss/tests/test_data/test_truss_with_error/model/model.py +8 -0
  205. truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
  206. truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +5 -0
  207. truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +2 -0
  208. truss/tests/test_docker.py +2 -1
  209. truss/tests/test_model_inference.py +1340 -292
  210. truss/tests/test_model_schema.py +33 -26
  211. truss/tests/test_testing_utilities_for_other_tests.py +50 -5
  212. truss/tests/test_truss_gatherer.py +3 -5
  213. truss/tests/test_truss_handle.py +62 -59
  214. truss/tests/test_util.py +2 -1
  215. truss/tests/test_validation.py +15 -13
  216. truss/tests/trt_llm/test_trt_llm_config.py +41 -0
  217. truss/tests/trt_llm/test_validation.py +91 -0
  218. truss/tests/util/test_config_checks.py +40 -0
  219. truss/tests/util/test_env_vars.py +14 -0
  220. truss/tests/util/test_path.py +10 -23
  221. truss/trt_llm/config_checks.py +43 -0
  222. truss/trt_llm/validation.py +42 -0
  223. truss/truss_handle/__init__.py +0 -0
  224. truss/truss_handle/build.py +122 -0
  225. truss/{decorators.py → truss_handle/decorators.py} +1 -1
  226. truss/truss_handle/patch/__init__.py +0 -0
  227. truss/{patch → truss_handle/patch}/calc_patch.py +146 -92
  228. truss/{types.py → truss_handle/patch/custom_types.py} +35 -27
  229. truss/{patch → truss_handle/patch}/dir_signature.py +1 -1
  230. truss/truss_handle/patch/hash.py +71 -0
  231. truss/{patch → truss_handle/patch}/local_truss_patch_applier.py +6 -4
  232. truss/truss_handle/patch/signature.py +22 -0
  233. truss/truss_handle/patch/truss_dir_patch_applier.py +87 -0
  234. truss/{readme_generator.py → truss_handle/readme_generator.py} +3 -2
  235. truss/{truss_gatherer.py → truss_handle/truss_gatherer.py} +3 -2
  236. truss/{truss_handle.py → truss_handle/truss_handle.py} +174 -78
  237. truss/util/.truss_ignore +3 -0
  238. truss/{docker.py → util/docker.py} +6 -2
  239. truss/util/download.py +6 -15
  240. truss/util/env_vars.py +41 -0
  241. truss/util/log_utils.py +52 -0
  242. truss/util/path.py +20 -20
  243. truss/util/requirements.py +11 -0
  244. {truss-0.10.0rc1.dist-info → truss-0.60.0.dist-info}/METADATA +18 -16
  245. truss-0.60.0.dist-info/RECORD +324 -0
  246. {truss-0.10.0rc1.dist-info → truss-0.60.0.dist-info}/WHEEL +1 -1
  247. truss-0.60.0.dist-info/entry_points.txt +4 -0
  248. truss_chains/__init__.py +71 -0
  249. truss_chains/definitions.py +756 -0
  250. truss_chains/deployment/__init__.py +0 -0
  251. truss_chains/deployment/code_gen.py +816 -0
  252. truss_chains/deployment/deployment_client.py +871 -0
  253. truss_chains/framework.py +1480 -0
  254. truss_chains/public_api.py +231 -0
  255. truss_chains/py.typed +0 -0
  256. truss_chains/pydantic_numpy.py +131 -0
  257. truss_chains/reference_code/reference_chainlet.py +34 -0
  258. truss_chains/reference_code/reference_model.py +10 -0
  259. truss_chains/remote_chainlet/__init__.py +0 -0
  260. truss_chains/remote_chainlet/model_skeleton.py +60 -0
  261. truss_chains/remote_chainlet/stub.py +380 -0
  262. truss_chains/remote_chainlet/utils.py +332 -0
  263. truss_chains/streaming.py +378 -0
  264. truss_chains/utils.py +178 -0
  265. CODE_OF_CONDUCT.md +0 -131
  266. CONTRIBUTING.md +0 -48
  267. README.md +0 -137
  268. context_builder.Dockerfile +0 -24
  269. truss/blob/blob_backend.py +0 -10
  270. truss/blob/blob_backend_registry.py +0 -23
  271. truss/blob/http_public_blob_backend.py +0 -23
  272. truss/build/__init__.py +0 -2
  273. truss/build/build.py +0 -143
  274. truss/build/configure.py +0 -63
  275. truss/cli/__init__.py +0 -2
  276. truss/cli/console.py +0 -5
  277. truss/cli/create.py +0 -5
  278. truss/config/trt_llm.py +0 -81
  279. truss/constants.py +0 -61
  280. truss/model_inference.py +0 -123
  281. truss/patch/types.py +0 -30
  282. truss/pytest.ini +0 -7
  283. truss/server/common/errors.py +0 -100
  284. truss/server/common/termination_handler_middleware.py +0 -64
  285. truss/server/common/truss_server.py +0 -389
  286. truss/server/control/patch/model_code_patch_applier.py +0 -46
  287. truss/server/control/patch/requirement_name_identifier.py +0 -17
  288. truss/server/inference_server.py +0 -29
  289. truss/server/model_wrapper.py +0 -434
  290. truss/server/shared/logging.py +0 -81
  291. truss/templates/trtllm/model/model.py +0 -97
  292. truss/templates/trtllm/packages/build_engine_utils.py +0 -34
  293. truss/templates/trtllm/packages/constants.py +0 -11
  294. truss/templates/trtllm/packages/schema.py +0 -216
  295. truss/templates/trtllm/packages/tensorrt_llm_model_repository/ensemble/config.pbtxt +0 -246
  296. truss/templates/trtllm/packages/tensorrt_llm_model_repository/postprocessing/1/model.py +0 -181
  297. truss/templates/trtllm/packages/tensorrt_llm_model_repository/postprocessing/config.pbtxt +0 -64
  298. truss/templates/trtllm/packages/tensorrt_llm_model_repository/preprocessing/1/model.py +0 -260
  299. truss/templates/trtllm/packages/tensorrt_llm_model_repository/preprocessing/config.pbtxt +0 -99
  300. truss/templates/trtllm/packages/tensorrt_llm_model_repository/tensorrt_llm/config.pbtxt +0 -208
  301. truss/templates/trtllm/packages/triton_client.py +0 -150
  302. truss/templates/trtllm/packages/utils.py +0 -43
  303. truss/test_data/context_builder_image_test/test.py +0 -4
  304. truss/test_data/happy.ipynb +0 -54
  305. truss/test_data/model_load_failure_test/config.yaml +0 -2
  306. truss/test_data/test_concurrency_truss/config.yaml +0 -2
  307. truss/test_data/test_streaming_async_generator_truss/config.yaml +0 -2
  308. truss/test_data/test_streaming_truss/config.yaml +0 -3
  309. truss/test_data/test_truss/config.yaml +0 -2
  310. truss/tests/server/common/test_termination_handler_middleware.py +0 -93
  311. truss/tests/server/control/test_model_container_patch_applier.py +0 -203
  312. truss/tests/server/core/server/common/test_util.py +0 -19
  313. truss/tests/server/test_model_wrapper.py +0 -87
  314. truss/util/data_structures.py +0 -16
  315. truss-0.10.0rc1.dist-info/RECORD +0 -216
  316. truss-0.10.0rc1.dist-info/entry_points.txt +0 -3
  317. truss/{server/shared → base}/__init__.py +0 -0
  318. truss/{server → templates/control}/control/helpers/context_managers.py +0 -0
  319. truss/{server/control → templates/control/control/helpers}/errors.py +0 -0
  320. truss/{server/control/patch → templates/control/control/helpers/truss_patch}/__init__.py +0 -0
  321. truss/{server/control/patch → templates/control/control/helpers/truss_patch}/system_packages.py +0 -0
  322. truss/{test_data/annotated_types_truss/model → templates/server}/__init__.py +0 -0
  323. truss/{server → templates/server}/common/__init__.py +0 -0
  324. truss/{test_data/gcs_fix/model → templates/shared}/__init__.py +0 -0
  325. truss/templates/{trtllm → trtllm-briton}/README.md +0 -0
  326. truss/{test_data/server_conformance_test_truss/model → tests/test_data}/__init__.py +0 -0
  327. truss/{test_data/test_basic_truss/model → tests/test_data/annotated_types_truss}/__init__.py +0 -0
  328. truss/{test_data → tests/test_data}/annotated_types_truss/config.yaml +0 -0
  329. truss/{test_data/test_requirements_file_truss → tests/test_data/annotated_types_truss}/model/__init__.py +0 -0
  330. truss/{test_data → tests/test_data}/annotated_types_truss/model/model.py +0 -0
  331. truss/{test_data → tests/test_data}/auto-mpg.data +0 -0
  332. truss/{test_data → tests/test_data}/context_builder_image_test/Dockerfile +0 -0
  333. truss/{test_data/test_truss/model → tests/test_data/context_builder_image_test}/__init__.py +0 -0
  334. truss/{test_data/test_truss_server_caching_truss/model → tests/test_data/gcs_fix}/__init__.py +0 -0
  335. truss/{test_data → tests/test_data}/gcs_fix/config.yaml +0 -0
  336. truss/tests/{local → test_data/gcs_fix/model}/__init__.py +0 -0
  337. truss/{test_data → tests/test_data}/gcs_fix/model/model.py +0 -0
  338. truss/{test_data/test_truss/model/dummy → tests/test_data/model_load_failure_test/__init__.py} +0 -0
  339. truss/{test_data → tests/test_data}/model_load_failure_test/model/model.py +0 -0
  340. truss/{test_data → tests/test_data}/pima-indians-diabetes.csv +0 -0
  341. truss/{test_data → tests/test_data}/readme_int_example.md +0 -0
  342. truss/{test_data → tests/test_data}/readme_no_example.md +0 -0
  343. truss/{test_data → tests/test_data}/readme_str_example.md +0 -0
  344. truss/{test_data → tests/test_data}/server_conformance_test_truss/config.yaml +0 -0
  345. truss/{test_data → tests/test_data}/test_async_truss/config.yaml +0 -0
  346. truss/{test_data → tests/test_data}/test_async_truss/model/model.py +3 -3
  347. /truss/{test_data → tests/test_data}/test_basic_truss/model/model.py +0 -0
  348. /truss/{test_data → tests/test_data}/test_concurrency_truss/model/model.py +0 -0
  349. /truss/{test_data/test_requirements_file_truss → tests/test_data/test_pyantic_v1}/config.yaml +0 -0
  350. /truss/{test_data → tests/test_data}/test_requirements_file_truss/requirements.txt +0 -0
  351. /truss/{test_data → tests/test_data}/test_streaming_read_timeout/config.yaml +0 -0
  352. /truss/{test_data → tests/test_data}/test_streaming_read_timeout/model/model.py +0 -0
  353. /truss/{test_data → tests/test_data}/test_streaming_truss/model/model.py +0 -0
  354. /truss/{test_data → tests/test_data}/test_streaming_truss_with_error/config.yaml +0 -0
  355. /truss/{test_data → tests/test_data}/test_truss/examples.yaml +0 -0
  356. /truss/{test_data → tests/test_data}/test_truss/model/model.py +0 -0
  357. /truss/{test_data → tests/test_data}/test_truss/packages/test_package/test.py +0 -0
  358. /truss/{test_data → tests/test_data}/test_truss_server_caching_truss/config.yaml +0 -0
  359. /truss/{test_data → tests/test_data}/test_truss_server_caching_truss/model/model.py +0 -0
  360. /truss/{patch → truss_handle/patch}/constants.py +0 -0
  361. /truss/{notebook.py → util/notebook.py} +0 -0
  362. {truss-0.10.0rc1.dist-info → truss-0.60.0.dist-info}/LICENSE +0 -0
@@ -0,0 +1,40 @@
1
+ from unittest.mock import patch
2
+
3
+ import pytest
4
+ from truss.base.constants import TRTLLM_MIN_MEMORY_REQUEST_GI
5
+ from truss.trt_llm.config_checks import (
6
+ is_missing_secrets_for_trt_llm_builder,
7
+ memory_updated_for_trt_llm_builder,
8
+ )
9
+ from truss.truss_handle.truss_handle import TrussHandle
10
+
11
+
12
+ @patch("truss.trt_llm.config_checks._is_model_public")
13
+ @pytest.mark.parametrize(
14
+ "has_secret, is_model_public, expected_result",
15
+ [
16
+ (False, False, True),
17
+ (False, True, False),
18
+ (True, False, False),
19
+ (True, True, False),
20
+ ],
21
+ )
22
+ def test_is_missing_secrets_for_trt_llm_builder(
23
+ _is_model_public_mock,
24
+ has_secret,
25
+ is_model_public,
26
+ expected_result,
27
+ custom_model_trt_llm,
28
+ ):
29
+ _is_model_public_mock.return_value = is_model_public
30
+ handle = TrussHandle(custom_model_trt_llm)
31
+ if has_secret:
32
+ handle.add_secret("hf_access_token")
33
+ assert is_missing_secrets_for_trt_llm_builder(handle) == expected_result
34
+
35
+
36
+ def test_check_and_update_memory_for_trt_llm_builder(custom_model_trt_llm):
37
+ handle = TrussHandle(custom_model_trt_llm)
38
+ assert memory_updated_for_trt_llm_builder(handle)
39
+ assert handle.spec.memory == f"{TRTLLM_MIN_MEMORY_REQUEST_GI}Gi"
40
+ assert handle.spec.memory_in_bytes == TRTLLM_MIN_MEMORY_REQUEST_GI * 1024**3
@@ -0,0 +1,14 @@
1
+ import os
2
+
3
+ from truss.util.env_vars import override_env_vars
4
+
5
+
6
+ def test_override_env_vars():
7
+ os.environ["API_KEY"] = "original_key"
8
+
9
+ with override_env_vars({"API_KEY": "new_key", "DEBUG": "true"}):
10
+ assert os.environ["API_KEY"] == "new_key"
11
+ assert os.environ["DEBUG"] == "true"
12
+
13
+ assert os.environ["API_KEY"] == "original_key"
14
+ assert "DEBUG" not in os.environ
@@ -3,10 +3,10 @@ import tempfile
3
3
  import time
4
4
  from pathlib import Path
5
5
 
6
- from truss import load
7
6
  from truss.contexts.image_builder.serving_image_builder import (
8
7
  ServingImageBuilderContext,
9
8
  )
9
+ from truss.truss_handle.build import load
10
10
  from truss.util import path
11
11
 
12
12
 
@@ -43,7 +43,7 @@ def test_copy_tree_path_with_hidden_files(custom_model_truss_dir_with_hidden_fil
43
43
  with path.given_or_temporary_dir() as dir:
44
44
  path.copy_tree_path(custom_model_truss_dir_with_hidden_files, dir)
45
45
 
46
- assert not (dir / "__pycache__" / "test.cpython-38.pyc").exists()
46
+ assert not (dir / "__pycache__" / "test.cpython-311.pyc").exists()
47
47
  assert not (dir / ".DS_Store").exists()
48
48
  assert not (dir / ".git").exists()
49
49
  assert (dir / "model").exists()
@@ -56,7 +56,7 @@ def test_is_ignored(custom_model_truss_dir_with_hidden_files):
56
56
  assert path.is_ignored(
57
57
  custom_model_truss_dir_with_hidden_files
58
58
  / "__pycache__"
59
- / "test.cpython-38.pyc",
59
+ / "test.cpython-311.pyc",
60
60
  patterns,
61
61
  )
62
62
 
@@ -116,9 +116,7 @@ def test_is_ignored_with_base_dir(custom_model_truss_dir_with_hidden_files):
116
116
  )
117
117
 
118
118
 
119
- def test_ignored_files_in_docker_context(
120
- custom_model_truss_dir_with_hidden_files,
121
- ):
119
+ def test_ignored_files_in_docker_context(custom_model_truss_dir_with_hidden_files):
122
120
  tr = load(custom_model_truss_dir_with_hidden_files)
123
121
 
124
122
  with path.given_or_temporary_dir() as dir:
@@ -127,7 +125,7 @@ def test_ignored_files_in_docker_context(
127
125
 
128
126
  assert dir.exists()
129
127
 
130
- assert not (dir / "__pycache__" / "test.cpython-38.pyc").exists()
128
+ assert not (dir / "__pycache__" / "test.cpython-311.pyc").exists()
131
129
  assert not (dir / ".DS_Store").exists()
132
130
  assert not (dir / ".git").exists()
133
131
  assert (dir / "model").exists()
@@ -135,7 +133,7 @@ def test_ignored_files_in_docker_context(
135
133
  assert (
136
134
  custom_model_truss_dir_with_hidden_files
137
135
  / "__pycache__"
138
- / "test.cpython-38.pyc"
136
+ / "test.cpython-311.pyc"
139
137
  ).exists()
140
138
  assert (custom_model_truss_dir_with_hidden_files / ".DS_Store").exists()
141
139
  assert (custom_model_truss_dir_with_hidden_files / ".git").exists()
@@ -159,13 +157,7 @@ def test_copy_tree_path_with_truss_ignore(custom_model_truss_dir_with_truss_igno
159
157
 
160
158
 
161
159
  def test_get_ignored_relative_paths():
162
- ignore_patterns = [
163
- ".mypy_cache/",
164
- "venv/",
165
- "*.tmp",
166
- ".git",
167
- "data/*",
168
- ]
160
+ ignore_patterns = [".mypy_cache/", "venv/", "*.tmp", ".git", "data/*"]
169
161
 
170
162
  root_relative_paths = {
171
163
  ".mypy_cache/should_ignore.json",
@@ -174,7 +166,7 @@ def test_get_ignored_relative_paths():
174
166
  ".git",
175
167
  ".git/HEAD",
176
168
  "data/should_ignore.txt",
177
- "data.txt" "config.yaml",
169
+ "data.txtconfig.yaml",
178
170
  "model/model.py",
179
171
  }
180
172
 
@@ -192,12 +184,7 @@ def test_get_ignored_relative_paths():
192
184
 
193
185
 
194
186
  def test_get_ignored_relative_paths_from_root(custom_model_truss_dir_with_hidden_files):
195
- ignore_patterns = [
196
- "__pycache__",
197
- ".DS_Store",
198
- ".git",
199
- "data/*",
200
- ]
187
+ ignore_patterns = ["__pycache__", ".DS_Store", ".git", "data/*"]
201
188
 
202
189
  unignored_relative_paths = path.get_unignored_relative_paths_from_root(
203
190
  custom_model_truss_dir_with_hidden_files, ignore_patterns
@@ -220,7 +207,7 @@ def test_get_ignored_relative_paths_from_root(custom_model_truss_dir_with_hidden
220
207
  )
221
208
  ignored_relative_paths_strs = {
222
209
  "__pycache__",
223
- "__pycache__/test.cpython-38.pyc",
210
+ "__pycache__/test.cpython-311.pyc",
224
211
  ".DS_Store",
225
212
  ".git",
226
213
  ".git/.test_file",
@@ -0,0 +1,43 @@
1
+ import requests
2
+ from truss.base.constants import (
3
+ HF_ACCESS_TOKEN_KEY,
4
+ HF_MODELS_API_URL,
5
+ TRTLLM_MIN_MEMORY_REQUEST_GI,
6
+ )
7
+ from truss.base.trt_llm_config import CheckpointSource
8
+ from truss.truss_handle.truss_handle import TrussHandle
9
+
10
+
11
+ def is_missing_secrets_for_trt_llm_builder(tr: TrussHandle) -> bool:
12
+ for trt_llm_build_config in tr.spec.config.parsed_trt_llm_build_configs:
13
+ source = trt_llm_build_config.checkpoint_repository.source
14
+ hf_model_id = trt_llm_build_config.checkpoint_repository.repo
15
+ if (
16
+ source == CheckpointSource.HF
17
+ and HF_ACCESS_TOKEN_KEY not in tr.spec.secrets
18
+ and not _is_model_public(hf_model_id)
19
+ ):
20
+ return True
21
+ return False
22
+
23
+
24
+ def memory_updated_for_trt_llm_builder(tr: TrussHandle) -> bool:
25
+ if uses_trt_llm_builder(tr):
26
+ if tr.spec.memory_in_bytes < TRTLLM_MIN_MEMORY_REQUEST_GI * 1024**3:
27
+ tr.spec.config.resources.memory = f"{TRTLLM_MIN_MEMORY_REQUEST_GI}Gi"
28
+ tr.spec.config.write_to_yaml_file(tr.spec.config_path, verbose=False)
29
+ return True
30
+ return False
31
+
32
+
33
+ def _is_model_public(model_id: str) -> bool:
34
+ """Validate that a huggingface hub model is public.
35
+
36
+ The hf hub API will return 401 when trying to access a private or gated model without auth.
37
+ """
38
+ response = requests.get(f"{HF_MODELS_API_URL}/{model_id}")
39
+ return response.status_code == 200
40
+
41
+
42
+ def uses_trt_llm_builder(tr: TrussHandle) -> bool:
43
+ return tr.spec.config.trt_llm is not None
@@ -0,0 +1,42 @@
1
+ import ast
2
+
3
+ from truss.base.errors import ValidationError
4
+ from truss.base.truss_spec import TrussSpec
5
+
6
+
7
+ def validate(truss_spec: TrussSpec):
8
+ model_class_filepath = truss_spec.model_class_filepath
9
+ if not model_class_filepath.exists():
10
+ # It's ok if model class file is not provided,
11
+ # trt_llm will generate one.
12
+ return
13
+
14
+ source = model_class_filepath.read_text()
15
+ _verify_has_class_init_arg(source, truss_spec.model_class_name, "trt_llm")
16
+
17
+
18
+ def _verify_has_class_init_arg(source: str, class_name: str, arg_name: str):
19
+ tree = ast.parse(source)
20
+ model_class_init_found = False
21
+ for node in tree.body:
22
+ if isinstance(node, ast.ClassDef) and node.name == class_name:
23
+ for child in node.body:
24
+ if child.name == "__init__": # type: ignore[attr-defined]
25
+ model_class_init_found = True
26
+ arg_found = False
27
+ for arg in child.args.args: # type: ignore[attr-defined]
28
+ if arg.arg == arg_name:
29
+ arg_found = True
30
+ if not arg_found:
31
+ raise ValidationError(
32
+ (
33
+ "Model class `__init__` method is required to have `trt_llm` as an argument. Please add that argument.\n "
34
+ "Or if you want to use the automatically generated model class then remove the `model.py` file.\n "
35
+ "Refer to https://docs.baseten.co/performance/engine-builder-customization for details on engine object usage."
36
+ )
37
+ )
38
+
39
+ if not model_class_init_found:
40
+ raise ValidationError(
41
+ "Model class does not have an `__init__` method; when using `trt_llm` it is required"
42
+ )
File without changes
@@ -0,0 +1,122 @@
1
+ import logging
2
+ import os
3
+ import sys
4
+ from pathlib import Path
5
+ from typing import Optional, Union
6
+
7
+ import yaml
8
+
9
+ from truss.base.constants import (
10
+ CONFIG_FILE,
11
+ PYTHON_DX_CUSTOM_TEMPLATE_DIR,
12
+ TRADITIONAL_CUSTOM_TEMPLATE_DIR,
13
+ )
14
+ from truss.base.truss_config import (
15
+ Build,
16
+ TrussConfig,
17
+ map_local_to_supported_python_version,
18
+ )
19
+ from truss.truss_handle.truss_handle import TrussHandle
20
+ from truss.util.notebook import is_notebook_or_ipython
21
+ from truss.util.path import copy_tree_path
22
+
23
+ logger: logging.Logger = logging.getLogger(__name__)
24
+
25
+ if is_notebook_or_ipython():
26
+ logger.setLevel(logging.INFO)
27
+ logger.addHandler(logging.StreamHandler(sys.stdout))
28
+
29
+
30
+ def _populate_traditional_target_directory(config: TrussConfig, dir_path: Path):
31
+ # Create data dir
32
+ (dir_path / config.data_dir).mkdir()
33
+
34
+ # Create bundled packages dir
35
+ # TODO: Drop by default
36
+ (dir_path / config.bundled_packages_dir).mkdir()
37
+
38
+ # Create model module dir
39
+ model_dir = dir_path / config.model_module_dir
40
+ copy_tree_path(TRADITIONAL_CUSTOM_TEMPLATE_DIR / "model", model_dir)
41
+
42
+ # Write config
43
+ with (dir_path / CONFIG_FILE).open("w") as config_file:
44
+ yaml.dump(config.to_dict(verbose=False), config_file)
45
+
46
+
47
+ def _populate_python_dx_target_directory(config: TrussConfig, dir_path: Path):
48
+ copy_tree_path(PYTHON_DX_CUSTOM_TEMPLATE_DIR, dir_path)
49
+
50
+ # Hack: We want to place the user provided model name into generated code. Until
51
+ # this gets more complicated, we rely on a brittle string replace. Eventually, we
52
+ # can consider moving to jinja templates.
53
+ model_file_path = dir_path / "my_model.py"
54
+ with open(model_file_path, "r") as f:
55
+ content = f.read()
56
+
57
+ assert config.model_name is not None
58
+ content = content.replace("{{ MODEL_NAME }}", config.model_name)
59
+ with open(model_file_path, "w") as f:
60
+ f.write(content)
61
+
62
+
63
+ def init_directory(
64
+ target_directory: Union[str, Path],
65
+ build_config: Optional[Build] = None,
66
+ model_name: Optional[str] = None,
67
+ python_config: bool = False,
68
+ ) -> Path:
69
+ """
70
+ Initialize an empty placeholder Truss. A Truss is a build context designed
71
+ to be built as a container locally or uploaded into a baseten serving
72
+ environment. This placeholder structure can be filled to represent ML
73
+ models.
74
+
75
+ Args:
76
+ target_directory: Absolute or relative path of the directory to create
77
+ Truss in. The directory is created if it doesn't exist.
78
+ """
79
+ config = TrussConfig(
80
+ model_name=model_name, python_version=map_local_to_supported_python_version()
81
+ )
82
+
83
+ if build_config:
84
+ config.build = build_config
85
+
86
+ target_directory_path = Path(target_directory)
87
+ target_directory_path.mkdir(parents=True, exist_ok=True)
88
+
89
+ if not python_config:
90
+ _populate_traditional_target_directory(
91
+ config=config, dir_path=target_directory_path
92
+ )
93
+ else:
94
+ _populate_python_dx_target_directory(
95
+ config=config, dir_path=target_directory_path
96
+ )
97
+
98
+ return target_directory_path
99
+
100
+
101
+ def load(truss_directory: Union[str, Path]) -> TrussHandle:
102
+ """Get a handle to a Truss. A Truss is a build context designed to be built
103
+ as a container locally or uploaded into a model serving environment.
104
+
105
+ Args:
106
+ truss_directory (str | Path): The local directory of an existing Truss
107
+ Returns:
108
+ TrussHandle
109
+ """
110
+ return TrussHandle(Path(truss_directory))
111
+
112
+
113
+ def cleanup() -> None:
114
+ """
115
+ Cleans up .truss directory.
116
+ """
117
+ build_folder_path = Path(Path.home(), ".truss")
118
+ if build_folder_path.exists():
119
+ for obj in build_folder_path.glob("**/*"):
120
+ if (not obj.name == "config.yaml") and (obj.is_file()):
121
+ os.remove(obj)
122
+ return
@@ -1,6 +1,6 @@
1
1
  def proxy_to_shadow_if_scattered(func):
2
2
  def wrapper(*args, **kwargs):
3
- from truss.truss_handle import TrussHandle
3
+ from truss.truss_handle.truss_handle import TrussHandle
4
4
 
5
5
  truss_handle = args[0]
6
6
  if not truss_handle.is_scattered():
File without changes