llama-stack 0.3.4__py3-none-any.whl → 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) 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 +201 -58
  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 +43 -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 +40 -33
  169. llama_stack/providers/registry/agents.py +7 -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 +125 -20
  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 +27 -21
  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 +26 -18
  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 +141 -24
  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 +26 -21
  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 +12 -21
  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/telemetry/constants.py +27 -0
  284. llama_stack/telemetry/helpers.py +43 -0
  285. llama_stack/testing/api_recorder.py +25 -16
  286. {llama_stack-0.3.4.dist-info → llama_stack-0.4.0.dist-info}/METADATA +56 -131
  287. llama_stack-0.4.0.dist-info/RECORD +588 -0
  288. llama_stack-0.4.0.dist-info/top_level.txt +2 -0
  289. llama_stack_api/__init__.py +945 -0
  290. llama_stack_api/admin/__init__.py +45 -0
  291. llama_stack_api/admin/api.py +72 -0
  292. llama_stack_api/admin/fastapi_routes.py +117 -0
  293. llama_stack_api/admin/models.py +113 -0
  294. llama_stack_api/agents.py +173 -0
  295. llama_stack_api/batches/__init__.py +40 -0
  296. llama_stack_api/batches/api.py +53 -0
  297. llama_stack_api/batches/fastapi_routes.py +113 -0
  298. llama_stack_api/batches/models.py +78 -0
  299. llama_stack_api/benchmarks/__init__.py +43 -0
  300. llama_stack_api/benchmarks/api.py +39 -0
  301. llama_stack_api/benchmarks/fastapi_routes.py +109 -0
  302. llama_stack_api/benchmarks/models.py +109 -0
  303. {llama_stack/apis → llama_stack_api}/common/content_types.py +1 -43
  304. {llama_stack/apis → llama_stack_api}/common/errors.py +0 -8
  305. {llama_stack/apis → llama_stack_api}/common/job_types.py +1 -1
  306. llama_stack_api/common/responses.py +77 -0
  307. {llama_stack/apis → llama_stack_api}/common/training_types.py +1 -1
  308. {llama_stack/apis → llama_stack_api}/common/type_system.py +2 -14
  309. llama_stack_api/connectors.py +146 -0
  310. {llama_stack/apis/conversations → llama_stack_api}/conversations.py +23 -39
  311. {llama_stack/apis/datasetio → llama_stack_api}/datasetio.py +4 -8
  312. llama_stack_api/datasets/__init__.py +61 -0
  313. llama_stack_api/datasets/api.py +35 -0
  314. llama_stack_api/datasets/fastapi_routes.py +104 -0
  315. llama_stack_api/datasets/models.py +152 -0
  316. {llama_stack/providers → llama_stack_api}/datatypes.py +166 -10
  317. {llama_stack/apis/eval → llama_stack_api}/eval.py +8 -40
  318. llama_stack_api/file_processors/__init__.py +27 -0
  319. llama_stack_api/file_processors/api.py +64 -0
  320. llama_stack_api/file_processors/fastapi_routes.py +78 -0
  321. llama_stack_api/file_processors/models.py +42 -0
  322. llama_stack_api/files/__init__.py +35 -0
  323. llama_stack_api/files/api.py +51 -0
  324. llama_stack_api/files/fastapi_routes.py +124 -0
  325. llama_stack_api/files/models.py +107 -0
  326. {llama_stack/apis/inference → llama_stack_api}/inference.py +90 -194
  327. llama_stack_api/inspect_api/__init__.py +37 -0
  328. llama_stack_api/inspect_api/api.py +25 -0
  329. llama_stack_api/inspect_api/fastapi_routes.py +76 -0
  330. llama_stack_api/inspect_api/models.py +28 -0
  331. {llama_stack/apis/agents → llama_stack_api/internal}/__init__.py +3 -1
  332. llama_stack/providers/utils/kvstore/api.py → llama_stack_api/internal/kvstore.py +5 -0
  333. llama_stack_api/internal/sqlstore.py +79 -0
  334. {llama_stack/apis/models → llama_stack_api}/models.py +11 -9
  335. {llama_stack/apis/agents → llama_stack_api}/openai_responses.py +184 -27
  336. {llama_stack/apis/post_training → llama_stack_api}/post_training.py +7 -11
  337. {llama_stack/apis/prompts → llama_stack_api}/prompts.py +3 -4
  338. llama_stack_api/providers/__init__.py +33 -0
  339. llama_stack_api/providers/api.py +16 -0
  340. llama_stack_api/providers/fastapi_routes.py +57 -0
  341. llama_stack_api/providers/models.py +24 -0
  342. {llama_stack/apis/tools → llama_stack_api}/rag_tool.py +2 -52
  343. {llama_stack/apis → llama_stack_api}/resource.py +1 -1
  344. llama_stack_api/router_utils.py +160 -0
  345. {llama_stack/apis/safety → llama_stack_api}/safety.py +6 -9
  346. {llama_stack → llama_stack_api}/schema_utils.py +94 -4
  347. {llama_stack/apis/scoring → llama_stack_api}/scoring.py +3 -3
  348. {llama_stack/apis/scoring_functions → llama_stack_api}/scoring_functions.py +9 -6
  349. {llama_stack/apis/shields → llama_stack_api}/shields.py +6 -7
  350. {llama_stack/apis/tools → llama_stack_api}/tools.py +26 -21
  351. {llama_stack/apis/vector_io → llama_stack_api}/vector_io.py +133 -152
  352. {llama_stack/apis/vector_stores → llama_stack_api}/vector_stores.py +1 -1
  353. llama_stack/apis/agents/agents.py +0 -894
  354. llama_stack/apis/batches/__init__.py +0 -9
  355. llama_stack/apis/batches/batches.py +0 -100
  356. llama_stack/apis/benchmarks/__init__.py +0 -7
  357. llama_stack/apis/benchmarks/benchmarks.py +0 -108
  358. llama_stack/apis/common/responses.py +0 -36
  359. llama_stack/apis/conversations/__init__.py +0 -31
  360. llama_stack/apis/datasets/datasets.py +0 -251
  361. llama_stack/apis/datatypes.py +0 -160
  362. llama_stack/apis/eval/__init__.py +0 -7
  363. llama_stack/apis/files/__init__.py +0 -7
  364. llama_stack/apis/files/files.py +0 -199
  365. llama_stack/apis/inference/__init__.py +0 -7
  366. llama_stack/apis/inference/event_logger.py +0 -43
  367. llama_stack/apis/inspect/__init__.py +0 -7
  368. llama_stack/apis/inspect/inspect.py +0 -94
  369. llama_stack/apis/models/__init__.py +0 -7
  370. llama_stack/apis/post_training/__init__.py +0 -7
  371. llama_stack/apis/prompts/__init__.py +0 -9
  372. llama_stack/apis/providers/__init__.py +0 -7
  373. llama_stack/apis/providers/providers.py +0 -69
  374. llama_stack/apis/safety/__init__.py +0 -7
  375. llama_stack/apis/scoring/__init__.py +0 -7
  376. llama_stack/apis/scoring_functions/__init__.py +0 -7
  377. llama_stack/apis/shields/__init__.py +0 -7
  378. llama_stack/apis/synthetic_data_generation/__init__.py +0 -7
  379. llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py +0 -77
  380. llama_stack/apis/telemetry/__init__.py +0 -7
  381. llama_stack/apis/telemetry/telemetry.py +0 -423
  382. llama_stack/apis/tools/__init__.py +0 -8
  383. llama_stack/apis/vector_io/__init__.py +0 -7
  384. llama_stack/apis/vector_stores/__init__.py +0 -7
  385. llama_stack/core/server/tracing.py +0 -80
  386. llama_stack/core/ui/app.py +0 -55
  387. llama_stack/core/ui/modules/__init__.py +0 -5
  388. llama_stack/core/ui/modules/api.py +0 -32
  389. llama_stack/core/ui/modules/utils.py +0 -42
  390. llama_stack/core/ui/page/__init__.py +0 -5
  391. llama_stack/core/ui/page/distribution/__init__.py +0 -5
  392. llama_stack/core/ui/page/distribution/datasets.py +0 -18
  393. llama_stack/core/ui/page/distribution/eval_tasks.py +0 -20
  394. llama_stack/core/ui/page/distribution/models.py +0 -18
  395. llama_stack/core/ui/page/distribution/providers.py +0 -27
  396. llama_stack/core/ui/page/distribution/resources.py +0 -48
  397. llama_stack/core/ui/page/distribution/scoring_functions.py +0 -18
  398. llama_stack/core/ui/page/distribution/shields.py +0 -19
  399. llama_stack/core/ui/page/evaluations/__init__.py +0 -5
  400. llama_stack/core/ui/page/evaluations/app_eval.py +0 -143
  401. llama_stack/core/ui/page/evaluations/native_eval.py +0 -253
  402. llama_stack/core/ui/page/playground/__init__.py +0 -5
  403. llama_stack/core/ui/page/playground/chat.py +0 -130
  404. llama_stack/core/ui/page/playground/tools.py +0 -352
  405. llama_stack/distributions/dell/build.yaml +0 -33
  406. llama_stack/distributions/meta-reference-gpu/build.yaml +0 -32
  407. llama_stack/distributions/nvidia/build.yaml +0 -29
  408. llama_stack/distributions/open-benchmark/build.yaml +0 -36
  409. llama_stack/distributions/postgres-demo/__init__.py +0 -7
  410. llama_stack/distributions/postgres-demo/build.yaml +0 -23
  411. llama_stack/distributions/postgres-demo/postgres_demo.py +0 -125
  412. llama_stack/distributions/starter/build.yaml +0 -61
  413. llama_stack/distributions/starter-gpu/build.yaml +0 -61
  414. llama_stack/distributions/watsonx/build.yaml +0 -33
  415. llama_stack/providers/inline/agents/meta_reference/agent_instance.py +0 -1024
  416. llama_stack/providers/inline/agents/meta_reference/persistence.py +0 -228
  417. llama_stack/providers/inline/telemetry/__init__.py +0 -5
  418. llama_stack/providers/inline/telemetry/meta_reference/__init__.py +0 -21
  419. llama_stack/providers/inline/telemetry/meta_reference/config.py +0 -47
  420. llama_stack/providers/inline/telemetry/meta_reference/telemetry.py +0 -252
  421. llama_stack/providers/remote/inference/bedrock/models.py +0 -29
  422. llama_stack/providers/utils/kvstore/sqlite/config.py +0 -20
  423. llama_stack/providers/utils/sqlstore/__init__.py +0 -5
  424. llama_stack/providers/utils/sqlstore/api.py +0 -128
  425. llama_stack/providers/utils/telemetry/__init__.py +0 -5
  426. llama_stack/providers/utils/telemetry/trace_protocol.py +0 -142
  427. llama_stack/providers/utils/telemetry/tracing.py +0 -384
  428. llama_stack/strong_typing/__init__.py +0 -19
  429. llama_stack/strong_typing/auxiliary.py +0 -228
  430. llama_stack/strong_typing/classdef.py +0 -440
  431. llama_stack/strong_typing/core.py +0 -46
  432. llama_stack/strong_typing/deserializer.py +0 -877
  433. llama_stack/strong_typing/docstring.py +0 -409
  434. llama_stack/strong_typing/exception.py +0 -23
  435. llama_stack/strong_typing/inspection.py +0 -1085
  436. llama_stack/strong_typing/mapping.py +0 -40
  437. llama_stack/strong_typing/name.py +0 -182
  438. llama_stack/strong_typing/schema.py +0 -792
  439. llama_stack/strong_typing/serialization.py +0 -97
  440. llama_stack/strong_typing/serializer.py +0 -500
  441. llama_stack/strong_typing/slots.py +0 -27
  442. llama_stack/strong_typing/topological.py +0 -89
  443. llama_stack/ui/node_modules/flatted/python/flatted.py +0 -149
  444. llama_stack-0.3.4.dist-info/RECORD +0 -625
  445. llama_stack-0.3.4.dist-info/top_level.txt +0 -1
  446. /llama_stack/{providers/utils → core/storage}/kvstore/config.py +0 -0
  447. /llama_stack/{providers/utils → core/storage}/kvstore/mongodb/__init__.py +0 -0
  448. /llama_stack/{providers/utils → core/storage}/kvstore/postgres/__init__.py +0 -0
  449. /llama_stack/{providers/utils → core/storage}/kvstore/redis/__init__.py +0 -0
  450. /llama_stack/{providers/utils → core/storage}/kvstore/sqlite/__init__.py +0 -0
  451. /llama_stack/{apis → providers/inline/file_processor}/__init__.py +0 -0
  452. /llama_stack/{apis/common → telemetry}/__init__.py +0 -0
  453. {llama_stack-0.3.4.dist-info → llama_stack-0.4.0.dist-info}/WHEEL +0 -0
  454. {llama_stack-0.3.4.dist-info → llama_stack-0.4.0.dist-info}/entry_points.txt +0 -0
  455. {llama_stack-0.3.4.dist-info → llama_stack-0.4.0.dist-info}/licenses/LICENSE +0 -0
  456. {llama_stack/core/ui → llama_stack_api/common}/__init__.py +0 -0
  457. {llama_stack/strong_typing → llama_stack_api}/py.typed +0 -0
  458. {llama_stack/apis → llama_stack_api}/version.py +0 -0
