llama-stack 0.3.5__py3-none-any.whl → 0.4.1__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 (460) hide show
  1. llama_stack/__init__.py +0 -5
  2. llama_stack/cli/llama.py +3 -3
  3. llama_stack/cli/stack/_list_deps.py +12 -23
  4. llama_stack/cli/stack/list_stacks.py +37 -18
  5. llama_stack/cli/stack/run.py +121 -11
  6. llama_stack/cli/stack/utils.py +0 -127
  7. llama_stack/core/access_control/access_control.py +69 -28
  8. llama_stack/core/access_control/conditions.py +15 -5
  9. llama_stack/core/admin.py +267 -0
  10. llama_stack/core/build.py +6 -74
  11. llama_stack/core/client.py +1 -1
  12. llama_stack/core/configure.py +6 -6
  13. llama_stack/core/conversations/conversations.py +28 -25
  14. llama_stack/core/datatypes.py +271 -79
  15. llama_stack/core/distribution.py +15 -16
  16. llama_stack/core/external.py +3 -3
  17. llama_stack/core/inspect.py +98 -15
  18. llama_stack/core/library_client.py +73 -61
  19. llama_stack/core/prompts/prompts.py +12 -11
  20. llama_stack/core/providers.py +17 -11
  21. llama_stack/core/resolver.py +65 -56
  22. llama_stack/core/routers/__init__.py +8 -12
  23. llama_stack/core/routers/datasets.py +1 -4
  24. llama_stack/core/routers/eval_scoring.py +7 -4
  25. llama_stack/core/routers/inference.py +55 -271
  26. llama_stack/core/routers/safety.py +52 -24
  27. llama_stack/core/routers/tool_runtime.py +6 -48
  28. llama_stack/core/routers/vector_io.py +130 -51
  29. llama_stack/core/routing_tables/benchmarks.py +24 -20
  30. llama_stack/core/routing_tables/common.py +1 -4
  31. llama_stack/core/routing_tables/datasets.py +22 -22
  32. llama_stack/core/routing_tables/models.py +119 -6
  33. llama_stack/core/routing_tables/scoring_functions.py +7 -7
  34. llama_stack/core/routing_tables/shields.py +1 -2
  35. llama_stack/core/routing_tables/toolgroups.py +17 -7
  36. llama_stack/core/routing_tables/vector_stores.py +51 -16
  37. llama_stack/core/server/auth.py +5 -3
  38. llama_stack/core/server/auth_providers.py +36 -20
  39. llama_stack/core/server/fastapi_router_registry.py +84 -0
  40. llama_stack/core/server/quota.py +2 -2
  41. llama_stack/core/server/routes.py +79 -27
  42. llama_stack/core/server/server.py +102 -87
  43. llama_stack/core/stack.py +235 -62
  44. llama_stack/core/storage/datatypes.py +26 -3
  45. llama_stack/{providers/utils → core/storage}/kvstore/__init__.py +2 -0
  46. llama_stack/{providers/utils → core/storage}/kvstore/kvstore.py +55 -24
  47. llama_stack/{providers/utils → core/storage}/kvstore/mongodb/mongodb.py +13 -10
  48. llama_stack/{providers/utils → core/storage}/kvstore/postgres/postgres.py +28 -17
  49. llama_stack/{providers/utils → core/storage}/kvstore/redis/redis.py +41 -16
  50. llama_stack/{providers/utils → core/storage}/kvstore/sqlite/sqlite.py +1 -1
  51. llama_stack/core/storage/sqlstore/__init__.py +17 -0
  52. llama_stack/{providers/utils → core/storage}/sqlstore/authorized_sqlstore.py +69 -49
  53. llama_stack/{providers/utils → core/storage}/sqlstore/sqlalchemy_sqlstore.py +47 -17
  54. llama_stack/{providers/utils → core/storage}/sqlstore/sqlstore.py +25 -8
  55. llama_stack/core/store/registry.py +1 -1
  56. llama_stack/core/utils/config.py +8 -2
  57. llama_stack/core/utils/config_resolution.py +32 -29
  58. llama_stack/core/utils/context.py +4 -10
  59. llama_stack/core/utils/exec.py +9 -0
  60. llama_stack/core/utils/type_inspection.py +45 -0
  61. llama_stack/distributions/dell/{run.yaml → config.yaml} +3 -2
  62. llama_stack/distributions/dell/dell.py +2 -2
  63. llama_stack/distributions/dell/run-with-safety.yaml +3 -2
  64. llama_stack/distributions/meta-reference-gpu/{run.yaml → config.yaml} +3 -2
  65. llama_stack/distributions/meta-reference-gpu/meta_reference.py +2 -2
  66. llama_stack/distributions/meta-reference-gpu/run-with-safety.yaml +3 -2
  67. llama_stack/distributions/nvidia/{run.yaml → config.yaml} +4 -4
  68. llama_stack/distributions/nvidia/nvidia.py +1 -1
  69. llama_stack/distributions/nvidia/run-with-safety.yaml +4 -4
  70. llama_stack/{apis/datasetio → distributions/oci}/__init__.py +1 -1
  71. llama_stack/distributions/oci/config.yaml +134 -0
  72. llama_stack/distributions/oci/oci.py +108 -0
  73. llama_stack/distributions/open-benchmark/{run.yaml → config.yaml} +5 -4
  74. llama_stack/distributions/open-benchmark/open_benchmark.py +2 -3
  75. llama_stack/distributions/postgres-demo/{run.yaml → config.yaml} +4 -3
  76. llama_stack/distributions/starter/{run.yaml → config.yaml} +64 -13
  77. llama_stack/distributions/starter/run-with-postgres-store.yaml +64 -13
  78. llama_stack/distributions/starter/starter.py +8 -5
  79. llama_stack/distributions/starter-gpu/{run.yaml → config.yaml} +64 -13
  80. llama_stack/distributions/starter-gpu/run-with-postgres-store.yaml +64 -13
  81. llama_stack/distributions/template.py +13 -69
  82. llama_stack/distributions/watsonx/{run.yaml → config.yaml} +4 -3
  83. llama_stack/distributions/watsonx/watsonx.py +1 -1
  84. llama_stack/log.py +28 -11
  85. llama_stack/models/llama/checkpoint.py +6 -6
  86. llama_stack/models/llama/hadamard_utils.py +2 -0
  87. llama_stack/models/llama/llama3/generation.py +3 -1
  88. llama_stack/models/llama/llama3/interface.py +2 -5
  89. llama_stack/models/llama/llama3/multimodal/encoder_utils.py +3 -3
  90. llama_stack/models/llama/llama3/multimodal/image_transform.py +6 -6
  91. llama_stack/models/llama/llama3/prompt_templates/system_prompts.py +1 -1
  92. llama_stack/models/llama/llama3/tool_utils.py +2 -1
  93. llama_stack/models/llama/llama4/prompt_templates/system_prompts.py +1 -1
  94. llama_stack/providers/inline/agents/meta_reference/__init__.py +3 -3
  95. llama_stack/providers/inline/agents/meta_reference/agents.py +44 -261
  96. llama_stack/providers/inline/agents/meta_reference/config.py +6 -1
  97. llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py +207 -57
  98. llama_stack/providers/inline/agents/meta_reference/responses/streaming.py +308 -47
  99. llama_stack/providers/inline/agents/meta_reference/responses/tool_executor.py +162 -96
  100. llama_stack/providers/inline/agents/meta_reference/responses/types.py +23 -8
  101. llama_stack/providers/inline/agents/meta_reference/responses/utils.py +201 -33
  102. llama_stack/providers/inline/agents/meta_reference/safety.py +8 -13
  103. llama_stack/providers/inline/batches/reference/__init__.py +2 -4
  104. llama_stack/providers/inline/batches/reference/batches.py +78 -60
  105. llama_stack/providers/inline/datasetio/localfs/datasetio.py +2 -5
  106. llama_stack/providers/inline/eval/meta_reference/eval.py +16 -61
  107. llama_stack/providers/inline/files/localfs/files.py +37 -28
  108. llama_stack/providers/inline/inference/meta_reference/config.py +2 -2
  109. llama_stack/providers/inline/inference/meta_reference/generators.py +50 -60
  110. llama_stack/providers/inline/inference/meta_reference/inference.py +403 -19
  111. llama_stack/providers/inline/inference/meta_reference/model_parallel.py +7 -26
  112. llama_stack/providers/inline/inference/meta_reference/parallel_utils.py +2 -12
  113. llama_stack/providers/inline/inference/sentence_transformers/sentence_transformers.py +10 -15
  114. llama_stack/providers/inline/post_training/common/validator.py +1 -5
  115. llama_stack/providers/inline/post_training/huggingface/post_training.py +8 -8
  116. llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device.py +18 -10
  117. llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device_dpo.py +12 -9
  118. llama_stack/providers/inline/post_training/huggingface/utils.py +27 -6
  119. llama_stack/providers/inline/post_training/torchtune/common/checkpointer.py +1 -1
  120. llama_stack/providers/inline/post_training/torchtune/common/utils.py +1 -1
  121. llama_stack/providers/inline/post_training/torchtune/datasets/format_adapter.py +1 -1
  122. llama_stack/providers/inline/post_training/torchtune/post_training.py +8 -8
  123. llama_stack/providers/inline/post_training/torchtune/recipes/lora_finetuning_single_device.py +16 -16
  124. llama_stack/providers/inline/safety/code_scanner/code_scanner.py +13 -9
  125. llama_stack/providers/inline/safety/llama_guard/llama_guard.py +18 -15
  126. llama_stack/providers/inline/safety/prompt_guard/prompt_guard.py +9 -9
  127. llama_stack/providers/inline/scoring/basic/scoring.py +6 -13
  128. llama_stack/providers/inline/scoring/basic/scoring_fn/docvqa_scoring_fn.py +1 -2
  129. llama_stack/providers/inline/scoring/basic/scoring_fn/equality_scoring_fn.py +1 -2
  130. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/docvqa.py +2 -2
  131. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/equality.py +2 -2
  132. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/ifeval.py +2 -2
  133. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_math_response.py +2 -2
  134. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_multiple_choice_answer.py +2 -2
  135. llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/subset_of.py +2 -2
  136. llama_stack/providers/inline/scoring/basic/scoring_fn/ifeval_scoring_fn.py +1 -2
  137. llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_math_response_scoring_fn.py +1 -2
  138. llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_scoring_fn.py +1 -2
  139. llama_stack/providers/inline/scoring/basic/scoring_fn/subset_of_scoring_fn.py +1 -2
  140. llama_stack/providers/inline/scoring/braintrust/braintrust.py +12 -15
  141. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_correctness.py +2 -2
  142. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_relevancy.py +2 -2
  143. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_similarity.py +2 -2
  144. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_entity_recall.py +2 -2
  145. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_precision.py +2 -2
  146. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_recall.py +2 -2
  147. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_relevancy.py +2 -2
  148. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/factuality.py +2 -2
  149. llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/faithfulness.py +2 -2
  150. llama_stack/providers/inline/scoring/llm_as_judge/scoring.py +7 -14
  151. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_405b_simpleqa.py +2 -2
  152. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_base.py +1 -2
  153. llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/llm_as_judge_scoring_fn.py +1 -3
  154. llama_stack/providers/inline/tool_runtime/rag/__init__.py +1 -1
  155. llama_stack/providers/inline/tool_runtime/rag/config.py +8 -1
  156. llama_stack/providers/inline/tool_runtime/rag/context_retriever.py +7 -6
  157. llama_stack/providers/inline/tool_runtime/rag/memory.py +64 -48
  158. llama_stack/providers/inline/vector_io/chroma/__init__.py +1 -1
  159. llama_stack/providers/inline/vector_io/chroma/config.py +1 -1
  160. llama_stack/providers/inline/vector_io/faiss/__init__.py +1 -1
  161. llama_stack/providers/inline/vector_io/faiss/config.py +1 -1
  162. llama_stack/providers/inline/vector_io/faiss/faiss.py +46 -28
  163. llama_stack/providers/inline/vector_io/milvus/__init__.py +1 -1
  164. llama_stack/providers/inline/vector_io/milvus/config.py +1 -1
  165. llama_stack/providers/inline/vector_io/qdrant/__init__.py +1 -1
  166. llama_stack/providers/inline/vector_io/qdrant/config.py +1 -1
  167. llama_stack/providers/inline/vector_io/sqlite_vec/__init__.py +1 -1
  168. llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py +44 -33
  169. llama_stack/providers/registry/agents.py +8 -3
  170. llama_stack/providers/registry/batches.py +1 -1
  171. llama_stack/providers/registry/datasetio.py +1 -1
  172. llama_stack/providers/registry/eval.py +1 -1
  173. llama_stack/{apis/datasets/__init__.py → providers/registry/file_processors.py} +5 -1
  174. llama_stack/providers/registry/files.py +11 -2
  175. llama_stack/providers/registry/inference.py +22 -3
  176. llama_stack/providers/registry/post_training.py +1 -1
  177. llama_stack/providers/registry/safety.py +1 -1
  178. llama_stack/providers/registry/scoring.py +1 -1
  179. llama_stack/providers/registry/tool_runtime.py +2 -2
  180. llama_stack/providers/registry/vector_io.py +7 -7
  181. llama_stack/providers/remote/datasetio/huggingface/huggingface.py +2 -5
  182. llama_stack/providers/remote/datasetio/nvidia/datasetio.py +1 -4
  183. llama_stack/providers/remote/eval/nvidia/eval.py +15 -9
  184. llama_stack/providers/remote/files/openai/__init__.py +19 -0
  185. llama_stack/providers/remote/files/openai/config.py +28 -0
  186. llama_stack/providers/remote/files/openai/files.py +253 -0
  187. llama_stack/providers/remote/files/s3/files.py +52 -30
  188. llama_stack/providers/remote/inference/anthropic/anthropic.py +2 -1
  189. llama_stack/providers/remote/inference/anthropic/config.py +1 -1
  190. llama_stack/providers/remote/inference/azure/azure.py +1 -3
  191. llama_stack/providers/remote/inference/azure/config.py +8 -7
  192. llama_stack/providers/remote/inference/bedrock/__init__.py +1 -1
  193. llama_stack/providers/remote/inference/bedrock/bedrock.py +82 -105
  194. llama_stack/providers/remote/inference/bedrock/config.py +24 -3
  195. llama_stack/providers/remote/inference/cerebras/cerebras.py +5 -5
  196. llama_stack/providers/remote/inference/cerebras/config.py +12 -5
  197. llama_stack/providers/remote/inference/databricks/config.py +13 -6
  198. llama_stack/providers/remote/inference/databricks/databricks.py +16 -6
  199. llama_stack/providers/remote/inference/fireworks/config.py +5 -5
  200. llama_stack/providers/remote/inference/fireworks/fireworks.py +1 -1
  201. llama_stack/providers/remote/inference/gemini/config.py +1 -1
  202. llama_stack/providers/remote/inference/gemini/gemini.py +13 -14
  203. llama_stack/providers/remote/inference/groq/config.py +5 -5
  204. llama_stack/providers/remote/inference/groq/groq.py +1 -1
  205. llama_stack/providers/remote/inference/llama_openai_compat/config.py +5 -5
  206. llama_stack/providers/remote/inference/llama_openai_compat/llama.py +8 -6
  207. llama_stack/providers/remote/inference/nvidia/__init__.py +1 -1
  208. llama_stack/providers/remote/inference/nvidia/config.py +21 -11
  209. llama_stack/providers/remote/inference/nvidia/nvidia.py +115 -3
  210. llama_stack/providers/remote/inference/nvidia/utils.py +1 -1
  211. llama_stack/providers/remote/inference/oci/__init__.py +17 -0
  212. llama_stack/providers/remote/inference/oci/auth.py +79 -0
  213. llama_stack/providers/remote/inference/oci/config.py +75 -0
  214. llama_stack/providers/remote/inference/oci/oci.py +162 -0
  215. llama_stack/providers/remote/inference/ollama/config.py +7 -5
  216. llama_stack/providers/remote/inference/ollama/ollama.py +17 -8
  217. llama_stack/providers/remote/inference/openai/config.py +4 -4
  218. llama_stack/providers/remote/inference/openai/openai.py +1 -1
  219. llama_stack/providers/remote/inference/passthrough/__init__.py +2 -2
  220. llama_stack/providers/remote/inference/passthrough/config.py +5 -10
  221. llama_stack/providers/remote/inference/passthrough/passthrough.py +97 -75
  222. llama_stack/providers/remote/inference/runpod/config.py +12 -5
  223. llama_stack/providers/remote/inference/runpod/runpod.py +2 -20
  224. llama_stack/providers/remote/inference/sambanova/config.py +5 -5
  225. llama_stack/providers/remote/inference/sambanova/sambanova.py +1 -1
  226. llama_stack/providers/remote/inference/tgi/config.py +7 -6
  227. llama_stack/providers/remote/inference/tgi/tgi.py +19 -11
  228. llama_stack/providers/remote/inference/together/config.py +5 -5
  229. llama_stack/providers/remote/inference/together/together.py +15 -12
  230. llama_stack/providers/remote/inference/vertexai/config.py +1 -1
  231. llama_stack/providers/remote/inference/vllm/config.py +5 -5
  232. llama_stack/providers/remote/inference/vllm/vllm.py +13 -14
  233. llama_stack/providers/remote/inference/watsonx/config.py +4 -4
  234. llama_stack/providers/remote/inference/watsonx/watsonx.py +21 -94
  235. llama_stack/providers/remote/post_training/nvidia/post_training.py +4 -4
  236. llama_stack/providers/remote/post_training/nvidia/utils.py +1 -1
  237. llama_stack/providers/remote/safety/bedrock/bedrock.py +6 -6
  238. llama_stack/providers/remote/safety/bedrock/config.py +1 -1
  239. llama_stack/providers/remote/safety/nvidia/config.py +1 -1
  240. llama_stack/providers/remote/safety/nvidia/nvidia.py +11 -5
  241. llama_stack/providers/remote/safety/sambanova/config.py +1 -1
  242. llama_stack/providers/remote/safety/sambanova/sambanova.py +6 -6
  243. llama_stack/providers/remote/tool_runtime/bing_search/bing_search.py +11 -6
  244. llama_stack/providers/remote/tool_runtime/brave_search/brave_search.py +12 -7
  245. llama_stack/providers/remote/tool_runtime/model_context_protocol/config.py +8 -2
  246. llama_stack/providers/remote/tool_runtime/model_context_protocol/model_context_protocol.py +57 -15
  247. llama_stack/providers/remote/tool_runtime/tavily_search/tavily_search.py +11 -6
  248. llama_stack/providers/remote/tool_runtime/wolfram_alpha/wolfram_alpha.py +11 -6
  249. llama_stack/providers/remote/vector_io/chroma/__init__.py +1 -1
  250. llama_stack/providers/remote/vector_io/chroma/chroma.py +131 -23
  251. llama_stack/providers/remote/vector_io/chroma/config.py +1 -1
  252. llama_stack/providers/remote/vector_io/milvus/__init__.py +1 -1
  253. llama_stack/providers/remote/vector_io/milvus/config.py +1 -1
  254. llama_stack/providers/remote/vector_io/milvus/milvus.py +37 -28
  255. llama_stack/providers/remote/vector_io/pgvector/__init__.py +1 -1
  256. llama_stack/providers/remote/vector_io/pgvector/config.py +1 -1
  257. llama_stack/providers/remote/vector_io/pgvector/pgvector.py +37 -25
  258. llama_stack/providers/remote/vector_io/qdrant/__init__.py +1 -1
  259. llama_stack/providers/remote/vector_io/qdrant/config.py +1 -1
  260. llama_stack/providers/remote/vector_io/qdrant/qdrant.py +147 -30
  261. llama_stack/providers/remote/vector_io/weaviate/__init__.py +1 -1
  262. llama_stack/providers/remote/vector_io/weaviate/config.py +1 -1
  263. llama_stack/providers/remote/vector_io/weaviate/weaviate.py +31 -26
  264. llama_stack/providers/utils/common/data_schema_validator.py +1 -5
  265. llama_stack/providers/utils/files/form_data.py +1 -1
  266. llama_stack/providers/utils/inference/embedding_mixin.py +1 -1
  267. llama_stack/providers/utils/inference/inference_store.py +7 -8
  268. llama_stack/providers/utils/inference/litellm_openai_mixin.py +79 -79
  269. llama_stack/providers/utils/inference/model_registry.py +1 -3
  270. llama_stack/providers/utils/inference/openai_compat.py +44 -1171
  271. llama_stack/providers/utils/inference/openai_mixin.py +68 -42
  272. llama_stack/providers/utils/inference/prompt_adapter.py +50 -265
  273. llama_stack/providers/utils/inference/stream_utils.py +23 -0
  274. llama_stack/providers/utils/memory/__init__.py +2 -0
  275. llama_stack/providers/utils/memory/file_utils.py +1 -1
  276. llama_stack/providers/utils/memory/openai_vector_store_mixin.py +181 -84
  277. llama_stack/providers/utils/memory/vector_store.py +39 -38
  278. llama_stack/providers/utils/pagination.py +1 -1
  279. llama_stack/providers/utils/responses/responses_store.py +15 -25
  280. llama_stack/providers/utils/scoring/aggregation_utils.py +1 -2
  281. llama_stack/providers/utils/scoring/base_scoring_fn.py +1 -2
  282. llama_stack/providers/utils/tools/mcp.py +93 -11
  283. llama_stack/providers/utils/vector_io/__init__.py +16 -0
  284. llama_stack/providers/utils/vector_io/vector_utils.py +36 -0
  285. llama_stack/telemetry/constants.py +27 -0
  286. llama_stack/telemetry/helpers.py +43 -0
  287. llama_stack/testing/api_recorder.py +25 -16
  288. {llama_stack-0.3.5.dist-info → llama_stack-0.4.1.dist-info}/METADATA +57 -55
  289. llama_stack-0.4.1.dist-info/RECORD +588 -0
  290. llama_stack-0.4.1.dist-info/top_level.txt +2 -0
  291. llama_stack_api/__init__.py +945 -0
  292. llama_stack_api/admin/__init__.py +45 -0
  293. llama_stack_api/admin/api.py +72 -0
  294. llama_stack_api/admin/fastapi_routes.py +117 -0
  295. llama_stack_api/admin/models.py +113 -0
  296. llama_stack_api/agents.py +173 -0
  297. llama_stack_api/batches/__init__.py +40 -0
  298. llama_stack_api/batches/api.py +53 -0
  299. llama_stack_api/batches/fastapi_routes.py +113 -0
  300. llama_stack_api/batches/models.py +78 -0
  301. llama_stack_api/benchmarks/__init__.py +43 -0
  302. llama_stack_api/benchmarks/api.py +39 -0
  303. llama_stack_api/benchmarks/fastapi_routes.py +109 -0
  304. llama_stack_api/benchmarks/models.py +109 -0
  305. {llama_stack/apis → llama_stack_api}/common/content_types.py +1 -43
  306. {llama_stack/apis → llama_stack_api}/common/errors.py +0 -8
  307. {llama_stack/apis → llama_stack_api}/common/job_types.py +1 -1
  308. llama_stack_api/common/responses.py +77 -0
  309. {llama_stack/apis → llama_stack_api}/common/training_types.py +1 -1
  310. {llama_stack/apis → llama_stack_api}/common/type_system.py +2 -14
  311. llama_stack_api/connectors.py +146 -0
  312. {llama_stack/apis/conversations → llama_stack_api}/conversations.py +23 -39
  313. {llama_stack/apis/datasetio → llama_stack_api}/datasetio.py +4 -8
  314. llama_stack_api/datasets/__init__.py +61 -0
  315. llama_stack_api/datasets/api.py +35 -0
  316. llama_stack_api/datasets/fastapi_routes.py +104 -0
  317. llama_stack_api/datasets/models.py +152 -0
  318. {llama_stack/providers → llama_stack_api}/datatypes.py +166 -10
  319. {llama_stack/apis/eval → llama_stack_api}/eval.py +8 -40
  320. llama_stack_api/file_processors/__init__.py +27 -0
  321. llama_stack_api/file_processors/api.py +64 -0
  322. llama_stack_api/file_processors/fastapi_routes.py +78 -0
  323. llama_stack_api/file_processors/models.py +42 -0
  324. llama_stack_api/files/__init__.py +35 -0
  325. llama_stack_api/files/api.py +51 -0
  326. llama_stack_api/files/fastapi_routes.py +124 -0
  327. llama_stack_api/files/models.py +107 -0
  328. {llama_stack/apis/inference → llama_stack_api}/inference.py +90 -194
  329. llama_stack_api/inspect_api/__init__.py +37 -0
  330. llama_stack_api/inspect_api/api.py +25 -0
  331. llama_stack_api/inspect_api/fastapi_routes.py +76 -0
  332. llama_stack_api/inspect_api/models.py +28 -0
  333. {llama_stack/apis/agents → llama_stack_api/internal}/__init__.py +3 -1
  334. llama_stack/providers/utils/kvstore/api.py → llama_stack_api/internal/kvstore.py +5 -0
  335. llama_stack_api/internal/sqlstore.py +79 -0
  336. {llama_stack/apis/models → llama_stack_api}/models.py +11 -9
  337. {llama_stack/apis/agents → llama_stack_api}/openai_responses.py +184 -27
  338. {llama_stack/apis/post_training → llama_stack_api}/post_training.py +7 -11
  339. {llama_stack/apis/prompts → llama_stack_api}/prompts.py +3 -4
  340. llama_stack_api/providers/__init__.py +33 -0
  341. llama_stack_api/providers/api.py +16 -0
  342. llama_stack_api/providers/fastapi_routes.py +57 -0
  343. llama_stack_api/providers/models.py +24 -0
  344. {llama_stack/apis/tools → llama_stack_api}/rag_tool.py +2 -52
  345. {llama_stack/apis → llama_stack_api}/resource.py +1 -1
  346. llama_stack_api/router_utils.py +160 -0
  347. {llama_stack/apis/safety → llama_stack_api}/safety.py +6 -9
  348. {llama_stack → llama_stack_api}/schema_utils.py +94 -4
  349. {llama_stack/apis/scoring → llama_stack_api}/scoring.py +3 -3
  350. {llama_stack/apis/scoring_functions → llama_stack_api}/scoring_functions.py +9 -6
  351. {llama_stack/apis/shields → llama_stack_api}/shields.py +6 -7
  352. {llama_stack/apis/tools → llama_stack_api}/tools.py +26 -21
  353. {llama_stack/apis/vector_io → llama_stack_api}/vector_io.py +133 -152
  354. {llama_stack/apis/vector_stores → llama_stack_api}/vector_stores.py +1 -1
  355. llama_stack/apis/agents/agents.py +0 -894
  356. llama_stack/apis/batches/__init__.py +0 -9
  357. llama_stack/apis/batches/batches.py +0 -100
  358. llama_stack/apis/benchmarks/__init__.py +0 -7
  359. llama_stack/apis/benchmarks/benchmarks.py +0 -108
  360. llama_stack/apis/common/responses.py +0 -36
  361. llama_stack/apis/conversations/__init__.py +0 -31
  362. llama_stack/apis/datasets/datasets.py +0 -251
  363. llama_stack/apis/datatypes.py +0 -160
  364. llama_stack/apis/eval/__init__.py +0 -7
  365. llama_stack/apis/files/__init__.py +0 -7
  366. llama_stack/apis/files/files.py +0 -199
  367. llama_stack/apis/inference/__init__.py +0 -7
  368. llama_stack/apis/inference/event_logger.py +0 -43
  369. llama_stack/apis/inspect/__init__.py +0 -7
  370. llama_stack/apis/inspect/inspect.py +0 -94
  371. llama_stack/apis/models/__init__.py +0 -7
  372. llama_stack/apis/post_training/__init__.py +0 -7
  373. llama_stack/apis/prompts/__init__.py +0 -9
  374. llama_stack/apis/providers/__init__.py +0 -7
  375. llama_stack/apis/providers/providers.py +0 -69
  376. llama_stack/apis/safety/__init__.py +0 -7
  377. llama_stack/apis/scoring/__init__.py +0 -7
  378. llama_stack/apis/scoring_functions/__init__.py +0 -7
  379. llama_stack/apis/shields/__init__.py +0 -7
  380. llama_stack/apis/synthetic_data_generation/__init__.py +0 -7
  381. llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py +0 -77
  382. llama_stack/apis/telemetry/__init__.py +0 -7
  383. llama_stack/apis/telemetry/telemetry.py +0 -423
  384. llama_stack/apis/tools/__init__.py +0 -8
  385. llama_stack/apis/vector_io/__init__.py +0 -7
  386. llama_stack/apis/vector_stores/__init__.py +0 -7
  387. llama_stack/core/server/tracing.py +0 -80
  388. llama_stack/core/ui/app.py +0 -55
  389. llama_stack/core/ui/modules/__init__.py +0 -5
  390. llama_stack/core/ui/modules/api.py +0 -32
  391. llama_stack/core/ui/modules/utils.py +0 -42
  392. llama_stack/core/ui/page/__init__.py +0 -5
  393. llama_stack/core/ui/page/distribution/__init__.py +0 -5
  394. llama_stack/core/ui/page/distribution/datasets.py +0 -18
  395. llama_stack/core/ui/page/distribution/eval_tasks.py +0 -20
  396. llama_stack/core/ui/page/distribution/models.py +0 -18
  397. llama_stack/core/ui/page/distribution/providers.py +0 -27
  398. llama_stack/core/ui/page/distribution/resources.py +0 -48
  399. llama_stack/core/ui/page/distribution/scoring_functions.py +0 -18
  400. llama_stack/core/ui/page/distribution/shields.py +0 -19
  401. llama_stack/core/ui/page/evaluations/__init__.py +0 -5
  402. llama_stack/core/ui/page/evaluations/app_eval.py +0 -143
  403. llama_stack/core/ui/page/evaluations/native_eval.py +0 -253
  404. llama_stack/core/ui/page/playground/__init__.py +0 -5
  405. llama_stack/core/ui/page/playground/chat.py +0 -130
  406. llama_stack/core/ui/page/playground/tools.py +0 -352
  407. llama_stack/distributions/dell/build.yaml +0 -33
  408. llama_stack/distributions/meta-reference-gpu/build.yaml +0 -32
  409. llama_stack/distributions/nvidia/build.yaml +0 -29
  410. llama_stack/distributions/open-benchmark/build.yaml +0 -36
  411. llama_stack/distributions/postgres-demo/__init__.py +0 -7
  412. llama_stack/distributions/postgres-demo/build.yaml +0 -23
  413. llama_stack/distributions/postgres-demo/postgres_demo.py +0 -125
  414. llama_stack/distributions/starter/build.yaml +0 -61
  415. llama_stack/distributions/starter-gpu/build.yaml +0 -61
  416. llama_stack/distributions/watsonx/build.yaml +0 -33
  417. llama_stack/providers/inline/agents/meta_reference/agent_instance.py +0 -1024
  418. llama_stack/providers/inline/agents/meta_reference/persistence.py +0 -228
  419. llama_stack/providers/inline/telemetry/__init__.py +0 -5
  420. llama_stack/providers/inline/telemetry/meta_reference/__init__.py +0 -21
  421. llama_stack/providers/inline/telemetry/meta_reference/config.py +0 -47
  422. llama_stack/providers/inline/telemetry/meta_reference/telemetry.py +0 -252
  423. llama_stack/providers/remote/inference/bedrock/models.py +0 -29
  424. llama_stack/providers/utils/kvstore/sqlite/config.py +0 -20
  425. llama_stack/providers/utils/sqlstore/__init__.py +0 -5
  426. llama_stack/providers/utils/sqlstore/api.py +0 -128
  427. llama_stack/providers/utils/telemetry/__init__.py +0 -5
  428. llama_stack/providers/utils/telemetry/trace_protocol.py +0 -142
  429. llama_stack/providers/utils/telemetry/tracing.py +0 -384
  430. llama_stack/strong_typing/__init__.py +0 -19
  431. llama_stack/strong_typing/auxiliary.py +0 -228
  432. llama_stack/strong_typing/classdef.py +0 -440
  433. llama_stack/strong_typing/core.py +0 -46
  434. llama_stack/strong_typing/deserializer.py +0 -877
  435. llama_stack/strong_typing/docstring.py +0 -409
  436. llama_stack/strong_typing/exception.py +0 -23
  437. llama_stack/strong_typing/inspection.py +0 -1085
  438. llama_stack/strong_typing/mapping.py +0 -40
  439. llama_stack/strong_typing/name.py +0 -182
  440. llama_stack/strong_typing/schema.py +0 -792
  441. llama_stack/strong_typing/serialization.py +0 -97
  442. llama_stack/strong_typing/serializer.py +0 -500
  443. llama_stack/strong_typing/slots.py +0 -27
  444. llama_stack/strong_typing/topological.py +0 -89
  445. llama_stack/ui/node_modules/flatted/python/flatted.py +0 -149
  446. llama_stack-0.3.5.dist-info/RECORD +0 -625
  447. llama_stack-0.3.5.dist-info/top_level.txt +0 -1
  448. /llama_stack/{providers/utils → core/storage}/kvstore/config.py +0 -0
  449. /llama_stack/{providers/utils → core/storage}/kvstore/mongodb/__init__.py +0 -0
  450. /llama_stack/{providers/utils → core/storage}/kvstore/postgres/__init__.py +0 -0
  451. /llama_stack/{providers/utils → core/storage}/kvstore/redis/__init__.py +0 -0
  452. /llama_stack/{providers/utils → core/storage}/kvstore/sqlite/__init__.py +0 -0
  453. /llama_stack/{apis → providers/inline/file_processor}/__init__.py +0 -0
  454. /llama_stack/{apis/common → telemetry}/__init__.py +0 -0
  455. {llama_stack-0.3.5.dist-info → llama_stack-0.4.1.dist-info}/WHEEL +0 -0
  456. {llama_stack-0.3.5.dist-info → llama_stack-0.4.1.dist-info}/entry_points.txt +0 -0
  457. {llama_stack-0.3.5.dist-info → llama_stack-0.4.1.dist-info}/licenses/LICENSE +0 -0
  458. {llama_stack/core/ui → llama_stack_api/common}/__init__.py +0 -0
  459. {llama_stack/strong_typing → llama_stack_api}/py.typed +0 -0
  460. {llama_stack/apis → llama_stack_api}/version.py +0 -0
