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,56 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 13,
6
+ "id": "7a4aad7e",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import random\n",
11
+ "import tempfile\n",
12
+ "\n",
13
+ "import numpy as np\n",
14
+ "import pandas as pd\n",
15
+ "from sklearn.linear_model import LogisticRegression\n",
16
+ "\n",
17
+ "import truss\n",
18
+ "\n",
19
+ "# 10 rows of 10 features\n",
20
+ "features = random.choices(range(10), k=10)\n",
21
+ "values = np.random.randint(0, 100, size=(10, 10))\n",
22
+ "\n",
23
+ "df = pd.DataFrame(values, columns=features)\n",
24
+ "\n",
25
+ "lr = LogisticRegression(random_state=0, max_iter=1000)\n",
26
+ "lr.fit(df.values, df.iloc[:, 0])\n",
27
+ "\n",
28
+ "with tempfile.TemporaryDirectory() as tmp:\n",
29
+ " tr = truss.create(lr, target_directory=tmp)\n",
30
+ "\n",
31
+ " assert truss.load(tmp).spec.yaml_string == tr.spec.yaml_string"
32
+ ]
33
+ }
34
+ ],
35
+ "metadata": {
36
+ "kernelspec": {
37
+ "display_name": "Python 3 (ipykernel)",
38
+ "language": "python",
39
+ "name": "python3"
40
+ },
41
+ "language_info": {
42
+ "codemirror_mode": {
43
+ "name": "ipython",
44
+ "version": 3
45
+ },
46
+ "file_extension": ".py",
47
+ "mimetype": "text/x-python",
48
+ "name": "python",
49
+ "nbconvert_exporter": "python",
50
+ "pygments_lexer": "ipython3",
51
+ "version": "3.9.9"
52
+ }
53
+ },
54
+ "nbformat": 4,
55
+ "nbformat_minor": 5
56
+ }
@@ -0,0 +1,2 @@
1
+ model_name: Test Load Failure
2
+ python_version: py39
@@ -22,9 +22,7 @@ def _inc_fn_call_stat():
22
22
  @app.route("/hash_is_current", methods=["POST"])
23
23
  def hash_is_current():
24
24
  _inc_fn_call_stat()
25
- return {
26
- "is_current": True,
27
- }
25
+ return {"is_current": True}
28
26
 
29
27
 
30
28
  @app.route("/hash_is_current_but_only_every_third_call_succeeds", methods=["POST"])
@@ -33,18 +31,14 @@ def hash_is_current_but_only_every_third_call_succeeds():
33
31
  global _stats
34
32
  fn_name = inspect.stack()[0][3]
35
33
  if _stats[f"{fn_name}_called_count"] % 3 == 0:
36
- return {
37
- "is_current": True,
38
- }
34
+ return {"is_current": True}
39
35
  return "simulated failure", 503
40
36
 
41
37
 
42
38
  @app.route("/accepted", methods=["POST"])
43
39
  def accepted():
44
40
  _inc_fn_call_stat()
45
- return {
46
- "accepted": True,
47
- }
41
+ return {"accepted": True}
48
42
 
49
43
 
50
44
  @app.route("/health")
@@ -1,27 +1,18 @@
1
1
  ARG PYVERSION=py39
2
- FROM baseten/truss-server-base:3.9-v0.4.3 as truss_server
2
+ FROM baseten/truss-server-base:3.9-v0.4.3 AS truss_server
3
3
 
4
- ENV PYTHON_EXECUTABLE /usr/local/bin/python3
5
- ENV JSON_LOG True
4
+ ENV PYTHON_EXECUTABLE="/usr/local/bin/python3"
6
5
 
7
6
  RUN grep -w 'ID=debian\|ID_LIKE=debian' /etc/os-release || { echo "ERROR: Supplied base image is not a debian image"; exit 1; }
