mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-10-04 20:14:13 +00:00
Implements a complete S3-based file storage provider for Llama Stack with: Core Implementation: - S3FilesImpl class with full OpenAI Files API compatibility - Support for file upload, download, listing, deletion operations - Sqlite-based metadata storage for fast queries and API compliance - Configurable S3 endpoints (AWS, MinIO, LocalStack support) Key Features: - Automatic S3 bucket creation and management - Metadata persistence - Proper error handling for S3 connectivity and permissions Dependencies: - Adds boto3 for AWS S3 integration - Adds moto[s3] for testing infrastructure Testing: Unit: `./scripts/unit-tests.sh tests/unit/files tests/unit/providers/files` Integration: Start MinIO: `podman run --rm -it -p 9000:9000 minio/minio server /data` Start stack w/ S3 provider: `S3_ENDPOINT_URL=http://localhost:9000 AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin S3_BUCKET_NAME=llama-stack-files uv run llama stack build --image-type venv --providers files=remote::s3 --run` Run integration tests: `./scripts/integration-tests.sh --stack-config http://localhost:8321 --provider ollama --test-subdirs files`
42 lines
1.9 KiB
Python
42 lines
1.9 KiB
Python
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the terms described in the LICENSE file in
|
|
# the root directory of this source tree.
|
|
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from llama_stack.providers.utils.sqlstore.sqlstore import SqliteSqlStoreConfig, SqlStoreConfig
|
|
|
|
|
|
class S3FilesImplConfig(BaseModel):
|
|
"""Configuration for S3-based files provider."""
|
|
|
|
bucket_name: str = Field(description="S3 bucket name to store files")
|
|
region: str = Field(default="us-east-1", description="AWS region where the bucket is located")
|
|
aws_access_key_id: str | None = Field(default=None, description="AWS access key ID (optional if using IAM roles)")
|
|
aws_secret_access_key: str | None = Field(
|
|
default=None, description="AWS secret access key (optional if using IAM roles)"
|
|
)
|
|
endpoint_url: str | None = Field(default=None, description="Custom S3 endpoint URL (for MinIO, LocalStack, etc.)")
|
|
auto_create_bucket: bool = Field(
|
|
default=False, description="Automatically create the S3 bucket if it doesn't exist"
|
|
)
|
|
metadata_store: SqlStoreConfig = Field(description="SQL store configuration for file metadata")
|
|
|
|
@classmethod
|
|
def sample_run_config(cls, __distro_dir__: str) -> dict[str, Any]:
|
|
return {
|
|
"bucket_name": "${env.S3_BUCKET_NAME}", # no default, buckets must be globally unique
|
|
"region": "${env.AWS_REGION:=us-east-1}",
|
|
"aws_access_key_id": "${env.AWS_ACCESS_KEY_ID:=}",
|
|
"aws_secret_access_key": "${env.AWS_SECRET_ACCESS_KEY:=}",
|
|
"endpoint_url": "${env.S3_ENDPOINT_URL:=}",
|
|
"auto_create_bucket": "${env.S3_AUTO_CREATE_BUCKET:=false}",
|
|
"metadata_store": SqliteSqlStoreConfig.sample_run_config(
|
|
__distro_dir__=__distro_dir__,
|
|
db_name="s3_files_metadata.db",
|
|
),
|
|
}
|