@@ -1,792 +0,0 @@
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 collections.abc
14
- import dataclasses
15
- import datetime
16
- import decimal
17
- import enum
18
- import functools
19
- import inspect
20
- import json
21
- import types
22
- import typing
23
- import uuid
24
- from copy import deepcopy
25
- from typing import (
26
- Any,
27
- Callable,
28
- ClassVar,
29
- Dict,
30
- List,
31
- Literal,
32
- Optional,
33
- Tuple,
34
- Type,
35
- TypeVar,
36
- Union,
37
- overload,
38
- )
39
-
40
- import jsonschema
41
- from typing_extensions import Annotated
42
-
43
- from . import docstring
44
- from .auxiliary import (
45
- Alias,
46
- IntegerRange,
47
- MaxLength,
48
- MinLength,
49
- Precision,
50
- get_auxiliary_format,
51
- )
52
- from .core import JsonArray, JsonObject, JsonType, Schema, StrictJsonType
53
- from .inspection import (
54
- TypeLike,
55
- enum_value_types,
56
- get_annotation,
57
- get_class_properties,
58
- is_type_enum,
59
- is_type_like,
60
- is_type_optional,
61
- unwrap_optional_type,
62
- )
63
- from .name import python_type_to_name
64
- from .serialization import object_to_json
65
-
66
- # determines the maximum number of distinct enum members up to which a Dict[EnumType, Any] is converted into a JSON
67
- # schema with explicitly listed properties (rather than employing a pattern constraint on property names)
68
- OBJECT_ENUM_EXPANSION_LIMIT = 4
69
-
70
-
71
- T = TypeVar("T")
72
-
73
-
74
- def get_class_docstrings(data_type: type) -> Tuple[Optional[str], Optional[str]]:
75
- docstr = docstring.parse_type(data_type)
76
-
77
- # check if class has a doc-string other than the auto-generated string assigned by @dataclass
78
- if docstring.has_default_docstring(data_type):
79
- return None, None
80
-
81
- return docstr.short_description, docstr.long_description
82
-
83
-
84
- def get_class_property_docstrings(
85
- data_type: type, transform_fun: Optional[Callable[[type, str, str], str]] = None
86
- ) -> Dict[str, str]:
87
- """
88
- Extracts the documentation strings associated with the properties of a composite type.
89
-
90
- :param data_type: The object whose properties to iterate over.
91
- :param transform_fun: An optional function that maps a property documentation string to a custom tailored string.
92
- :returns: A dictionary mapping property names to descriptions.
93
- """
94
-
95
- result: Dict[str, str] = {}
96
- # Only try to get MRO if data_type is actually a class
97
- # Special types like Literal, Union, etc. don't have MRO
98
- if not inspect.isclass(data_type):
99
- return result
100
-
101
- for base in inspect.getmro(data_type):
102
- docstr = docstring.parse_type(base)
103
- for param in docstr.params.values():
104
- if param.name in result:
105
- continue
106
-
107
- if transform_fun:
108
- description = transform_fun(data_type, param.name, param.description)
109
- else:
110
- description = param.description
111
-
112
- result[param.name] = description
113
- return result
114
-
115
-
116
- def docstring_to_schema(data_type: type) -> Schema:
117
- short_description, long_description = get_class_docstrings(data_type)
118
- schema: Schema = {
119
- "title": python_type_to_name(data_type),
120
- }
121
-
122
- description = "\n".join(filter(None, [short_description, long_description]))
123
- if description:
124
- schema["description"] = description
125
- return schema
126
-
127
-
128
- def id_from_ref(data_type: Union[typing.ForwardRef, str, type]) -> str:
129
- "Extracts the name of a possibly forward-referenced type."
130
-
131
- if isinstance(data_type, typing.ForwardRef):
132
- forward_type: typing.ForwardRef = data_type
133
- return forward_type.__forward_arg__
134
- elif isinstance(data_type, str):
135
- return data_type
136
- else:
137
- return data_type.__name__
138
-
139
-
140
- def type_from_ref(data_type: Union[typing.ForwardRef, str, type]) -> Tuple[str, type]:
141
- "Creates a type from a forward reference."
142
-
143
- if isinstance(data_type, typing.ForwardRef):
144
- forward_type: typing.ForwardRef = data_type
145
- true_type = eval(forward_type.__forward_code__)
146
- return forward_type.__forward_arg__, true_type
147
- elif isinstance(data_type, str):
148
- true_type = eval(data_type)
149
- return data_type, true_type
150
- else:
151
- return data_type.__name__, data_type
152
-
153
-
154
- @dataclasses.dataclass
155
- class TypeCatalogEntry:
156
- schema: Optional[Schema]
157
- identifier: str
158
- examples: Optional[JsonType] = None
159
-
160
-
161
- class TypeCatalog:
162
- "Maintains an association of well-known Python types to their JSON schema."
163
-
164
- _by_type: Dict[TypeLike, TypeCatalogEntry]
165
- _by_name: Dict[str, TypeCatalogEntry]
166
-
167
- def __init__(self) -> None:
168
- self._by_type = {}
169
- self._by_name = {}
170
-
171
- def __contains__(self, data_type: TypeLike) -> bool:
172
- if isinstance(data_type, typing.ForwardRef):
173
- fwd: typing.ForwardRef = data_type
174
- name = fwd.__forward_arg__
175
- return name in self._by_name
176
- else:
177
- return data_type in self._by_type
178
-
179
- def add(
180
- self,
181
- data_type: TypeLike,
182
- schema: Optional[Schema],
183
- identifier: str,
184
- examples: Optional[List[JsonType]] = None,
185
- ) -> None:
186
- if isinstance(data_type, typing.ForwardRef):
187
- raise TypeError("forward references cannot be used to register a type")
188
-
189
- if data_type in self._by_type:
190
- raise ValueError(f"type {data_type} is already registered in the catalog")
191
-
192
- entry = TypeCatalogEntry(schema, identifier, examples)
193
- self._by_type[data_type] = entry
194
- self._by_name[identifier] = entry
195
-
196
- def get(self, data_type: TypeLike) -> TypeCatalogEntry:
197
- if isinstance(data_type, typing.ForwardRef):
198
- fwd: typing.ForwardRef = data_type
199
- name = fwd.__forward_arg__
200
- return self._by_name[name]
201
- else:
202
- return self._by_type[data_type]
203
-
204
-
205
- @dataclasses.dataclass
206
- class SchemaOptions:
207
- definitions_path: str = "#/definitions/"
208
- use_descriptions: bool = True
209
- use_examples: bool = True
210
- property_description_fun: Optional[Callable[[type, str, str], str]] = None
211
-
212
-
213
- class JsonSchemaGenerator:
214
- "Creates a JSON schema with user-defined type definitions."
215
-
216
- type_catalog: ClassVar[TypeCatalog] = TypeCatalog()
217
- types_used: Dict[str, TypeLike]
218
- options: SchemaOptions
219
-
220
- def __init__(self, options: Optional[SchemaOptions] = None):
221
- if options is None:
222
- self.options = SchemaOptions()
223
- else:
224
- self.options = options
225
- self.types_used = {}
226
-
227
- @functools.singledispatchmethod
228
- def _metadata_to_schema(self, arg: object) -> Schema:
229
- # unrecognized annotation
230
- return {}
231
-
232
- @_metadata_to_schema.register
233
- def _(self, arg: IntegerRange) -> Schema:
234
- return {"minimum": arg.minimum, "maximum": arg.maximum}
235
-
236
- @_metadata_to_schema.register
237
- def _(self, arg: Precision) -> Schema:
238
- return {
239
- "multipleOf": 10 ** (-arg.decimal_digits),
240
- "exclusiveMinimum": -(10**arg.integer_digits),
241
- "exclusiveMaximum": (10**arg.integer_digits),
242
- }
243
-
244
- @_metadata_to_schema.register
245
- def _(self, arg: MinLength) -> Schema:
246
- return {"minLength": arg.value}
247
-
248
- @_metadata_to_schema.register
249
- def _(self, arg: MaxLength) -> Schema:
250
- return {"maxLength": arg.value}
251
-
252
- def _with_metadata(self, type_schema: Schema, metadata: Optional[Tuple[Any, ...]]) -> Schema:
253
- if metadata:
254
- for m in metadata:
255
- type_schema.update(self._metadata_to_schema(m))
256
- return type_schema
257
-
258
- def _simple_type_to_schema(self, typ: TypeLike, json_schema_extra: Optional[dict] = None) -> Optional[Schema]:
259
- """
260
- Returns the JSON schema associated with a simple, unrestricted type.
261
-
262
- :returns: The schema for a simple type, or `None`.
263
- """
264
-
265
- if typ is type(None):
266
- return {"type": "null"}
267
- elif typ is bool:
268
- return {"type": "boolean"}
269
- elif typ is int:
270
- return {"type": "integer"}
271
- elif typ is float:
272
- return {"type": "number"}
273
- elif typ is str:
274
- if json_schema_extra and "contentEncoding" in json_schema_extra:
275
- return {
276
- "type": "string",
277
- "contentEncoding": json_schema_extra["contentEncoding"],
278
- }
279
- return {"type": "string"}
280
- elif typ is bytes:
281
- return {"type": "string", "contentEncoding": "base64"}
282
- elif typ is datetime.datetime:
283
- # 2018-11-13T20:20:39+00:00
284
- return {
285
- "type": "string",
286
- "format": "date-time",
287
- }
288
- elif typ is datetime.date:
289
- # 2018-11-13
290
- return {"type": "string", "format": "date"}
291
- elif typ is datetime.time:
292
- # 20:20:39+00:00
293
- return {"type": "string", "format": "time"}
294
- elif typ is decimal.Decimal:
295
- return {"type": "number"}
296
- elif typ is uuid.UUID:
297
- # f81d4fae-7dec-11d0-a765-00a0c91e6bf6
298
- return {"type": "string", "format": "uuid"}
299
- elif typ is Any:
300
- return {
301
- "oneOf": [
302
- {"type": "null"},
303
- {"type": "boolean"},
304
- {"type": "number"},
305
- {"type": "string"},
306
- {"type": "array"},
307
- {"type": "object"},
308
- ]
309
- }
310
- elif typ is JsonObject:
311
- return {"type": "object"}
312
- elif typ is JsonArray:
313
- return {"type": "array"}
314
- else:
315
- # not a simple type
316
- return None
317
-
318
- def type_to_schema(
319
- self,
320
- data_type: TypeLike,
321
- force_expand: bool = False,
322
- json_schema_extra: Optional[dict] = None,
323
- ) -> Schema:
324
- common_info = {}
325
- if json_schema_extra and "deprecated" in json_schema_extra:
326
- common_info["deprecated"] = json_schema_extra["deprecated"]
327
- return self._type_to_schema(data_type, force_expand, json_schema_extra) | common_info
328
-
329
- def _type_to_schema(
330
- self,
331
- data_type: TypeLike,
332
- force_expand: bool = False,
333
- json_schema_extra: Optional[dict] = None,
334
- ) -> Schema:
335
- """
336
- Returns the JSON schema associated with a type.
337
-
338
- :param data_type: The Python type whose JSON schema to return.
339
- :param force_expand: Forces a JSON schema to be returned even if the type is registered in the catalog of known types.
340
- :returns: The JSON schema associated with the type.
341
- """
342
-
343
- # short-circuit for common simple types
344
- schema = self._simple_type_to_schema(data_type, json_schema_extra)
345
- if schema is not None:
346
- return schema
347
-
348
- # types registered in the type catalog of well-known types
349
- type_catalog = JsonSchemaGenerator.type_catalog
350
- if not force_expand and data_type in type_catalog:
351
- # user-defined type
352
- identifier = type_catalog.get(data_type).identifier
353
- self.types_used.setdefault(identifier, data_type)
354
- return {"$ref": f"{self.options.definitions_path}{identifier}"}
355
-
356
- # unwrap annotated types
357
- metadata = getattr(data_type, "__metadata__", None)
358
- if metadata is not None:
359
- # type is Annotated[T, ...]
360
- typ = typing.get_args(data_type)[0]
361
- schema = self._simple_type_to_schema(typ)
362
- if schema is not None:
363
- # recognize well-known auxiliary types
364
- fmt = get_auxiliary_format(data_type)
365
- if fmt is not None:
366
- schema.update({"format": fmt})
367
- return schema
368
- else:
369
- return self._with_metadata(schema, metadata)
370
-
371
- else:
372
- # type is a regular type
373
- typ = data_type
374
-
375
- if isinstance(typ, typing.ForwardRef) or isinstance(typ, str):
376
- if force_expand:
377
- identifier, true_type = type_from_ref(typ)
378
- return self.type_to_schema(true_type, force_expand=True)
379
- else:
380
- try:
381
- identifier, true_type = type_from_ref(typ)
382
- self.types_used[identifier] = true_type
383
- except NameError:
384
- identifier = id_from_ref(typ)
385
-
386
- return {"$ref": f"{self.options.definitions_path}{identifier}"}
387
-
388
- if is_type_enum(typ):
389
- enum_type: Type[enum.Enum] = typ
390
- value_types = enum_value_types(enum_type)
391
- if len(value_types) != 1:
392
- raise ValueError(
393
- f"enumerations must have a consistent member value type but several types found: {value_types}"
394
- )
395
- enum_value_type = value_types.pop()
396
-
397
- enum_schema: Schema
398
- if enum_value_type is bool or enum_value_type is int or enum_value_type is float or enum_value_type is str:
399
- if enum_value_type is bool:
400
- enum_schema_type = "boolean"
401
- elif enum_value_type is int:
402
- enum_schema_type = "integer"
403
- elif enum_value_type is float:
404
- enum_schema_type = "number"
405
- elif enum_value_type is str:
406
- enum_schema_type = "string"
407
-
408
- enum_schema = {
409
- "type": enum_schema_type,
410
- "enum": [object_to_json(e.value) for e in enum_type],
411
- }
412
- if self.options.use_descriptions:
413
- enum_schema.update(docstring_to_schema(typ))
414
- return enum_schema
415
- else:
416
- enum_schema = self.type_to_schema(enum_value_type)
417
- if self.options.use_descriptions:
418
- enum_schema.update(docstring_to_schema(typ))
419
- return enum_schema
420
-
421
- origin_type = typing.get_origin(typ)
422
- if origin_type is list:
423
- (list_type,) = typing.get_args(typ) # unpack single tuple element
424
- return {"type": "array", "items": self.type_to_schema(list_type)}
425
- elif origin_type is dict:
426
- key_type, value_type = typing.get_args(typ)
427
- if not (key_type is str or key_type is int or is_type_enum(key_type)):
428
- raise ValueError("`dict` with key type not coercible to `str` is not supported")
429
-
430
- dict_schema: Schema
431
- value_schema = self.type_to_schema(value_type)
432
- if is_type_enum(key_type):
433
- enum_values = [str(e.value) for e in key_type]
434
- if len(enum_values) > OBJECT_ENUM_EXPANSION_LIMIT:
435
- dict_schema = {
436
- "propertyNames": {"pattern": "^(" + "|".join(enum_values) + ")$"},
437
- "additionalProperties": value_schema,
438
- }
439
- else:
440
- dict_schema = {
441
- "properties": {value: value_schema for value in enum_values},
442
- "additionalProperties": False,
443
- }
444
- else:
445
- dict_schema = {"additionalProperties": value_schema}
446
-
447
- schema = {"type": "object"}
448
- schema.update(dict_schema)
449
- return schema
450
- elif origin_type is set:
451
- (set_type,) = typing.get_args(typ) # unpack single tuple element
452
- return {
453
- "type": "array",
454
- "items": self.type_to_schema(set_type),
455
- "uniqueItems": True,
456
- }
457
- elif origin_type is tuple:
458
- args = typing.get_args(typ)
459
- return {
460
- "type": "array",
461
- "minItems": len(args),
462
- "maxItems": len(args),
463
- "prefixItems": [self.type_to_schema(member_type) for member_type in args],
464
- }
465
- elif origin_type in (Union, types.UnionType):
466
- discriminator = None
467
- if typing.get_origin(data_type) is Annotated:
468
- discriminator = typing.get_args(data_type)[1].discriminator
469
- ret: Schema = {"oneOf": [self.type_to_schema(union_type) for union_type in typing.get_args(typ)]}
470
- if discriminator:
471
- # for each union type, we need to read the value of the discriminator
472
- mapping: dict[str, JsonType] = {}
473
- for union_type in typing.get_args(typ):
474
- props = self.type_to_schema(union_type, force_expand=True)["properties"]
475
- # mypy is confused here because JsonType allows multiple types, some of them
476
- # not indexable (bool?) or not indexable by string (list?). The correctness of
477
- # types depends on correct model definitions. Hence multiple ignore statements below.
478
- discriminator_value = props[discriminator]["default"] # type: ignore[index,call-overload]
479
- mapping[discriminator_value] = self.type_to_schema(union_type)["$ref"] # type: ignore[index]
480
-
481
- ret["discriminator"] = {
482
- "propertyName": discriminator,
483
- "mapping": mapping,
484
- }
485
- return ret
486
- elif origin_type is Literal:
487
- literal_args = typing.get_args(typ)
488
- if len(literal_args) == 1:
489
- (literal_value,) = literal_args
490
- schema = self.type_to_schema(type(literal_value))
491
- schema["const"] = literal_value
492
- return schema
493
- elif len(literal_args) > 1:
494
- first_value = literal_args[0]
495
- schema = self.type_to_schema(type(first_value))
496
- schema["enum"] = list(literal_args)
497
- return schema
498
- else:
499
- return {"enum": []}
500
- elif origin_type is type:
501
- (concrete_type,) = typing.get_args(typ) # unpack single tuple element
502
- return {"const": self.type_to_schema(concrete_type, force_expand=True)}
503
- elif origin_type is collections.abc.AsyncIterator:
504
- (concrete_type,) = typing.get_args(typ)
505
- return self.type_to_schema(concrete_type)
506
-
507
- # dictionary of class attributes
508
- members = dict(inspect.getmembers(typ, lambda a: not inspect.isroutine(a)))
509
-
510
- property_docstrings = get_class_property_docstrings(typ, self.options.property_description_fun)
511
- properties: Dict[str, Schema] = {}
512
- required: List[str] = []
513
- for property_name, property_type in get_class_properties(typ):
514
- # rename property if an alias name is specified
515
- alias = get_annotation(property_type, Alias)
516
- if alias:
517
- output_name = alias.name
518
- else:
519
- output_name = property_name
520
-
521
- defaults = {}
522
- json_schema_extra = None
523
- if "model_fields" in members:
524
- f = members["model_fields"]
525
- defaults = {k: finfo.default for k, finfo in f.items()}
526
- if output_name in f:
527
- finfo = f[output_name]
528
- json_schema_extra = finfo.json_schema_extra or {}
529
- if finfo.deprecated:
530
- json_schema_extra["deprecated"] = True
531
-
532
- if is_type_optional(property_type):
533
- optional_type: type = unwrap_optional_type(property_type)
534
- property_def = self.type_to_schema(optional_type, json_schema_extra=json_schema_extra)
535
- else:
536
- property_def = self.type_to_schema(property_type, json_schema_extra=json_schema_extra)
537
- required.append(output_name)
538
-
539
- # check if attribute has a default value initializer
540
- if defaults.get(property_name) is not None:
541
- def_value = defaults[property_name]
542
- # check if value can be directly represented in JSON
543
- if isinstance(
544
- def_value,
545
- (
546
- bool,
547
- int,
548
- float,
549
- str,
550
- enum.Enum,
551
- datetime.datetime,
552
- datetime.date,
553
- datetime.time,
554
- ),
555
- ):
556
- property_def["default"] = object_to_json(def_value)
557
-
558
- # add property docstring if available
559
- property_doc = property_docstrings.get(property_name)
560
- if property_doc:
561
- # print(output_name, property_doc)
562
- property_def.pop("title", None)
563
- property_def["description"] = property_doc
564
-
565
- properties[output_name] = property_def
566
-
567
- schema = {"type": "object"}
568
- if len(properties) > 0:
569
- schema["properties"] = typing.cast(JsonType, properties)
570
- schema["additionalProperties"] = False
571
- if len(required) > 0:
572
- schema["required"] = typing.cast(JsonType, required)
573
- if self.options.use_descriptions:
574
- schema.update(docstring_to_schema(typ))
575
- return schema
576
-
577
- def _type_to_schema_with_lookup(self, data_type: TypeLike) -> Schema:
578
- """
579
- Returns the JSON schema associated with a type that may be registered in the catalog of known types.
580
-
581
- :param data_type: The type whose JSON schema we seek.
582
- :returns: The JSON schema associated with the type.
583
- """
584
-
585
- entry = JsonSchemaGenerator.type_catalog.get(data_type)
586
- if entry.schema is None:
587
- type_schema = self.type_to_schema(data_type, force_expand=True)
588
- else:
589
- type_schema = deepcopy(entry.schema)
590
-
591
- # add descriptive text (if present)
592
- if self.options.use_descriptions:
593
- if isinstance(data_type, type) and not isinstance(data_type, typing.ForwardRef):
594
- type_schema.update(docstring_to_schema(data_type))
595
-
596
- # add example (if present)
597
- if self.options.use_examples and entry.examples:
598
- type_schema["examples"] = entry.examples
599
-
600
- return type_schema
601
-
602
- def classdef_to_schema(self, data_type: TypeLike, force_expand: bool = False) -> Tuple[Schema, Dict[str, Schema]]:
603
- """
604
- Returns the JSON schema associated with a type and any nested types.
605
-
606
- :param data_type: The type whose JSON schema to return.
607
- :param force_expand: True if a full JSON schema is to be returned even for well-known types; false if a schema
608
- reference is to be used for well-known types.
609
- :returns: A tuple of the JSON schema, and a mapping between nested type names and their corresponding schema.
610
- """
611
-
612
- if not is_type_like(data_type):
613
- raise TypeError(f"expected a type-like object but got: {data_type}")
614
-
615
- self.types_used = {}
616
- try:
617
- type_schema = self.type_to_schema(data_type, force_expand=force_expand)
618
-
619
- types_defined: Dict[str, Schema] = {}
620
- while len(self.types_used) > len(types_defined):
621
- # make a snapshot copy; original collection is going to be modified
622
- types_undefined = {
623
- sub_name: sub_type
624
- for sub_name, sub_type in self.types_used.items()
625
- if sub_name not in types_defined
626
- }
627
-
628
- # expand undefined types, which may lead to additional types to be defined
629
- for sub_name, sub_type in types_undefined.items():
630
- types_defined[sub_name] = self._type_to_schema_with_lookup(sub_type)
631
-
632
- type_definitions = dict(sorted(types_defined.items()))
633
- finally:
634
- self.types_used = {}
635
-
636
- return type_schema, type_definitions
637
-
638
-
639
- class Validator(enum.Enum):
640
- "Defines constants for JSON schema standards."
641
-
642
- Draft7 = jsonschema.Draft7Validator
643
- Draft201909 = jsonschema.Draft201909Validator
644
- Draft202012 = jsonschema.Draft202012Validator
645
- Latest = jsonschema.Draft202012Validator
646
-
647
-
648
- def classdef_to_schema(
649
- data_type: TypeLike,
650
- options: Optional[SchemaOptions] = None,
651
- validator: Validator = Validator.Latest,
652
- ) -> Schema:
653
- """
654
- Returns the JSON schema corresponding to the given type.
655
-
656
- :param data_type: The Python type used to generate the JSON schema
657
- :returns: A JSON object that you can serialize to a JSON string with json.dump or json.dumps
658
- :raises TypeError: Indicates that the generated JSON schema does not validate against the desired meta-schema.
659
- """
660
-
661
- # short-circuit with an error message when passing invalid data
662
- if not is_type_like(data_type):
663
- raise TypeError(f"expected a type-like object but got: {data_type}")
664
-
665
- generator = JsonSchemaGenerator(options)
666
- type_schema, type_definitions = generator.classdef_to_schema(data_type)
667
-
668
- class_schema: Schema = {}
669
- if type_definitions:
670
- class_schema["definitions"] = typing.cast(JsonType, type_definitions)
671
- class_schema.update(type_schema)
672
-
673
- validator_id = validator.value.META_SCHEMA["$id"]
674
- try:
675
- validator.value.check_schema(class_schema)
676
- except jsonschema.exceptions.SchemaError:
677
- raise TypeError(f"schema does not validate against meta-schema <{validator_id}>")
678
-
679
- schema = {"$schema": validator_id}
680
- schema.update(class_schema)
681
- return schema
682
-
683
-
684
- def validate_object(data_type: TypeLike, json_dict: JsonType) -> None:
685
- """
686
- Validates if the JSON dictionary object conforms to the expected type.
687
-
688
- :param data_type: The type to match against.
689
- :param json_dict: A JSON object obtained with `json.load` or `json.loads`.
690
- :raises jsonschema.exceptions.ValidationError: Indicates that the JSON object cannot represent the type.
691
- """
692
-
693
- schema_dict = classdef_to_schema(data_type)
694
- jsonschema.validate(json_dict, schema_dict, format_checker=jsonschema.FormatChecker())
695
-
696
-
697
- def print_schema(data_type: type) -> None:
698
- """Pretty-prints the JSON schema corresponding to the type."""
699
-
700
- s = classdef_to_schema(data_type)
701
- print(json.dumps(s, indent=4))
702
-
703
-
704
- def get_schema_identifier(data_type: type) -> Optional[str]:
705
- if data_type in JsonSchemaGenerator.type_catalog:
706
- return JsonSchemaGenerator.type_catalog.get(data_type).identifier
707
- else:
708
- return None
709
-
710
-
711
- def register_schema(
712
- data_type: T,
713
- schema: Optional[Schema] = None,
714
- name: Optional[str] = None,
715
- examples: Optional[List[JsonType]] = None,
716
- ) -> T:
717
- """
718
- Associates a type with a JSON schema definition.
719
-
720
- :param data_type: The type to associate with a JSON schema.
721
- :param schema: The schema to associate the type with. Derived automatically if omitted.
722
- :param name: The name used for looking uo the type. Determined automatically if omitted.
723
- :returns: The input type.
724
- """
725
-
726
- JsonSchemaGenerator.type_catalog.add(
727
- data_type,
728
- schema,
729
- name if name is not None else python_type_to_name(data_type),
730
- examples,
731
- )
732
- return data_type
733
-
734
-
735
- @overload
736
- def json_schema_type(cls: Type[T], /) -> Type[T]: ...
737
-
738
-
739
- @overload
740
- def json_schema_type(cls: None, *, schema: Optional[Schema] = None) -> Callable[[Type[T]], Type[T]]: ...
741
-
742
-
743
- def json_schema_type(
744
- cls: Optional[Type[T]] = None,
745
- *,
746
- schema: Optional[Schema] = None,
747
- examples: Optional[List[JsonType]] = None,
748
- ) -> Union[Type[T], Callable[[Type[T]], Type[T]]]:
749
- """Decorator to add user-defined schema definition to a class."""
750
-
751
- def wrap(cls: Type[T]) -> Type[T]:
752
- return register_schema(cls, schema, examples=examples)
753
-
754
- # see if decorator is used as @json_schema_type or @json_schema_type()
755
- if cls is None:
756
- # called with parentheses
757
- return wrap
758
- else:
759
- # called as @json_schema_type without parentheses
760
- return wrap(cls)
761
-
762
-
763
- register_schema(JsonObject, name="JsonObject")
764
- register_schema(JsonArray, name="JsonArray")
765
-
766
- register_schema(
767
- JsonType,
768
- name="JsonType",
769
- examples=[
770
- {
771
- "property1": None,
772
- "property2": True,
773
- "property3": 64,
774
- "property4": "string",
775
- "property5": ["item"],
776
- "property6": {"key": "value"},
777
- }
778
- ],
779
- )
780
- register_schema(
781
- StrictJsonType,
782
- name="StrictJsonType",
783
- examples=[
784
- {
785
- "property1": True,
786
- "property2": 64,
787
- "property3": "string",
788
- "property4": ["item"],
789
- "property5": {"key": "value"},
790
- }
791
- ],
792
- )