8
- RUN $PYTHON_EXECUTABLE -c "import sys; sys.exit(0) if sys.version_info.major == 3 and sys.version_info.minor >=8 and sys.version_info.minor <=11 else sys.exit(1)" \
9
- || { echo "ERROR: Supplied base image does not have 3.8 <= python <= 3.11"; exit 1; }
7
+ RUN $PYTHON_EXECUTABLE -c "import sys; sys.exit(0) if sys.version_info.major == 3 and sys.version_info.minor >=8 and sys.version_info.minor <=12 else sys.exit(1)" \
8
+ || { echo "ERROR: Supplied base image does not have 3.8 <= python <= 3.12"; exit 1; }
10
9
 
11
10
  RUN pip install --upgrade pip --no-cache-dir \
12
11
  && rm -rf /root/.cache/pip
13
12
 
14
-
15
- # Always install the truss package
16
- COPY ./truss/ /lib/truss_pkg/truss
17
- COPY ./pyproject.toml /lib/truss_pkg/
18
- COPY ./README.md /lib/truss_pkg/
19
- RUN pip install /lib/truss_pkg --no-cache-dir && rm -rf /root/.cache/pip
20
-
21
-
22
13
  # If user base image is supplied in config, apply build commands from truss base image
23
- ENV PYTHONUNBUFFERED True
24
- ENV DEBIAN_FRONTEND=noninteractive
14
+ ENV PYTHONUNBUFFERED="True"
15
+ ENV DEBIAN_FRONTEND="noninteractive"
25
16
 
26
17
  RUN apt update && \
27
18
  apt install -y bash \
@@ -34,16 +25,24 @@ RUN apt update && \
34
25
  && apt-get clean -y \
