mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-10-11 13:44:38 +00:00
Merge 32930868de
into 2f58d87c22
This commit is contained in:
commit
689f1db815
8 changed files with 284 additions and 8 deletions
|
@ -94,6 +94,19 @@ def pytest_configure(config):
|
|||
if not current:
|
||||
setattr(config.option, dest, value)
|
||||
|
||||
# After processing CLI --env overrides, ensure global default embedding model is set for vector-store operations
|
||||
embedding_model_opt = config.getoption("--embedding-model") or "sentence-transformers/all-MiniLM-L6-v2"
|
||||
if embedding_model_opt and not os.getenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL"):
|
||||
# Use first value in comma-separated list (if any)
|
||||
default_model = embedding_model_opt.split(",")[0].strip()
|
||||
os.environ["LLAMA_STACK_DEFAULT_EMBEDDING_MODEL"] = default_model
|
||||
logger.info(f"Setting LLAMA_STACK_DEFAULT_EMBEDDING_MODEL={default_model}")
|
||||
|
||||
embedding_dim_opt = config.getoption("--embedding-dimension") or 384
|
||||
if not os.getenv("LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION") and embedding_dim_opt:
|
||||
os.environ["LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION"] = str(embedding_dim_opt)
|
||||
logger.info(f"Setting LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION={embedding_dim_opt}")
|
||||
|
||||
|
||||
def pytest_addoption(parser):
|
||||
parser.addoption(
|
||||
|
|
29
tests/unit/common/test_vector_store_config.py
Normal file
29
tests/unit/common/test_vector_store_config.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
# 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 llama_stack.apis.common.vector_store_config import VectorStoreConfig
|
||||
|
||||
|
||||
def test_defaults(monkeypatch):
|
||||
# ensure env is clean to avoid flaky defaults
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", raising=False)
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION", raising=False)
|
||||
config = VectorStoreConfig()
|
||||
assert config.default_embedding_model is None
|
||||
assert config.default_embedding_dimension is None
|
||||
|
||||
|
||||
def test_env_loading(monkeypatch):
|
||||
monkeypatch.setenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", "test-model")
|
||||
monkeypatch.setenv("LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION", "123")
|
||||
|
||||
config = VectorStoreConfig()
|
||||
assert config.default_embedding_model == "test-model"
|
||||
assert config.default_embedding_dimension == 123
|
||||
|
||||
# cleanup
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", raising=False)
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION", raising=False)
|
112
tests/unit/router/test_embedding_precedence.py
Normal file
112
tests/unit/router/test_embedding_precedence.py
Normal file
|
@ -0,0 +1,112 @@
|
|||
# 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.
|
||||
|
||||
|
||||
import pytest
|
||||
|
||||
from llama_stack.apis.models import ModelType
|
||||
from llama_stack.core.routers.vector_io import VectorIORouter
|
||||
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
|
||||
class _DummyModel:
|
||||
def __init__(self, identifier: str, dim: int):
|
||||
self.identifier = identifier
|
||||
self.model_type = ModelType.embedding
|
||||
self.metadata = {"embedding_dimension": dim}
|
||||
|
||||
|
||||
class _DummyRoutingTable:
|
||||
"""Just a fake routing table for testing."""
|
||||
|
||||
def __init__(self):
|
||||
self._models = [
|
||||
_DummyModel("first-model", 123),
|
||||
_DummyModel("second-model", 512),
|
||||
]
|
||||
|
||||
async def get_all_with_type(self, _type: str):
|
||||
# just return embedding models for tests
|
||||
return self._models
|
||||
|
||||
# VectorIORouter needs these but we don't use them in tests
|
||||
async def register_vector_db(self, *_args, **_kwargs):
|
||||
raise NotImplementedError
|
||||
|
||||
async def get_provider_impl(self, *_args, **_kwargs):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
async def test_global_default_used(monkeypatch):
|
||||
"""Should use env var defaults when no explicit model given."""
|
||||
|
||||
monkeypatch.setenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", "env-default-model")
|
||||
monkeypatch.setenv("LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION", "256")
|
||||
|
||||
router = VectorIORouter(routing_table=_DummyRoutingTable())
|
||||
|
||||
model, dim = await router._resolve_embedding_model(None)
|
||||
assert model == "env-default-model"
|
||||
assert dim == 256
|
||||
|
||||
# cleanup
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", raising=False)
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_DIMENSION", raising=False)
|
||||
|
||||
|
||||
async def test_explicit_override(monkeypatch):
|
||||
"""Explicit model should win over env defaults."""
|
||||
|
||||
monkeypatch.setenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", "env-default-model")
|
||||
|
||||
router = VectorIORouter(routing_table=_DummyRoutingTable())
|
||||
|
||||
model, dim = await router._resolve_embedding_model("first-model")
|
||||
assert model == "first-model"
|
||||
assert dim == 123
|
||||
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", raising=False)
|
||||
|
||||
|
||||
async def test_fallback_to_default():
|
||||
"""Should fallback to first available embedding model when no defaults set."""
|
||||
|
||||
router = VectorIORouter(routing_table=_DummyRoutingTable())
|
||||
|
||||
model, dim = await router._resolve_embedding_model(None)
|
||||
assert model == "first-model"
|
||||
assert dim == 123
|
||||
|
||||
|
||||
async def test_missing_dimension_requirement(monkeypatch):
|
||||
monkeypatch.setenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", "some-model")
|
||||
|
||||
router = VectorIORouter(routing_table=_DummyRoutingTable())
|
||||
|
||||
with pytest.raises(ValueError, match="default_embedding_model.*is set but default_embedding_dimension is missing"):
|
||||
await router._resolve_embedding_model(None)
|
||||
|
||||
monkeypatch.delenv("LLAMA_STACK_DEFAULT_EMBEDDING_MODEL", raising=False)
|
||||
|
||||
|
||||
async def test_unregistered_model_error():
|
||||
router = VectorIORouter(routing_table=_DummyRoutingTable())
|
||||
|
||||
with pytest.raises(ValueError, match="Embedding model 'unknown-model' not found in model registry"):
|
||||
await router._resolve_embedding_model("unknown-model")
|
||||
|
||||
|
||||
class _EmptyRoutingTable:
|
||||
async def get_all_with_type(self, _type: str):
|
||||
return []
|
||||
|
||||
|
||||
async def test_no_models_available_error():
|
||||
router = VectorIORouter(routing_table=_EmptyRoutingTable())
|
||||
|
||||
with pytest.raises(ValueError, match="No embedding model specified and no default configured"):
|
||||
await router._resolve_embedding_model(None)
|
Loading…
Add table
Add a link
Reference in a new issue