llama-stack 0.3.5__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.
- llama_stack/__init__.py +0 -5
- llama_stack/cli/llama.py +3 -3
- llama_stack/cli/stack/_list_deps.py +12 -23
- llama_stack/cli/stack/list_stacks.py +37 -18
- llama_stack/cli/stack/run.py +121 -11
- llama_stack/cli/stack/utils.py +0 -127
- llama_stack/core/access_control/access_control.py +69 -28
- llama_stack/core/access_control/conditions.py +15 -5
- llama_stack/core/admin.py +267 -0
- llama_stack/core/build.py +6 -74
- llama_stack/core/client.py +1 -1
- llama_stack/core/configure.py +6 -6
- llama_stack/core/conversations/conversations.py +28 -25
- llama_stack/core/datatypes.py +271 -79
- llama_stack/core/distribution.py +15 -16
- llama_stack/core/external.py +3 -3
- llama_stack/core/inspect.py +98 -15
- llama_stack/core/library_client.py +73 -61
- llama_stack/core/prompts/prompts.py +12 -11
- llama_stack/core/providers.py +17 -11
- llama_stack/core/resolver.py +65 -56
- llama_stack/core/routers/__init__.py +8 -12
- llama_stack/core/routers/datasets.py +1 -4
- llama_stack/core/routers/eval_scoring.py +7 -4
- llama_stack/core/routers/inference.py +55 -271
- llama_stack/core/routers/safety.py +52 -24
- llama_stack/core/routers/tool_runtime.py +6 -48
- llama_stack/core/routers/vector_io.py +130 -51
- llama_stack/core/routing_tables/benchmarks.py +24 -20
- llama_stack/core/routing_tables/common.py +1 -4
- llama_stack/core/routing_tables/datasets.py +22 -22
- llama_stack/core/routing_tables/models.py +119 -6
- llama_stack/core/routing_tables/scoring_functions.py +7 -7
- llama_stack/core/routing_tables/shields.py +1 -2
- llama_stack/core/routing_tables/toolgroups.py +17 -7
- llama_stack/core/routing_tables/vector_stores.py +51 -16
- llama_stack/core/server/auth.py +5 -3
- llama_stack/core/server/auth_providers.py +36 -20
- llama_stack/core/server/fastapi_router_registry.py +84 -0
- llama_stack/core/server/quota.py +2 -2
- llama_stack/core/server/routes.py +79 -27
- llama_stack/core/server/server.py +102 -87
- llama_stack/core/stack.py +201 -58
- llama_stack/core/storage/datatypes.py +26 -3
- llama_stack/{providers/utils → core/storage}/kvstore/__init__.py +2 -0
- llama_stack/{providers/utils → core/storage}/kvstore/kvstore.py +55 -24
- llama_stack/{providers/utils → core/storage}/kvstore/mongodb/mongodb.py +13 -10
- llama_stack/{providers/utils → core/storage}/kvstore/postgres/postgres.py +28 -17
- llama_stack/{providers/utils → core/storage}/kvstore/redis/redis.py +41 -16
- llama_stack/{providers/utils → core/storage}/kvstore/sqlite/sqlite.py +1 -1
- llama_stack/core/storage/sqlstore/__init__.py +17 -0
- llama_stack/{providers/utils → core/storage}/sqlstore/authorized_sqlstore.py +69 -49
- llama_stack/{providers/utils → core/storage}/sqlstore/sqlalchemy_sqlstore.py +47 -17
- llama_stack/{providers/utils → core/storage}/sqlstore/sqlstore.py +25 -8
- llama_stack/core/store/registry.py +1 -1
- llama_stack/core/utils/config.py +8 -2
- llama_stack/core/utils/config_resolution.py +32 -29
- llama_stack/core/utils/context.py +4 -10
- llama_stack/core/utils/exec.py +9 -0
- llama_stack/core/utils/type_inspection.py +45 -0
- llama_stack/distributions/dell/{run.yaml → config.yaml} +3 -2
- llama_stack/distributions/dell/dell.py +2 -2
- llama_stack/distributions/dell/run-with-safety.yaml +3 -2
- llama_stack/distributions/meta-reference-gpu/{run.yaml → config.yaml} +3 -2
- llama_stack/distributions/meta-reference-gpu/meta_reference.py +2 -2
- llama_stack/distributions/meta-reference-gpu/run-with-safety.yaml +3 -2
- llama_stack/distributions/nvidia/{run.yaml → config.yaml} +4 -4
- llama_stack/distributions/nvidia/nvidia.py +1 -1
- llama_stack/distributions/nvidia/run-with-safety.yaml +4 -4
- llama_stack/{apis/datasetio → distributions/oci}/__init__.py +1 -1
- llama_stack/distributions/oci/config.yaml +134 -0
- llama_stack/distributions/oci/oci.py +108 -0
- llama_stack/distributions/open-benchmark/{run.yaml → config.yaml} +5 -4
- llama_stack/distributions/open-benchmark/open_benchmark.py +2 -3
- llama_stack/distributions/postgres-demo/{run.yaml → config.yaml} +4 -3
- llama_stack/distributions/starter/{run.yaml → config.yaml} +64 -13
- llama_stack/distributions/starter/run-with-postgres-store.yaml +64 -13
- llama_stack/distributions/starter/starter.py +8 -5
- llama_stack/distributions/starter-gpu/{run.yaml → config.yaml} +64 -13
- llama_stack/distributions/starter-gpu/run-with-postgres-store.yaml +64 -13
- llama_stack/distributions/template.py +13 -69
- llama_stack/distributions/watsonx/{run.yaml → config.yaml} +4 -3
- llama_stack/distributions/watsonx/watsonx.py +1 -1
- llama_stack/log.py +28 -11
- llama_stack/models/llama/checkpoint.py +6 -6
- llama_stack/models/llama/hadamard_utils.py +2 -0
- llama_stack/models/llama/llama3/generation.py +3 -1
- llama_stack/models/llama/llama3/interface.py +2 -5
- llama_stack/models/llama/llama3/multimodal/encoder_utils.py +3 -3
- llama_stack/models/llama/llama3/multimodal/image_transform.py +6 -6
- llama_stack/models/llama/llama3/prompt_templates/system_prompts.py +1 -1
- llama_stack/models/llama/llama3/tool_utils.py +2 -1
- llama_stack/models/llama/llama4/prompt_templates/system_prompts.py +1 -1
- llama_stack/providers/inline/agents/meta_reference/__init__.py +3 -3
- llama_stack/providers/inline/agents/meta_reference/agents.py +44 -261
- llama_stack/providers/inline/agents/meta_reference/config.py +6 -1
- llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py +207 -57
- llama_stack/providers/inline/agents/meta_reference/responses/streaming.py +308 -47
- llama_stack/providers/inline/agents/meta_reference/responses/tool_executor.py +162 -96
- llama_stack/providers/inline/agents/meta_reference/responses/types.py +23 -8
- llama_stack/providers/inline/agents/meta_reference/responses/utils.py +201 -33
- llama_stack/providers/inline/agents/meta_reference/safety.py +8 -13
- llama_stack/providers/inline/batches/reference/__init__.py +2 -4
- llama_stack/providers/inline/batches/reference/batches.py +78 -60
- llama_stack/providers/inline/datasetio/localfs/datasetio.py +2 -5
- llama_stack/providers/inline/eval/meta_reference/eval.py +16 -61
- llama_stack/providers/inline/files/localfs/files.py +37 -28
- llama_stack/providers/inline/inference/meta_reference/config.py +2 -2
- llama_stack/providers/inline/inference/meta_reference/generators.py +50 -60
- llama_stack/providers/inline/inference/meta_reference/inference.py +403 -19
- llama_stack/providers/inline/inference/meta_reference/model_parallel.py +7 -26
- llama_stack/providers/inline/inference/meta_reference/parallel_utils.py +2 -12
- llama_stack/providers/inline/inference/sentence_transformers/sentence_transformers.py +10 -15
- llama_stack/providers/inline/post_training/common/validator.py +1 -5
- llama_stack/providers/inline/post_training/huggingface/post_training.py +8 -8
- llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device.py +18 -10
- llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device_dpo.py +12 -9
- llama_stack/providers/inline/post_training/huggingface/utils.py +27 -6
- llama_stack/providers/inline/post_training/torchtune/common/checkpointer.py +1 -1
- llama_stack/providers/inline/post_training/torchtune/common/utils.py +1 -1
- llama_stack/providers/inline/post_training/torchtune/datasets/format_adapter.py +1 -1
- llama_stack/providers/inline/post_training/torchtune/post_training.py +8 -8
- llama_stack/providers/inline/post_training/torchtune/recipes/lora_finetuning_single_device.py +16 -16
- llama_stack/providers/inline/safety/code_scanner/code_scanner.py +13 -9
- llama_stack/providers/inline/safety/llama_guard/llama_guard.py +18 -15
- llama_stack/providers/inline/safety/prompt_guard/prompt_guard.py +9 -9
- llama_stack/providers/inline/scoring/basic/scoring.py +6 -13
- llama_stack/providers/inline/scoring/basic/scoring_fn/docvqa_scoring_fn.py +1 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/equality_scoring_fn.py +1 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/docvqa.py +2 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/equality.py +2 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/ifeval.py +2 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_math_response.py +2 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_multiple_choice_answer.py +2 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/subset_of.py +2 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/ifeval_scoring_fn.py +1 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_math_response_scoring_fn.py +1 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_scoring_fn.py +1 -2
- llama_stack/providers/inline/scoring/basic/scoring_fn/subset_of_scoring_fn.py +1 -2
- llama_stack/providers/inline/scoring/braintrust/braintrust.py +12 -15
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_correctness.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_relevancy.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_similarity.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_entity_recall.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_precision.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_recall.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_relevancy.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/factuality.py +2 -2
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/faithfulness.py +2 -2
- llama_stack/providers/inline/scoring/llm_as_judge/scoring.py +7 -14
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_405b_simpleqa.py +2 -2
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_base.py +1 -2
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/llm_as_judge_scoring_fn.py +1 -3
- llama_stack/providers/inline/tool_runtime/rag/__init__.py +1 -1
- llama_stack/providers/inline/tool_runtime/rag/config.py +8 -1
- llama_stack/providers/inline/tool_runtime/rag/context_retriever.py +7 -6
- llama_stack/providers/inline/tool_runtime/rag/memory.py +64 -48
- llama_stack/providers/inline/vector_io/chroma/__init__.py +1 -1
- llama_stack/providers/inline/vector_io/chroma/config.py +1 -1
- llama_stack/providers/inline/vector_io/faiss/__init__.py +1 -1
- llama_stack/providers/inline/vector_io/faiss/config.py +1 -1
- llama_stack/providers/inline/vector_io/faiss/faiss.py +43 -28
- llama_stack/providers/inline/vector_io/milvus/__init__.py +1 -1
- llama_stack/providers/inline/vector_io/milvus/config.py +1 -1
- llama_stack/providers/inline/vector_io/qdrant/__init__.py +1 -1
- llama_stack/providers/inline/vector_io/qdrant/config.py +1 -1
- llama_stack/providers/inline/vector_io/sqlite_vec/__init__.py +1 -1
- llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py +40 -33
- llama_stack/providers/registry/agents.py +7 -3
- llama_stack/providers/registry/batches.py +1 -1
- llama_stack/providers/registry/datasetio.py +1 -1
- llama_stack/providers/registry/eval.py +1 -1
- llama_stack/{apis/datasets/__init__.py → providers/registry/file_processors.py} +5 -1
- llama_stack/providers/registry/files.py +11 -2
- llama_stack/providers/registry/inference.py +22 -3
- llama_stack/providers/registry/post_training.py +1 -1
- llama_stack/providers/registry/safety.py +1 -1
- llama_stack/providers/registry/scoring.py +1 -1
- llama_stack/providers/registry/tool_runtime.py +2 -2
- llama_stack/providers/registry/vector_io.py +7 -7
- llama_stack/providers/remote/datasetio/huggingface/huggingface.py +2 -5
- llama_stack/providers/remote/datasetio/nvidia/datasetio.py +1 -4
- llama_stack/providers/remote/eval/nvidia/eval.py +15 -9
- llama_stack/providers/remote/files/openai/__init__.py +19 -0
- llama_stack/providers/remote/files/openai/config.py +28 -0
- llama_stack/providers/remote/files/openai/files.py +253 -0
- llama_stack/providers/remote/files/s3/files.py +52 -30
- llama_stack/providers/remote/inference/anthropic/anthropic.py +2 -1
- llama_stack/providers/remote/inference/anthropic/config.py +1 -1
- llama_stack/providers/remote/inference/azure/azure.py +1 -3
- llama_stack/providers/remote/inference/azure/config.py +8 -7
- llama_stack/providers/remote/inference/bedrock/__init__.py +1 -1
- llama_stack/providers/remote/inference/bedrock/bedrock.py +82 -105
- llama_stack/providers/remote/inference/bedrock/config.py +24 -3
- llama_stack/providers/remote/inference/cerebras/cerebras.py +5 -5
- llama_stack/providers/remote/inference/cerebras/config.py +12 -5
- llama_stack/providers/remote/inference/databricks/config.py +13 -6
- llama_stack/providers/remote/inference/databricks/databricks.py +16 -6
- llama_stack/providers/remote/inference/fireworks/config.py +5 -5
- llama_stack/providers/remote/inference/fireworks/fireworks.py +1 -1
- llama_stack/providers/remote/inference/gemini/config.py +1 -1
- llama_stack/providers/remote/inference/gemini/gemini.py +13 -14
- llama_stack/providers/remote/inference/groq/config.py +5 -5
- llama_stack/providers/remote/inference/groq/groq.py +1 -1
- llama_stack/providers/remote/inference/llama_openai_compat/config.py +5 -5
- llama_stack/providers/remote/inference/llama_openai_compat/llama.py +8 -6
- llama_stack/providers/remote/inference/nvidia/__init__.py +1 -1
- llama_stack/providers/remote/inference/nvidia/config.py +21 -11
- llama_stack/providers/remote/inference/nvidia/nvidia.py +115 -3
- llama_stack/providers/remote/inference/nvidia/utils.py +1 -1
- llama_stack/providers/remote/inference/oci/__init__.py +17 -0
- llama_stack/providers/remote/inference/oci/auth.py +79 -0
- llama_stack/providers/remote/inference/oci/config.py +75 -0
- llama_stack/providers/remote/inference/oci/oci.py +162 -0
- llama_stack/providers/remote/inference/ollama/config.py +7 -5
- llama_stack/providers/remote/inference/ollama/ollama.py +17 -8
- llama_stack/providers/remote/inference/openai/config.py +4 -4
- llama_stack/providers/remote/inference/openai/openai.py +1 -1
- llama_stack/providers/remote/inference/passthrough/__init__.py +2 -2
- llama_stack/providers/remote/inference/passthrough/config.py +5 -10
- llama_stack/providers/remote/inference/passthrough/passthrough.py +97 -75
- llama_stack/providers/remote/inference/runpod/config.py +12 -5
- llama_stack/providers/remote/inference/runpod/runpod.py +2 -20
- llama_stack/providers/remote/inference/sambanova/config.py +5 -5
- llama_stack/providers/remote/inference/sambanova/sambanova.py +1 -1
- llama_stack/providers/remote/inference/tgi/config.py +7 -6
- llama_stack/providers/remote/inference/tgi/tgi.py +19 -11
- llama_stack/providers/remote/inference/together/config.py +5 -5
- llama_stack/providers/remote/inference/together/together.py +15 -12
- llama_stack/providers/remote/inference/vertexai/config.py +1 -1
- llama_stack/providers/remote/inference/vllm/config.py +5 -5
- llama_stack/providers/remote/inference/vllm/vllm.py +13 -14
- llama_stack/providers/remote/inference/watsonx/config.py +4 -4
- llama_stack/providers/remote/inference/watsonx/watsonx.py +21 -94
- llama_stack/providers/remote/post_training/nvidia/post_training.py +4 -4
- llama_stack/providers/remote/post_training/nvidia/utils.py +1 -1
- llama_stack/providers/remote/safety/bedrock/bedrock.py +6 -6
- llama_stack/providers/remote/safety/bedrock/config.py +1 -1
- llama_stack/providers/remote/safety/nvidia/config.py +1 -1
- llama_stack/providers/remote/safety/nvidia/nvidia.py +11 -5
- llama_stack/providers/remote/safety/sambanova/config.py +1 -1
- llama_stack/providers/remote/safety/sambanova/sambanova.py +6 -6
- llama_stack/providers/remote/tool_runtime/bing_search/bing_search.py +11 -6
- llama_stack/providers/remote/tool_runtime/brave_search/brave_search.py +12 -7
- llama_stack/providers/remote/tool_runtime/model_context_protocol/config.py +8 -2
- llama_stack/providers/remote/tool_runtime/model_context_protocol/model_context_protocol.py +57 -15
- llama_stack/providers/remote/tool_runtime/tavily_search/tavily_search.py +11 -6
- llama_stack/providers/remote/tool_runtime/wolfram_alpha/wolfram_alpha.py +11 -6
- llama_stack/providers/remote/vector_io/chroma/__init__.py +1 -1
- llama_stack/providers/remote/vector_io/chroma/chroma.py +125 -20
- llama_stack/providers/remote/vector_io/chroma/config.py +1 -1
- llama_stack/providers/remote/vector_io/milvus/__init__.py +1 -1
- llama_stack/providers/remote/vector_io/milvus/config.py +1 -1
- llama_stack/providers/remote/vector_io/milvus/milvus.py +27 -21
- llama_stack/providers/remote/vector_io/pgvector/__init__.py +1 -1
- llama_stack/providers/remote/vector_io/pgvector/config.py +1 -1
- llama_stack/providers/remote/vector_io/pgvector/pgvector.py +26 -18
- llama_stack/providers/remote/vector_io/qdrant/__init__.py +1 -1
- llama_stack/providers/remote/vector_io/qdrant/config.py +1 -1
- llama_stack/providers/remote/vector_io/qdrant/qdrant.py +141 -24
- llama_stack/providers/remote/vector_io/weaviate/__init__.py +1 -1
- llama_stack/providers/remote/vector_io/weaviate/config.py +1 -1
- llama_stack/providers/remote/vector_io/weaviate/weaviate.py +26 -21
- llama_stack/providers/utils/common/data_schema_validator.py +1 -5
- llama_stack/providers/utils/files/form_data.py +1 -1
- llama_stack/providers/utils/inference/embedding_mixin.py +1 -1
- llama_stack/providers/utils/inference/inference_store.py +7 -8
- llama_stack/providers/utils/inference/litellm_openai_mixin.py +79 -79
- llama_stack/providers/utils/inference/model_registry.py +1 -3
- llama_stack/providers/utils/inference/openai_compat.py +44 -1171
- llama_stack/providers/utils/inference/openai_mixin.py +68 -42
- llama_stack/providers/utils/inference/prompt_adapter.py +50 -265
- llama_stack/providers/utils/inference/stream_utils.py +23 -0
- llama_stack/providers/utils/memory/__init__.py +2 -0
- llama_stack/providers/utils/memory/file_utils.py +1 -1
- llama_stack/providers/utils/memory/openai_vector_store_mixin.py +181 -84
- llama_stack/providers/utils/memory/vector_store.py +39 -38
- llama_stack/providers/utils/pagination.py +1 -1
- llama_stack/providers/utils/responses/responses_store.py +15 -25
- llama_stack/providers/utils/scoring/aggregation_utils.py +1 -2
- llama_stack/providers/utils/scoring/base_scoring_fn.py +1 -2
- llama_stack/providers/utils/tools/mcp.py +93 -11
- llama_stack/telemetry/constants.py +27 -0
- llama_stack/telemetry/helpers.py +43 -0
- llama_stack/testing/api_recorder.py +25 -16
- {llama_stack-0.3.5.dist-info → llama_stack-0.4.0.dist-info}/METADATA +56 -54
- llama_stack-0.4.0.dist-info/RECORD +588 -0
- llama_stack-0.4.0.dist-info/top_level.txt +2 -0
- llama_stack_api/__init__.py +945 -0
- llama_stack_api/admin/__init__.py +45 -0
- llama_stack_api/admin/api.py +72 -0
- llama_stack_api/admin/fastapi_routes.py +117 -0
- llama_stack_api/admin/models.py +113 -0
- llama_stack_api/agents.py +173 -0
- llama_stack_api/batches/__init__.py +40 -0
- llama_stack_api/batches/api.py +53 -0
- llama_stack_api/batches/fastapi_routes.py +113 -0
- llama_stack_api/batches/models.py +78 -0
- llama_stack_api/benchmarks/__init__.py +43 -0
- llama_stack_api/benchmarks/api.py +39 -0
- llama_stack_api/benchmarks/fastapi_routes.py +109 -0
- llama_stack_api/benchmarks/models.py +109 -0
- {llama_stack/apis → llama_stack_api}/common/content_types.py +1 -43
- {llama_stack/apis → llama_stack_api}/common/errors.py +0 -8
- {llama_stack/apis → llama_stack_api}/common/job_types.py +1 -1
- llama_stack_api/common/responses.py +77 -0
- {llama_stack/apis → llama_stack_api}/common/training_types.py +1 -1
- {llama_stack/apis → llama_stack_api}/common/type_system.py +2 -14
- llama_stack_api/connectors.py +146 -0
- {llama_stack/apis/conversations → llama_stack_api}/conversations.py +23 -39
- {llama_stack/apis/datasetio → llama_stack_api}/datasetio.py +4 -8
- llama_stack_api/datasets/__init__.py +61 -0
- llama_stack_api/datasets/api.py +35 -0
- llama_stack_api/datasets/fastapi_routes.py +104 -0
- llama_stack_api/datasets/models.py +152 -0
- {llama_stack/providers → llama_stack_api}/datatypes.py +166 -10
- {llama_stack/apis/eval → llama_stack_api}/eval.py +8 -40
- llama_stack_api/file_processors/__init__.py +27 -0
- llama_stack_api/file_processors/api.py +64 -0
- llama_stack_api/file_processors/fastapi_routes.py +78 -0
- llama_stack_api/file_processors/models.py +42 -0
- llama_stack_api/files/__init__.py +35 -0
- llama_stack_api/files/api.py +51 -0
- llama_stack_api/files/fastapi_routes.py +124 -0
- llama_stack_api/files/models.py +107 -0
- {llama_stack/apis/inference → llama_stack_api}/inference.py +90 -194
- llama_stack_api/inspect_api/__init__.py +37 -0
- llama_stack_api/inspect_api/api.py +25 -0
- llama_stack_api/inspect_api/fastapi_routes.py +76 -0
- llama_stack_api/inspect_api/models.py +28 -0
- {llama_stack/apis/agents → llama_stack_api/internal}/__init__.py +3 -1
- llama_stack/providers/utils/kvstore/api.py → llama_stack_api/internal/kvstore.py +5 -0
- llama_stack_api/internal/sqlstore.py +79 -0
- {llama_stack/apis/models → llama_stack_api}/models.py +11 -9
- {llama_stack/apis/agents → llama_stack_api}/openai_responses.py +184 -27
- {llama_stack/apis/post_training → llama_stack_api}/post_training.py +7 -11
- {llama_stack/apis/prompts → llama_stack_api}/prompts.py +3 -4
- llama_stack_api/providers/__init__.py +33 -0
- llama_stack_api/providers/api.py +16 -0
- llama_stack_api/providers/fastapi_routes.py +57 -0
- llama_stack_api/providers/models.py +24 -0
- {llama_stack/apis/tools → llama_stack_api}/rag_tool.py +2 -52
- {llama_stack/apis → llama_stack_api}/resource.py +1 -1
- llama_stack_api/router_utils.py +160 -0
- {llama_stack/apis/safety → llama_stack_api}/safety.py +6 -9
- {llama_stack → llama_stack_api}/schema_utils.py +94 -4
- {llama_stack/apis/scoring → llama_stack_api}/scoring.py +3 -3
- {llama_stack/apis/scoring_functions → llama_stack_api}/scoring_functions.py +9 -6
- {llama_stack/apis/shields → llama_stack_api}/shields.py +6 -7
- {llama_stack/apis/tools → llama_stack_api}/tools.py +26 -21
- {llama_stack/apis/vector_io → llama_stack_api}/vector_io.py +133 -152
- {llama_stack/apis/vector_stores → llama_stack_api}/vector_stores.py +1 -1
- llama_stack/apis/agents/agents.py +0 -894
- llama_stack/apis/batches/__init__.py +0 -9
- llama_stack/apis/batches/batches.py +0 -100
- llama_stack/apis/benchmarks/__init__.py +0 -7
- llama_stack/apis/benchmarks/benchmarks.py +0 -108
- llama_stack/apis/common/responses.py +0 -36
- llama_stack/apis/conversations/__init__.py +0 -31
- llama_stack/apis/datasets/datasets.py +0 -251
- llama_stack/apis/datatypes.py +0 -160
- llama_stack/apis/eval/__init__.py +0 -7
- llama_stack/apis/files/__init__.py +0 -7
- llama_stack/apis/files/files.py +0 -199
- llama_stack/apis/inference/__init__.py +0 -7
- llama_stack/apis/inference/event_logger.py +0 -43
- llama_stack/apis/inspect/__init__.py +0 -7
- llama_stack/apis/inspect/inspect.py +0 -94
- llama_stack/apis/models/__init__.py +0 -7
- llama_stack/apis/post_training/__init__.py +0 -7
- llama_stack/apis/prompts/__init__.py +0 -9
- llama_stack/apis/providers/__init__.py +0 -7
- llama_stack/apis/providers/providers.py +0 -69
- llama_stack/apis/safety/__init__.py +0 -7
- llama_stack/apis/scoring/__init__.py +0 -7
- llama_stack/apis/scoring_functions/__init__.py +0 -7
- llama_stack/apis/shields/__init__.py +0 -7
- llama_stack/apis/synthetic_data_generation/__init__.py +0 -7
- llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py +0 -77
- llama_stack/apis/telemetry/__init__.py +0 -7
- llama_stack/apis/telemetry/telemetry.py +0 -423
- llama_stack/apis/tools/__init__.py +0 -8
- llama_stack/apis/vector_io/__init__.py +0 -7
- llama_stack/apis/vector_stores/__init__.py +0 -7
- llama_stack/core/server/tracing.py +0 -80
- llama_stack/core/ui/app.py +0 -55
- llama_stack/core/ui/modules/__init__.py +0 -5
- llama_stack/core/ui/modules/api.py +0 -32
- llama_stack/core/ui/modules/utils.py +0 -42
- llama_stack/core/ui/page/__init__.py +0 -5
- llama_stack/core/ui/page/distribution/__init__.py +0 -5
- llama_stack/core/ui/page/distribution/datasets.py +0 -18
- llama_stack/core/ui/page/distribution/eval_tasks.py +0 -20
- llama_stack/core/ui/page/distribution/models.py +0 -18
- llama_stack/core/ui/page/distribution/providers.py +0 -27
- llama_stack/core/ui/page/distribution/resources.py +0 -48
- llama_stack/core/ui/page/distribution/scoring_functions.py +0 -18
- llama_stack/core/ui/page/distribution/shields.py +0 -19
- llama_stack/core/ui/page/evaluations/__init__.py +0 -5
- llama_stack/core/ui/page/evaluations/app_eval.py +0 -143
- llama_stack/core/ui/page/evaluations/native_eval.py +0 -253
- llama_stack/core/ui/page/playground/__init__.py +0 -5
- llama_stack/core/ui/page/playground/chat.py +0 -130
- llama_stack/core/ui/page/playground/tools.py +0 -352
- llama_stack/distributions/dell/build.yaml +0 -33
- llama_stack/distributions/meta-reference-gpu/build.yaml +0 -32
- llama_stack/distributions/nvidia/build.yaml +0 -29
- llama_stack/distributions/open-benchmark/build.yaml +0 -36
- llama_stack/distributions/postgres-demo/__init__.py +0 -7
- llama_stack/distributions/postgres-demo/build.yaml +0 -23
- llama_stack/distributions/postgres-demo/postgres_demo.py +0 -125
- llama_stack/distributions/starter/build.yaml +0 -61
- llama_stack/distributions/starter-gpu/build.yaml +0 -61
- llama_stack/distributions/watsonx/build.yaml +0 -33
- llama_stack/providers/inline/agents/meta_reference/agent_instance.py +0 -1024
- llama_stack/providers/inline/agents/meta_reference/persistence.py +0 -228
- llama_stack/providers/inline/telemetry/__init__.py +0 -5
- llama_stack/providers/inline/telemetry/meta_reference/__init__.py +0 -21
- llama_stack/providers/inline/telemetry/meta_reference/config.py +0 -47
- llama_stack/providers/inline/telemetry/meta_reference/telemetry.py +0 -252
- llama_stack/providers/remote/inference/bedrock/models.py +0 -29
- llama_stack/providers/utils/kvstore/sqlite/config.py +0 -20
- llama_stack/providers/utils/sqlstore/__init__.py +0 -5
- llama_stack/providers/utils/sqlstore/api.py +0 -128
- llama_stack/providers/utils/telemetry/__init__.py +0 -5
- llama_stack/providers/utils/telemetry/trace_protocol.py +0 -142
- llama_stack/providers/utils/telemetry/tracing.py +0 -384
- llama_stack/strong_typing/__init__.py +0 -19
- llama_stack/strong_typing/auxiliary.py +0 -228
- llama_stack/strong_typing/classdef.py +0 -440
- llama_stack/strong_typing/core.py +0 -46
- llama_stack/strong_typing/deserializer.py +0 -877
- llama_stack/strong_typing/docstring.py +0 -409
- llama_stack/strong_typing/exception.py +0 -23
- llama_stack/strong_typing/inspection.py +0 -1085
- llama_stack/strong_typing/mapping.py +0 -40
- llama_stack/strong_typing/name.py +0 -182
- llama_stack/strong_typing/schema.py +0 -792
- llama_stack/strong_typing/serialization.py +0 -97
- llama_stack/strong_typing/serializer.py +0 -500
- llama_stack/strong_typing/slots.py +0 -27
- llama_stack/strong_typing/topological.py +0 -89
- llama_stack/ui/node_modules/flatted/python/flatted.py +0 -149
- llama_stack-0.3.5.dist-info/RECORD +0 -625
- llama_stack-0.3.5.dist-info/top_level.txt +0 -1
- /llama_stack/{providers/utils → core/storage}/kvstore/config.py +0 -0
- /llama_stack/{providers/utils → core/storage}/kvstore/mongodb/__init__.py +0 -0
- /llama_stack/{providers/utils → core/storage}/kvstore/postgres/__init__.py +0 -0
- /llama_stack/{providers/utils → core/storage}/kvstore/redis/__init__.py +0 -0
- /llama_stack/{providers/utils → core/storage}/kvstore/sqlite/__init__.py +0 -0
- /llama_stack/{apis → providers/inline/file_processor}/__init__.py +0 -0
- /llama_stack/{apis/common → telemetry}/__init__.py +0 -0
- {llama_stack-0.3.5.dist-info → llama_stack-0.4.0.dist-info}/WHEEL +0 -0
- {llama_stack-0.3.5.dist-info → llama_stack-0.4.0.dist-info}/entry_points.txt +0 -0
- {llama_stack-0.3.5.dist-info → llama_stack-0.4.0.dist-info}/licenses/LICENSE +0 -0
- {llama_stack/core/ui → llama_stack_api/common}/__init__.py +0 -0
- {llama_stack/strong_typing → llama_stack_api}/py.typed +0 -0
- {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]
|