35
26
  && rm -rf /var/lib/apt/lists/*
36
27
 
37
- ENV APP_HOME /app
28
+ COPY ./base_server_requirements.txt base_server_requirements.txt
29
+ RUN pip install -r base_server_requirements.txt --no-cache-dir && rm -rf /root/.cache/pip
30
+
31
+ COPY ./requirements.txt requirements.txt
32
+ RUN cat requirements.txt
33
+ RUN pip install -r requirements.txt --no-cache-dir && rm -rf /root/.cache/pip
34
+
35
+ ENV APP_HOME="/app"
38
36
  WORKDIR $APP_HOME
39
37
 
40
38
  # Copy data before code for better caching
41
39
  COPY ./data /app/data
42
- COPY ./model /app/model
40
+ COPY ./server /app
43
41
  COPY ./config.yaml /app/config.yaml
42
+ COPY ./model /app/model
44
43
 
45
- COPY ./packages /app/packages
44
+ COPY ./packages /packages
46
45
 
47
- ENV INFERENCE_SERVER_PORT 8080
48
- ENV SERVER_START_CMD="/usr/local/bin/python3 -m truss.server.inference_server"
49
- ENTRYPOINT ["/usr/local/bin/python3", "-m", "truss.server.inference_server"]
46
+ ENV INFERENCE_SERVER_PORT="8080"
47
+ ENV SERVER_START_CMD="/usr/local/bin/python3 /app/main.py"
48
+ ENTRYPOINT ["/usr/local/bin/python3", "/app/main.py"]
@@ -10,11 +10,9 @@ class Model:
10
10
  self._model = None
11
11
 
12
12
  def load(self):
13
- # Load model here and assign to self._model.
14
- print("Taking 20 seconds to load")
13
+ print("Starting loading over 20 seconds.")
15
14
  time.sleep(20)
16
15
 
17
16
  def predict(self, model_input: Any) -> Dict[str, List]:
18
- # Invoke model on model_input and calculate predictions here.
19
17
  print("Taking 20 seconds to predict")
20
18
  time.sleep(20)
File without changes
File without changes
@@ -0,0 +1,16 @@
1
+ environment_variables:
2
+ OTEL_TRACING_NDJSON_FILE: "/tmp/otel_traces.ndjson"
3
+ external_package_dirs: []
4
+ model_metadata: {}
5
+ model_name: basic truss
6
+ python_version: py39
7
+ requirements: []
8
+ resources:
9
+ accelerator: null
10
+ cpu: '1'
11
+ memory: 2Gi
12
+ use_gpu: false
13
+ secrets:
14
+ foo: "foo"
15
+ bar: "bar"
16
+ system_packages: []
File without changes
@@ -0,0 +1,13 @@
1
+ build_commands:
2
+ - mkdir example_dir
3
+ - cd example_dir && touch testing.py
4
+ model_metadata: {}
5
+ model_name: null
6
+ model_type: custom
7
+ python_version: py39
8
+ requirements: []
9
+ resources:
10
+ accelerator: null
11
+ cpu: 500m
12
+ memory: 512Mi
13
+ use_gpu: false
@@ -12,7 +12,6 @@ class Model:
12
12
  # Load model here and assign to self._model.
13
13
  pass
14
14
 
15
- async def predict(self, model_input: Any) -> Dict[str, List]:
15
+ def predict(self, model_input: Any) -> Dict[str, List]:
16
16
  # Invoke model on model_input and calculate predictions here.
17
- for i in range(5):
18
- yield str(i)
17
+ return {"predictions": [1, 2]}
@@ -0,0 +1,14 @@
1
+ build_commands:
2
+ - mkdir example_dir
3
+ - cd example_dir && touch testing.py
4
+ - haha lol
5
+ model_metadata: {}
6
+ model_name: null
7
+ model_type: custom
8
+ python_version: py39
9
+ requirements: []
10
+ resources:
11
+ accelerator: null
12
+ cpu: 500m
13
+ memory: 512Mi
14
+ use_gpu: false
@@ -0,0 +1,17 @@
1
+ from typing import Any, Dict, List
2
+
3
+
4
+ class Model:
5
+ def __init__(self, **kwargs) -> None:
6
+ self._data_dir = kwargs["data_dir"]
7
+ self._config = kwargs["config"]
8
+ self._secrets = kwargs["secrets"]
9
+ self._model = None
10
+
11
+ def load(self):
12
+ # Load model here and assign to self._model.
13
+ pass
14
+
15
+ def predict(self, model_input: Any) -> Dict[str, List]:
16
+ # Invoke model on model_input and calculate predictions here.
17
+ return {"predictions": [1, 2]}
@@ -0,0 +1,4 @@
1
+ runtime:
2
+ predict_concurrency: 2
3
+ environment_variables:
4
+ OTEL_TRACING_NDJSON_FILE: "/tmp/otel_traces.ndjson"
@@ -0,0 +1,20 @@
1
+ base_image:
2
+ image: baseten/fastapi-test:0.1.2
3
+ docker_server:
4
+ start_command: python main.py
5
+ predict_endpoint: /predict
6
+ server_port: 8000
7
+ readiness_endpoint: /
8
+ liveness_endpoint: /
9
+ resources:
10
+ accelerator: null
11
+ cpu: '1'
12
+ memory: 2Gi
13
+ use_gpu: false
14
+ model_name: Test Docker Server Truss
15
+ secrets:
16
+ hf_access_token: null
17
+ environment_variables:
18
+ HF_TOKEN: 123456
19
+ runtime:
20
+ predict_concurrency: 1
@@ -0,0 +1,17 @@
1
+ FROM python:3.11-slim
2
+
3
+ # Update package lists and install curl
4
+ RUN apt-get update && apt-get install -y curl
5
+
6
+ # Install pip dependencies
7
+ RUN pip install fastapi[standard]
8
+
9
+ # Copy the FastAPI application code
10
+ COPY app.py /home/app.py
11
+ COPY main.py /home/main.py
12
+
13
+ # Set the working directory
14
+ WORKDIR /home
15
+
16
+ # Command to run FastAPI directly
17
+ ENTRYPOINT ["python", "main.py"]
@@ -0,0 +1,10 @@
1
+ We built this minimal fastapi docker image to be used in integration test `test_custom_server_truss.py::test_custom_server_truss`
2
+
3
+ Steps to update testing docker image
4
+
5
+ 1. run `docker login`
6
+ 2. cd into this directory
7
+ 3. update version number in VERSION file
8
+ (before running the next step, make sure you meet with the [prerequisites](https://docs.docker.com/build/building/multi-platform/#prerequisites) here)
9
+ 4. run `sh build_upload_new_image.sh`
10
+ 5. update image tag to latest version in config.yaml
@@ -0,0 +1,19 @@
1
+ import os
2
+
3
+ from fastapi import FastAPI
4
+
5
+ app = FastAPI()
6
+
7
+
8
+ @app.get("/health")
9
+ async def health():
10
+ return {"message": "OK"}
11
+
12
+
13
+ @app.post("/predict")
14
+ async def root():
15
+ return {
16
+ "message": "Hello World",
17
+ "is_env_var_passed": os.environ.get("HF_TOKEN") is not None,
18
+ "is_secret_mounted": os.path.exists("/secrets/hf_access_token"),
19
+ }
@@ -0,0 +1,6 @@
1
+ # Read the version from the VERSION file
2
+ VERSION=$(cat VERSION)
3
+
4
+ docker buildx build --platform linux/amd64,linux/arm64 -f ./Dockerfile -t fastapi-test:$VERSION . || { echo "Failed to build the Docker image"; exit 1; }
5
+ docker tag fastapi-test:$VERSION baseten/fastapi-test:$VERSION || { echo "Failed to tag the Docker image."; exit 1; }
6
+ docker push baseten/fastapi-test:$VERSION || { echo "Failed to push the Docker image."; exit 1; }
File without changes
@@ -1,9 +1,8 @@
1
1
  environment_variables: {}
2
2
  external_package_dirs: []
3
3
  model_metadata: {}
4
- model_name: basic truss
4
+ model_name: Test OpenAI Compatibility
5
5
  python_version: py39
6
- requirements: []
7
6
  resources:
8
7
  accelerator: null
9
8
  cpu: '1'
File without changes
@@ -0,0 +1,15 @@
1
+ from typing import Dict
2
+
3
+
4
+ class Model:
5
+ def __init__(self, **kwargs):
6
+ pass
7
+
8
+ def chat_completions(self, input: Dict) -> str:
9
+ return "chat_completions"
10
+
11
+ def completions(self, input: Dict) -> str:
12
+ return "completions"
13
+
14
+ def predict(self, input: Dict) -> str:
15
+ return "predict"
File without changes
@@ -0,0 +1,28 @@
1
+ """
2
+ The `Model` class is an interface between the ML model that you're packaging and the model
3
+ server that you're running it on.
4
+
5
+ The main methods to implement here are:
6
+ * `load`: runs exactly once when the model server is spun up or patched and loads the
7
+ model onto the model server. Include any logic for initializing your model, such
8
+ as downloading model weights and loading the model into memory.
9
+ * `predict`: runs every time the model server is called. Include any logic for model
10
+ inference and return the model output.
11
+
12
+ See https://truss.baseten.co/quickstart for more.
13
+ """
14
+
15
+ import pydantic
16
+
17
+
18
+ class DummyData(pydantic.BaseModel):
19
+ foo: str
20
+ bar: int
21
+
22
+
23
+ class Model:
24
+ def __init__(self, **kwargs):
25
+ self._model = DummyData(foo="bla", bar=123)
26
+
27
+ def predict(self, model_input):
28
+ return self._model.json(indent=4)
@@ -0,0 +1 @@
1
+ pydantic<2.0
File without changes
@@ -0,0 +1,13 @@
1
+ environment_variables: {}
2
+ external_package_dirs: []
3
+ model_metadata: {}
4
+ model_name: Test Requirements File
5
+ python_version: py39
6
+ requirements_file: ./requirements.txt
7
+ resources:
8
+ accelerator: null
9
+ cpu: '1'
10
+ memory: 2Gi
11
+ use_gpu: false
12
+ secrets: {}
13
+ system_packages: []
@@ -0,0 +1,30 @@
1
+ """
2
+ The `Model` class is an interface between the ML model that you're packaging and the model
3
+ server that you're running it on.
4
+
5
+ The main methods to implement here are:
6
+ * `load`: runs exactly once when the model server is spun up or patched and loads the
7
+ model onto the model server. Include any logic for initializing your model, such
8
+ as downloading model weights and loading the model into memory.
9
+ * `predict`: runs every time the model server is called. Include any logic for model
10
+ inference and return the model output.
11
+
12
+ See https://truss.baseten.co/quickstart for more.
13
+ """
14
+
15
+ import pydantic
16
+
17
+
18
+ class DummyData(pydantic.BaseModel):
19
+ model_config = pydantic.ConfigDict()
20
+
21
+ foo: str
22
+ bar: int
23
+
24
+
25
+ class Model:
26
+ def __init__(self, **kwargs):
27
+ self._model = DummyData(foo="bla", bar=123)
28
+
29
+ def predict(self, model_input):
30
+ return self._model.model_dump_json(indent=4)
@@ -0,0 +1 @@
1
+ pydantic>=2.0
@@ -0,0 +1,13 @@
1
+ environment_variables: {}
2
+ external_package_dirs: []
3
+ model_metadata: {}
4
+ model_name: Test Requirements File
5
+ python_version: py39
6
+ requirements_file: ./requirements.txt
7
+ resources:
8
+ accelerator: null
9
+ cpu: '1'
10
+ memory: 2Gi
11
+ use_gpu: false
12
+ secrets: {}
13
+ system_packages: []
@@ -11,6 +11,7 @@ The main methods to implement here are:
11
11
 
12
12
  See https://truss.baseten.co/quickstart for more.
13
13
  """
14
+
14
15
  import torch
15
16
 
16
17
 
@@ -0,0 +1,4 @@
1
+ model_name: Test Streaming Async Generator
2
+ python_version: py39
3
+ environment_variables:
4
+ OTEL_TRACING_NDJSON_FILE: "/tmp/otel_traces.ndjson"
@@ -0,0 +1,7 @@
1
+ from typing import Any, Dict, List
2
+
3
+
4
+ class Model:
5
+ async def predict(self, model_input: Any) -> Dict[str, List]:
6
+ for i in range(5):
7
+ yield str(i)
File without changes
@@ -0,0 +1,4 @@
1
+ model_name: Test Streaming
2
+ python_version: py39
3
+ environment_variables:
4
+ OTEL_TRACING_NDJSON_FILE: "/tmp/otel_traces.ndjson"
@@ -1,23 +1,15 @@
1
1
  from typing import Any, Dict, List
2
2
 
3
+ import helpers_1
3
4
 
4
- class Model:
5
- def __init__(self, **kwargs) -> None:
6
- self._data_dir = kwargs["data_dir"]
7
- self._config = kwargs["config"]
8
- self._secrets = kwargs["secrets"]
9
- self._model = None
10
-
11
- def load(self):
12
- # Load model here and assign to self._model.
13
- pass
14
5
 
6
+ class Model:
15
7
  def predict(self, model_input: Any) -> Dict[str, List]:
16
8
  def inner():
17
9
  for i in range(5):
18
10
  # Raise error partway through if throw_error is set
19
11
  if i == 3 and model_input.get("throw_error"):
20
- raise Exception("error")
12
+ helpers_1.foo(123)
21
13
  yield str(i)
22
14
 
23
15
  return inner()
@@ -0,0 +1,5 @@
1
+ import helpers_2
2
+
3
+
4
+ def foo(x):
5
+ return helpers_2.bar(x)
@@ -0,0 +1,2 @@
1
+ def bar(x):
2
+ raise Exception("Crashed in `bar`.")