@@ -1,228 +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 dataclasses
14
- import sys
15
- from dataclasses import is_dataclass
16
- from typing import Callable, Dict, Optional, Type, TypeVar, Union, overload
17
-
18
- if sys.version_info >= (3, 9):
19
- from typing import Annotated as Annotated
20
- else:
21
- from typing_extensions import Annotated as Annotated
22
-
23
- if sys.version_info >= (3, 10):
24
- from typing import TypeAlias as TypeAlias
25
- else:
26
- from typing_extensions import TypeAlias as TypeAlias
27
-
28
- if sys.version_info >= (3, 11):
29
- from typing import dataclass_transform as dataclass_transform
30
- else:
31
- from typing_extensions import dataclass_transform as dataclass_transform
32
-
33
- T = TypeVar("T")
34
-
35
-
36
- def _compact_dataclass_repr(obj: object) -> str:
37
- """
38
- Compact data-class representation where positional arguments are used instead of keyword arguments.
39
-
40
- :param obj: A data-class object.
41
- :returns: A string that matches the pattern `Class(arg1, arg2, ...)`.
42
- """
43
-
44
- if is_dataclass(obj):
45
- arglist = ", ".join(repr(getattr(obj, field.name)) for field in dataclasses.fields(obj))
46
- return f"{obj.__class__.__name__}({arglist})"
47
- else:
48
- return obj.__class__.__name__
49
-
50
-
51
- class CompactDataClass:
52
- "A data class whose repr() uses positional rather than keyword arguments."
53
-
54
- def __repr__(self) -> str:
55
- return _compact_dataclass_repr(self)
56
-
57
-
58
- @overload
59
- def typeannotation(cls: Type[T], /) -> Type[T]: ...
60
-
61
-
62
- @overload
63
- def typeannotation(cls: None, *, eq: bool = True, order: bool = False) -> Callable[[Type[T]], Type[T]]: ...
64
-
65
-
66
- @dataclass_transform(eq_default=True, order_default=False)
67
- def typeannotation(
68
- cls: Optional[Type[T]] = None, *, eq: bool = True, order: bool = False
69
- ) -> Union[Type[T], Callable[[Type[T]], Type[T]]]:
70
- """
71
- Returns the same class as was passed in, with dunder methods added based on the fields defined in the class.
72
-
73
- :param cls: The data-class type to transform into a type annotation.
74
- :param eq: Whether to generate functions to support equality comparison.
75
- :param order: Whether to generate functions to support ordering.
76
- :returns: A data-class type, or a wrapper for data-class types.
77
- """
78
-
79
- def wrap(cls: Type[T]) -> Type[T]:
80
- # mypy fails to equate bound-y functions (first argument interpreted as
81
- # the bound object) with class methods, hence the `ignore` directive.
82
- cls.__repr__ = _compact_dataclass_repr # type: ignore[method-assign]
83
- if not dataclasses.is_dataclass(cls):
84
- cls = dataclasses.dataclass( # type: ignore[call-overload]
85
- cls,
86
- init=True,
87
- repr=False,
88
- eq=eq,
89
- order=order,
90
- unsafe_hash=False,
91
- frozen=True,
92
- )
93
- return cls
94
-
95
- # see if decorator is used as @typeannotation or @typeannotation()
96
- if cls is None:
97
- # called with parentheses
98
- return wrap
99
- else:
100
- # called without parentheses
101
- return wrap(cls)
102
-
103
-
104
- @typeannotation
105
- class Alias:
106
- "Alternative name of a property, typically used in JSON serialization."
107
-
108
- name: str
109
-
110
-
111
- @typeannotation
112
- class Signed:
113
- "Signedness of an integer type."
114
-
115
- is_signed: bool
116
-
117
-
118
- @typeannotation
119
- class Storage:
120
- "Number of bytes the binary representation of an integer type takes, e.g. 4 bytes for an int32."
121
-
122
- bytes: int
123
-
124
-
125
- @typeannotation
126
- class IntegerRange:
127
- "Minimum and maximum value of an integer. The range is inclusive."
128
-
129
- minimum: int
130
- maximum: int
131
-
132
-
133
- @typeannotation
134
- class Precision:
135
- "Precision of a floating-point value."
136
-
137
- significant_digits: int
138
- decimal_digits: int = 0
139
-
140
- @property
141
- def integer_digits(self) -> int:
142
- return self.significant_digits - self.decimal_digits
143
-
144
-
145
- @typeannotation
146
- class TimePrecision:
147
- """
148
- Precision of a timestamp or time interval.
149
-
150
- :param decimal_digits: Number of fractional digits retained in the sub-seconds field for a timestamp.
151
- """
152
-
153
- decimal_digits: int = 0
154
-
155
-
156
- @typeannotation
157
- class Length:
158
- "Exact length of a string."
159
-
160
- value: int
161
-
162
-
163
- @typeannotation
164
- class MinLength:
165
- "Minimum length of a string."
166
-
167
- value: int
168
-
169
-
170
- @typeannotation
171
- class MaxLength:
172
- "Maximum length of a string."
173
-
174
- value: int
175
-
176
-
177
- @typeannotation
178
- class SpecialConversion:
179
- "Indicates that the annotated type is subject to custom conversion rules."
180
-
181
-
182
- int8: TypeAlias = Annotated[int, Signed(True), Storage(1), IntegerRange(-128, 127)]
183
- int16: TypeAlias = Annotated[int, Signed(True), Storage(2), IntegerRange(-32768, 32767)]
184
- int32: TypeAlias = Annotated[
185
- int,
186
- Signed(True),
187
- Storage(4),
188
- IntegerRange(-2147483648, 2147483647),
189
- ]
190
- int64: TypeAlias = Annotated[
191
- int,
192
- Signed(True),
193
- Storage(8),
194
- IntegerRange(-9223372036854775808, 9223372036854775807),
195
- ]
196
-
197
- uint8: TypeAlias = Annotated[int, Signed(False), Storage(1), IntegerRange(0, 255)]
198
- uint16: TypeAlias = Annotated[int, Signed(False), Storage(2), IntegerRange(0, 65535)]
199
- uint32: TypeAlias = Annotated[
200
- int,
201
- Signed(False),
202
- Storage(4),
203
- IntegerRange(0, 4294967295),
204
- ]
205
- uint64: TypeAlias = Annotated[
206
- int,
207
- Signed(False),
208
- Storage(8),
209
- IntegerRange(0, 18446744073709551615),
210
- ]
211
-
212
- float32: TypeAlias = Annotated[float, Storage(4)]
213
- float64: TypeAlias = Annotated[float, Storage(8)]
214
-
215
- # maps globals of type Annotated[T, ...] defined in this module to their string names
216
- _auxiliary_types: Dict[object, str] = {}
217
- module = sys.modules[__name__]
218
- for var in dir(module):
219
- typ = getattr(module, var)
220
- if getattr(typ, "__metadata__", None) is not None:
221
- # type is Annotated[T, ...]
222
- _auxiliary_types[typ] = var
223
-
224
-
225
- def get_auxiliary_format(data_type: object) -> Optional[str]:
226
- "Returns the JSON format string corresponding to an auxiliary type."
227
-
228
- return _auxiliary_types.get(data_type)
@@ -1,440 +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
- import copy
8
- import dataclasses
9
- import datetime
10
- import decimal
11
- import enum
12
- import ipaddress
13
- import math
14
- import re
15
- import sys
16
- import types
17
- import typing
18
- import uuid
19
- from dataclasses import dataclass
20
- from typing import Any, Dict, List, Literal, Optional, Tuple, Type, TypeVar, Union
21
-
22
- from .auxiliary import (
23
- Alias,
24
- Annotated,
25
- MaxLength,
26
- Precision,
27
- float32,
28
- float64,
29
- int16,
30
- int32,
31
- int64,
32
- )
33
- from .core import JsonType, Schema
34
- from .docstring import Docstring, DocstringParam
35
- from .inspection import TypeLike
36
- from .serialization import json_to_object, object_to_json
37
-
38
- T = TypeVar("T")
39
-
40
-
41
- @dataclass
42
- class JsonSchemaNode:
43
- title: Optional[str]
44
- description: Optional[str]
45
-
46
-
47
- @dataclass
48
- class JsonSchemaType(JsonSchemaNode):
49
- type: str
50
- format: Optional[str]
51
-
52
-
53
- @dataclass
54
- class JsonSchemaBoolean(JsonSchemaType):
55
- type: Literal["boolean"]
56
- const: Optional[bool]
57
- default: Optional[bool]
58
- examples: Optional[List[bool]]
59
-
60
-
61
- @dataclass
62
- class JsonSchemaInteger(JsonSchemaType):
63
- type: Literal["integer"]
64
- const: Optional[int]
65
- default: Optional[int]
66
- examples: Optional[List[int]]
67
- enum: Optional[List[int]]
68
- minimum: Optional[int]
69
- maximum: Optional[int]
70
-
71
-
72
- @dataclass
73
- class JsonSchemaNumber(JsonSchemaType):
74
- type: Literal["number"]
75
- const: Optional[float]
76
- default: Optional[float]
77
- examples: Optional[List[float]]
78
- minimum: Optional[float]
79
- maximum: Optional[float]
80
- exclusiveMinimum: Optional[float]
81
- exclusiveMaximum: Optional[float]
82
- multipleOf: Optional[float]
83
-
84
-
85
- @dataclass
86
- class JsonSchemaString(JsonSchemaType):
87
- type: Literal["string"]
88
- const: Optional[str]
89
- default: Optional[str]
90
- examples: Optional[List[str]]
91
- enum: Optional[List[str]]
92
- minLength: Optional[int]
93
- maxLength: Optional[int]
94
-
95
-
96
- @dataclass
97
- class JsonSchemaArray(JsonSchemaType):
98
- type: Literal["array"]
99
- items: "JsonSchemaAny"
100
-
101
-
102
- @dataclass
103
- class JsonSchemaObject(JsonSchemaType):
104
- type: Literal["object"]
105
- properties: Optional[Dict[str, "JsonSchemaAny"]]
106
- additionalProperties: Optional[bool]
107
- required: Optional[List[str]]
108
-
109
-
110
- @dataclass
111
- class JsonSchemaRef(JsonSchemaNode):
112
- ref: Annotated[str, Alias("$ref")]
113
-
114
-
115
- @dataclass
116
- class JsonSchemaAllOf(JsonSchemaNode):
117
- allOf: List["JsonSchemaAny"]
118
-
119
-
120
- @dataclass
121
- class JsonSchemaAnyOf(JsonSchemaNode):
122
- anyOf: List["JsonSchemaAny"]
123
-
124
-
125
- @dataclass
126
- class Discriminator:
127
- propertyName: str
128
- mapping: Dict[str, str]
129
-
130
-
131
- @dataclass
132
- class JsonSchemaOneOf(JsonSchemaNode):
133
- oneOf: List["JsonSchemaAny"]
134
- discriminator: Optional[Discriminator]
135
-
136
-
137
- JsonSchemaAny = Union[
138
- JsonSchemaRef,
139
- JsonSchemaBoolean,
140
- JsonSchemaInteger,
141
- JsonSchemaNumber,
142
- JsonSchemaString,
143
- JsonSchemaArray,
144
- JsonSchemaObject,
145
- JsonSchemaOneOf,
146
- ]
147
-
148
-
149
- @dataclass
150
- class JsonSchemaTopLevelObject(JsonSchemaObject):
151
- schema: Annotated[str, Alias("$schema")]
152
- definitions: Optional[Dict[str, JsonSchemaAny]]
153
-
154
-
155
- def integer_range_to_type(min_value: float, max_value: float) -> type:
156
- if min_value >= -(2**15) and max_value < 2**15:
157
- return int16
158
- elif min_value >= -(2**31) and max_value < 2**31:
159
- return int32
160
- else:
161
- return int64
162
-
163
-
164
- def enum_safe_name(name: str) -> str:
165
- name = re.sub(r"\W", "_", name)
166
- is_dunder = name.startswith("__")
167
- is_sunder = name.startswith("_") and name.endswith("_")
168
- if is_dunder or is_sunder: # provide an alternative for dunder and sunder names
169
- name = f"v{name}"
170
- return name
171
-
172
-
173
- def enum_values_to_type(
174
- module: types.ModuleType,
175
- name: str,
176
- values: Dict[str, Any],
177
- title: Optional[str] = None,
178
- description: Optional[str] = None,
179
- ) -> Type[enum.Enum]:
180
- enum_class: Type[enum.Enum] = enum.Enum(name, values) # type: ignore
181
-
182
- # assign the newly created type to the same module where the defining class is
183
- enum_class.__module__ = module.__name__
184
- enum_class.__doc__ = str(Docstring(short_description=title, long_description=description))
185
- setattr(module, name, enum_class)
186
-
187
- return enum.unique(enum_class)
188
-
189
-
190
- def schema_to_type(schema: Schema, *, module: types.ModuleType, class_name: str) -> TypeLike:
191
- """
192
- Creates a Python type from a JSON schema.
193
-
194
- :param schema: The JSON schema that the types would correspond to.
195
- :param module: The module in which to create the new types.
196
- :param class_name: The name assigned to the top-level class.
197
- """
198
-
199
- top_node = typing.cast(JsonSchemaTopLevelObject, json_to_object(JsonSchemaTopLevelObject, schema))
200
- if top_node.definitions is not None:
201
- for type_name, type_node in top_node.definitions.items():
202
- type_def = node_to_typedef(module, type_name, type_node)
203
- if type_def.default is not dataclasses.MISSING:
204
- raise TypeError("disallowed: `default` for top-level type definitions")
205
-
206
- type_def.type.__module__ = module.__name__
207
- setattr(module, type_name, type_def.type)
208
-
209
- return node_to_typedef(module, class_name, top_node).type
210
-
211
-
212
- @dataclass
213
- class TypeDef:
214
- type: TypeLike
215
- default: Any = dataclasses.MISSING
216
-
217
-
218
- def json_to_value(target_type: TypeLike, data: JsonType) -> Any:
219
- if data is not None:
220
- return json_to_object(target_type, data)
221
- else:
222
- return dataclasses.MISSING
223
-
224
-
225
- def node_to_typedef(module: types.ModuleType, context: str, node: JsonSchemaNode) -> TypeDef:
226
- if isinstance(node, JsonSchemaRef):
227
- match_obj = re.match(r"^#/definitions/(\w+)$", node.ref)
228
- if not match_obj:
229
- raise ValueError(f"invalid reference: {node.ref}")
230
-
231
- type_name = match_obj.group(1)
232
- return TypeDef(getattr(module, type_name), dataclasses.MISSING)
233
-
234
- elif isinstance(node, JsonSchemaBoolean):
235
- if node.const is not None:
236
- return TypeDef(Literal[node.const], dataclasses.MISSING)
237
-
238
- default = json_to_value(bool, node.default)
239
- return TypeDef(bool, default)
240
-
241
- elif isinstance(node, JsonSchemaInteger):
242
- if node.const is not None:
243
- return TypeDef(Literal[node.const], dataclasses.MISSING)
244
-
245
- integer_type: TypeLike
246
- if node.format == "int16":
247
- integer_type = int16
248
- elif node.format == "int32":
249
- integer_type = int32
250
- elif node.format == "int64":
251
- integer_type = int64
252
- else:
253
- if node.enum is not None:
254
- integer_type = integer_range_to_type(min(node.enum), max(node.enum))
255
- elif node.minimum is not None and node.maximum is not None:
256
- integer_type = integer_range_to_type(node.minimum, node.maximum)
257
- else:
258
- integer_type = int
259
-
260
- default = json_to_value(integer_type, node.default)
261
- return TypeDef(integer_type, default)
262
-
263
- elif isinstance(node, JsonSchemaNumber):
264
- if node.const is not None:
265
- return TypeDef(Literal[node.const], dataclasses.MISSING)
266
-
267
- number_type: TypeLike
268
- if node.format == "float32":
269
- number_type = float32
270
- elif node.format == "float64":
271
- number_type = float64
272
- else:
273
- if (
274
- node.exclusiveMinimum is not None
275
- and node.exclusiveMaximum is not None
276
- and node.exclusiveMinimum == -node.exclusiveMaximum
277
- ):
278
- integer_digits = round(math.log10(node.exclusiveMaximum))
279
- else:
280
- integer_digits = None
281
-
282
- if node.multipleOf is not None:
283
- decimal_digits = -round(math.log10(node.multipleOf))
284
- else:
285
- decimal_digits = None
286
-
287
- if integer_digits is not None and decimal_digits is not None:
288
- number_type = Annotated[
289
- decimal.Decimal,
290
- Precision(integer_digits + decimal_digits, decimal_digits),
291
- ]
292
- else:
293
- number_type = float
294
-
295
- default = json_to_value(number_type, node.default)
296
- return TypeDef(number_type, default)
297
-
298
- elif isinstance(node, JsonSchemaString):
299
- if node.const is not None:
300
- return TypeDef(Literal[node.const], dataclasses.MISSING)
301
-
302
- string_type: TypeLike
303
- if node.format == "date-time":
304
- string_type = datetime.datetime
305
- elif node.format == "uuid":
306
- string_type = uuid.UUID
307
- elif node.format == "ipv4":
308
- string_type = ipaddress.IPv4Address
309
- elif node.format == "ipv6":
310
- string_type = ipaddress.IPv6Address
311
-
312
- elif node.enum is not None:
313
- string_type = enum_values_to_type(
314
- module,
315
- context,
316
- {enum_safe_name(e): e for e in node.enum},
317
- title=node.title,
318
- description=node.description,
319
- )
320
-
321
- elif node.maxLength is not None:
322
- string_type = Annotated[str, MaxLength(node.maxLength)]
323
- else:
324
- string_type = str
325
-
326
- default = json_to_value(string_type, node.default)
327
- return TypeDef(string_type, default)
328
-
329
- elif isinstance(node, JsonSchemaArray):
330
- type_def = node_to_typedef(module, context, node.items)
331
- if type_def.default is not dataclasses.MISSING:
332
- raise TypeError("disallowed: `default` for array element type")
333
- list_type = List[(type_def.type,)] # type: ignore
334
- return TypeDef(list_type, dataclasses.MISSING)
335
-
336
- elif isinstance(node, JsonSchemaObject):
337
- if node.properties is None:
338
- return TypeDef(JsonType, dataclasses.MISSING)
339
-
340
- if node.additionalProperties is None or node.additionalProperties is not False:
341
- raise TypeError("expected: `additionalProperties` equals `false`")
342
-
343
- required = node.required if node.required is not None else []
344
-
345
- class_name = context
346
-
347
- fields: List[Tuple[str, Any, dataclasses.Field]] = []
348
- params: Dict[str, DocstringParam] = {}
349
- for prop_name, prop_node in node.properties.items():
350
- type_def = node_to_typedef(module, f"{class_name}__{prop_name}", prop_node)
351
- if prop_name in required:
352
- prop_type = type_def.type
353
- else:
354
- prop_type = Union[(None, type_def.type)]
355
- fields.append((prop_name, prop_type, dataclasses.field(default=type_def.default)))
356
- prop_desc = prop_node.title or prop_node.description
357
- if prop_desc is not None:
358
- params[prop_name] = DocstringParam(prop_name, prop_desc)
359
-
360
- fields.sort(key=lambda t: t[2].default is not dataclasses.MISSING)
361
- if sys.version_info >= (3, 12):
362
- class_type = dataclasses.make_dataclass(class_name, fields, module=module.__name__)
363
- else:
364
- class_type = dataclasses.make_dataclass(class_name, fields, namespace={"__module__": module.__name__})
365
- class_type.__doc__ = str(
366
- Docstring(
367
- short_description=node.title,
368
- long_description=node.description,
369
- params=params,
370
- )
371
- )
372
- setattr(module, class_name, class_type)
373
- return TypeDef(class_type, dataclasses.MISSING)
374
-
375
- elif isinstance(node, JsonSchemaOneOf):
376
- union_defs = tuple(node_to_typedef(module, context, n) for n in node.oneOf)
377
- if any(d.default is not dataclasses.MISSING for d in union_defs):
378
- raise TypeError("disallowed: `default` for union member type")
379
- union_types = tuple(d.type for d in union_defs)
380
- return TypeDef(Union[union_types], dataclasses.MISSING)
381
-
382
- raise NotImplementedError()
383
-
384
-
385
- @dataclass
386
- class SchemaFlatteningOptions:
387
- qualified_names: bool = False
388
- recursive: bool = False
389
-
390
-
391
- def flatten_schema(schema: Schema, *, options: Optional[SchemaFlatteningOptions] = None) -> Schema:
392
- top_node = typing.cast(JsonSchemaTopLevelObject, json_to_object(JsonSchemaTopLevelObject, schema))
393
- flattener = SchemaFlattener(options)
394
- obj = flattener.flatten(top_node)
395
- return typing.cast(Schema, object_to_json(obj))
396
-
397
-
398
- class SchemaFlattener:
399
- options: SchemaFlatteningOptions
400
-
401
- def __init__(self, options: Optional[SchemaFlatteningOptions] = None) -> None:
402
- self.options = options or SchemaFlatteningOptions()
403
-
404
- def flatten(self, source_node: JsonSchemaObject) -> JsonSchemaObject:
405
- if source_node.type != "object":
406
- return source_node
407
-
408
- source_props = source_node.properties or {}
409
- target_props: Dict[str, JsonSchemaAny] = {}
410
-
411
- source_reqs = source_node.required or []
412
- target_reqs: List[str] = []
413
-
414
- for name, prop in source_props.items():
415
- if not isinstance(prop, JsonSchemaObject):
416
- target_props[name] = prop
417
- if name in source_reqs:
418
- target_reqs.append(name)
419
- continue
420
-
421
- if self.options.recursive:
422
- obj = self.flatten(prop)
423
- else:
424
- obj = prop
425
- if obj.properties is not None:
426
- if self.options.qualified_names:
427
- target_props.update((f"{name}.{n}", p) for n, p in obj.properties.items())
428
- else:
429
- target_props.update(obj.properties.items())
430
- if obj.required is not None:
431
- if self.options.qualified_names:
432
- target_reqs.extend(f"{name}.{n}" for n in obj.required)
433
- else:
434
- target_reqs.extend(obj.required)
435
-
436
- target_node = copy.copy(source_node)
437
- target_node.properties = target_props or None
438
- target_node.additionalProperties = False
439
- target_node.required = target_reqs or None
440
- return target_node
@@ -1,46 +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
- from typing import Dict, List, Union
14
-
15
-
16
- class JsonObject:
17
- "Placeholder type for an unrestricted JSON object."
18
-
19
-
20
- class JsonArray:
21
- "Placeholder type for an unrestricted JSON array."
22
-
23
-
24
- # a JSON type with possible `null` values
25
- JsonType = Union[
26
- None,
27
- bool,
28
- int,
29
- float,
30
- str,
31
- Dict[str, "JsonType"],
32
- List["JsonType"],
33
- ]
34
-
35
- # a JSON type that cannot contain `null` values
36
- StrictJsonType = Union[
37
- bool,
38
- int,
39
- float,
40
- str,
41
- Dict[str, "StrictJsonType"],
42
- List["StrictJsonType"],
43
- ]
44
-
45
- # a meta-type that captures the object type in a JSON schema
46
- Schema = Dict[str, JsonType]