llama-stack 0.0.42__py3-none-any.whl → 0.3.4__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.
Files changed (738) hide show
  1. llama_stack/__init__.py +5 -0
  2. llama_stack/apis/agents/__init__.py +1 -1
  3. llama_stack/apis/agents/agents.py +700 -281
  4. llama_stack/apis/agents/openai_responses.py +1311 -0
  5. llama_stack/{providers/adapters/memory/sample/config.py → apis/batches/__init__.py} +2 -5
  6. llama_stack/apis/batches/batches.py +100 -0
  7. llama_stack/apis/benchmarks/__init__.py +7 -0
  8. llama_stack/apis/benchmarks/benchmarks.py +108 -0
  9. llama_stack/apis/common/content_types.py +143 -0
  10. llama_stack/apis/common/errors.py +103 -0
  11. llama_stack/apis/common/job_types.py +38 -0
  12. llama_stack/apis/common/responses.py +36 -0
  13. llama_stack/apis/common/training_types.py +36 -5
  14. llama_stack/apis/common/type_system.py +158 -0
  15. llama_stack/apis/conversations/__init__.py +31 -0
  16. llama_stack/apis/conversations/conversations.py +286 -0
  17. llama_stack/apis/datasetio/__init__.py +7 -0
  18. llama_stack/apis/datasetio/datasetio.py +59 -0
  19. llama_stack/apis/datasets/__init__.py +7 -0
  20. llama_stack/apis/datasets/datasets.py +251 -0
  21. llama_stack/apis/datatypes.py +160 -0
  22. llama_stack/apis/eval/__init__.py +7 -0
  23. llama_stack/apis/eval/eval.py +169 -0
  24. llama_stack/apis/files/__init__.py +7 -0
  25. llama_stack/apis/files/files.py +199 -0
  26. llama_stack/apis/inference/__init__.py +1 -1
  27. llama_stack/apis/inference/inference.py +1169 -113
  28. llama_stack/apis/inspect/__init__.py +1 -1
  29. llama_stack/apis/inspect/inspect.py +69 -16
  30. llama_stack/apis/models/__init__.py +1 -1
  31. llama_stack/apis/models/models.py +148 -21
  32. llama_stack/apis/post_training/__init__.py +1 -1
  33. llama_stack/apis/post_training/post_training.py +265 -120
  34. llama_stack/{providers/adapters/agents/sample/config.py → apis/prompts/__init__.py} +2 -5
  35. llama_stack/apis/prompts/prompts.py +204 -0
  36. llama_stack/apis/providers/__init__.py +7 -0
  37. llama_stack/apis/providers/providers.py +69 -0
  38. llama_stack/apis/resource.py +37 -0
  39. llama_stack/apis/safety/__init__.py +1 -1
  40. llama_stack/apis/safety/safety.py +95 -12
  41. llama_stack/apis/scoring/__init__.py +7 -0
  42. llama_stack/apis/scoring/scoring.py +93 -0
  43. llama_stack/apis/scoring_functions/__init__.py +7 -0
  44. llama_stack/apis/scoring_functions/scoring_functions.py +208 -0
  45. llama_stack/apis/shields/__init__.py +1 -1
  46. llama_stack/apis/shields/shields.py +76 -33
  47. llama_stack/apis/synthetic_data_generation/__init__.py +1 -1
  48. llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py +40 -17
  49. llama_stack/apis/telemetry/__init__.py +1 -1
  50. llama_stack/apis/telemetry/telemetry.py +322 -31
  51. llama_stack/apis/{dataset → tools}/__init__.py +2 -1
  52. llama_stack/apis/tools/rag_tool.py +218 -0
  53. llama_stack/apis/tools/tools.py +221 -0
  54. llama_stack/apis/vector_io/__init__.py +7 -0
  55. llama_stack/apis/vector_io/vector_io.py +960 -0
  56. llama_stack/apis/vector_stores/__init__.py +7 -0
  57. llama_stack/apis/vector_stores/vector_stores.py +51 -0
  58. llama_stack/apis/version.py +9 -0
  59. llama_stack/cli/llama.py +13 -5
  60. llama_stack/cli/stack/_list_deps.py +182 -0
  61. llama_stack/cli/stack/list_apis.py +1 -1
  62. llama_stack/cli/stack/list_deps.py +55 -0
  63. llama_stack/cli/stack/list_providers.py +24 -10
  64. llama_stack/cli/stack/list_stacks.py +56 -0
  65. llama_stack/cli/stack/remove.py +115 -0
  66. llama_stack/cli/stack/run.py +169 -56
  67. llama_stack/cli/stack/stack.py +18 -4
  68. llama_stack/cli/stack/utils.py +151 -0
  69. llama_stack/cli/table.py +23 -61
  70. llama_stack/cli/utils.py +29 -0
  71. llama_stack/core/access_control/access_control.py +131 -0
  72. llama_stack/core/access_control/conditions.py +129 -0
  73. llama_stack/core/access_control/datatypes.py +107 -0
  74. llama_stack/core/build.py +164 -0
  75. llama_stack/core/client.py +205 -0
  76. llama_stack/core/common.sh +37 -0
  77. llama_stack/{distribution → core}/configure.py +74 -55
  78. llama_stack/core/conversations/conversations.py +309 -0
  79. llama_stack/core/datatypes.py +625 -0
  80. llama_stack/core/distribution.py +276 -0
  81. llama_stack/core/external.py +54 -0
  82. llama_stack/core/id_generation.py +42 -0
  83. llama_stack/core/inspect.py +86 -0
  84. llama_stack/core/library_client.py +539 -0
  85. llama_stack/core/prompts/prompts.py +234 -0
  86. llama_stack/core/providers.py +137 -0
  87. llama_stack/core/request_headers.py +115 -0
  88. llama_stack/core/resolver.py +506 -0
  89. llama_stack/core/routers/__init__.py +101 -0
  90. llama_stack/core/routers/datasets.py +73 -0
  91. llama_stack/core/routers/eval_scoring.py +155 -0
  92. llama_stack/core/routers/inference.py +645 -0
  93. llama_stack/core/routers/safety.py +85 -0
  94. llama_stack/core/routers/tool_runtime.py +91 -0
  95. llama_stack/core/routers/vector_io.py +442 -0
  96. llama_stack/core/routing_tables/benchmarks.py +62 -0
  97. llama_stack/core/routing_tables/common.py +254 -0
  98. llama_stack/core/routing_tables/datasets.py +91 -0
  99. llama_stack/core/routing_tables/models.py +163 -0
  100. llama_stack/core/routing_tables/scoring_functions.py +66 -0
  101. llama_stack/core/routing_tables/shields.py +61 -0
  102. llama_stack/core/routing_tables/toolgroups.py +129 -0
  103. llama_stack/core/routing_tables/vector_stores.py +292 -0
  104. llama_stack/core/server/auth.py +187 -0
  105. llama_stack/core/server/auth_providers.py +494 -0
  106. llama_stack/core/server/quota.py +110 -0
  107. llama_stack/core/server/routes.py +141 -0
  108. llama_stack/core/server/server.py +542 -0
  109. llama_stack/core/server/tracing.py +80 -0
  110. llama_stack/core/stack.py +546 -0
  111. llama_stack/core/start_stack.sh +117 -0
  112. llama_stack/core/storage/datatypes.py +283 -0
  113. llama_stack/{cli/model → core/store}/__init__.py +1 -1
  114. llama_stack/core/store/registry.py +199 -0
  115. llama_stack/core/testing_context.py +49 -0
  116. llama_stack/core/ui/app.py +55 -0
  117. llama_stack/core/ui/modules/api.py +32 -0
  118. llama_stack/core/ui/modules/utils.py +42 -0
  119. llama_stack/core/ui/page/distribution/datasets.py +18 -0
  120. llama_stack/core/ui/page/distribution/eval_tasks.py +20 -0
  121. llama_stack/core/ui/page/distribution/models.py +18 -0
  122. llama_stack/core/ui/page/distribution/providers.py +27 -0
  123. llama_stack/core/ui/page/distribution/resources.py +48 -0
  124. llama_stack/core/ui/page/distribution/scoring_functions.py +18 -0
  125. llama_stack/core/ui/page/distribution/shields.py +19 -0
  126. llama_stack/core/ui/page/evaluations/app_eval.py +143 -0
  127. llama_stack/core/ui/page/evaluations/native_eval.py +253 -0
  128. llama_stack/core/ui/page/playground/chat.py +130 -0
  129. llama_stack/core/ui/page/playground/tools.py +352 -0
  130. llama_stack/core/utils/config.py +30 -0
  131. llama_stack/{distribution → core}/utils/config_dirs.py +3 -6
  132. llama_stack/core/utils/config_resolution.py +125 -0
  133. llama_stack/core/utils/context.py +84 -0
  134. llama_stack/core/utils/exec.py +96 -0
  135. llama_stack/{providers/impls/meta_reference/codeshield/config.py → core/utils/image_types.py} +4 -3
  136. llama_stack/{distribution → core}/utils/model_utils.py +2 -2
  137. llama_stack/{distribution → core}/utils/prompt_for_config.py +30 -63
  138. llama_stack/{apis/batch_inference → distributions/dell}/__init__.py +1 -1
  139. llama_stack/distributions/dell/build.yaml +33 -0
  140. llama_stack/distributions/dell/dell.py +158 -0
  141. llama_stack/distributions/dell/run-with-safety.yaml +141 -0
  142. llama_stack/distributions/dell/run.yaml +132 -0
  143. llama_stack/distributions/meta-reference-gpu/__init__.py +7 -0
  144. llama_stack/distributions/meta-reference-gpu/build.yaml +32 -0
  145. llama_stack/distributions/meta-reference-gpu/meta_reference.py +163 -0
  146. llama_stack/distributions/meta-reference-gpu/run-with-safety.yaml +154 -0
  147. llama_stack/distributions/meta-reference-gpu/run.yaml +139 -0
  148. llama_stack/{apis/evals → distributions/nvidia}/__init__.py +1 -1
  149. llama_stack/distributions/nvidia/build.yaml +29 -0
  150. llama_stack/distributions/nvidia/nvidia.py +154 -0
  151. llama_stack/distributions/nvidia/run-with-safety.yaml +137 -0
  152. llama_stack/distributions/nvidia/run.yaml +116 -0
  153. llama_stack/distributions/open-benchmark/__init__.py +7 -0
  154. llama_stack/distributions/open-benchmark/build.yaml +36 -0
  155. llama_stack/distributions/open-benchmark/open_benchmark.py +303 -0
  156. llama_stack/distributions/open-benchmark/run.yaml +252 -0
  157. llama_stack/distributions/postgres-demo/__init__.py +7 -0
  158. llama_stack/distributions/postgres-demo/build.yaml +23 -0
  159. llama_stack/distributions/postgres-demo/postgres_demo.py +125 -0
  160. llama_stack/distributions/postgres-demo/run.yaml +115 -0
  161. llama_stack/{apis/memory → distributions/starter}/__init__.py +1 -1
  162. llama_stack/distributions/starter/build.yaml +61 -0
  163. llama_stack/distributions/starter/run-with-postgres-store.yaml +285 -0
  164. llama_stack/distributions/starter/run.yaml +276 -0
  165. llama_stack/distributions/starter/starter.py +345 -0
  166. llama_stack/distributions/starter-gpu/__init__.py +7 -0
  167. llama_stack/distributions/starter-gpu/build.yaml +61 -0
  168. llama_stack/distributions/starter-gpu/run-with-postgres-store.yaml +288 -0
  169. llama_stack/distributions/starter-gpu/run.yaml +279 -0
  170. llama_stack/distributions/starter-gpu/starter_gpu.py +20 -0
  171. llama_stack/distributions/template.py +456 -0
  172. llama_stack/distributions/watsonx/__init__.py +7 -0
  173. llama_stack/distributions/watsonx/build.yaml +33 -0
  174. llama_stack/distributions/watsonx/run.yaml +133 -0
  175. llama_stack/distributions/watsonx/watsonx.py +95 -0
  176. llama_stack/env.py +24 -0
  177. llama_stack/log.py +314 -0
  178. llama_stack/models/llama/checkpoint.py +164 -0
  179. llama_stack/models/llama/datatypes.py +164 -0
  180. llama_stack/models/llama/hadamard_utils.py +86 -0
  181. llama_stack/models/llama/llama3/args.py +74 -0
  182. llama_stack/models/llama/llama3/chat_format.py +286 -0
  183. llama_stack/models/llama/llama3/generation.py +376 -0
  184. llama_stack/models/llama/llama3/interface.py +255 -0
  185. llama_stack/models/llama/llama3/model.py +304 -0
  186. llama_stack/models/llama/llama3/multimodal/__init__.py +12 -0
  187. llama_stack/models/llama/llama3/multimodal/encoder_utils.py +180 -0
  188. llama_stack/models/llama/llama3/multimodal/image_transform.py +409 -0
  189. llama_stack/models/llama/llama3/multimodal/model.py +1430 -0
  190. llama_stack/models/llama/llama3/multimodal/utils.py +26 -0
  191. llama_stack/models/llama/llama3/prompt_templates/__init__.py +22 -0
  192. llama_stack/models/llama/llama3/prompt_templates/base.py +39 -0
  193. llama_stack/models/llama/llama3/prompt_templates/system_prompts.py +319 -0
  194. llama_stack/models/llama/llama3/prompt_templates/tool_response.py +62 -0
  195. llama_stack/models/llama/llama3/quantization/loader.py +316 -0
  196. llama_stack/models/llama/llama3/template_data.py +116 -0
  197. llama_stack/models/llama/llama3/tokenizer.model +128000 -0
  198. llama_stack/models/llama/llama3/tokenizer.py +198 -0
  199. llama_stack/models/llama/llama3/tool_utils.py +266 -0
  200. llama_stack/models/llama/llama3_1/__init__.py +12 -0
  201. llama_stack/models/llama/llama3_1/prompt_format.md +358 -0
  202. llama_stack/models/llama/llama3_1/prompts.py +258 -0
  203. llama_stack/models/llama/llama3_2/prompts_text.py +229 -0
  204. llama_stack/models/llama/llama3_2/prompts_vision.py +126 -0
  205. llama_stack/models/llama/llama3_2/text_prompt_format.md +286 -0
  206. llama_stack/models/llama/llama3_2/vision_prompt_format.md +141 -0
  207. llama_stack/models/llama/llama3_3/prompts.py +259 -0
  208. llama_stack/models/llama/llama4/args.py +107 -0
  209. llama_stack/models/llama/llama4/chat_format.py +317 -0
  210. llama_stack/models/llama/llama4/datatypes.py +56 -0
  211. llama_stack/models/llama/llama4/ffn.py +58 -0
  212. llama_stack/models/llama/llama4/generation.py +313 -0
  213. llama_stack/models/llama/llama4/model.py +437 -0
  214. llama_stack/models/llama/llama4/moe.py +214 -0
  215. llama_stack/models/llama/llama4/preprocess.py +435 -0
  216. llama_stack/models/llama/llama4/prompt_format.md +304 -0
  217. llama_stack/models/llama/llama4/prompt_templates/system_prompts.py +136 -0
  218. llama_stack/models/llama/llama4/prompts.py +279 -0
  219. llama_stack/models/llama/llama4/quantization/__init__.py +5 -0
  220. llama_stack/models/llama/llama4/quantization/loader.py +226 -0
  221. llama_stack/models/llama/llama4/tokenizer.model +200000 -0
  222. llama_stack/models/llama/llama4/tokenizer.py +263 -0
  223. llama_stack/models/llama/llama4/vision/__init__.py +5 -0
  224. llama_stack/models/llama/llama4/vision/embedding.py +210 -0
  225. llama_stack/models/llama/llama4/vision/encoder.py +412 -0
  226. llama_stack/models/llama/prompt_format.py +191 -0
  227. llama_stack/models/llama/quantize_impls.py +316 -0
  228. llama_stack/models/llama/sku_list.py +1029 -0
  229. llama_stack/models/llama/sku_types.py +233 -0
  230. llama_stack/models/llama/tokenizer_utils.py +40 -0
  231. llama_stack/providers/datatypes.py +136 -107
  232. llama_stack/providers/inline/__init__.py +5 -0
  233. llama_stack/providers/inline/agents/__init__.py +5 -0
  234. llama_stack/providers/{impls/meta_reference/agents → inline/agents/meta_reference}/__init__.py +12 -5
  235. llama_stack/providers/inline/agents/meta_reference/agent_instance.py +1024 -0
  236. llama_stack/providers/inline/agents/meta_reference/agents.py +383 -0
  237. llama_stack/providers/inline/agents/meta_reference/config.py +37 -0
  238. llama_stack/providers/inline/agents/meta_reference/persistence.py +228 -0
  239. llama_stack/providers/inline/agents/meta_reference/responses/__init__.py +5 -0
  240. llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py +423 -0
  241. llama_stack/providers/inline/agents/meta_reference/responses/streaming.py +1226 -0
  242. llama_stack/providers/inline/agents/meta_reference/responses/tool_executor.py +449 -0
  243. llama_stack/providers/inline/agents/meta_reference/responses/types.py +194 -0
  244. llama_stack/providers/inline/agents/meta_reference/responses/utils.py +365 -0
  245. llama_stack/providers/inline/agents/meta_reference/safety.py +52 -0
  246. llama_stack/providers/inline/batches/__init__.py +5 -0
  247. llama_stack/providers/inline/batches/reference/__init__.py +36 -0
  248. llama_stack/providers/inline/batches/reference/batches.py +679 -0
  249. llama_stack/providers/inline/batches/reference/config.py +40 -0
  250. llama_stack/providers/inline/datasetio/__init__.py +5 -0
  251. llama_stack/providers/inline/datasetio/localfs/__init__.py +20 -0
  252. llama_stack/providers/inline/datasetio/localfs/config.py +23 -0
  253. llama_stack/providers/inline/datasetio/localfs/datasetio.py +113 -0
  254. llama_stack/providers/inline/eval/__init__.py +5 -0
  255. llama_stack/providers/inline/eval/meta_reference/__init__.py +28 -0
  256. llama_stack/providers/inline/eval/meta_reference/config.py +23 -0
  257. llama_stack/providers/inline/eval/meta_reference/eval.py +259 -0
  258. llama_stack/providers/inline/files/localfs/__init__.py +20 -0
  259. llama_stack/providers/inline/files/localfs/config.py +31 -0
  260. llama_stack/providers/inline/files/localfs/files.py +219 -0
  261. llama_stack/providers/inline/inference/__init__.py +5 -0
  262. llama_stack/providers/{impls/meta_reference/inference → inline/inference/meta_reference}/__init__.py +4 -4
  263. llama_stack/providers/inline/inference/meta_reference/common.py +24 -0
  264. llama_stack/providers/inline/inference/meta_reference/config.py +68 -0
  265. llama_stack/providers/inline/inference/meta_reference/generators.py +211 -0
  266. llama_stack/providers/inline/inference/meta_reference/inference.py +158 -0
  267. llama_stack/providers/inline/inference/meta_reference/model_parallel.py +96 -0
  268. llama_stack/providers/{impls/meta_reference/inference → inline/inference/meta_reference}/parallel_utils.py +56 -73
  269. llama_stack/providers/inline/inference/sentence_transformers/__init__.py +22 -0
  270. llama_stack/providers/{impls/meta_reference/agents → inline/inference/sentence_transformers}/config.py +6 -4
  271. llama_stack/providers/inline/inference/sentence_transformers/sentence_transformers.py +83 -0
  272. llama_stack/providers/inline/post_training/__init__.py +5 -0
  273. llama_stack/providers/inline/post_training/common/__init__.py +5 -0
  274. llama_stack/providers/inline/post_training/common/utils.py +35 -0
  275. llama_stack/providers/inline/post_training/common/validator.py +36 -0
  276. llama_stack/providers/inline/post_training/huggingface/__init__.py +27 -0
  277. llama_stack/providers/inline/post_training/huggingface/config.py +83 -0
  278. llama_stack/providers/inline/post_training/huggingface/post_training.py +208 -0
  279. llama_stack/providers/inline/post_training/huggingface/recipes/__init__.py +5 -0
  280. llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device.py +519 -0
  281. llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device_dpo.py +485 -0
  282. llama_stack/providers/inline/post_training/huggingface/utils.py +269 -0
  283. llama_stack/providers/inline/post_training/torchtune/__init__.py +27 -0
  284. llama_stack/providers/inline/post_training/torchtune/common/__init__.py +5 -0
  285. llama_stack/providers/inline/post_training/torchtune/common/checkpointer.py +240 -0
  286. llama_stack/providers/inline/post_training/torchtune/common/utils.py +99 -0
  287. llama_stack/providers/inline/post_training/torchtune/config.py +20 -0
  288. llama_stack/providers/inline/post_training/torchtune/datasets/__init__.py +5 -0
  289. llama_stack/providers/inline/post_training/torchtune/datasets/format_adapter.py +57 -0
  290. llama_stack/providers/inline/post_training/torchtune/datasets/sft.py +78 -0
  291. llama_stack/providers/inline/post_training/torchtune/post_training.py +178 -0
  292. llama_stack/providers/inline/post_training/torchtune/recipes/__init__.py +5 -0
  293. llama_stack/providers/inline/post_training/torchtune/recipes/lora_finetuning_single_device.py +588 -0
  294. llama_stack/providers/inline/safety/__init__.py +5 -0
  295. llama_stack/providers/{impls/meta_reference/codeshield → inline/safety/code_scanner}/__init__.py +4 -2
  296. llama_stack/providers/inline/safety/code_scanner/code_scanner.py +128 -0
  297. llama_stack/providers/{impls/meta_reference/memory → inline/safety/code_scanner}/config.py +5 -3
  298. llama_stack/providers/inline/safety/llama_guard/__init__.py +19 -0
  299. llama_stack/providers/inline/safety/llama_guard/config.py +19 -0
  300. llama_stack/providers/inline/safety/llama_guard/llama_guard.py +489 -0
  301. llama_stack/providers/{adapters/memory/sample → inline/safety/prompt_guard}/__init__.py +4 -4
  302. llama_stack/providers/inline/safety/prompt_guard/config.py +32 -0
  303. llama_stack/providers/inline/safety/prompt_guard/prompt_guard.py +131 -0
  304. llama_stack/providers/inline/scoring/__init__.py +5 -0
  305. llama_stack/providers/inline/scoring/basic/__init__.py +25 -0
  306. llama_stack/providers/{adapters/memory/weaviate → inline/scoring/basic}/config.py +5 -7
  307. llama_stack/providers/inline/scoring/basic/scoring.py +126 -0
  308. llama_stack/providers/inline/scoring/basic/scoring_fn/__init__.py +5 -0
  309. llama_stack/providers/inline/scoring/basic/scoring_fn/docvqa_scoring_fn.py +240 -0
  310. llama_stack/providers/inline/scoring/basic/scoring_fn/equality_scoring_fn.py +41 -0
  311. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/__init__.py +5 -0
  312. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/docvqa.py +21 -0
  313. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/equality.py +21 -0
  314. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/ifeval.py +23 -0
  315. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_math_response.py +27 -0
  316. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_multiple_choice_answer.py +71 -0
  317. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/subset_of.py +21 -0
  318. llama_stack/providers/inline/scoring/basic/scoring_fn/ifeval_scoring_fn.py +80 -0
  319. llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_math_response_scoring_fn.py +66 -0
  320. llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_scoring_fn.py +58 -0
  321. llama_stack/providers/inline/scoring/basic/scoring_fn/subset_of_scoring_fn.py +38 -0
  322. llama_stack/providers/inline/scoring/basic/utils/__init__.py +5 -0
  323. llama_stack/providers/inline/scoring/basic/utils/ifeval_utils.py +3319 -0
  324. llama_stack/providers/inline/scoring/basic/utils/math_utils.py +330 -0
  325. llama_stack/providers/inline/scoring/braintrust/__init__.py +27 -0
  326. llama_stack/providers/inline/scoring/braintrust/braintrust.py +230 -0
  327. llama_stack/providers/inline/scoring/braintrust/config.py +21 -0
  328. llama_stack/providers/inline/scoring/braintrust/scoring_fn/__init__.py +5 -0
  329. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/__init__.py +5 -0
  330. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_correctness.py +24 -0
  331. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_relevancy.py +24 -0
  332. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_similarity.py +24 -0
  333. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_entity_recall.py +24 -0
  334. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_precision.py +24 -0
  335. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_recall.py +24 -0
  336. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_relevancy.py +23 -0
  337. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/factuality.py +24 -0
  338. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/faithfulness.py +24 -0
  339. llama_stack/providers/inline/scoring/llm_as_judge/__init__.py +21 -0
  340. llama_stack/providers/inline/scoring/llm_as_judge/config.py +14 -0
  341. llama_stack/providers/inline/scoring/llm_as_judge/scoring.py +113 -0
  342. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/__init__.py +5 -0
  343. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/__init__.py +5 -0
  344. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_405b_simpleqa.py +96 -0
  345. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_base.py +20 -0
  346. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/llm_as_judge_scoring_fn.py +81 -0
  347. llama_stack/providers/inline/telemetry/__init__.py +5 -0
  348. llama_stack/providers/inline/telemetry/meta_reference/__init__.py +21 -0
  349. llama_stack/providers/inline/telemetry/meta_reference/config.py +47 -0
  350. llama_stack/providers/inline/telemetry/meta_reference/telemetry.py +252 -0
  351. llama_stack/providers/inline/tool_runtime/__init__.py +5 -0
  352. llama_stack/providers/inline/tool_runtime/rag/__init__.py +19 -0
  353. llama_stack/providers/{impls/meta_reference/telemetry → inline/tool_runtime/rag}/config.py +5 -3
  354. llama_stack/providers/inline/tool_runtime/rag/context_retriever.py +77 -0
  355. llama_stack/providers/inline/tool_runtime/rag/memory.py +332 -0
  356. llama_stack/providers/inline/vector_io/__init__.py +5 -0
  357. llama_stack/providers/inline/vector_io/chroma/__init__.py +19 -0
  358. llama_stack/providers/inline/vector_io/chroma/config.py +30 -0
  359. llama_stack/providers/inline/vector_io/faiss/__init__.py +21 -0
  360. llama_stack/providers/inline/vector_io/faiss/config.py +26 -0
  361. llama_stack/providers/inline/vector_io/faiss/faiss.py +293 -0
  362. llama_stack/providers/inline/vector_io/milvus/__init__.py +19 -0
  363. llama_stack/providers/inline/vector_io/milvus/config.py +29 -0
  364. llama_stack/providers/inline/vector_io/qdrant/__init__.py +20 -0
  365. llama_stack/providers/inline/vector_io/qdrant/config.py +29 -0
  366. llama_stack/providers/inline/vector_io/sqlite_vec/__init__.py +20 -0
  367. llama_stack/providers/inline/vector_io/sqlite_vec/config.py +26 -0
  368. llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py +483 -0
  369. llama_stack/providers/registry/agents.py +16 -18
  370. llama_stack/providers/registry/batches.py +26 -0
  371. llama_stack/providers/registry/datasetio.py +49 -0
  372. llama_stack/providers/registry/eval.py +46 -0
  373. llama_stack/providers/registry/files.py +31 -0
  374. llama_stack/providers/registry/inference.py +273 -118
  375. llama_stack/providers/registry/post_training.py +69 -0
  376. llama_stack/providers/registry/safety.py +46 -41
  377. llama_stack/providers/registry/scoring.py +51 -0
  378. llama_stack/providers/registry/tool_runtime.py +87 -0
  379. llama_stack/providers/registry/vector_io.py +828 -0
  380. llama_stack/providers/remote/__init__.py +5 -0
  381. llama_stack/providers/remote/agents/__init__.py +5 -0
  382. llama_stack/providers/remote/datasetio/__init__.py +5 -0
  383. llama_stack/providers/{adapters/memory/chroma → remote/datasetio/huggingface}/__init__.py +7 -4
  384. llama_stack/providers/remote/datasetio/huggingface/config.py +23 -0
  385. llama_stack/providers/remote/datasetio/huggingface/huggingface.py +99 -0
  386. llama_stack/providers/remote/datasetio/nvidia/__init__.py +23 -0
  387. llama_stack/providers/remote/datasetio/nvidia/config.py +61 -0
  388. llama_stack/providers/remote/datasetio/nvidia/datasetio.py +116 -0
  389. llama_stack/providers/remote/eval/__init__.py +5 -0
  390. llama_stack/providers/remote/eval/nvidia/__init__.py +31 -0
  391. llama_stack/providers/remote/eval/nvidia/config.py +29 -0
  392. llama_stack/providers/remote/eval/nvidia/eval.py +162 -0
  393. llama_stack/providers/remote/files/s3/__init__.py +19 -0
  394. llama_stack/providers/remote/files/s3/config.py +42 -0
  395. llama_stack/providers/remote/files/s3/files.py +313 -0
  396. llama_stack/providers/remote/inference/__init__.py +5 -0
  397. llama_stack/providers/{adapters/safety/sample → remote/inference/anthropic}/__init__.py +4 -6
  398. llama_stack/providers/remote/inference/anthropic/anthropic.py +36 -0
  399. llama_stack/providers/remote/inference/anthropic/config.py +28 -0
  400. llama_stack/providers/{impls/meta_reference/telemetry → remote/inference/azure}/__init__.py +4 -4
  401. llama_stack/providers/remote/inference/azure/azure.py +25 -0
  402. llama_stack/providers/remote/inference/azure/config.py +61 -0
  403. llama_stack/providers/{adapters → remote}/inference/bedrock/__init__.py +18 -17
  404. llama_stack/providers/remote/inference/bedrock/bedrock.py +142 -0
  405. llama_stack/providers/{adapters/inference/sample → remote/inference/bedrock}/config.py +3 -4
  406. llama_stack/providers/remote/inference/bedrock/models.py +29 -0
  407. llama_stack/providers/remote/inference/cerebras/__init__.py +19 -0
  408. llama_stack/providers/remote/inference/cerebras/cerebras.py +28 -0
  409. llama_stack/providers/remote/inference/cerebras/config.py +30 -0
  410. llama_stack/providers/{adapters → remote}/inference/databricks/__init__.py +4 -5
  411. llama_stack/providers/remote/inference/databricks/config.py +37 -0
  412. llama_stack/providers/remote/inference/databricks/databricks.py +44 -0
  413. llama_stack/providers/{adapters → remote}/inference/fireworks/__init__.py +8 -4
  414. llama_stack/providers/remote/inference/fireworks/config.py +27 -0
  415. llama_stack/providers/remote/inference/fireworks/fireworks.py +27 -0
  416. llama_stack/providers/{adapters/memory/pgvector → remote/inference/gemini}/__init__.py +4 -4
  417. llama_stack/providers/remote/inference/gemini/config.py +28 -0
  418. llama_stack/providers/remote/inference/gemini/gemini.py +82 -0
  419. llama_stack/providers/remote/inference/groq/__init__.py +15 -0
  420. llama_stack/providers/remote/inference/groq/config.py +34 -0
  421. llama_stack/providers/remote/inference/groq/groq.py +18 -0
  422. llama_stack/providers/remote/inference/llama_openai_compat/__init__.py +15 -0
  423. llama_stack/providers/remote/inference/llama_openai_compat/config.py +34 -0
  424. llama_stack/providers/remote/inference/llama_openai_compat/llama.py +46 -0
  425. llama_stack/providers/remote/inference/nvidia/__init__.py +23 -0
  426. llama_stack/providers/remote/inference/nvidia/config.py +64 -0
  427. llama_stack/providers/remote/inference/nvidia/nvidia.py +61 -0
  428. llama_stack/providers/{adapters/safety/sample/config.py → remote/inference/nvidia/utils.py} +3 -4
  429. llama_stack/providers/{impls/vllm → remote/inference/ollama}/__init__.py +4 -6
  430. llama_stack/providers/remote/inference/ollama/config.py +25 -0
  431. llama_stack/providers/remote/inference/ollama/ollama.py +102 -0
  432. llama_stack/providers/{adapters/telemetry/opentelemetry → remote/inference/openai}/__init__.py +4 -4
  433. llama_stack/providers/remote/inference/openai/config.py +39 -0
  434. llama_stack/providers/remote/inference/openai/openai.py +38 -0
  435. llama_stack/providers/remote/inference/passthrough/__init__.py +23 -0
  436. llama_stack/providers/remote/inference/passthrough/config.py +34 -0
  437. llama_stack/providers/remote/inference/passthrough/passthrough.py +122 -0
  438. llama_stack/providers/remote/inference/runpod/__init__.py +16 -0
  439. llama_stack/providers/remote/inference/runpod/config.py +32 -0
  440. llama_stack/providers/remote/inference/runpod/runpod.py +42 -0
  441. llama_stack/providers/remote/inference/sambanova/__init__.py +16 -0
  442. llama_stack/providers/remote/inference/sambanova/config.py +34 -0
  443. llama_stack/providers/remote/inference/sambanova/sambanova.py +28 -0
  444. llama_stack/providers/{adapters → remote}/inference/tgi/__init__.py +3 -4
  445. llama_stack/providers/remote/inference/tgi/config.py +76 -0
  446. llama_stack/providers/remote/inference/tgi/tgi.py +85 -0
  447. llama_stack/providers/{adapters → remote}/inference/together/__init__.py +8 -4
  448. llama_stack/providers/remote/inference/together/config.py +27 -0
  449. llama_stack/providers/remote/inference/together/together.py +102 -0
  450. llama_stack/providers/remote/inference/vertexai/__init__.py +15 -0
  451. llama_stack/providers/remote/inference/vertexai/config.py +48 -0
  452. llama_stack/providers/remote/inference/vertexai/vertexai.py +54 -0
  453. llama_stack/providers/remote/inference/vllm/__init__.py +22 -0
  454. llama_stack/providers/remote/inference/vllm/config.py +59 -0
  455. llama_stack/providers/remote/inference/vllm/vllm.py +111 -0
  456. llama_stack/providers/remote/inference/watsonx/__init__.py +15 -0
  457. llama_stack/providers/remote/inference/watsonx/config.py +45 -0
  458. llama_stack/providers/remote/inference/watsonx/watsonx.py +336 -0
  459. llama_stack/providers/remote/post_training/__init__.py +5 -0
  460. llama_stack/providers/remote/post_training/nvidia/__init__.py +23 -0
  461. llama_stack/providers/remote/post_training/nvidia/config.py +113 -0
  462. llama_stack/providers/remote/post_training/nvidia/models.py +27 -0
  463. llama_stack/providers/remote/post_training/nvidia/post_training.py +430 -0
  464. llama_stack/providers/remote/post_training/nvidia/utils.py +63 -0
  465. llama_stack/providers/remote/safety/__init__.py +5 -0
  466. llama_stack/providers/remote/safety/bedrock/bedrock.py +111 -0
  467. llama_stack/providers/remote/safety/bedrock/config.py +14 -0
  468. llama_stack/providers/{adapters/inference/sample → remote/safety/nvidia}/__init__.py +5 -4
  469. llama_stack/providers/remote/safety/nvidia/config.py +40 -0
  470. llama_stack/providers/remote/safety/nvidia/nvidia.py +161 -0
  471. llama_stack/providers/{adapters/agents/sample → remote/safety/sambanova}/__init__.py +5 -4
  472. llama_stack/providers/remote/safety/sambanova/config.py +37 -0
  473. llama_stack/providers/remote/safety/sambanova/sambanova.py +98 -0
  474. llama_stack/providers/remote/tool_runtime/__init__.py +5 -0
  475. llama_stack/providers/remote/tool_runtime/bing_search/__init__.py +21 -0
  476. llama_stack/providers/remote/tool_runtime/bing_search/bing_search.py +112 -0
  477. llama_stack/providers/remote/tool_runtime/bing_search/config.py +22 -0
  478. llama_stack/providers/remote/tool_runtime/brave_search/__init__.py +20 -0
  479. llama_stack/providers/remote/tool_runtime/brave_search/brave_search.py +148 -0
  480. llama_stack/providers/remote/tool_runtime/brave_search/config.py +27 -0
  481. llama_stack/providers/remote/tool_runtime/model_context_protocol/__init__.py +15 -0
  482. llama_stack/providers/remote/tool_runtime/model_context_protocol/config.py +20 -0
  483. llama_stack/providers/remote/tool_runtime/model_context_protocol/model_context_protocol.py +73 -0
  484. llama_stack/providers/remote/tool_runtime/tavily_search/__init__.py +20 -0
  485. llama_stack/providers/remote/tool_runtime/tavily_search/config.py +27 -0
  486. llama_stack/providers/remote/tool_runtime/tavily_search/tavily_search.py +84 -0
  487. llama_stack/providers/remote/tool_runtime/wolfram_alpha/__init__.py +22 -0
  488. llama_stack/providers/remote/tool_runtime/wolfram_alpha/config.py +21 -0
  489. llama_stack/providers/remote/tool_runtime/wolfram_alpha/wolfram_alpha.py +140 -0
  490. llama_stack/providers/remote/vector_io/__init__.py +5 -0
  491. llama_stack/providers/remote/vector_io/chroma/__init__.py +17 -0
  492. llama_stack/providers/remote/vector_io/chroma/chroma.py +215 -0
  493. llama_stack/providers/remote/vector_io/chroma/config.py +28 -0
  494. llama_stack/providers/remote/vector_io/milvus/__init__.py +18 -0
  495. llama_stack/providers/remote/vector_io/milvus/config.py +35 -0
  496. llama_stack/providers/remote/vector_io/milvus/milvus.py +375 -0
  497. llama_stack/providers/remote/vector_io/pgvector/__init__.py +17 -0
  498. llama_stack/providers/remote/vector_io/pgvector/config.py +47 -0
  499. llama_stack/providers/remote/vector_io/pgvector/pgvector.py +460 -0
  500. llama_stack/providers/remote/vector_io/qdrant/__init__.py +17 -0
  501. llama_stack/providers/remote/vector_io/qdrant/config.py +37 -0
  502. llama_stack/providers/remote/vector_io/qdrant/qdrant.py +265 -0
  503. llama_stack/providers/remote/vector_io/weaviate/__init__.py +17 -0
  504. llama_stack/providers/remote/vector_io/weaviate/config.py +32 -0
  505. llama_stack/providers/remote/vector_io/weaviate/weaviate.py +393 -0
  506. llama_stack/providers/utils/bedrock/__init__.py +5 -0
  507. llama_stack/providers/utils/bedrock/client.py +74 -0
  508. llama_stack/providers/utils/bedrock/config.py +64 -0
  509. llama_stack/providers/utils/bedrock/refreshable_boto_session.py +112 -0
  510. llama_stack/providers/utils/common/__init__.py +5 -0
  511. llama_stack/providers/utils/common/data_schema_validator.py +103 -0
  512. llama_stack/providers/utils/datasetio/__init__.py +5 -0
  513. llama_stack/providers/utils/datasetio/url_utils.py +47 -0
  514. llama_stack/providers/utils/files/__init__.py +5 -0
  515. llama_stack/providers/utils/files/form_data.py +69 -0
  516. llama_stack/providers/utils/inference/__init__.py +8 -7
  517. llama_stack/providers/utils/inference/embedding_mixin.py +101 -0
  518. llama_stack/providers/utils/inference/inference_store.py +264 -0
  519. llama_stack/providers/utils/inference/litellm_openai_mixin.py +336 -0
  520. llama_stack/providers/utils/inference/model_registry.py +173 -23
  521. llama_stack/providers/utils/inference/openai_compat.py +1261 -49
  522. llama_stack/providers/utils/inference/openai_mixin.py +506 -0
  523. llama_stack/providers/utils/inference/prompt_adapter.py +365 -67
  524. llama_stack/providers/utils/kvstore/api.py +6 -6
  525. llama_stack/providers/utils/kvstore/config.py +28 -48
  526. llama_stack/providers/utils/kvstore/kvstore.py +61 -15
  527. llama_stack/providers/utils/kvstore/mongodb/__init__.py +9 -0
  528. llama_stack/providers/utils/kvstore/mongodb/mongodb.py +82 -0
  529. llama_stack/providers/utils/kvstore/postgres/__init__.py +7 -0
  530. llama_stack/providers/utils/kvstore/postgres/postgres.py +114 -0
  531. llama_stack/providers/utils/kvstore/redis/redis.py +33 -9
  532. llama_stack/providers/utils/kvstore/sqlite/config.py +2 -1
  533. llama_stack/providers/utils/kvstore/sqlite/sqlite.py +123 -22
  534. llama_stack/providers/utils/memory/file_utils.py +1 -1
  535. llama_stack/providers/utils/memory/openai_vector_store_mixin.py +1304 -0
  536. llama_stack/providers/utils/memory/vector_store.py +220 -82
  537. llama_stack/providers/utils/pagination.py +43 -0
  538. llama_stack/providers/utils/responses/__init__.py +5 -0
  539. llama_stack/providers/utils/responses/responses_store.py +292 -0
  540. llama_stack/providers/utils/scheduler.py +270 -0
  541. llama_stack/providers/utils/scoring/__init__.py +5 -0
  542. llama_stack/providers/utils/scoring/aggregation_utils.py +75 -0
  543. llama_stack/providers/utils/scoring/base_scoring_fn.py +114 -0
  544. llama_stack/providers/utils/scoring/basic_scoring_utils.py +26 -0
  545. llama_stack/providers/utils/sqlstore/__init__.py +5 -0
  546. llama_stack/providers/utils/sqlstore/api.py +128 -0
  547. llama_stack/providers/utils/sqlstore/authorized_sqlstore.py +319 -0
  548. llama_stack/providers/utils/sqlstore/sqlalchemy_sqlstore.py +343 -0
  549. llama_stack/providers/utils/sqlstore/sqlstore.py +70 -0
  550. llama_stack/providers/utils/telemetry/trace_protocol.py +142 -0
  551. llama_stack/providers/utils/telemetry/tracing.py +192 -53
  552. llama_stack/providers/utils/tools/__init__.py +5 -0
  553. llama_stack/providers/utils/tools/mcp.py +148 -0
  554. llama_stack/providers/utils/tools/ttl_dict.py +70 -0
  555. llama_stack/providers/utils/vector_io/__init__.py +5 -0
  556. llama_stack/providers/utils/vector_io/vector_utils.py +156 -0
  557. llama_stack/schema_utils.py +118 -0
  558. llama_stack/strong_typing/__init__.py +19 -0
  559. llama_stack/strong_typing/auxiliary.py +228 -0
  560. llama_stack/strong_typing/classdef.py +440 -0
  561. llama_stack/strong_typing/core.py +46 -0
  562. llama_stack/strong_typing/deserializer.py +877 -0
  563. llama_stack/strong_typing/docstring.py +409 -0
  564. llama_stack/strong_typing/exception.py +23 -0
  565. llama_stack/strong_typing/inspection.py +1085 -0
  566. llama_stack/strong_typing/mapping.py +40 -0
  567. llama_stack/strong_typing/name.py +182 -0
  568. llama_stack/strong_typing/py.typed +0 -0
  569. llama_stack/strong_typing/schema.py +792 -0
  570. llama_stack/strong_typing/serialization.py +97 -0
  571. llama_stack/strong_typing/serializer.py +500 -0
  572. llama_stack/strong_typing/slots.py +27 -0
  573. llama_stack/strong_typing/topological.py +89 -0
  574. llama_stack/testing/__init__.py +5 -0
  575. llama_stack/testing/api_recorder.py +956 -0
  576. llama_stack/ui/node_modules/flatted/python/flatted.py +149 -0
  577. llama_stack-0.3.4.dist-info/METADATA +261 -0
  578. llama_stack-0.3.4.dist-info/RECORD +625 -0
  579. {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info}/WHEEL +1 -1
  580. llama_stack/apis/agents/client.py +0 -292
  581. llama_stack/apis/agents/event_logger.py +0 -184
  582. llama_stack/apis/batch_inference/batch_inference.py +0 -72
  583. llama_stack/apis/common/deployment_types.py +0 -31
  584. llama_stack/apis/dataset/dataset.py +0 -63
  585. llama_stack/apis/evals/evals.py +0 -122
  586. llama_stack/apis/inference/client.py +0 -197
  587. llama_stack/apis/inspect/client.py +0 -82
  588. llama_stack/apis/memory/client.py +0 -155
  589. llama_stack/apis/memory/memory.py +0 -65
  590. llama_stack/apis/memory_banks/__init__.py +0 -7
  591. llama_stack/apis/memory_banks/client.py +0 -101
  592. llama_stack/apis/memory_banks/memory_banks.py +0 -78
  593. llama_stack/apis/models/client.py +0 -83
  594. llama_stack/apis/reward_scoring/__init__.py +0 -7
  595. llama_stack/apis/reward_scoring/reward_scoring.py +0 -55
  596. llama_stack/apis/safety/client.py +0 -105
  597. llama_stack/apis/shields/client.py +0 -79
  598. llama_stack/cli/download.py +0 -340
  599. llama_stack/cli/model/describe.py +0 -82
  600. llama_stack/cli/model/download.py +0 -24
  601. llama_stack/cli/model/list.py +0 -62
  602. llama_stack/cli/model/model.py +0 -34
  603. llama_stack/cli/model/prompt_format.py +0 -112
  604. llama_stack/cli/model/safety_models.py +0 -52
  605. llama_stack/cli/stack/build.py +0 -299
  606. llama_stack/cli/stack/configure.py +0 -178
  607. llama_stack/distribution/build.py +0 -123
  608. llama_stack/distribution/build_conda_env.sh +0 -136
  609. llama_stack/distribution/build_container.sh +0 -142
  610. llama_stack/distribution/common.sh +0 -40
  611. llama_stack/distribution/configure_container.sh +0 -47
  612. llama_stack/distribution/datatypes.py +0 -139
  613. llama_stack/distribution/distribution.py +0 -58
  614. llama_stack/distribution/inspect.py +0 -67
  615. llama_stack/distribution/request_headers.py +0 -57
  616. llama_stack/distribution/resolver.py +0 -323
  617. llama_stack/distribution/routers/__init__.py +0 -48
  618. llama_stack/distribution/routers/routers.py +0 -158
  619. llama_stack/distribution/routers/routing_tables.py +0 -173
  620. llama_stack/distribution/server/endpoints.py +0 -48
  621. llama_stack/distribution/server/server.py +0 -343
  622. llama_stack/distribution/start_conda_env.sh +0 -42
  623. llama_stack/distribution/start_container.sh +0 -64
  624. llama_stack/distribution/templates/local-bedrock-conda-example-build.yaml +0 -10
  625. llama_stack/distribution/templates/local-build.yaml +0 -10
  626. llama_stack/distribution/templates/local-databricks-build.yaml +0 -10
  627. llama_stack/distribution/templates/local-fireworks-build.yaml +0 -10
  628. llama_stack/distribution/templates/local-hf-endpoint-build.yaml +0 -10
  629. llama_stack/distribution/templates/local-hf-serverless-build.yaml +0 -10
  630. llama_stack/distribution/templates/local-ollama-build.yaml +0 -10
  631. llama_stack/distribution/templates/local-tgi-build.yaml +0 -10
  632. llama_stack/distribution/templates/local-together-build.yaml +0 -10
  633. llama_stack/distribution/templates/local-vllm-build.yaml +0 -10
  634. llama_stack/distribution/utils/exec.py +0 -105
  635. llama_stack/providers/adapters/agents/sample/sample.py +0 -18
  636. llama_stack/providers/adapters/inference/bedrock/bedrock.py +0 -451
  637. llama_stack/providers/adapters/inference/bedrock/config.py +0 -55
  638. llama_stack/providers/adapters/inference/databricks/config.py +0 -21
  639. llama_stack/providers/adapters/inference/databricks/databricks.py +0 -125
  640. llama_stack/providers/adapters/inference/fireworks/config.py +0 -20
  641. llama_stack/providers/adapters/inference/fireworks/fireworks.py +0 -130
  642. llama_stack/providers/adapters/inference/ollama/__init__.py +0 -19
  643. llama_stack/providers/adapters/inference/ollama/ollama.py +0 -175
  644. llama_stack/providers/adapters/inference/sample/sample.py +0 -23
  645. llama_stack/providers/adapters/inference/tgi/config.py +0 -43
  646. llama_stack/providers/adapters/inference/tgi/tgi.py +0 -200
  647. llama_stack/providers/adapters/inference/together/config.py +0 -22
  648. llama_stack/providers/adapters/inference/together/together.py +0 -143
  649. llama_stack/providers/adapters/memory/chroma/chroma.py +0 -157
  650. llama_stack/providers/adapters/memory/pgvector/config.py +0 -17
  651. llama_stack/providers/adapters/memory/pgvector/pgvector.py +0 -211
  652. llama_stack/providers/adapters/memory/sample/sample.py +0 -23
  653. llama_stack/providers/adapters/memory/weaviate/__init__.py +0 -15
  654. llama_stack/providers/adapters/memory/weaviate/weaviate.py +0 -190
  655. llama_stack/providers/adapters/safety/bedrock/bedrock.py +0 -113
  656. llama_stack/providers/adapters/safety/bedrock/config.py +0 -16
  657. llama_stack/providers/adapters/safety/sample/sample.py +0 -23
  658. llama_stack/providers/adapters/safety/together/__init__.py +0 -18
  659. llama_stack/providers/adapters/safety/together/config.py +0 -26
  660. llama_stack/providers/adapters/safety/together/together.py +0 -101
  661. llama_stack/providers/adapters/telemetry/opentelemetry/config.py +0 -12
  662. llama_stack/providers/adapters/telemetry/opentelemetry/opentelemetry.py +0 -201
  663. llama_stack/providers/adapters/telemetry/sample/__init__.py +0 -17
  664. llama_stack/providers/adapters/telemetry/sample/config.py +0 -12
  665. llama_stack/providers/adapters/telemetry/sample/sample.py +0 -18
  666. llama_stack/providers/impls/meta_reference/agents/agent_instance.py +0 -844
  667. llama_stack/providers/impls/meta_reference/agents/agents.py +0 -161
  668. llama_stack/providers/impls/meta_reference/agents/persistence.py +0 -84
  669. llama_stack/providers/impls/meta_reference/agents/rag/context_retriever.py +0 -74
  670. llama_stack/providers/impls/meta_reference/agents/safety.py +0 -57
  671. llama_stack/providers/impls/meta_reference/agents/tests/code_execution.py +0 -93
  672. llama_stack/providers/impls/meta_reference/agents/tests/test_chat_agent.py +0 -305
  673. llama_stack/providers/impls/meta_reference/agents/tools/base.py +0 -20
  674. llama_stack/providers/impls/meta_reference/agents/tools/builtin.py +0 -375
  675. llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/code_env_prefix.py +0 -133
  676. llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/code_execution.py +0 -256
  677. llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/matplotlib_custom_backend.py +0 -87
  678. llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/utils.py +0 -21
  679. llama_stack/providers/impls/meta_reference/agents/tools/safety.py +0 -43
  680. llama_stack/providers/impls/meta_reference/codeshield/code_scanner.py +0 -58
  681. llama_stack/providers/impls/meta_reference/inference/config.py +0 -45
  682. llama_stack/providers/impls/meta_reference/inference/generation.py +0 -376
  683. llama_stack/providers/impls/meta_reference/inference/inference.py +0 -280
  684. llama_stack/providers/impls/meta_reference/inference/model_parallel.py +0 -99
  685. llama_stack/providers/impls/meta_reference/inference/quantization/fp8_impls.py +0 -184
  686. llama_stack/providers/impls/meta_reference/inference/quantization/fp8_txest_disabled.py +0 -76
  687. llama_stack/providers/impls/meta_reference/inference/quantization/loader.py +0 -97
  688. llama_stack/providers/impls/meta_reference/inference/quantization/scripts/quantize_checkpoint.py +0 -161
  689. llama_stack/providers/impls/meta_reference/memory/__init__.py +0 -19
  690. llama_stack/providers/impls/meta_reference/memory/faiss.py +0 -113
  691. llama_stack/providers/impls/meta_reference/safety/__init__.py +0 -17
  692. llama_stack/providers/impls/meta_reference/safety/base.py +0 -57
  693. llama_stack/providers/impls/meta_reference/safety/config.py +0 -48
  694. llama_stack/providers/impls/meta_reference/safety/llama_guard.py +0 -268
  695. llama_stack/providers/impls/meta_reference/safety/prompt_guard.py +0 -145
  696. llama_stack/providers/impls/meta_reference/safety/safety.py +0 -112
  697. llama_stack/providers/impls/meta_reference/telemetry/console.py +0 -89
  698. llama_stack/providers/impls/vllm/config.py +0 -35
  699. llama_stack/providers/impls/vllm/vllm.py +0 -241
  700. llama_stack/providers/registry/memory.py +0 -78
  701. llama_stack/providers/registry/telemetry.py +0 -44
  702. llama_stack/providers/tests/agents/test_agents.py +0 -210
  703. llama_stack/providers/tests/inference/test_inference.py +0 -257
  704. llama_stack/providers/tests/inference/test_prompt_adapter.py +0 -126
  705. llama_stack/providers/tests/memory/test_memory.py +0 -136
  706. llama_stack/providers/tests/resolver.py +0 -100
  707. llama_stack/providers/tests/safety/test_safety.py +0 -77
  708. llama_stack-0.0.42.dist-info/METADATA +0 -137
  709. llama_stack-0.0.42.dist-info/RECORD +0 -256
  710. /llama_stack/{distribution → core}/__init__.py +0 -0
  711. /llama_stack/{distribution/server → core/access_control}/__init__.py +0 -0
  712. /llama_stack/{distribution/utils → core/conversations}/__init__.py +0 -0
  713. /llama_stack/{providers/adapters → core/prompts}/__init__.py +0 -0
  714. /llama_stack/{providers/adapters/agents → core/routing_tables}/__init__.py +0 -0
  715. /llama_stack/{providers/adapters/inference → core/server}/__init__.py +0 -0
  716. /llama_stack/{providers/adapters/memory → core/storage}/__init__.py +0 -0
  717. /llama_stack/{providers/adapters/safety → core/ui}/__init__.py +0 -0
  718. /llama_stack/{providers/adapters/telemetry → core/ui/modules}/__init__.py +0 -0
  719. /llama_stack/{providers/impls → core/ui/page}/__init__.py +0 -0
  720. /llama_stack/{providers/impls/meta_reference → core/ui/page/distribution}/__init__.py +0 -0
  721. /llama_stack/{providers/impls/meta_reference/agents/rag → core/ui/page/evaluations}/__init__.py +0 -0
  722. /llama_stack/{providers/impls/meta_reference/agents/tests → core/ui/page/playground}/__init__.py +0 -0
  723. /llama_stack/{providers/impls/meta_reference/agents/tools → core/utils}/__init__.py +0 -0
  724. /llama_stack/{distribution → core}/utils/dynamic.py +0 -0
  725. /llama_stack/{distribution → core}/utils/serialize.py +0 -0
  726. /llama_stack/{providers/impls/meta_reference/agents/tools/ipython_tool → distributions}/__init__.py +0 -0
  727. /llama_stack/{providers/impls/meta_reference/inference/quantization → models}/__init__.py +0 -0
  728. /llama_stack/{providers/impls/meta_reference/inference/quantization/scripts → models/llama}/__init__.py +0 -0
  729. /llama_stack/{providers/tests → models/llama/llama3}/__init__.py +0 -0
  730. /llama_stack/{providers/tests/agents → models/llama/llama3/quantization}/__init__.py +0 -0
  731. /llama_stack/{providers/tests/inference → models/llama/llama3_2}/__init__.py +0 -0
  732. /llama_stack/{providers/tests/memory → models/llama/llama3_3}/__init__.py +0 -0
  733. /llama_stack/{providers/tests/safety → models/llama/llama4}/__init__.py +0 -0
  734. /llama_stack/{scripts → models/llama/llama4/prompt_templates}/__init__.py +0 -0
  735. /llama_stack/providers/{adapters → remote}/safety/bedrock/__init__.py +0 -0
  736. {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info}/entry_points.txt +0 -0
  737. {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info/licenses}/LICENSE +0 -0
  738. {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,877 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ # All rights reserved.
3
+ #
4
+ # This source code is licensed under the terms described in the LICENSE file in
5
+ # the root directory of this source tree.
6
+
7
+ """
8
+ Type-safe data interchange for Python data classes.
9
+
10
+ :see: https://github.com/hunyadi/strong_typing
11
+ """
12
+
13
+ import abc
14
+ import base64
15
+ import dataclasses
16
+ import datetime
17
+ import enum
18
+ import inspect
19
+ import ipaddress
20
+ import sys
21
+ import typing
22
+ import uuid
23
+ from types import ModuleType
24
+ from typing import (
25
+ Any,
26
+ Callable,
27
+ Dict,
28
+ Generic,
29
+ List,
30
+ Literal,
31
+ NamedTuple,
32
+ Optional,
33
+ Set,
34
+ Tuple,
35
+ Type,
36
+ TypeVar,
37
+ Union,
38
+ )
39
+
40
+ from .core import JsonType
41
+ from .exception import JsonKeyError, JsonTypeError, JsonValueError
42
+ from .inspection import (
43
+ TypeLike,
44
+ create_object,
45
+ enum_value_types,
46
+ evaluate_type,
47
+ get_class_properties,
48
+ get_class_property,
49
+ get_resolved_hints,
50
+ is_dataclass_instance,
51
+ is_dataclass_type,
52
+ is_named_tuple_type,
53
+ is_type_annotated,
54
+ is_type_literal,
55
+ is_type_optional,
56
+ unwrap_annotated_type,
57
+ unwrap_literal_values,
58
+ unwrap_optional_type,
59
+ )
60
+ from .mapping import python_field_to_json_property
61
+ from .name import python_type_to_str
62
+
63
+ E = TypeVar("E", bound=enum.Enum)
64
+ T = TypeVar("T")
65
+ R = TypeVar("R")
66
+ K = TypeVar("K")
67
+ V = TypeVar("V")
68
+
69
+
70
+ class Deserializer(abc.ABC, Generic[T]):
71
+ "Parses a JSON value into a Python type."
72
+
73
+ def build(self, context: Optional[ModuleType]) -> None:
74
+ """
75
+ Creates auxiliary parsers that this parser is depending on.
76
+
77
+ :param context: A module context for evaluating types specified as a string.
78
+ """
79
+
80
+ @abc.abstractmethod
81
+ def parse(self, data: JsonType) -> T:
82
+ """
83
+ Parses a JSON value into a Python type.
84
+
85
+ :param data: The JSON value to de-serialize.
86
+ :returns: The Python object that the JSON value de-serializes to.
87
+ """
88
+
89
+
90
+ class NoneDeserializer(Deserializer[None]):
91
+ "Parses JSON `null` values into Python `None`."
92
+
93
+ def parse(self, data: JsonType) -> None:
94
+ if data is not None:
95
+ raise JsonTypeError(f"`None` type expects JSON `null` but instead received: {data}")
96
+ return None
97
+
98
+
99
+ class BoolDeserializer(Deserializer[bool]):
100
+ "Parses JSON `boolean` values into Python `bool` type."
101
+
102
+ def parse(self, data: JsonType) -> bool:
103
+ if not isinstance(data, bool):
104
+ raise JsonTypeError(f"`bool` type expects JSON `boolean` data but instead received: {data}")
105
+ return bool(data)
106
+
107
+
108
+ class IntDeserializer(Deserializer[int]):
109
+ "Parses JSON `number` values into Python `int` type."
110
+
111
+ def parse(self, data: JsonType) -> int:
112
+ if not isinstance(data, int):
113
+ raise JsonTypeError(f"`int` type expects integer data as JSON `number` but instead received: {data}")
114
+ return int(data)
115
+
116
+
117
+ class FloatDeserializer(Deserializer[float]):
118
+ "Parses JSON `number` values into Python `float` type."
119
+
120
+ def parse(self, data: JsonType) -> float:
121
+ if not isinstance(data, float) and not isinstance(data, int):
122
+ raise JsonTypeError(f"`int` type expects data as JSON `number` but instead received: {data}")
123
+ return float(data)
124
+
125
+
126
+ class StringDeserializer(Deserializer[str]):
127
+ "Parses JSON `string` values into Python `str` type."
128
+
129
+ def parse(self, data: JsonType) -> str:
130
+ if not isinstance(data, str):
131
+ raise JsonTypeError(f"`str` type expects JSON `string` data but instead received: {data}")
132
+ return str(data)
133
+
134
+
135
+ class BytesDeserializer(Deserializer[bytes]):
136
+ "Parses JSON `string` values of Base64-encoded strings into Python `bytes` type."
137
+
138
+ def parse(self, data: JsonType) -> bytes:
139
+ if not isinstance(data, str):
140
+ raise JsonTypeError(f"`bytes` type expects JSON `string` data but instead received: {data}")
141
+ return base64.b64decode(data, validate=True)
142
+
143
+
144
+ class DateTimeDeserializer(Deserializer[datetime.datetime]):
145
+ "Parses JSON `string` values representing timestamps in ISO 8601 format to Python `datetime` with time zone."
146
+
147
+ def parse(self, data: JsonType) -> datetime.datetime:
148
+ if not isinstance(data, str):
149
+ raise JsonTypeError(f"`datetime` type expects JSON `string` data but instead received: {data}")
150
+
151
+ if data.endswith("Z"):
152
+ data = f"{data[:-1]}+00:00" # Python's isoformat() does not support military time zones like "Zulu" for UTC
153
+ timestamp = datetime.datetime.fromisoformat(data)
154
+ if timestamp.tzinfo is None:
155
+ raise JsonValueError(f"timestamp lacks explicit time zone designator: {data}")
156
+ return timestamp
157
+
158
+
159
+ class DateDeserializer(Deserializer[datetime.date]):
160
+ "Parses JSON `string` values representing dates in ISO 8601 format to Python `date` type."
161
+
162
+ def parse(self, data: JsonType) -> datetime.date:
163
+ if not isinstance(data, str):
164
+ raise JsonTypeError(f"`date` type expects JSON `string` data but instead received: {data}")
165
+
166
+ return datetime.date.fromisoformat(data)
167
+
168
+
169
+ class TimeDeserializer(Deserializer[datetime.time]):
170
+ "Parses JSON `string` values representing time instances in ISO 8601 format to Python `time` type with time zone."
171
+
172
+ def parse(self, data: JsonType) -> datetime.time:
173
+ if not isinstance(data, str):
174
+ raise JsonTypeError(f"`time` type expects JSON `string` data but instead received: {data}")
175
+
176
+ return datetime.time.fromisoformat(data)
177
+
178
+
179
+ class UUIDDeserializer(Deserializer[uuid.UUID]):
180
+ "Parses JSON `string` values of UUID strings into Python `uuid.UUID` type."
181
+
182
+ def parse(self, data: JsonType) -> uuid.UUID:
183
+ if not isinstance(data, str):
184
+ raise JsonTypeError(f"`UUID` type expects JSON `string` data but instead received: {data}")
185
+ return uuid.UUID(data)
186
+
187
+
188
+ class IPv4Deserializer(Deserializer[ipaddress.IPv4Address]):
189
+ "Parses JSON `string` values of IPv4 address strings into Python `ipaddress.IPv4Address` type."
190
+
191
+ def parse(self, data: JsonType) -> ipaddress.IPv4Address:
192
+ if not isinstance(data, str):
193
+ raise JsonTypeError(f"`IPv4Address` type expects JSON `string` data but instead received: {data}")
194
+ return ipaddress.IPv4Address(data)
195
+
196
+
197
+ class IPv6Deserializer(Deserializer[ipaddress.IPv6Address]):
198
+ "Parses JSON `string` values of IPv6 address strings into Python `ipaddress.IPv6Address` type."
199
+
200
+ def parse(self, data: JsonType) -> ipaddress.IPv6Address:
201
+ if not isinstance(data, str):
202
+ raise JsonTypeError(f"`IPv6Address` type expects JSON `string` data but instead received: {data}")
203
+ return ipaddress.IPv6Address(data)
204
+
205
+
206
+ class ListDeserializer(Deserializer[List[T]]):
207
+ "Recursively de-serializes a JSON array into a Python `list`."
208
+
209
+ item_type: Type[T]
210
+ item_parser: Deserializer
211
+
212
+ def __init__(self, item_type: Type[T]) -> None:
213
+ self.item_type = item_type
214
+
215
+ def build(self, context: Optional[ModuleType]) -> None:
216
+ self.item_parser = _get_deserializer(self.item_type, context)
217
+
218
+ def parse(self, data: JsonType) -> List[T]:
219
+ if not isinstance(data, list):
220
+ type_name = python_type_to_str(self.item_type)
221
+ raise JsonTypeError(f"type `List[{type_name}]` expects JSON `array` data but instead received: {data}")
222
+
223
+ return [self.item_parser.parse(item) for item in data]
224
+
225
+
226
+ class DictDeserializer(Deserializer[Dict[K, V]]):
227
+ "Recursively de-serializes a JSON object into a Python `dict`."
228
+
229
+ key_type: Type[K]
230
+ value_type: Type[V]
231
+ value_parser: Deserializer[V]
232
+
233
+ def __init__(self, key_type: Type[K], value_type: Type[V]) -> None:
234
+ self.key_type = key_type
235
+ self.value_type = value_type
236
+ self._check_key_type()
237
+
238
+ def build(self, context: Optional[ModuleType]) -> None:
239
+ self.value_parser = _get_deserializer(self.value_type, context)
240
+
241
+ def _check_key_type(self) -> None:
242
+ if self.key_type is str:
243
+ return
244
+
245
+ if issubclass(self.key_type, enum.Enum):
246
+ value_types = enum_value_types(self.key_type)
247
+ if len(value_types) != 1:
248
+ raise JsonTypeError(
249
+ f"type `{self.container_type}` has invalid key type, "
250
+ f"enumerations must have a consistent member value type but several types found: {value_types}"
251
+ )
252
+ value_type = value_types.pop()
253
+ if value_type is not str:
254
+ f"`type `{self.container_type}` has invalid enumeration key type, expected `enum.Enum` with string values"
255
+ return
256
+
257
+ raise JsonTypeError(
258
+ f"`type `{self.container_type}` has invalid key type, expected `str` or `enum.Enum` with string values"
259
+ )
260
+
261
+ @property
262
+ def container_type(self) -> str:
263
+ key_type_name = python_type_to_str(self.key_type)
264
+ value_type_name = python_type_to_str(self.value_type)
265
+ return f"Dict[{key_type_name}, {value_type_name}]"
266
+
267
+ def parse(self, data: JsonType) -> Dict[K, V]:
268
+ if not isinstance(data, dict):
269
+ raise JsonTypeError(
270
+ f"`type `{self.container_type}` expects JSON `object` data but instead received: {data}"
271
+ )
272
+
273
+ return dict(
274
+ (self.key_type(key), self.value_parser.parse(value)) # type: ignore[call-arg]
275
+ for key, value in data.items()
276
+ )
277
+
278
+
279
+ class SetDeserializer(Deserializer[Set[T]]):
280
+ "Recursively de-serializes a JSON list into a Python `set`."
281
+
282
+ member_type: Type[T]
283
+ member_parser: Deserializer
284
+
285
+ def __init__(self, member_type: Type[T]) -> None:
286
+ self.member_type = member_type
287
+
288
+ def build(self, context: Optional[ModuleType]) -> None:
289
+ self.member_parser = _get_deserializer(self.member_type, context)
290
+
291
+ def parse(self, data: JsonType) -> Set[T]:
292
+ if not isinstance(data, list):
293
+ type_name = python_type_to_str(self.member_type)
294
+ raise JsonTypeError(f"type `Set[{type_name}]` expects JSON `array` data but instead received: {data}")
295
+
296
+ return set(self.member_parser.parse(item) for item in data)
297
+
298
+
299
+ class TupleDeserializer(Deserializer[Tuple[Any, ...]]):
300
+ "Recursively de-serializes a JSON list into a Python `tuple`."
301
+
302
+ item_types: Tuple[Type[Any], ...]
303
+ item_parsers: Tuple[Deserializer[Any], ...]
304
+
305
+ def __init__(self, item_types: Tuple[Type[Any], ...]) -> None:
306
+ self.item_types = item_types
307
+
308
+ def build(self, context: Optional[ModuleType]) -> None:
309
+ self.item_parsers = tuple(_get_deserializer(item_type, context) for item_type in self.item_types)
310
+
311
+ @property
312
+ def container_type(self) -> str:
313
+ type_names = ", ".join(python_type_to_str(item_type) for item_type in self.item_types)
314
+ return f"Tuple[{type_names}]"
315
+
316
+ def parse(self, data: JsonType) -> Tuple[Any, ...]:
317
+ if not isinstance(data, list) or len(data) != len(self.item_parsers):
318
+ if not isinstance(data, list):
319
+ raise JsonTypeError(
320
+ f"type `{self.container_type}` expects JSON `array` data but instead received: {data}"
321
+ )
322
+ else:
323
+ count = len(self.item_parsers)
324
+ raise JsonValueError(
325
+ f"type `{self.container_type}` expects a JSON `array` of length {count} but received length {len(data)}"
326
+ )
327
+
328
+ return tuple(item_parser.parse(item) for item_parser, item in zip(self.item_parsers, data, strict=False))
329
+
330
+
331
+ class UnionDeserializer(Deserializer):
332
+ "De-serializes a JSON value (of any type) into a Python union type."
333
+
334
+ member_types: Tuple[type, ...]
335
+ member_parsers: Tuple[Deserializer, ...]
336
+
337
+ def __init__(self, member_types: Tuple[type, ...]) -> None:
338
+ self.member_types = member_types
339
+
340
+ def build(self, context: Optional[ModuleType]) -> None:
341
+ self.member_parsers = tuple(_get_deserializer(member_type, context) for member_type in self.member_types)
342
+
343
+ def parse(self, data: JsonType) -> Any:
344
+ for member_parser in self.member_parsers:
345
+ # iterate over potential types of discriminated union
346
+ try:
347
+ return member_parser.parse(data)
348
+ except (JsonKeyError, JsonTypeError):
349
+ # indicates a required field is missing from JSON dict -OR- the data cannot be cast to the expected type,
350
+ # i.e. we don't have the type that we are looking for
351
+ continue
352
+
353
+ type_names = ", ".join(python_type_to_str(member_type) for member_type in self.member_types)
354
+ raise JsonKeyError(f"type `Union[{type_names}]` could not be instantiated from: {data}")
355
+
356
+
357
+ def get_literal_properties(typ: type) -> Set[str]:
358
+ "Returns the names of all properties in a class that are of a literal type."
359
+
360
+ return set(
361
+ property_name for property_name, property_type in get_class_properties(typ) if is_type_literal(property_type)
362
+ )
363
+
364
+
365
+ def get_discriminating_properties(types: Tuple[type, ...]) -> Set[str]:
366
+ "Returns a set of properties with literal type that are common across all specified classes."
367
+
368
+ if not types or not all(isinstance(typ, type) for typ in types):
369
+ return set()
370
+
371
+ props = get_literal_properties(types[0])
372
+ for typ in types[1:]:
373
+ props = props & get_literal_properties(typ)
374
+
375
+ return props
376
+
377
+
378
+ class TaggedUnionDeserializer(Deserializer):
379
+ "De-serializes a JSON value with one or more disambiguating properties into a Python union type."
380
+
381
+ member_types: Tuple[type, ...]
382
+ disambiguating_properties: Set[str]
383
+ member_parsers: Dict[Tuple[str, Any], Deserializer]
384
+
385
+ def __init__(self, member_types: Tuple[type, ...]) -> None:
386
+ self.member_types = member_types
387
+ self.disambiguating_properties = get_discriminating_properties(member_types)
388
+
389
+ def build(self, context: Optional[ModuleType]) -> None:
390
+ self.member_parsers = {}
391
+ for member_type in self.member_types:
392
+ for property_name in self.disambiguating_properties:
393
+ literal_type = get_class_property(member_type, property_name)
394
+ if not literal_type:
395
+ continue
396
+
397
+ for literal_value in unwrap_literal_values(literal_type):
398
+ tpl = (property_name, literal_value)
399
+ if tpl in self.member_parsers:
400
+ raise JsonTypeError(
401
+ f"disambiguating property `{property_name}` in type `{self.union_type}` has a duplicate value: {literal_value}"
402
+ )
403
+
404
+ self.member_parsers[tpl] = _get_deserializer(member_type, context)
405
+
406
+ @property
407
+ def union_type(self) -> str:
408
+ type_names = ", ".join(python_type_to_str(member_type) for member_type in self.member_types)
409
+ return f"Union[{type_names}]"
410
+
411
+ def parse(self, data: JsonType) -> Any:
412
+ if not isinstance(data, dict):
413
+ raise JsonTypeError(
414
+ f"tagged union type `{self.union_type}` expects JSON `object` data but instead received: {data}"
415
+ )
416
+
417
+ for property_name in self.disambiguating_properties:
418
+ disambiguating_value = data.get(property_name)
419
+ if disambiguating_value is None:
420
+ continue
421
+
422
+ member_parser = self.member_parsers.get((property_name, disambiguating_value))
423
+ if member_parser is None:
424
+ raise JsonTypeError(
425
+ f"disambiguating property value is invalid for tagged union type `{self.union_type}`: {data}"
426
+ )
427
+
428
+ return member_parser.parse(data)
429
+
430
+ raise JsonTypeError(
431
+ f"disambiguating property value is missing for tagged union type `{self.union_type}`: {data}"
432
+ )
433
+
434
+
435
+ class LiteralDeserializer(Deserializer):
436
+ "De-serializes a JSON value into a Python literal type."
437
+
438
+ values: Tuple[Any, ...]
439
+ parser: Deserializer
440
+
441
+ def __init__(self, values: Tuple[Any, ...]) -> None:
442
+ self.values = values
443
+
444
+ def build(self, context: Optional[ModuleType]) -> None:
445
+ literal_type_tuple = tuple(type(value) for value in self.values)
446
+ literal_type_set = set(literal_type_tuple)
447
+ if len(literal_type_set) != 1:
448
+ value_names = ", ".join(repr(value) for value in self.values)
449
+ raise TypeError(
450
+ f"type `Literal[{value_names}]` expects consistent literal value types but got: {literal_type_tuple}"
451
+ )
452
+
453
+ literal_type = literal_type_set.pop()
454
+ self.parser = _get_deserializer(literal_type, context)
455
+
456
+ def parse(self, data: JsonType) -> Any:
457
+ value = self.parser.parse(data)
458
+ if value not in self.values:
459
+ value_names = ", ".join(repr(value) for value in self.values)
460
+ raise JsonTypeError(f"type `Literal[{value_names}]` could not be instantiated from: {data}")
461
+ return value
462
+
463
+
464
+ class EnumDeserializer(Deserializer[E]):
465
+ "Returns an enumeration instance based on the enumeration value read from a JSON value."
466
+
467
+ enum_type: Type[E]
468
+
469
+ def __init__(self, enum_type: Type[E]) -> None:
470
+ self.enum_type = enum_type
471
+
472
+ def parse(self, data: JsonType) -> E:
473
+ return self.enum_type(data)
474
+
475
+
476
+ class CustomDeserializer(Deserializer[T]):
477
+ "Uses the `from_json` class method in class to de-serialize the object from JSON."
478
+
479
+ converter: Callable[[JsonType], T]
480
+
481
+ def __init__(self, converter: Callable[[JsonType], T]) -> None:
482
+ self.converter = converter
483
+
484
+ def parse(self, data: JsonType) -> T:
485
+ return self.converter(data)
486
+
487
+
488
+ class FieldDeserializer(abc.ABC, Generic[T, R]):
489
+ """
490
+ Deserializes a JSON property into a Python object field.
491
+
492
+ :param property_name: The name of the JSON property to read from a JSON `object`.
493
+ :param field_name: The name of the field in a Python class to write data to.
494
+ :param parser: A compatible deserializer that can handle the field's type.
495
+ """
496
+
497
+ property_name: str
498
+ field_name: str
499
+ parser: Deserializer[T]
500
+
501
+ def __init__(self, property_name: str, field_name: str, parser: Deserializer[T]) -> None:
502
+ self.property_name = property_name
503
+ self.field_name = field_name
504
+ self.parser = parser
505
+
506
+ @abc.abstractmethod
507
+ def parse_field(self, data: Dict[str, JsonType]) -> R: ...
508
+
509
+
510
+ class RequiredFieldDeserializer(FieldDeserializer[T, T]):
511
+ "Deserializes a JSON property into a mandatory Python object field."
512
+
513
+ def parse_field(self, data: Dict[str, JsonType]) -> T:
514
+ if self.property_name not in data:
515
+ raise JsonKeyError(f"missing required property `{self.property_name}` from JSON object: {data}")
516
+
517
+ return self.parser.parse(data[self.property_name])
518
+
519
+
520
+ class OptionalFieldDeserializer(FieldDeserializer[T, Optional[T]]):
521
+ "Deserializes a JSON property into an optional Python object field with a default value of `None`."
522
+
523
+ def parse_field(self, data: Dict[str, JsonType]) -> Optional[T]:
524
+ value = data.get(self.property_name)
525
+ if value is not None:
526
+ return self.parser.parse(value)
527
+ else:
528
+ return None
529
+
530
+
531
+ class DefaultFieldDeserializer(FieldDeserializer[T, T]):
532
+ "Deserializes a JSON property into a Python object field with an explicit default value."
533
+
534
+ default_value: T
535
+
536
+ def __init__(
537
+ self,
538
+ property_name: str,
539
+ field_name: str,
540
+ parser: Deserializer,
541
+ default_value: T,
542
+ ) -> None:
543
+ super().__init__(property_name, field_name, parser)
544
+ self.default_value = default_value
545
+
546
+ def parse_field(self, data: Dict[str, JsonType]) -> T:
547
+ value = data.get(self.property_name)
548
+ if value is not None:
549
+ return self.parser.parse(value)
550
+ else:
551
+ return self.default_value
552
+
553
+
554
+ class DefaultFactoryFieldDeserializer(FieldDeserializer[T, T]):
555
+ "Deserializes a JSON property into an optional Python object field with an explicit default value factory."
556
+
557
+ default_factory: Callable[[], T]
558
+
559
+ def __init__(
560
+ self,
561
+ property_name: str,
562
+ field_name: str,
563
+ parser: Deserializer[T],
564
+ default_factory: Callable[[], T],
565
+ ) -> None:
566
+ super().__init__(property_name, field_name, parser)
567
+ self.default_factory = default_factory
568
+
569
+ def parse_field(self, data: Dict[str, JsonType]) -> T:
570
+ value = data.get(self.property_name)
571
+ if value is not None:
572
+ return self.parser.parse(value)
573
+ else:
574
+ return self.default_factory()
575
+
576
+
577
+ class ClassDeserializer(Deserializer[T]):
578
+ "Base class for de-serializing class-like types such as data classes, named tuples and regular classes."
579
+
580
+ class_type: type
581
+ property_parsers: List[FieldDeserializer]
582
+ property_fields: Set[str]
583
+
584
+ def __init__(self, class_type: Type[T]) -> None:
585
+ self.class_type = class_type
586
+
587
+ def assign(self, property_parsers: List[FieldDeserializer]) -> None:
588
+ self.property_parsers = property_parsers
589
+ self.property_fields = set(property_parser.property_name for property_parser in property_parsers)
590
+
591
+ def parse(self, data: JsonType) -> T:
592
+ if not isinstance(data, dict):
593
+ type_name = python_type_to_str(self.class_type)
594
+ raise JsonTypeError(f"`type `{type_name}` expects JSON `object` data but instead received: {data}")
595
+
596
+ object_data: Dict[str, JsonType] = typing.cast(Dict[str, JsonType], data)
597
+
598
+ field_values = {}
599
+ for property_parser in self.property_parsers:
600
+ field_values[property_parser.field_name] = property_parser.parse_field(object_data)
601
+
602
+ if not self.property_fields.issuperset(object_data):
603
+ unassigned_names = [name for name in object_data if name not in self.property_fields]
604
+ raise JsonKeyError(f"unrecognized fields in JSON object: {unassigned_names}")
605
+
606
+ return self.create(**field_values)
607
+
608
+ def create(self, **field_values: Any) -> T:
609
+ "Instantiates an object with a collection of property values."
610
+
611
+ obj: T = create_object(self.class_type)
612
+
613
+ # use `setattr` on newly created object instance
614
+ for field_name, field_value in field_values.items():
615
+ setattr(obj, field_name, field_value)
616
+ return obj
617
+
618
+
619
+ class NamedTupleDeserializer(ClassDeserializer[NamedTuple]):
620
+ "De-serializes a named tuple from a JSON `object`."
621
+
622
+ def build(self, context: Optional[ModuleType]) -> None:
623
+ property_parsers: List[FieldDeserializer] = [
624
+ RequiredFieldDeserializer(field_name, field_name, _get_deserializer(field_type, context))
625
+ for field_name, field_type in get_resolved_hints(self.class_type).items()
626
+ ]
627
+ super().assign(property_parsers)
628
+
629
+ def create(self, **field_values: Any) -> NamedTuple:
630
+ # mypy fails to deduce that this class returns NamedTuples only, hence the `ignore` directive
631
+ return self.class_type(**field_values) # type: ignore[no-any-return]
632
+
633
+
634
+ class DataclassDeserializer(ClassDeserializer[T]):
635
+ "De-serializes a data class from a JSON `object`."
636
+
637
+ def __init__(self, class_type: Type[T]) -> None:
638
+ if not dataclasses.is_dataclass(class_type):
639
+ raise TypeError("expected: data-class type")
640
+ super().__init__(class_type) # type: ignore[arg-type]
641
+
642
+ def build(self, context: Optional[ModuleType]) -> None:
643
+ property_parsers: List[FieldDeserializer] = []
644
+ resolved_hints = get_resolved_hints(self.class_type)
645
+ for field in dataclasses.fields(self.class_type):
646
+ field_type = resolved_hints[field.name]
647
+ property_name = python_field_to_json_property(field.name, field_type)
648
+
649
+ is_optional = is_type_optional(field_type)
650
+ has_default = field.default is not dataclasses.MISSING
651
+ has_default_factory = field.default_factory is not dataclasses.MISSING
652
+
653
+ if is_optional:
654
+ required_type: Type[T] = unwrap_optional_type(field_type)
655
+ else:
656
+ required_type = field_type
657
+
658
+ parser = _get_deserializer(required_type, context)
659
+
660
+ if has_default:
661
+ field_parser: FieldDeserializer = DefaultFieldDeserializer(
662
+ property_name, field.name, parser, field.default
663
+ )
664
+ elif has_default_factory:
665
+ default_factory = typing.cast(Callable[[], Any], field.default_factory)
666
+ field_parser = DefaultFactoryFieldDeserializer(property_name, field.name, parser, default_factory)
667
+ elif is_optional:
668
+ field_parser = OptionalFieldDeserializer(property_name, field.name, parser)
669
+ else:
670
+ field_parser = RequiredFieldDeserializer(property_name, field.name, parser)
671
+
672
+ property_parsers.append(field_parser)
673
+
674
+ super().assign(property_parsers)
675
+
676
+
677
+ class FrozenDataclassDeserializer(DataclassDeserializer[T]):
678
+ "De-serializes a frozen data class from a JSON `object`."
679
+
680
+ def create(self, **field_values: Any) -> T:
681
+ "Instantiates an object with a collection of property values."
682
+
683
+ # create object instance without calling `__init__`
684
+ obj: T = create_object(self.class_type)
685
+
686
+ # can't use `setattr` on frozen dataclasses, pass member variable values to `__init__`
687
+ obj.__init__(**field_values) # type: ignore
688
+ return obj
689
+
690
+
691
+ class TypedClassDeserializer(ClassDeserializer[T]):
692
+ "De-serializes a class with type annotations from a JSON `object` by iterating over class properties."
693
+
694
+ def build(self, context: Optional[ModuleType]) -> None:
695
+ property_parsers: List[FieldDeserializer] = []
696
+ for field_name, field_type in get_resolved_hints(self.class_type).items():
697
+ property_name = python_field_to_json_property(field_name, field_type)
698
+
699
+ is_optional = is_type_optional(field_type)
700
+
701
+ if is_optional:
702
+ required_type: Type[T] = unwrap_optional_type(field_type)
703
+ else:
704
+ required_type = field_type
705
+
706
+ parser = _get_deserializer(required_type, context)
707
+
708
+ if is_optional:
709
+ field_parser: FieldDeserializer = OptionalFieldDeserializer(property_name, field_name, parser)
710
+ else:
711
+ field_parser = RequiredFieldDeserializer(property_name, field_name, parser)
712
+
713
+ property_parsers.append(field_parser)
714
+
715
+ super().assign(property_parsers)
716
+
717
+
718
+ def create_deserializer(typ: TypeLike, context: Optional[ModuleType] = None) -> Deserializer:
719
+ """
720
+ Creates a de-serializer engine to produce a Python object from an object obtained from a JSON string.
721
+
722
+ When de-serializing a JSON object into a Python object, the following transformations are applied:
723
+
724
+ * Fundamental types are parsed as `bool`, `int`, `float` or `str`.
725
+ * Date and time types are parsed from the ISO 8601 format with time zone into the corresponding Python type
726
+ `datetime`, `date` or `time`.
727
+ * Byte arrays are read from a string with Base64 encoding into a `bytes` instance.
728
+ * UUIDs are extracted from a UUID string compliant with RFC 4122 into a `uuid.UUID` instance.
729
+ * Enumerations are instantiated with a lookup on enumeration value.
730
+ * Containers (e.g. `list`, `dict`, `set`, `tuple`) are parsed recursively.
731
+ * Complex objects with properties (including data class types) are populated from dictionaries of key-value pairs
732
+ using reflection (enumerating type annotations).
733
+
734
+ :raises TypeError: A de-serializer engine cannot be constructed for the input type.
735
+ """
736
+
737
+ if context is None:
738
+ if isinstance(typ, type):
739
+ context = sys.modules[typ.__module__]
740
+
741
+ return _get_deserializer(typ, context)
742
+
743
+
744
+ _CACHE: Dict[Tuple[str, str], Deserializer] = {}
745
+
746
+
747
+ def _get_deserializer(typ: TypeLike, context: Optional[ModuleType]) -> Deserializer:
748
+ "Creates or re-uses a de-serializer engine to parse an object obtained from a JSON string."
749
+
750
+ cache_key = None
751
+
752
+ if isinstance(typ, (str, typing.ForwardRef)):
753
+ if context is None:
754
+ raise TypeError(f"missing context for evaluating type: {typ}")
755
+
756
+ if isinstance(typ, str):
757
+ if hasattr(context, typ):
758
+ cache_key = (context.__name__, typ)
759
+ elif isinstance(typ, typing.ForwardRef):
760
+ if hasattr(context, typ.__forward_arg__):
761
+ cache_key = (context.__name__, typ.__forward_arg__)
762
+
763
+ typ = evaluate_type(typ, context)
764
+
765
+ typ = unwrap_annotated_type(typ) if is_type_annotated(typ) else typ
766
+
767
+ if isinstance(typ, type) and typing.get_origin(typ) is None:
768
+ cache_key = (typ.__module__, typ.__name__)
769
+
770
+ if cache_key is not None:
771
+ deserializer = _CACHE.get(cache_key)
772
+ if deserializer is None:
773
+ deserializer = _create_deserializer(typ)
774
+
775
+ # store de-serializer immediately in cache to avoid stack overflow for recursive types
776
+ _CACHE[cache_key] = deserializer
777
+
778
+ if isinstance(typ, type):
779
+ # use type's own module as context for evaluating member types
780
+ context = sys.modules[typ.__module__]
781
+
782
+ # create any de-serializers this de-serializer is depending on
783
+ deserializer.build(context)
784
+ else:
785
+ # special forms are not always hashable, create a new de-serializer every time
786
+ deserializer = _create_deserializer(typ)
787
+ deserializer.build(context)
788
+
789
+ return deserializer
790
+
791
+
792
+ def _create_deserializer(typ: TypeLike) -> Deserializer:
793
+ "Creates a de-serializer engine to parse an object obtained from a JSON string."
794
+
795
+ # check for well-known types
796
+ if typ is type(None):
797
+ return NoneDeserializer()
798
+ elif typ is bool:
799
+ return BoolDeserializer()
800
+ elif typ is int:
801
+ return IntDeserializer()
802
+ elif typ is float:
803
+ return FloatDeserializer()
804
+ elif typ is str:
805
+ return StringDeserializer()
806
+ elif typ is bytes:
807
+ return BytesDeserializer()
808
+ elif typ is datetime.datetime:
809
+ return DateTimeDeserializer()
810
+ elif typ is datetime.date:
811
+ return DateDeserializer()
812
+ elif typ is datetime.time:
813
+ return TimeDeserializer()
814
+ elif typ is uuid.UUID:
815
+ return UUIDDeserializer()
816
+ elif typ is ipaddress.IPv4Address:
817
+ return IPv4Deserializer()
818
+ elif typ is ipaddress.IPv6Address:
819
+ return IPv6Deserializer()
820
+
821
+ # dynamically-typed collection types
822
+ if typ is list:
823
+ raise TypeError("explicit item type required: use `List[T]` instead of `list`")
824
+ if typ is dict:
825
+ raise TypeError("explicit key and value types required: use `Dict[K, V]` instead of `dict`")
826
+ if typ is set:
827
+ raise TypeError("explicit member type required: use `Set[T]` instead of `set`")
828
+ if typ is tuple:
829
+ raise TypeError("explicit item type list required: use `Tuple[T, ...]` instead of `tuple`")
830
+
831
+ # generic types (e.g. list, dict, set, etc.)
832
+ origin_type = typing.get_origin(typ)
833
+ if origin_type is list:
834
+ (list_item_type,) = typing.get_args(typ) # unpack single tuple element
835
+ return ListDeserializer(list_item_type)
836
+ elif origin_type is dict:
837
+ key_type, value_type = typing.get_args(typ)
838
+ return DictDeserializer(key_type, value_type)
839
+ elif origin_type is set:
840
+ (set_member_type,) = typing.get_args(typ) # unpack single tuple element
841
+ return SetDeserializer(set_member_type)
842
+ elif origin_type is tuple:
843
+ return TupleDeserializer(typing.get_args(typ))
844
+ elif origin_type is Union:
845
+ union_args = typing.get_args(typ)
846
+ if get_discriminating_properties(union_args):
847
+ return TaggedUnionDeserializer(union_args)
848
+ else:
849
+ return UnionDeserializer(union_args)
850
+ elif origin_type is Literal:
851
+ return LiteralDeserializer(typing.get_args(typ))
852
+
853
+ if not inspect.isclass(typ):
854
+ if is_dataclass_instance(typ):
855
+ raise TypeError(f"dataclass type expected but got instance: {typ}")
856
+ else:
857
+ raise TypeError(f"unable to de-serialize unrecognized type: {typ}")
858
+
859
+ if issubclass(typ, enum.Enum):
860
+ return EnumDeserializer(typ)
861
+
862
+ if is_named_tuple_type(typ):
863
+ return NamedTupleDeserializer(typ)
864
+
865
+ # check if object has custom serialization method
866
+ convert_func = getattr(typ, "from_json", None)
867
+ if callable(convert_func):
868
+ return CustomDeserializer(convert_func)
869
+
870
+ if is_dataclass_type(typ):
871
+ dataclass_params = getattr(typ, "__dataclass_params__", None)
872
+ if dataclass_params is not None and dataclass_params.frozen:
873
+ return FrozenDataclassDeserializer(typ)
874
+ else:
875
+ return DataclassDeserializer(typ)
876
+
877
+ return TypedClassDeserializer(typ)