llama-stack 0.0.42__py3-none-any.whl → 0.3.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- llama_stack/__init__.py +5 -0
- llama_stack/apis/agents/__init__.py +1 -1
- llama_stack/apis/agents/agents.py +700 -281
- llama_stack/apis/agents/openai_responses.py +1311 -0
- llama_stack/{providers/adapters/memory/sample/config.py → apis/batches/__init__.py} +2 -5
- llama_stack/apis/batches/batches.py +100 -0
- llama_stack/apis/benchmarks/__init__.py +7 -0
- llama_stack/apis/benchmarks/benchmarks.py +108 -0
- llama_stack/apis/common/content_types.py +143 -0
- llama_stack/apis/common/errors.py +103 -0
- llama_stack/apis/common/job_types.py +38 -0
- llama_stack/apis/common/responses.py +36 -0
- llama_stack/apis/common/training_types.py +36 -5
- llama_stack/apis/common/type_system.py +158 -0
- llama_stack/apis/conversations/__init__.py +31 -0
- llama_stack/apis/conversations/conversations.py +286 -0
- llama_stack/apis/datasetio/__init__.py +7 -0
- llama_stack/apis/datasetio/datasetio.py +59 -0
- llama_stack/apis/datasets/__init__.py +7 -0
- llama_stack/apis/datasets/datasets.py +251 -0
- llama_stack/apis/datatypes.py +160 -0
- llama_stack/apis/eval/__init__.py +7 -0
- llama_stack/apis/eval/eval.py +169 -0
- llama_stack/apis/files/__init__.py +7 -0
- llama_stack/apis/files/files.py +199 -0
- llama_stack/apis/inference/__init__.py +1 -1
- llama_stack/apis/inference/inference.py +1169 -113
- llama_stack/apis/inspect/__init__.py +1 -1
- llama_stack/apis/inspect/inspect.py +69 -16
- llama_stack/apis/models/__init__.py +1 -1
- llama_stack/apis/models/models.py +148 -21
- llama_stack/apis/post_training/__init__.py +1 -1
- llama_stack/apis/post_training/post_training.py +265 -120
- llama_stack/{providers/adapters/agents/sample/config.py → apis/prompts/__init__.py} +2 -5
- llama_stack/apis/prompts/prompts.py +204 -0
- llama_stack/apis/providers/__init__.py +7 -0
- llama_stack/apis/providers/providers.py +69 -0
- llama_stack/apis/resource.py +37 -0
- llama_stack/apis/safety/__init__.py +1 -1
- llama_stack/apis/safety/safety.py +95 -12
- llama_stack/apis/scoring/__init__.py +7 -0
- llama_stack/apis/scoring/scoring.py +93 -0
- llama_stack/apis/scoring_functions/__init__.py +7 -0
- llama_stack/apis/scoring_functions/scoring_functions.py +208 -0
- llama_stack/apis/shields/__init__.py +1 -1
- llama_stack/apis/shields/shields.py +76 -33
- llama_stack/apis/synthetic_data_generation/__init__.py +1 -1
- llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py +40 -17
- llama_stack/apis/telemetry/__init__.py +1 -1
- llama_stack/apis/telemetry/telemetry.py +322 -31
- llama_stack/apis/{dataset → tools}/__init__.py +2 -1
- llama_stack/apis/tools/rag_tool.py +218 -0
- llama_stack/apis/tools/tools.py +221 -0
- llama_stack/apis/vector_io/__init__.py +7 -0
- llama_stack/apis/vector_io/vector_io.py +960 -0
- llama_stack/apis/vector_stores/__init__.py +7 -0
- llama_stack/apis/vector_stores/vector_stores.py +51 -0
- llama_stack/apis/version.py +9 -0
- llama_stack/cli/llama.py +13 -5
- llama_stack/cli/stack/_list_deps.py +182 -0
- llama_stack/cli/stack/list_apis.py +1 -1
- llama_stack/cli/stack/list_deps.py +55 -0
- llama_stack/cli/stack/list_providers.py +24 -10
- llama_stack/cli/stack/list_stacks.py +56 -0
- llama_stack/cli/stack/remove.py +115 -0
- llama_stack/cli/stack/run.py +169 -56
- llama_stack/cli/stack/stack.py +18 -4
- llama_stack/cli/stack/utils.py +151 -0
- llama_stack/cli/table.py +23 -61
- llama_stack/cli/utils.py +29 -0
- llama_stack/core/access_control/access_control.py +131 -0
- llama_stack/core/access_control/conditions.py +129 -0
- llama_stack/core/access_control/datatypes.py +107 -0
- llama_stack/core/build.py +164 -0
- llama_stack/core/client.py +205 -0
- llama_stack/core/common.sh +37 -0
- llama_stack/{distribution → core}/configure.py +74 -55
- llama_stack/core/conversations/conversations.py +309 -0
- llama_stack/core/datatypes.py +625 -0
- llama_stack/core/distribution.py +276 -0
- llama_stack/core/external.py +54 -0
- llama_stack/core/id_generation.py +42 -0
- llama_stack/core/inspect.py +86 -0
- llama_stack/core/library_client.py +539 -0
- llama_stack/core/prompts/prompts.py +234 -0
- llama_stack/core/providers.py +137 -0
- llama_stack/core/request_headers.py +115 -0
- llama_stack/core/resolver.py +506 -0
- llama_stack/core/routers/__init__.py +101 -0
- llama_stack/core/routers/datasets.py +73 -0
- llama_stack/core/routers/eval_scoring.py +155 -0
- llama_stack/core/routers/inference.py +645 -0
- llama_stack/core/routers/safety.py +85 -0
- llama_stack/core/routers/tool_runtime.py +91 -0
- llama_stack/core/routers/vector_io.py +442 -0
- llama_stack/core/routing_tables/benchmarks.py +62 -0
- llama_stack/core/routing_tables/common.py +254 -0
- llama_stack/core/routing_tables/datasets.py +91 -0
- llama_stack/core/routing_tables/models.py +163 -0
- llama_stack/core/routing_tables/scoring_functions.py +66 -0
- llama_stack/core/routing_tables/shields.py +61 -0
- llama_stack/core/routing_tables/toolgroups.py +129 -0
- llama_stack/core/routing_tables/vector_stores.py +292 -0
- llama_stack/core/server/auth.py +187 -0
- llama_stack/core/server/auth_providers.py +494 -0
- llama_stack/core/server/quota.py +110 -0
- llama_stack/core/server/routes.py +141 -0
- llama_stack/core/server/server.py +542 -0
- llama_stack/core/server/tracing.py +80 -0
- llama_stack/core/stack.py +546 -0
- llama_stack/core/start_stack.sh +117 -0
- llama_stack/core/storage/datatypes.py +283 -0
- llama_stack/{cli/model → core/store}/__init__.py +1 -1
- llama_stack/core/store/registry.py +199 -0
- llama_stack/core/testing_context.py +49 -0
- llama_stack/core/ui/app.py +55 -0
- llama_stack/core/ui/modules/api.py +32 -0
- llama_stack/core/ui/modules/utils.py +42 -0
- llama_stack/core/ui/page/distribution/datasets.py +18 -0
- llama_stack/core/ui/page/distribution/eval_tasks.py +20 -0
- llama_stack/core/ui/page/distribution/models.py +18 -0
- llama_stack/core/ui/page/distribution/providers.py +27 -0
- llama_stack/core/ui/page/distribution/resources.py +48 -0
- llama_stack/core/ui/page/distribution/scoring_functions.py +18 -0
- llama_stack/core/ui/page/distribution/shields.py +19 -0
- llama_stack/core/ui/page/evaluations/app_eval.py +143 -0
- llama_stack/core/ui/page/evaluations/native_eval.py +253 -0
- llama_stack/core/ui/page/playground/chat.py +130 -0
- llama_stack/core/ui/page/playground/tools.py +352 -0
- llama_stack/core/utils/config.py +30 -0
- llama_stack/{distribution → core}/utils/config_dirs.py +3 -6
- llama_stack/core/utils/config_resolution.py +125 -0
- llama_stack/core/utils/context.py +84 -0
- llama_stack/core/utils/exec.py +96 -0
- llama_stack/{providers/impls/meta_reference/codeshield/config.py → core/utils/image_types.py} +4 -3
- llama_stack/{distribution → core}/utils/model_utils.py +2 -2
- llama_stack/{distribution → core}/utils/prompt_for_config.py +30 -63
- llama_stack/{apis/batch_inference → distributions/dell}/__init__.py +1 -1
- llama_stack/distributions/dell/build.yaml +33 -0
- llama_stack/distributions/dell/dell.py +158 -0
- llama_stack/distributions/dell/run-with-safety.yaml +141 -0
- llama_stack/distributions/dell/run.yaml +132 -0
- llama_stack/distributions/meta-reference-gpu/__init__.py +7 -0
- llama_stack/distributions/meta-reference-gpu/build.yaml +32 -0
- llama_stack/distributions/meta-reference-gpu/meta_reference.py +163 -0
- llama_stack/distributions/meta-reference-gpu/run-with-safety.yaml +154 -0
- llama_stack/distributions/meta-reference-gpu/run.yaml +139 -0
- llama_stack/{apis/evals → distributions/nvidia}/__init__.py +1 -1
- llama_stack/distributions/nvidia/build.yaml +29 -0
- llama_stack/distributions/nvidia/nvidia.py +154 -0
- llama_stack/distributions/nvidia/run-with-safety.yaml +137 -0
- llama_stack/distributions/nvidia/run.yaml +116 -0
- llama_stack/distributions/open-benchmark/__init__.py +7 -0
- llama_stack/distributions/open-benchmark/build.yaml +36 -0
- llama_stack/distributions/open-benchmark/open_benchmark.py +303 -0
- llama_stack/distributions/open-benchmark/run.yaml +252 -0
- llama_stack/distributions/postgres-demo/__init__.py +7 -0
- llama_stack/distributions/postgres-demo/build.yaml +23 -0
- llama_stack/distributions/postgres-demo/postgres_demo.py +125 -0
- llama_stack/distributions/postgres-demo/run.yaml +115 -0
- llama_stack/{apis/memory → distributions/starter}/__init__.py +1 -1
- llama_stack/distributions/starter/build.yaml +61 -0
- llama_stack/distributions/starter/run-with-postgres-store.yaml +285 -0
- llama_stack/distributions/starter/run.yaml +276 -0
- llama_stack/distributions/starter/starter.py +345 -0
- llama_stack/distributions/starter-gpu/__init__.py +7 -0
- llama_stack/distributions/starter-gpu/build.yaml +61 -0
- llama_stack/distributions/starter-gpu/run-with-postgres-store.yaml +288 -0
- llama_stack/distributions/starter-gpu/run.yaml +279 -0
- llama_stack/distributions/starter-gpu/starter_gpu.py +20 -0
- llama_stack/distributions/template.py +456 -0
- llama_stack/distributions/watsonx/__init__.py +7 -0
- llama_stack/distributions/watsonx/build.yaml +33 -0
- llama_stack/distributions/watsonx/run.yaml +133 -0
- llama_stack/distributions/watsonx/watsonx.py +95 -0
- llama_stack/env.py +24 -0
- llama_stack/log.py +314 -0
- llama_stack/models/llama/checkpoint.py +164 -0
- llama_stack/models/llama/datatypes.py +164 -0
- llama_stack/models/llama/hadamard_utils.py +86 -0
- llama_stack/models/llama/llama3/args.py +74 -0
- llama_stack/models/llama/llama3/chat_format.py +286 -0
- llama_stack/models/llama/llama3/generation.py +376 -0
- llama_stack/models/llama/llama3/interface.py +255 -0
- llama_stack/models/llama/llama3/model.py +304 -0
- llama_stack/models/llama/llama3/multimodal/__init__.py +12 -0
- llama_stack/models/llama/llama3/multimodal/encoder_utils.py +180 -0
- llama_stack/models/llama/llama3/multimodal/image_transform.py +409 -0
- llama_stack/models/llama/llama3/multimodal/model.py +1430 -0
- llama_stack/models/llama/llama3/multimodal/utils.py +26 -0
- llama_stack/models/llama/llama3/prompt_templates/__init__.py +22 -0
- llama_stack/models/llama/llama3/prompt_templates/base.py +39 -0
- llama_stack/models/llama/llama3/prompt_templates/system_prompts.py +319 -0
- llama_stack/models/llama/llama3/prompt_templates/tool_response.py +62 -0
- llama_stack/models/llama/llama3/quantization/loader.py +316 -0
- llama_stack/models/llama/llama3/template_data.py +116 -0
- llama_stack/models/llama/llama3/tokenizer.model +128000 -0
- llama_stack/models/llama/llama3/tokenizer.py +198 -0
- llama_stack/models/llama/llama3/tool_utils.py +266 -0
- llama_stack/models/llama/llama3_1/__init__.py +12 -0
- llama_stack/models/llama/llama3_1/prompt_format.md +358 -0
- llama_stack/models/llama/llama3_1/prompts.py +258 -0
- llama_stack/models/llama/llama3_2/prompts_text.py +229 -0
- llama_stack/models/llama/llama3_2/prompts_vision.py +126 -0
- llama_stack/models/llama/llama3_2/text_prompt_format.md +286 -0
- llama_stack/models/llama/llama3_2/vision_prompt_format.md +141 -0
- llama_stack/models/llama/llama3_3/prompts.py +259 -0
- llama_stack/models/llama/llama4/args.py +107 -0
- llama_stack/models/llama/llama4/chat_format.py +317 -0
- llama_stack/models/llama/llama4/datatypes.py +56 -0
- llama_stack/models/llama/llama4/ffn.py +58 -0
- llama_stack/models/llama/llama4/generation.py +313 -0
- llama_stack/models/llama/llama4/model.py +437 -0
- llama_stack/models/llama/llama4/moe.py +214 -0
- llama_stack/models/llama/llama4/preprocess.py +435 -0
- llama_stack/models/llama/llama4/prompt_format.md +304 -0
- llama_stack/models/llama/llama4/prompt_templates/system_prompts.py +136 -0
- llama_stack/models/llama/llama4/prompts.py +279 -0
- llama_stack/models/llama/llama4/quantization/__init__.py +5 -0
- llama_stack/models/llama/llama4/quantization/loader.py +226 -0
- llama_stack/models/llama/llama4/tokenizer.model +200000 -0
- llama_stack/models/llama/llama4/tokenizer.py +263 -0
- llama_stack/models/llama/llama4/vision/__init__.py +5 -0
- llama_stack/models/llama/llama4/vision/embedding.py +210 -0
- llama_stack/models/llama/llama4/vision/encoder.py +412 -0
- llama_stack/models/llama/prompt_format.py +191 -0
- llama_stack/models/llama/quantize_impls.py +316 -0
- llama_stack/models/llama/sku_list.py +1029 -0
- llama_stack/models/llama/sku_types.py +233 -0
- llama_stack/models/llama/tokenizer_utils.py +40 -0
- llama_stack/providers/datatypes.py +136 -107
- llama_stack/providers/inline/__init__.py +5 -0
- llama_stack/providers/inline/agents/__init__.py +5 -0
- llama_stack/providers/{impls/meta_reference/agents → inline/agents/meta_reference}/__init__.py +12 -5
- llama_stack/providers/inline/agents/meta_reference/agent_instance.py +1024 -0
- llama_stack/providers/inline/agents/meta_reference/agents.py +383 -0
- llama_stack/providers/inline/agents/meta_reference/config.py +37 -0
- llama_stack/providers/inline/agents/meta_reference/persistence.py +228 -0
- llama_stack/providers/inline/agents/meta_reference/responses/__init__.py +5 -0
- llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py +423 -0
- llama_stack/providers/inline/agents/meta_reference/responses/streaming.py +1226 -0
- llama_stack/providers/inline/agents/meta_reference/responses/tool_executor.py +449 -0
- llama_stack/providers/inline/agents/meta_reference/responses/types.py +194 -0
- llama_stack/providers/inline/agents/meta_reference/responses/utils.py +365 -0
- llama_stack/providers/inline/agents/meta_reference/safety.py +52 -0
- llama_stack/providers/inline/batches/__init__.py +5 -0
- llama_stack/providers/inline/batches/reference/__init__.py +36 -0
- llama_stack/providers/inline/batches/reference/batches.py +679 -0
- llama_stack/providers/inline/batches/reference/config.py +40 -0
- llama_stack/providers/inline/datasetio/__init__.py +5 -0
- llama_stack/providers/inline/datasetio/localfs/__init__.py +20 -0
- llama_stack/providers/inline/datasetio/localfs/config.py +23 -0
- llama_stack/providers/inline/datasetio/localfs/datasetio.py +113 -0
- llama_stack/providers/inline/eval/__init__.py +5 -0
- llama_stack/providers/inline/eval/meta_reference/__init__.py +28 -0
- llama_stack/providers/inline/eval/meta_reference/config.py +23 -0
- llama_stack/providers/inline/eval/meta_reference/eval.py +259 -0
- llama_stack/providers/inline/files/localfs/__init__.py +20 -0
- llama_stack/providers/inline/files/localfs/config.py +31 -0
- llama_stack/providers/inline/files/localfs/files.py +219 -0
- llama_stack/providers/inline/inference/__init__.py +5 -0
- llama_stack/providers/{impls/meta_reference/inference → inline/inference/meta_reference}/__init__.py +4 -4
- llama_stack/providers/inline/inference/meta_reference/common.py +24 -0
- llama_stack/providers/inline/inference/meta_reference/config.py +68 -0
- llama_stack/providers/inline/inference/meta_reference/generators.py +211 -0
- llama_stack/providers/inline/inference/meta_reference/inference.py +158 -0
- llama_stack/providers/inline/inference/meta_reference/model_parallel.py +96 -0
- llama_stack/providers/{impls/meta_reference/inference → inline/inference/meta_reference}/parallel_utils.py +56 -73
- llama_stack/providers/inline/inference/sentence_transformers/__init__.py +22 -0
- llama_stack/providers/{impls/meta_reference/agents → inline/inference/sentence_transformers}/config.py +6 -4
- llama_stack/providers/inline/inference/sentence_transformers/sentence_transformers.py +83 -0
- llama_stack/providers/inline/post_training/__init__.py +5 -0
- llama_stack/providers/inline/post_training/common/__init__.py +5 -0
- llama_stack/providers/inline/post_training/common/utils.py +35 -0
- llama_stack/providers/inline/post_training/common/validator.py +36 -0
- llama_stack/providers/inline/post_training/huggingface/__init__.py +27 -0
- llama_stack/providers/inline/post_training/huggingface/config.py +83 -0
- llama_stack/providers/inline/post_training/huggingface/post_training.py +208 -0
- llama_stack/providers/inline/post_training/huggingface/recipes/__init__.py +5 -0
- llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device.py +519 -0
- llama_stack/providers/inline/post_training/huggingface/recipes/finetune_single_device_dpo.py +485 -0
- llama_stack/providers/inline/post_training/huggingface/utils.py +269 -0
- llama_stack/providers/inline/post_training/torchtune/__init__.py +27 -0
- llama_stack/providers/inline/post_training/torchtune/common/__init__.py +5 -0
- llama_stack/providers/inline/post_training/torchtune/common/checkpointer.py +240 -0
- llama_stack/providers/inline/post_training/torchtune/common/utils.py +99 -0
- llama_stack/providers/inline/post_training/torchtune/config.py +20 -0
- llama_stack/providers/inline/post_training/torchtune/datasets/__init__.py +5 -0
- llama_stack/providers/inline/post_training/torchtune/datasets/format_adapter.py +57 -0
- llama_stack/providers/inline/post_training/torchtune/datasets/sft.py +78 -0
- llama_stack/providers/inline/post_training/torchtune/post_training.py +178 -0
- llama_stack/providers/inline/post_training/torchtune/recipes/__init__.py +5 -0
- llama_stack/providers/inline/post_training/torchtune/recipes/lora_finetuning_single_device.py +588 -0
- llama_stack/providers/inline/safety/__init__.py +5 -0
- llama_stack/providers/{impls/meta_reference/codeshield → inline/safety/code_scanner}/__init__.py +4 -2
- llama_stack/providers/inline/safety/code_scanner/code_scanner.py +128 -0
- llama_stack/providers/{impls/meta_reference/memory → inline/safety/code_scanner}/config.py +5 -3
- llama_stack/providers/inline/safety/llama_guard/__init__.py +19 -0
- llama_stack/providers/inline/safety/llama_guard/config.py +19 -0
- llama_stack/providers/inline/safety/llama_guard/llama_guard.py +489 -0
- llama_stack/providers/{adapters/memory/sample → inline/safety/prompt_guard}/__init__.py +4 -4
- llama_stack/providers/inline/safety/prompt_guard/config.py +32 -0
- llama_stack/providers/inline/safety/prompt_guard/prompt_guard.py +131 -0
- llama_stack/providers/inline/scoring/__init__.py +5 -0
- llama_stack/providers/inline/scoring/basic/__init__.py +25 -0
- llama_stack/providers/{adapters/memory/weaviate → inline/scoring/basic}/config.py +5 -7
- llama_stack/providers/inline/scoring/basic/scoring.py +126 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/__init__.py +5 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/docvqa_scoring_fn.py +240 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/equality_scoring_fn.py +41 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/__init__.py +5 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/docvqa.py +21 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/equality.py +21 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/ifeval.py +23 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_math_response.py +27 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/regex_parser_multiple_choice_answer.py +71 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/fn_defs/subset_of.py +21 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/ifeval_scoring_fn.py +80 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_math_response_scoring_fn.py +66 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/regex_parser_scoring_fn.py +58 -0
- llama_stack/providers/inline/scoring/basic/scoring_fn/subset_of_scoring_fn.py +38 -0
- llama_stack/providers/inline/scoring/basic/utils/__init__.py +5 -0
- llama_stack/providers/inline/scoring/basic/utils/ifeval_utils.py +3319 -0
- llama_stack/providers/inline/scoring/basic/utils/math_utils.py +330 -0
- llama_stack/providers/inline/scoring/braintrust/__init__.py +27 -0
- llama_stack/providers/inline/scoring/braintrust/braintrust.py +230 -0
- llama_stack/providers/inline/scoring/braintrust/config.py +21 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/__init__.py +5 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/__init__.py +5 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_correctness.py +24 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_relevancy.py +24 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/answer_similarity.py +24 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_entity_recall.py +24 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_precision.py +24 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_recall.py +24 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/context_relevancy.py +23 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/factuality.py +24 -0
- llama_stack/providers/inline/scoring/braintrust/scoring_fn/fn_defs/faithfulness.py +24 -0
- llama_stack/providers/inline/scoring/llm_as_judge/__init__.py +21 -0
- llama_stack/providers/inline/scoring/llm_as_judge/config.py +14 -0
- llama_stack/providers/inline/scoring/llm_as_judge/scoring.py +113 -0
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/__init__.py +5 -0
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/__init__.py +5 -0
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_405b_simpleqa.py +96 -0
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/fn_defs/llm_as_judge_base.py +20 -0
- llama_stack/providers/inline/scoring/llm_as_judge/scoring_fn/llm_as_judge_scoring_fn.py +81 -0
- llama_stack/providers/inline/telemetry/__init__.py +5 -0
- llama_stack/providers/inline/telemetry/meta_reference/__init__.py +21 -0
- llama_stack/providers/inline/telemetry/meta_reference/config.py +47 -0
- llama_stack/providers/inline/telemetry/meta_reference/telemetry.py +252 -0
- llama_stack/providers/inline/tool_runtime/__init__.py +5 -0
- llama_stack/providers/inline/tool_runtime/rag/__init__.py +19 -0
- llama_stack/providers/{impls/meta_reference/telemetry → inline/tool_runtime/rag}/config.py +5 -3
- llama_stack/providers/inline/tool_runtime/rag/context_retriever.py +77 -0
- llama_stack/providers/inline/tool_runtime/rag/memory.py +332 -0
- llama_stack/providers/inline/vector_io/__init__.py +5 -0
- llama_stack/providers/inline/vector_io/chroma/__init__.py +19 -0
- llama_stack/providers/inline/vector_io/chroma/config.py +30 -0
- llama_stack/providers/inline/vector_io/faiss/__init__.py +21 -0
- llama_stack/providers/inline/vector_io/faiss/config.py +26 -0
- llama_stack/providers/inline/vector_io/faiss/faiss.py +293 -0
- llama_stack/providers/inline/vector_io/milvus/__init__.py +19 -0
- llama_stack/providers/inline/vector_io/milvus/config.py +29 -0
- llama_stack/providers/inline/vector_io/qdrant/__init__.py +20 -0
- llama_stack/providers/inline/vector_io/qdrant/config.py +29 -0
- llama_stack/providers/inline/vector_io/sqlite_vec/__init__.py +20 -0
- llama_stack/providers/inline/vector_io/sqlite_vec/config.py +26 -0
- llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py +483 -0
- llama_stack/providers/registry/agents.py +16 -18
- llama_stack/providers/registry/batches.py +26 -0
- llama_stack/providers/registry/datasetio.py +49 -0
- llama_stack/providers/registry/eval.py +46 -0
- llama_stack/providers/registry/files.py +31 -0
- llama_stack/providers/registry/inference.py +273 -118
- llama_stack/providers/registry/post_training.py +69 -0
- llama_stack/providers/registry/safety.py +46 -41
- llama_stack/providers/registry/scoring.py +51 -0
- llama_stack/providers/registry/tool_runtime.py +87 -0
- llama_stack/providers/registry/vector_io.py +828 -0
- llama_stack/providers/remote/__init__.py +5 -0
- llama_stack/providers/remote/agents/__init__.py +5 -0
- llama_stack/providers/remote/datasetio/__init__.py +5 -0
- llama_stack/providers/{adapters/memory/chroma → remote/datasetio/huggingface}/__init__.py +7 -4
- llama_stack/providers/remote/datasetio/huggingface/config.py +23 -0
- llama_stack/providers/remote/datasetio/huggingface/huggingface.py +99 -0
- llama_stack/providers/remote/datasetio/nvidia/__init__.py +23 -0
- llama_stack/providers/remote/datasetio/nvidia/config.py +61 -0
- llama_stack/providers/remote/datasetio/nvidia/datasetio.py +116 -0
- llama_stack/providers/remote/eval/__init__.py +5 -0
- llama_stack/providers/remote/eval/nvidia/__init__.py +31 -0
- llama_stack/providers/remote/eval/nvidia/config.py +29 -0
- llama_stack/providers/remote/eval/nvidia/eval.py +162 -0
- llama_stack/providers/remote/files/s3/__init__.py +19 -0
- llama_stack/providers/remote/files/s3/config.py +42 -0
- llama_stack/providers/remote/files/s3/files.py +313 -0
- llama_stack/providers/remote/inference/__init__.py +5 -0
- llama_stack/providers/{adapters/safety/sample → remote/inference/anthropic}/__init__.py +4 -6
- llama_stack/providers/remote/inference/anthropic/anthropic.py +36 -0
- llama_stack/providers/remote/inference/anthropic/config.py +28 -0
- llama_stack/providers/{impls/meta_reference/telemetry → remote/inference/azure}/__init__.py +4 -4
- llama_stack/providers/remote/inference/azure/azure.py +25 -0
- llama_stack/providers/remote/inference/azure/config.py +61 -0
- llama_stack/providers/{adapters → remote}/inference/bedrock/__init__.py +18 -17
- llama_stack/providers/remote/inference/bedrock/bedrock.py +142 -0
- llama_stack/providers/{adapters/inference/sample → remote/inference/bedrock}/config.py +3 -4
- llama_stack/providers/remote/inference/bedrock/models.py +29 -0
- llama_stack/providers/remote/inference/cerebras/__init__.py +19 -0
- llama_stack/providers/remote/inference/cerebras/cerebras.py +28 -0
- llama_stack/providers/remote/inference/cerebras/config.py +30 -0
- llama_stack/providers/{adapters → remote}/inference/databricks/__init__.py +4 -5
- llama_stack/providers/remote/inference/databricks/config.py +37 -0
- llama_stack/providers/remote/inference/databricks/databricks.py +44 -0
- llama_stack/providers/{adapters → remote}/inference/fireworks/__init__.py +8 -4
- llama_stack/providers/remote/inference/fireworks/config.py +27 -0
- llama_stack/providers/remote/inference/fireworks/fireworks.py +27 -0
- llama_stack/providers/{adapters/memory/pgvector → remote/inference/gemini}/__init__.py +4 -4
- llama_stack/providers/remote/inference/gemini/config.py +28 -0
- llama_stack/providers/remote/inference/gemini/gemini.py +82 -0
- llama_stack/providers/remote/inference/groq/__init__.py +15 -0
- llama_stack/providers/remote/inference/groq/config.py +34 -0
- llama_stack/providers/remote/inference/groq/groq.py +18 -0
- llama_stack/providers/remote/inference/llama_openai_compat/__init__.py +15 -0
- llama_stack/providers/remote/inference/llama_openai_compat/config.py +34 -0
- llama_stack/providers/remote/inference/llama_openai_compat/llama.py +46 -0
- llama_stack/providers/remote/inference/nvidia/__init__.py +23 -0
- llama_stack/providers/remote/inference/nvidia/config.py +64 -0
- llama_stack/providers/remote/inference/nvidia/nvidia.py +61 -0
- llama_stack/providers/{adapters/safety/sample/config.py → remote/inference/nvidia/utils.py} +3 -4
- llama_stack/providers/{impls/vllm → remote/inference/ollama}/__init__.py +4 -6
- llama_stack/providers/remote/inference/ollama/config.py +25 -0
- llama_stack/providers/remote/inference/ollama/ollama.py +102 -0
- llama_stack/providers/{adapters/telemetry/opentelemetry → remote/inference/openai}/__init__.py +4 -4
- llama_stack/providers/remote/inference/openai/config.py +39 -0
- llama_stack/providers/remote/inference/openai/openai.py +38 -0
- llama_stack/providers/remote/inference/passthrough/__init__.py +23 -0
- llama_stack/providers/remote/inference/passthrough/config.py +34 -0
- llama_stack/providers/remote/inference/passthrough/passthrough.py +122 -0
- llama_stack/providers/remote/inference/runpod/__init__.py +16 -0
- llama_stack/providers/remote/inference/runpod/config.py +32 -0
- llama_stack/providers/remote/inference/runpod/runpod.py +42 -0
- llama_stack/providers/remote/inference/sambanova/__init__.py +16 -0
- llama_stack/providers/remote/inference/sambanova/config.py +34 -0
- llama_stack/providers/remote/inference/sambanova/sambanova.py +28 -0
- llama_stack/providers/{adapters → remote}/inference/tgi/__init__.py +3 -4
- llama_stack/providers/remote/inference/tgi/config.py +76 -0
- llama_stack/providers/remote/inference/tgi/tgi.py +85 -0
- llama_stack/providers/{adapters → remote}/inference/together/__init__.py +8 -4
- llama_stack/providers/remote/inference/together/config.py +27 -0
- llama_stack/providers/remote/inference/together/together.py +102 -0
- llama_stack/providers/remote/inference/vertexai/__init__.py +15 -0
- llama_stack/providers/remote/inference/vertexai/config.py +48 -0
- llama_stack/providers/remote/inference/vertexai/vertexai.py +54 -0
- llama_stack/providers/remote/inference/vllm/__init__.py +22 -0
- llama_stack/providers/remote/inference/vllm/config.py +59 -0
- llama_stack/providers/remote/inference/vllm/vllm.py +111 -0
- llama_stack/providers/remote/inference/watsonx/__init__.py +15 -0
- llama_stack/providers/remote/inference/watsonx/config.py +45 -0
- llama_stack/providers/remote/inference/watsonx/watsonx.py +336 -0
- llama_stack/providers/remote/post_training/__init__.py +5 -0
- llama_stack/providers/remote/post_training/nvidia/__init__.py +23 -0
- llama_stack/providers/remote/post_training/nvidia/config.py +113 -0
- llama_stack/providers/remote/post_training/nvidia/models.py +27 -0
- llama_stack/providers/remote/post_training/nvidia/post_training.py +430 -0
- llama_stack/providers/remote/post_training/nvidia/utils.py +63 -0
- llama_stack/providers/remote/safety/__init__.py +5 -0
- llama_stack/providers/remote/safety/bedrock/bedrock.py +111 -0
- llama_stack/providers/remote/safety/bedrock/config.py +14 -0
- llama_stack/providers/{adapters/inference/sample → remote/safety/nvidia}/__init__.py +5 -4
- llama_stack/providers/remote/safety/nvidia/config.py +40 -0
- llama_stack/providers/remote/safety/nvidia/nvidia.py +161 -0
- llama_stack/providers/{adapters/agents/sample → remote/safety/sambanova}/__init__.py +5 -4
- llama_stack/providers/remote/safety/sambanova/config.py +37 -0
- llama_stack/providers/remote/safety/sambanova/sambanova.py +98 -0
- llama_stack/providers/remote/tool_runtime/__init__.py +5 -0
- llama_stack/providers/remote/tool_runtime/bing_search/__init__.py +21 -0
- llama_stack/providers/remote/tool_runtime/bing_search/bing_search.py +112 -0
- llama_stack/providers/remote/tool_runtime/bing_search/config.py +22 -0
- llama_stack/providers/remote/tool_runtime/brave_search/__init__.py +20 -0
- llama_stack/providers/remote/tool_runtime/brave_search/brave_search.py +148 -0
- llama_stack/providers/remote/tool_runtime/brave_search/config.py +27 -0
- llama_stack/providers/remote/tool_runtime/model_context_protocol/__init__.py +15 -0
- llama_stack/providers/remote/tool_runtime/model_context_protocol/config.py +20 -0
- llama_stack/providers/remote/tool_runtime/model_context_protocol/model_context_protocol.py +73 -0
- llama_stack/providers/remote/tool_runtime/tavily_search/__init__.py +20 -0
- llama_stack/providers/remote/tool_runtime/tavily_search/config.py +27 -0
- llama_stack/providers/remote/tool_runtime/tavily_search/tavily_search.py +84 -0
- llama_stack/providers/remote/tool_runtime/wolfram_alpha/__init__.py +22 -0
- llama_stack/providers/remote/tool_runtime/wolfram_alpha/config.py +21 -0
- llama_stack/providers/remote/tool_runtime/wolfram_alpha/wolfram_alpha.py +140 -0
- llama_stack/providers/remote/vector_io/__init__.py +5 -0
- llama_stack/providers/remote/vector_io/chroma/__init__.py +17 -0
- llama_stack/providers/remote/vector_io/chroma/chroma.py +215 -0
- llama_stack/providers/remote/vector_io/chroma/config.py +28 -0
- llama_stack/providers/remote/vector_io/milvus/__init__.py +18 -0
- llama_stack/providers/remote/vector_io/milvus/config.py +35 -0
- llama_stack/providers/remote/vector_io/milvus/milvus.py +375 -0
- llama_stack/providers/remote/vector_io/pgvector/__init__.py +17 -0
- llama_stack/providers/remote/vector_io/pgvector/config.py +47 -0
- llama_stack/providers/remote/vector_io/pgvector/pgvector.py +460 -0
- llama_stack/providers/remote/vector_io/qdrant/__init__.py +17 -0
- llama_stack/providers/remote/vector_io/qdrant/config.py +37 -0
- llama_stack/providers/remote/vector_io/qdrant/qdrant.py +265 -0
- llama_stack/providers/remote/vector_io/weaviate/__init__.py +17 -0
- llama_stack/providers/remote/vector_io/weaviate/config.py +32 -0
- llama_stack/providers/remote/vector_io/weaviate/weaviate.py +393 -0
- llama_stack/providers/utils/bedrock/__init__.py +5 -0
- llama_stack/providers/utils/bedrock/client.py +74 -0
- llama_stack/providers/utils/bedrock/config.py +64 -0
- llama_stack/providers/utils/bedrock/refreshable_boto_session.py +112 -0
- llama_stack/providers/utils/common/__init__.py +5 -0
- llama_stack/providers/utils/common/data_schema_validator.py +103 -0
- llama_stack/providers/utils/datasetio/__init__.py +5 -0
- llama_stack/providers/utils/datasetio/url_utils.py +47 -0
- llama_stack/providers/utils/files/__init__.py +5 -0
- llama_stack/providers/utils/files/form_data.py +69 -0
- llama_stack/providers/utils/inference/__init__.py +8 -7
- llama_stack/providers/utils/inference/embedding_mixin.py +101 -0
- llama_stack/providers/utils/inference/inference_store.py +264 -0
- llama_stack/providers/utils/inference/litellm_openai_mixin.py +336 -0
- llama_stack/providers/utils/inference/model_registry.py +173 -23
- llama_stack/providers/utils/inference/openai_compat.py +1261 -49
- llama_stack/providers/utils/inference/openai_mixin.py +506 -0
- llama_stack/providers/utils/inference/prompt_adapter.py +365 -67
- llama_stack/providers/utils/kvstore/api.py +6 -6
- llama_stack/providers/utils/kvstore/config.py +28 -48
- llama_stack/providers/utils/kvstore/kvstore.py +61 -15
- llama_stack/providers/utils/kvstore/mongodb/__init__.py +9 -0
- llama_stack/providers/utils/kvstore/mongodb/mongodb.py +82 -0
- llama_stack/providers/utils/kvstore/postgres/__init__.py +7 -0
- llama_stack/providers/utils/kvstore/postgres/postgres.py +114 -0
- llama_stack/providers/utils/kvstore/redis/redis.py +33 -9
- llama_stack/providers/utils/kvstore/sqlite/config.py +2 -1
- llama_stack/providers/utils/kvstore/sqlite/sqlite.py +123 -22
- llama_stack/providers/utils/memory/file_utils.py +1 -1
- llama_stack/providers/utils/memory/openai_vector_store_mixin.py +1304 -0
- llama_stack/providers/utils/memory/vector_store.py +220 -82
- llama_stack/providers/utils/pagination.py +43 -0
- llama_stack/providers/utils/responses/__init__.py +5 -0
- llama_stack/providers/utils/responses/responses_store.py +292 -0
- llama_stack/providers/utils/scheduler.py +270 -0
- llama_stack/providers/utils/scoring/__init__.py +5 -0
- llama_stack/providers/utils/scoring/aggregation_utils.py +75 -0
- llama_stack/providers/utils/scoring/base_scoring_fn.py +114 -0
- llama_stack/providers/utils/scoring/basic_scoring_utils.py +26 -0
- llama_stack/providers/utils/sqlstore/__init__.py +5 -0
- llama_stack/providers/utils/sqlstore/api.py +128 -0
- llama_stack/providers/utils/sqlstore/authorized_sqlstore.py +319 -0
- llama_stack/providers/utils/sqlstore/sqlalchemy_sqlstore.py +343 -0
- llama_stack/providers/utils/sqlstore/sqlstore.py +70 -0
- llama_stack/providers/utils/telemetry/trace_protocol.py +142 -0
- llama_stack/providers/utils/telemetry/tracing.py +192 -53
- llama_stack/providers/utils/tools/__init__.py +5 -0
- llama_stack/providers/utils/tools/mcp.py +148 -0
- llama_stack/providers/utils/tools/ttl_dict.py +70 -0
- llama_stack/providers/utils/vector_io/__init__.py +5 -0
- llama_stack/providers/utils/vector_io/vector_utils.py +156 -0
- llama_stack/schema_utils.py +118 -0
- llama_stack/strong_typing/__init__.py +19 -0
- llama_stack/strong_typing/auxiliary.py +228 -0
- llama_stack/strong_typing/classdef.py +440 -0
- llama_stack/strong_typing/core.py +46 -0
- llama_stack/strong_typing/deserializer.py +877 -0
- llama_stack/strong_typing/docstring.py +409 -0
- llama_stack/strong_typing/exception.py +23 -0
- llama_stack/strong_typing/inspection.py +1085 -0
- llama_stack/strong_typing/mapping.py +40 -0
- llama_stack/strong_typing/name.py +182 -0
- llama_stack/strong_typing/py.typed +0 -0
- llama_stack/strong_typing/schema.py +792 -0
- llama_stack/strong_typing/serialization.py +97 -0
- llama_stack/strong_typing/serializer.py +500 -0
- llama_stack/strong_typing/slots.py +27 -0
- llama_stack/strong_typing/topological.py +89 -0
- llama_stack/testing/__init__.py +5 -0
- llama_stack/testing/api_recorder.py +956 -0
- llama_stack/ui/node_modules/flatted/python/flatted.py +149 -0
- llama_stack-0.3.4.dist-info/METADATA +261 -0
- llama_stack-0.3.4.dist-info/RECORD +625 -0
- {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info}/WHEEL +1 -1
- llama_stack/apis/agents/client.py +0 -292
- llama_stack/apis/agents/event_logger.py +0 -184
- llama_stack/apis/batch_inference/batch_inference.py +0 -72
- llama_stack/apis/common/deployment_types.py +0 -31
- llama_stack/apis/dataset/dataset.py +0 -63
- llama_stack/apis/evals/evals.py +0 -122
- llama_stack/apis/inference/client.py +0 -197
- llama_stack/apis/inspect/client.py +0 -82
- llama_stack/apis/memory/client.py +0 -155
- llama_stack/apis/memory/memory.py +0 -65
- llama_stack/apis/memory_banks/__init__.py +0 -7
- llama_stack/apis/memory_banks/client.py +0 -101
- llama_stack/apis/memory_banks/memory_banks.py +0 -78
- llama_stack/apis/models/client.py +0 -83
- llama_stack/apis/reward_scoring/__init__.py +0 -7
- llama_stack/apis/reward_scoring/reward_scoring.py +0 -55
- llama_stack/apis/safety/client.py +0 -105
- llama_stack/apis/shields/client.py +0 -79
- llama_stack/cli/download.py +0 -340
- llama_stack/cli/model/describe.py +0 -82
- llama_stack/cli/model/download.py +0 -24
- llama_stack/cli/model/list.py +0 -62
- llama_stack/cli/model/model.py +0 -34
- llama_stack/cli/model/prompt_format.py +0 -112
- llama_stack/cli/model/safety_models.py +0 -52
- llama_stack/cli/stack/build.py +0 -299
- llama_stack/cli/stack/configure.py +0 -178
- llama_stack/distribution/build.py +0 -123
- llama_stack/distribution/build_conda_env.sh +0 -136
- llama_stack/distribution/build_container.sh +0 -142
- llama_stack/distribution/common.sh +0 -40
- llama_stack/distribution/configure_container.sh +0 -47
- llama_stack/distribution/datatypes.py +0 -139
- llama_stack/distribution/distribution.py +0 -58
- llama_stack/distribution/inspect.py +0 -67
- llama_stack/distribution/request_headers.py +0 -57
- llama_stack/distribution/resolver.py +0 -323
- llama_stack/distribution/routers/__init__.py +0 -48
- llama_stack/distribution/routers/routers.py +0 -158
- llama_stack/distribution/routers/routing_tables.py +0 -173
- llama_stack/distribution/server/endpoints.py +0 -48
- llama_stack/distribution/server/server.py +0 -343
- llama_stack/distribution/start_conda_env.sh +0 -42
- llama_stack/distribution/start_container.sh +0 -64
- llama_stack/distribution/templates/local-bedrock-conda-example-build.yaml +0 -10
- llama_stack/distribution/templates/local-build.yaml +0 -10
- llama_stack/distribution/templates/local-databricks-build.yaml +0 -10
- llama_stack/distribution/templates/local-fireworks-build.yaml +0 -10
- llama_stack/distribution/templates/local-hf-endpoint-build.yaml +0 -10
- llama_stack/distribution/templates/local-hf-serverless-build.yaml +0 -10
- llama_stack/distribution/templates/local-ollama-build.yaml +0 -10
- llama_stack/distribution/templates/local-tgi-build.yaml +0 -10
- llama_stack/distribution/templates/local-together-build.yaml +0 -10
- llama_stack/distribution/templates/local-vllm-build.yaml +0 -10
- llama_stack/distribution/utils/exec.py +0 -105
- llama_stack/providers/adapters/agents/sample/sample.py +0 -18
- llama_stack/providers/adapters/inference/bedrock/bedrock.py +0 -451
- llama_stack/providers/adapters/inference/bedrock/config.py +0 -55
- llama_stack/providers/adapters/inference/databricks/config.py +0 -21
- llama_stack/providers/adapters/inference/databricks/databricks.py +0 -125
- llama_stack/providers/adapters/inference/fireworks/config.py +0 -20
- llama_stack/providers/adapters/inference/fireworks/fireworks.py +0 -130
- llama_stack/providers/adapters/inference/ollama/__init__.py +0 -19
- llama_stack/providers/adapters/inference/ollama/ollama.py +0 -175
- llama_stack/providers/adapters/inference/sample/sample.py +0 -23
- llama_stack/providers/adapters/inference/tgi/config.py +0 -43
- llama_stack/providers/adapters/inference/tgi/tgi.py +0 -200
- llama_stack/providers/adapters/inference/together/config.py +0 -22
- llama_stack/providers/adapters/inference/together/together.py +0 -143
- llama_stack/providers/adapters/memory/chroma/chroma.py +0 -157
- llama_stack/providers/adapters/memory/pgvector/config.py +0 -17
- llama_stack/providers/adapters/memory/pgvector/pgvector.py +0 -211
- llama_stack/providers/adapters/memory/sample/sample.py +0 -23
- llama_stack/providers/adapters/memory/weaviate/__init__.py +0 -15
- llama_stack/providers/adapters/memory/weaviate/weaviate.py +0 -190
- llama_stack/providers/adapters/safety/bedrock/bedrock.py +0 -113
- llama_stack/providers/adapters/safety/bedrock/config.py +0 -16
- llama_stack/providers/adapters/safety/sample/sample.py +0 -23
- llama_stack/providers/adapters/safety/together/__init__.py +0 -18
- llama_stack/providers/adapters/safety/together/config.py +0 -26
- llama_stack/providers/adapters/safety/together/together.py +0 -101
- llama_stack/providers/adapters/telemetry/opentelemetry/config.py +0 -12
- llama_stack/providers/adapters/telemetry/opentelemetry/opentelemetry.py +0 -201
- llama_stack/providers/adapters/telemetry/sample/__init__.py +0 -17
- llama_stack/providers/adapters/telemetry/sample/config.py +0 -12
- llama_stack/providers/adapters/telemetry/sample/sample.py +0 -18
- llama_stack/providers/impls/meta_reference/agents/agent_instance.py +0 -844
- llama_stack/providers/impls/meta_reference/agents/agents.py +0 -161
- llama_stack/providers/impls/meta_reference/agents/persistence.py +0 -84
- llama_stack/providers/impls/meta_reference/agents/rag/context_retriever.py +0 -74
- llama_stack/providers/impls/meta_reference/agents/safety.py +0 -57
- llama_stack/providers/impls/meta_reference/agents/tests/code_execution.py +0 -93
- llama_stack/providers/impls/meta_reference/agents/tests/test_chat_agent.py +0 -305
- llama_stack/providers/impls/meta_reference/agents/tools/base.py +0 -20
- llama_stack/providers/impls/meta_reference/agents/tools/builtin.py +0 -375
- llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/code_env_prefix.py +0 -133
- llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/code_execution.py +0 -256
- llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/matplotlib_custom_backend.py +0 -87
- llama_stack/providers/impls/meta_reference/agents/tools/ipython_tool/utils.py +0 -21
- llama_stack/providers/impls/meta_reference/agents/tools/safety.py +0 -43
- llama_stack/providers/impls/meta_reference/codeshield/code_scanner.py +0 -58
- llama_stack/providers/impls/meta_reference/inference/config.py +0 -45
- llama_stack/providers/impls/meta_reference/inference/generation.py +0 -376
- llama_stack/providers/impls/meta_reference/inference/inference.py +0 -280
- llama_stack/providers/impls/meta_reference/inference/model_parallel.py +0 -99
- llama_stack/providers/impls/meta_reference/inference/quantization/fp8_impls.py +0 -184
- llama_stack/providers/impls/meta_reference/inference/quantization/fp8_txest_disabled.py +0 -76
- llama_stack/providers/impls/meta_reference/inference/quantization/loader.py +0 -97
- llama_stack/providers/impls/meta_reference/inference/quantization/scripts/quantize_checkpoint.py +0 -161
- llama_stack/providers/impls/meta_reference/memory/__init__.py +0 -19
- llama_stack/providers/impls/meta_reference/memory/faiss.py +0 -113
- llama_stack/providers/impls/meta_reference/safety/__init__.py +0 -17
- llama_stack/providers/impls/meta_reference/safety/base.py +0 -57
- llama_stack/providers/impls/meta_reference/safety/config.py +0 -48
- llama_stack/providers/impls/meta_reference/safety/llama_guard.py +0 -268
- llama_stack/providers/impls/meta_reference/safety/prompt_guard.py +0 -145
- llama_stack/providers/impls/meta_reference/safety/safety.py +0 -112
- llama_stack/providers/impls/meta_reference/telemetry/console.py +0 -89
- llama_stack/providers/impls/vllm/config.py +0 -35
- llama_stack/providers/impls/vllm/vllm.py +0 -241
- llama_stack/providers/registry/memory.py +0 -78
- llama_stack/providers/registry/telemetry.py +0 -44
- llama_stack/providers/tests/agents/test_agents.py +0 -210
- llama_stack/providers/tests/inference/test_inference.py +0 -257
- llama_stack/providers/tests/inference/test_prompt_adapter.py +0 -126
- llama_stack/providers/tests/memory/test_memory.py +0 -136
- llama_stack/providers/tests/resolver.py +0 -100
- llama_stack/providers/tests/safety/test_safety.py +0 -77
- llama_stack-0.0.42.dist-info/METADATA +0 -137
- llama_stack-0.0.42.dist-info/RECORD +0 -256
- /llama_stack/{distribution → core}/__init__.py +0 -0
- /llama_stack/{distribution/server → core/access_control}/__init__.py +0 -0
- /llama_stack/{distribution/utils → core/conversations}/__init__.py +0 -0
- /llama_stack/{providers/adapters → core/prompts}/__init__.py +0 -0
- /llama_stack/{providers/adapters/agents → core/routing_tables}/__init__.py +0 -0
- /llama_stack/{providers/adapters/inference → core/server}/__init__.py +0 -0
- /llama_stack/{providers/adapters/memory → core/storage}/__init__.py +0 -0
- /llama_stack/{providers/adapters/safety → core/ui}/__init__.py +0 -0
- /llama_stack/{providers/adapters/telemetry → core/ui/modules}/__init__.py +0 -0
- /llama_stack/{providers/impls → core/ui/page}/__init__.py +0 -0
- /llama_stack/{providers/impls/meta_reference → core/ui/page/distribution}/__init__.py +0 -0
- /llama_stack/{providers/impls/meta_reference/agents/rag → core/ui/page/evaluations}/__init__.py +0 -0
- /llama_stack/{providers/impls/meta_reference/agents/tests → core/ui/page/playground}/__init__.py +0 -0
- /llama_stack/{providers/impls/meta_reference/agents/tools → core/utils}/__init__.py +0 -0
- /llama_stack/{distribution → core}/utils/dynamic.py +0 -0
- /llama_stack/{distribution → core}/utils/serialize.py +0 -0
- /llama_stack/{providers/impls/meta_reference/agents/tools/ipython_tool → distributions}/__init__.py +0 -0
- /llama_stack/{providers/impls/meta_reference/inference/quantization → models}/__init__.py +0 -0
- /llama_stack/{providers/impls/meta_reference/inference/quantization/scripts → models/llama}/__init__.py +0 -0
- /llama_stack/{providers/tests → models/llama/llama3}/__init__.py +0 -0
- /llama_stack/{providers/tests/agents → models/llama/llama3/quantization}/__init__.py +0 -0
- /llama_stack/{providers/tests/inference → models/llama/llama3_2}/__init__.py +0 -0
- /llama_stack/{providers/tests/memory → models/llama/llama3_3}/__init__.py +0 -0
- /llama_stack/{providers/tests/safety → models/llama/llama4}/__init__.py +0 -0
- /llama_stack/{scripts → models/llama/llama4/prompt_templates}/__init__.py +0 -0
- /llama_stack/providers/{adapters → remote}/safety/bedrock/__init__.py +0 -0
- {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info}/entry_points.txt +0 -0
- {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info/licenses}/LICENSE +0 -0
- {llama_stack-0.0.42.dist-info → llama_stack-0.3.4.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from llama_stack.apis.scoring import ScoringFnParams, ScoringResultRow
|
|
10
|
+
from llama_stack.apis.scoring_functions import ScoringFn
|
|
11
|
+
from llama_stack.providers.utils.scoring.aggregation_utils import aggregate_metrics
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BaseScoringFn(ABC):
|
|
15
|
+
"""
|
|
16
|
+
Base interface class for Scoring Functions.
|
|
17
|
+
Each scoring function needs to implement the following methods:
|
|
18
|
+
- score_row(self, row)
|
|
19
|
+
- aggregate(self, scoring_fn_results)
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, *args, **kwargs) -> None:
|
|
23
|
+
super().__init__(*args, **kwargs)
|
|
24
|
+
|
|
25
|
+
def __str__(self) -> str:
|
|
26
|
+
return self.__class__.__name__
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
async def score_row(
|
|
30
|
+
self,
|
|
31
|
+
input_row: dict[str, Any],
|
|
32
|
+
scoring_fn_identifier: str | None = None,
|
|
33
|
+
scoring_params: ScoringFnParams | None = None,
|
|
34
|
+
) -> ScoringResultRow:
|
|
35
|
+
raise NotImplementedError()
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
async def aggregate(
|
|
39
|
+
self,
|
|
40
|
+
scoring_results: list[ScoringResultRow],
|
|
41
|
+
scoring_fn_identifier: str | None = None,
|
|
42
|
+
scoring_params: ScoringFnParams | None = None,
|
|
43
|
+
) -> dict[str, Any]:
|
|
44
|
+
raise NotImplementedError()
|
|
45
|
+
|
|
46
|
+
@abstractmethod
|
|
47
|
+
async def score(
|
|
48
|
+
self,
|
|
49
|
+
input_rows: list[dict[str, Any]],
|
|
50
|
+
scoring_fn_identifier: str | None = None,
|
|
51
|
+
scoring_params: ScoringFnParams | None = None,
|
|
52
|
+
) -> list[ScoringResultRow]:
|
|
53
|
+
raise NotImplementedError()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class RegisteredBaseScoringFn(BaseScoringFn):
|
|
57
|
+
"""
|
|
58
|
+
Interface for native scoring functions that are registered in LlamaStack.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(self, *args, **kwargs) -> None:
|
|
62
|
+
super().__init__(*args, **kwargs)
|
|
63
|
+
self.supported_fn_defs_registry = {}
|
|
64
|
+
|
|
65
|
+
def __str__(self) -> str:
|
|
66
|
+
return self.__class__.__name__
|
|
67
|
+
|
|
68
|
+
def get_supported_scoring_fn_defs(self) -> list[ScoringFn]:
|
|
69
|
+
return list(self.supported_fn_defs_registry.values())
|
|
70
|
+
|
|
71
|
+
def register_scoring_fn_def(self, scoring_fn: ScoringFn) -> None:
|
|
72
|
+
if scoring_fn.identifier in self.supported_fn_defs_registry:
|
|
73
|
+
raise ValueError(f"Scoring function def with identifier {scoring_fn.identifier} already exists.")
|
|
74
|
+
self.supported_fn_defs_registry[scoring_fn.identifier] = scoring_fn
|
|
75
|
+
|
|
76
|
+
def unregister_scoring_fn_def(self, scoring_fn_id: str) -> None:
|
|
77
|
+
if scoring_fn_id not in self.supported_fn_defs_registry:
|
|
78
|
+
raise ValueError(f"Scoring function def with identifier {scoring_fn_id} does not exist.")
|
|
79
|
+
del self.supported_fn_defs_registry[scoring_fn_id]
|
|
80
|
+
|
|
81
|
+
@abstractmethod
|
|
82
|
+
async def score_row(
|
|
83
|
+
self,
|
|
84
|
+
input_row: dict[str, Any],
|
|
85
|
+
scoring_fn_identifier: str | None = None,
|
|
86
|
+
scoring_params: ScoringFnParams | None = None,
|
|
87
|
+
) -> ScoringResultRow:
|
|
88
|
+
raise NotImplementedError()
|
|
89
|
+
|
|
90
|
+
async def aggregate(
|
|
91
|
+
self,
|
|
92
|
+
scoring_results: list[ScoringResultRow],
|
|
93
|
+
scoring_fn_identifier: str | None = None,
|
|
94
|
+
scoring_params: ScoringFnParams | None = None,
|
|
95
|
+
) -> dict[str, Any]:
|
|
96
|
+
params = self.supported_fn_defs_registry[scoring_fn_identifier].params
|
|
97
|
+
if scoring_params is not None:
|
|
98
|
+
if params is None:
|
|
99
|
+
params = scoring_params
|
|
100
|
+
else:
|
|
101
|
+
params.aggregation_functions = scoring_params.aggregation_functions
|
|
102
|
+
|
|
103
|
+
aggregation_functions = []
|
|
104
|
+
if params and hasattr(params, "aggregation_functions") and params.aggregation_functions:
|
|
105
|
+
aggregation_functions.extend(params.aggregation_functions)
|
|
106
|
+
return aggregate_metrics(scoring_results, aggregation_functions)
|
|
107
|
+
|
|
108
|
+
async def score(
|
|
109
|
+
self,
|
|
110
|
+
input_rows: list[dict[str, Any]],
|
|
111
|
+
scoring_fn_identifier: str | None = None,
|
|
112
|
+
scoring_params: ScoringFnParams | None = None,
|
|
113
|
+
) -> list[ScoringResultRow]:
|
|
114
|
+
return [await self.score_row(input_row, scoring_fn_identifier, scoring_params) for input_row in input_rows]
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
import contextlib
|
|
7
|
+
import signal
|
|
8
|
+
from collections.abc import Iterator
|
|
9
|
+
from types import FrameType
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TimeoutError(Exception):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@contextlib.contextmanager
|
|
17
|
+
def time_limit(seconds: float) -> Iterator[None]:
|
|
18
|
+
def signal_handler(signum: int, frame: FrameType | None) -> None:
|
|
19
|
+
raise TimeoutError("Timed out!")
|
|
20
|
+
|
|
21
|
+
signal.setitimer(signal.ITIMER_REAL, seconds)
|
|
22
|
+
signal.signal(signal.SIGALRM, signal_handler)
|
|
23
|
+
try:
|
|
24
|
+
yield
|
|
25
|
+
finally:
|
|
26
|
+
signal.setitimer(signal.ITIMER_REAL, 0)
|
|
@@ -0,0 +1,128 @@
|
|
|
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
|
+
from collections.abc import Mapping, Sequence
|
|
8
|
+
from enum import Enum
|
|
9
|
+
from typing import Any, Literal, Protocol
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel
|
|
12
|
+
|
|
13
|
+
from llama_stack.apis.common.responses import PaginatedResponse
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ColumnType(Enum):
|
|
17
|
+
INTEGER = "INTEGER"
|
|
18
|
+
STRING = "STRING"
|
|
19
|
+
TEXT = "TEXT"
|
|
20
|
+
FLOAT = "FLOAT"
|
|
21
|
+
BOOLEAN = "BOOLEAN"
|
|
22
|
+
JSON = "JSON"
|
|
23
|
+
DATETIME = "DATETIME"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ColumnDefinition(BaseModel):
|
|
27
|
+
type: ColumnType
|
|
28
|
+
primary_key: bool = False
|
|
29
|
+
nullable: bool = True
|
|
30
|
+
default: Any = None
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SqlStore(Protocol):
|
|
34
|
+
"""
|
|
35
|
+
A protocol for a SQL store.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
async def create_table(self, table: str, schema: Mapping[str, ColumnType | ColumnDefinition]) -> None:
|
|
39
|
+
"""
|
|
40
|
+
Create a table.
|
|
41
|
+
"""
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
async def insert(self, table: str, data: Mapping[str, Any] | Sequence[Mapping[str, Any]]) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Insert a row or batch of rows into a table.
|
|
47
|
+
"""
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
async def fetch_all(
|
|
51
|
+
self,
|
|
52
|
+
table: str,
|
|
53
|
+
where: Mapping[str, Any] | None = None,
|
|
54
|
+
where_sql: str | None = None,
|
|
55
|
+
limit: int | None = None,
|
|
56
|
+
order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None,
|
|
57
|
+
cursor: tuple[str, str] | None = None,
|
|
58
|
+
) -> PaginatedResponse:
|
|
59
|
+
"""
|
|
60
|
+
Fetch all rows from a table with optional cursor-based pagination.
|
|
61
|
+
|
|
62
|
+
:param table: The table name
|
|
63
|
+
:param where: Simple key-value WHERE conditions
|
|
64
|
+
:param where_sql: Raw SQL WHERE clause for complex queries
|
|
65
|
+
:param limit: Maximum number of records to return
|
|
66
|
+
:param order_by: List of (column, order) tuples for sorting
|
|
67
|
+
:param cursor: Tuple of (key_column, cursor_id) for pagination (None for first page)
|
|
68
|
+
Requires order_by with exactly one column when used
|
|
69
|
+
:return: PaginatedResult with data and has_more flag
|
|
70
|
+
|
|
71
|
+
Note: Cursor pagination only supports single-column ordering for simplicity.
|
|
72
|
+
Multi-column ordering is allowed without cursor but will raise an error with cursor.
|
|
73
|
+
"""
|
|
74
|
+
pass
|
|
75
|
+
|
|
76
|
+
async def fetch_one(
|
|
77
|
+
self,
|
|
78
|
+
table: str,
|
|
79
|
+
where: Mapping[str, Any] | None = None,
|
|
80
|
+
where_sql: str | None = None,
|
|
81
|
+
order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None,
|
|
82
|
+
) -> dict[str, Any] | None:
|
|
83
|
+
"""
|
|
84
|
+
Fetch one row from a table.
|
|
85
|
+
"""
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
async def update(
|
|
89
|
+
self,
|
|
90
|
+
table: str,
|
|
91
|
+
data: Mapping[str, Any],
|
|
92
|
+
where: Mapping[str, Any],
|
|
93
|
+
) -> None:
|
|
94
|
+
"""
|
|
95
|
+
Update a row in a table.
|
|
96
|
+
"""
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
async def delete(
|
|
100
|
+
self,
|
|
101
|
+
table: str,
|
|
102
|
+
where: Mapping[str, Any],
|
|
103
|
+
) -> None:
|
|
104
|
+
"""
|
|
105
|
+
Delete a row from a table.
|
|
106
|
+
"""
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
async def add_column_if_not_exists(
|
|
110
|
+
self,
|
|
111
|
+
table: str,
|
|
112
|
+
column_name: str,
|
|
113
|
+
column_type: ColumnType,
|
|
114
|
+
nullable: bool = True,
|
|
115
|
+
) -> None:
|
|
116
|
+
"""
|
|
117
|
+
Add a column to an existing table if the column doesn't already exist.
|
|
118
|
+
|
|
119
|
+
This is useful for table migrations when adding new functionality.
|
|
120
|
+
If the table doesn't exist, this method should do nothing.
|
|
121
|
+
If the column already exists, this method should do nothing.
|
|
122
|
+
|
|
123
|
+
:param table: Table name
|
|
124
|
+
:param column_name: Name of the column to add
|
|
125
|
+
:param column_type: Type of the column to add
|
|
126
|
+
:param nullable: Whether the column should be nullable (default: True)
|
|
127
|
+
"""
|
|
128
|
+
pass
|
|
@@ -0,0 +1,319 @@
|
|
|
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
|
+
from collections.abc import Mapping, Sequence
|
|
8
|
+
from typing import Any, Literal
|
|
9
|
+
|
|
10
|
+
from llama_stack.core.access_control.access_control import default_policy, is_action_allowed
|
|
11
|
+
from llama_stack.core.access_control.conditions import ProtectedResource
|
|
12
|
+
from llama_stack.core.access_control.datatypes import AccessRule, Action, Scope
|
|
13
|
+
from llama_stack.core.datatypes import User
|
|
14
|
+
from llama_stack.core.request_headers import get_authenticated_user
|
|
15
|
+
from llama_stack.core.storage.datatypes import StorageBackendType
|
|
16
|
+
from llama_stack.log import get_logger
|
|
17
|
+
|
|
18
|
+
from .api import ColumnDefinition, ColumnType, PaginatedResponse, SqlStore
|
|
19
|
+
|
|
20
|
+
logger = get_logger(name=__name__, category="providers::utils")
|
|
21
|
+
|
|
22
|
+
# Hardcoded copy of the default policy that our SQL filtering implements
|
|
23
|
+
# WARNING: If default_policy() changes, this constant must be updated accordingly
|
|
24
|
+
# or SQL filtering will fall back to conservative mode (safe but less performant)
|
|
25
|
+
#
|
|
26
|
+
# This policy represents: "Permit all actions when user is in owners list for ALL attribute categories"
|
|
27
|
+
# The corresponding SQL logic is implemented in _build_default_policy_where_clause():
|
|
28
|
+
# - Public records (no access_attributes) are always accessible
|
|
29
|
+
# - Records with access_attributes require user to match ALL categories that exist in the resource
|
|
30
|
+
# - Missing categories in the resource are treated as "no restriction" (allow)
|
|
31
|
+
# - Within each category, user needs ANY matching value (OR logic)
|
|
32
|
+
# - Between categories, user needs ALL categories to match (AND logic)
|
|
33
|
+
SQL_OPTIMIZED_POLICY = [
|
|
34
|
+
AccessRule(
|
|
35
|
+
permit=Scope(actions=list(Action)),
|
|
36
|
+
when=["user in owners roles", "user in owners teams", "user in owners projects", "user in owners namespaces"],
|
|
37
|
+
),
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _enhance_item_with_access_control(item: Mapping[str, Any], current_user: User | None) -> Mapping[str, Any]:
|
|
42
|
+
"""Add access control attributes to a data item."""
|
|
43
|
+
enhanced = dict(item)
|
|
44
|
+
if current_user:
|
|
45
|
+
enhanced["owner_principal"] = current_user.principal
|
|
46
|
+
enhanced["access_attributes"] = current_user.attributes
|
|
47
|
+
else:
|
|
48
|
+
# IMPORTANT: Use empty string and null value (not None) to match public access filter
|
|
49
|
+
# The public access filter in _get_public_access_conditions() expects:
|
|
50
|
+
# - owner_principal = '' (empty string)
|
|
51
|
+
# - access_attributes = null (JSON null, which serializes to the string 'null')
|
|
52
|
+
# Setting them to None (SQL NULL) will cause rows to be filtered out on read.
|
|
53
|
+
enhanced["owner_principal"] = ""
|
|
54
|
+
enhanced["access_attributes"] = None # Pydantic/JSON will serialize this as JSON null
|
|
55
|
+
return enhanced
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class SqlRecord(ProtectedResource):
|
|
59
|
+
def __init__(self, record_id: str, table_name: str, owner: User):
|
|
60
|
+
self.type = f"sql_record::{table_name}"
|
|
61
|
+
self.identifier = record_id
|
|
62
|
+
self.owner = owner
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class AuthorizedSqlStore:
|
|
66
|
+
"""
|
|
67
|
+
Authorization layer for SqlStore that provides access control functionality.
|
|
68
|
+
|
|
69
|
+
This class composes a base SqlStore and adds authorization methods that handle
|
|
70
|
+
access control policies, user attribute capture, and SQL filtering optimization.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
def __init__(self, sql_store: SqlStore, policy: list[AccessRule]):
|
|
74
|
+
"""
|
|
75
|
+
Initialize the authorization layer.
|
|
76
|
+
|
|
77
|
+
:param sql_store: Base SqlStore implementation to wrap
|
|
78
|
+
:param policy: Access control policy to use for authorization
|
|
79
|
+
"""
|
|
80
|
+
self.sql_store = sql_store
|
|
81
|
+
self.policy = policy
|
|
82
|
+
self._detect_database_type()
|
|
83
|
+
self._validate_sql_optimized_policy()
|
|
84
|
+
|
|
85
|
+
def _detect_database_type(self) -> None:
|
|
86
|
+
"""Detect the database type from the underlying SQL store."""
|
|
87
|
+
if not hasattr(self.sql_store, "config"):
|
|
88
|
+
raise ValueError("SqlStore must have a config attribute to be used with AuthorizedSqlStore")
|
|
89
|
+
|
|
90
|
+
self.database_type = self.sql_store.config.type.value
|
|
91
|
+
if self.database_type not in [StorageBackendType.SQL_POSTGRES.value, StorageBackendType.SQL_SQLITE.value]:
|
|
92
|
+
raise ValueError(f"Unsupported database type: {self.database_type}")
|
|
93
|
+
|
|
94
|
+
def _validate_sql_optimized_policy(self) -> None:
|
|
95
|
+
"""Validate that SQL_OPTIMIZED_POLICY matches the actual default_policy().
|
|
96
|
+
|
|
97
|
+
This ensures that if default_policy() changes, we detect the mismatch and
|
|
98
|
+
can update our SQL filtering logic accordingly.
|
|
99
|
+
"""
|
|
100
|
+
actual_default = default_policy()
|
|
101
|
+
|
|
102
|
+
if SQL_OPTIMIZED_POLICY != actual_default:
|
|
103
|
+
logger.warning(
|
|
104
|
+
f"SQL_OPTIMIZED_POLICY does not match default_policy(). "
|
|
105
|
+
f"SQL filtering will use conservative mode. "
|
|
106
|
+
f"Expected: {SQL_OPTIMIZED_POLICY}, Got: {actual_default}",
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
async def create_table(self, table: str, schema: Mapping[str, ColumnType | ColumnDefinition]) -> None:
|
|
110
|
+
"""Create a table with built-in access control support."""
|
|
111
|
+
|
|
112
|
+
enhanced_schema = dict(schema)
|
|
113
|
+
if "access_attributes" not in enhanced_schema:
|
|
114
|
+
enhanced_schema["access_attributes"] = ColumnType.JSON
|
|
115
|
+
if "owner_principal" not in enhanced_schema:
|
|
116
|
+
enhanced_schema["owner_principal"] = ColumnType.STRING
|
|
117
|
+
|
|
118
|
+
await self.sql_store.create_table(table, enhanced_schema)
|
|
119
|
+
await self.sql_store.add_column_if_not_exists(table, "access_attributes", ColumnType.JSON)
|
|
120
|
+
await self.sql_store.add_column_if_not_exists(table, "owner_principal", ColumnType.STRING)
|
|
121
|
+
|
|
122
|
+
async def insert(self, table: str, data: Mapping[str, Any] | Sequence[Mapping[str, Any]]) -> None:
|
|
123
|
+
"""Insert a row or batch of rows with automatic access control attribute capture."""
|
|
124
|
+
current_user = get_authenticated_user()
|
|
125
|
+
enhanced_data: Mapping[str, Any] | Sequence[Mapping[str, Any]]
|
|
126
|
+
if isinstance(data, Mapping):
|
|
127
|
+
enhanced_data = _enhance_item_with_access_control(data, current_user)
|
|
128
|
+
else:
|
|
129
|
+
enhanced_data = [_enhance_item_with_access_control(item, current_user) for item in data]
|
|
130
|
+
await self.sql_store.insert(table, enhanced_data)
|
|
131
|
+
|
|
132
|
+
async def fetch_all(
|
|
133
|
+
self,
|
|
134
|
+
table: str,
|
|
135
|
+
where: Mapping[str, Any] | None = None,
|
|
136
|
+
limit: int | None = None,
|
|
137
|
+
order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None,
|
|
138
|
+
cursor: tuple[str, str] | None = None,
|
|
139
|
+
) -> PaginatedResponse:
|
|
140
|
+
"""Fetch all rows with automatic access control filtering."""
|
|
141
|
+
access_where = self._build_access_control_where_clause(self.policy)
|
|
142
|
+
rows = await self.sql_store.fetch_all(
|
|
143
|
+
table=table,
|
|
144
|
+
where=where,
|
|
145
|
+
where_sql=access_where,
|
|
146
|
+
limit=limit,
|
|
147
|
+
order_by=order_by,
|
|
148
|
+
cursor=cursor,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
current_user = get_authenticated_user()
|
|
152
|
+
filtered_rows = []
|
|
153
|
+
|
|
154
|
+
for row in rows.data:
|
|
155
|
+
stored_access_attrs = row.get("access_attributes")
|
|
156
|
+
stored_owner_principal = row.get("owner_principal") or ""
|
|
157
|
+
|
|
158
|
+
record_id = row.get("id", "unknown")
|
|
159
|
+
sql_record = SqlRecord(
|
|
160
|
+
str(record_id), table, User(principal=stored_owner_principal, attributes=stored_access_attrs)
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
if is_action_allowed(self.policy, Action.READ, sql_record, current_user):
|
|
164
|
+
filtered_rows.append(row)
|
|
165
|
+
|
|
166
|
+
return PaginatedResponse(
|
|
167
|
+
data=filtered_rows,
|
|
168
|
+
has_more=rows.has_more,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
async def fetch_one(
|
|
172
|
+
self,
|
|
173
|
+
table: str,
|
|
174
|
+
where: Mapping[str, Any] | None = None,
|
|
175
|
+
order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None,
|
|
176
|
+
) -> dict[str, Any] | None:
|
|
177
|
+
"""Fetch one row with automatic access control checking."""
|
|
178
|
+
results = await self.fetch_all(
|
|
179
|
+
table=table,
|
|
180
|
+
where=where,
|
|
181
|
+
limit=1,
|
|
182
|
+
order_by=order_by,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
return results.data[0] if results.data else None
|
|
186
|
+
|
|
187
|
+
async def update(self, table: str, data: Mapping[str, Any], where: Mapping[str, Any]) -> None:
|
|
188
|
+
"""Update rows with automatic access control attribute capture."""
|
|
189
|
+
enhanced_data = dict(data)
|
|
190
|
+
|
|
191
|
+
current_user = get_authenticated_user()
|
|
192
|
+
if current_user:
|
|
193
|
+
enhanced_data["owner_principal"] = current_user.principal
|
|
194
|
+
enhanced_data["access_attributes"] = current_user.attributes
|
|
195
|
+
else:
|
|
196
|
+
# IMPORTANT: Use empty string for owner_principal to match public access filter
|
|
197
|
+
enhanced_data["owner_principal"] = ""
|
|
198
|
+
enhanced_data["access_attributes"] = None # Will serialize as JSON null
|
|
199
|
+
|
|
200
|
+
await self.sql_store.update(table, enhanced_data, where)
|
|
201
|
+
|
|
202
|
+
async def delete(self, table: str, where: Mapping[str, Any]) -> None:
|
|
203
|
+
"""Delete rows with automatic access control filtering."""
|
|
204
|
+
await self.sql_store.delete(table, where)
|
|
205
|
+
|
|
206
|
+
def _build_access_control_where_clause(self, policy: list[AccessRule]) -> str:
|
|
207
|
+
"""Build SQL WHERE clause for access control filtering.
|
|
208
|
+
|
|
209
|
+
Only applies SQL filtering for the default policy to ensure correctness.
|
|
210
|
+
For custom policies, uses conservative filtering to avoid blocking legitimate access.
|
|
211
|
+
"""
|
|
212
|
+
current_user = get_authenticated_user()
|
|
213
|
+
|
|
214
|
+
if not policy or policy == SQL_OPTIMIZED_POLICY:
|
|
215
|
+
return self._build_default_policy_where_clause(current_user)
|
|
216
|
+
else:
|
|
217
|
+
return self._build_conservative_where_clause()
|
|
218
|
+
|
|
219
|
+
def _json_extract(self, column: str, path: str) -> str:
|
|
220
|
+
"""Extract JSON value (keeping JSON type).
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
column: The JSON column name
|
|
224
|
+
path: The JSON path (e.g., 'roles', 'teams')
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
SQL expression to extract JSON value
|
|
228
|
+
"""
|
|
229
|
+
if self.database_type == StorageBackendType.SQL_POSTGRES.value:
|
|
230
|
+
return f"{column}->'{path}'"
|
|
231
|
+
elif self.database_type == StorageBackendType.SQL_SQLITE.value:
|
|
232
|
+
return f"JSON_EXTRACT({column}, '$.{path}')"
|
|
233
|
+
else:
|
|
234
|
+
raise ValueError(f"Unsupported database type: {self.database_type}")
|
|
235
|
+
|
|
236
|
+
def _json_extract_text(self, column: str, path: str) -> str:
|
|
237
|
+
"""Extract JSON value as text.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
column: The JSON column name
|
|
241
|
+
path: The JSON path (e.g., 'roles', 'teams')
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
SQL expression to extract JSON value as text
|
|
245
|
+
"""
|
|
246
|
+
if self.database_type == StorageBackendType.SQL_POSTGRES.value:
|
|
247
|
+
return f"{column}->>'{path}'"
|
|
248
|
+
elif self.database_type == StorageBackendType.SQL_SQLITE.value:
|
|
249
|
+
return f"JSON_EXTRACT({column}, '$.{path}')"
|
|
250
|
+
else:
|
|
251
|
+
raise ValueError(f"Unsupported database type: {self.database_type}")
|
|
252
|
+
|
|
253
|
+
def _get_public_access_conditions(self) -> list[str]:
|
|
254
|
+
"""Get the SQL conditions for public access.
|
|
255
|
+
|
|
256
|
+
Public records are those with:
|
|
257
|
+
- owner_principal = '' (empty string)
|
|
258
|
+
- access_attributes is either SQL NULL or JSON null
|
|
259
|
+
|
|
260
|
+
Note: Different databases serialize None differently:
|
|
261
|
+
- SQLite: None → JSON null (text = 'null')
|
|
262
|
+
- Postgres: None → SQL NULL (IS NULL)
|
|
263
|
+
"""
|
|
264
|
+
conditions = ["owner_principal = ''"]
|
|
265
|
+
if self.database_type == StorageBackendType.SQL_POSTGRES.value:
|
|
266
|
+
# Accept both SQL NULL and JSON null for Postgres compatibility
|
|
267
|
+
# This handles both old rows (SQL NULL) and new rows (JSON null)
|
|
268
|
+
conditions.append("(access_attributes IS NULL OR access_attributes::text = 'null')")
|
|
269
|
+
elif self.database_type == StorageBackendType.SQL_SQLITE.value:
|
|
270
|
+
# SQLite serializes None as JSON null
|
|
271
|
+
conditions.append("(access_attributes IS NULL OR access_attributes = 'null')")
|
|
272
|
+
else:
|
|
273
|
+
raise ValueError(f"Unsupported database type: {self.database_type}")
|
|
274
|
+
return conditions
|
|
275
|
+
|
|
276
|
+
def _build_default_policy_where_clause(self, current_user: User | None) -> str:
|
|
277
|
+
"""Build SQL WHERE clause for the default policy.
|
|
278
|
+
|
|
279
|
+
Default policy: permit all actions when user in owners [roles, teams, projects, namespaces]
|
|
280
|
+
This means user must match ALL attribute categories that exist in the resource.
|
|
281
|
+
"""
|
|
282
|
+
base_conditions = self._get_public_access_conditions()
|
|
283
|
+
user_attr_conditions = []
|
|
284
|
+
|
|
285
|
+
if current_user and current_user.attributes:
|
|
286
|
+
for attr_key, user_values in current_user.attributes.items():
|
|
287
|
+
if user_values:
|
|
288
|
+
value_conditions = []
|
|
289
|
+
for value in user_values:
|
|
290
|
+
# Check if JSON array contains the value
|
|
291
|
+
escaped_value = value.replace("'", "''")
|
|
292
|
+
json_text = self._json_extract_text("access_attributes", attr_key)
|
|
293
|
+
value_conditions.append(f"({json_text} LIKE '%\"{escaped_value}\"%')")
|
|
294
|
+
|
|
295
|
+
if value_conditions:
|
|
296
|
+
# Check if the category is missing (NULL)
|
|
297
|
+
category_missing = f"{self._json_extract('access_attributes', attr_key)} IS NULL"
|
|
298
|
+
user_matches_category = f"({' OR '.join(value_conditions)})"
|
|
299
|
+
user_attr_conditions.append(f"({category_missing} OR {user_matches_category})")
|
|
300
|
+
|
|
301
|
+
if user_attr_conditions:
|
|
302
|
+
all_requirements_met = f"({' AND '.join(user_attr_conditions)})"
|
|
303
|
+
base_conditions.append(all_requirements_met)
|
|
304
|
+
|
|
305
|
+
return f"({' OR '.join(base_conditions)})"
|
|
306
|
+
|
|
307
|
+
def _build_conservative_where_clause(self) -> str:
|
|
308
|
+
"""Conservative SQL filtering for custom policies.
|
|
309
|
+
|
|
310
|
+
Only filters records we're 100% certain would be denied by any reasonable policy.
|
|
311
|
+
"""
|
|
312
|
+
current_user = get_authenticated_user()
|
|
313
|
+
|
|
314
|
+
if not current_user:
|
|
315
|
+
# Only allow public records
|
|
316
|
+
base_conditions = self._get_public_access_conditions()
|
|
317
|
+
return f"({' OR '.join(base_conditions)})"
|
|
318
|
+
|
|
319
|
+
return "1=1"
|