mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-12-22 22:42:25 +00:00
Merge branch 'main' into fix/issue-2584-llama4-tool-calling
This commit is contained in:
commit
d9f558e69f
14 changed files with 145 additions and 38 deletions
11
docs/_static/llama-stack-spec.html
vendored
11
docs/_static/llama-stack-spec.html
vendored
|
|
@ -11340,6 +11340,9 @@
|
||||||
},
|
},
|
||||||
"embedding_dimension": {
|
"embedding_dimension": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"vector_db_name": {
|
||||||
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|
@ -13590,10 +13593,6 @@
|
||||||
"provider_id": {
|
"provider_id": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The ID of the provider to use for this vector store."
|
"description": "The ID of the provider to use for this vector store."
|
||||||
},
|
|
||||||
"provider_vector_db_id": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "The provider-specific vector database ID."
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|
@ -15634,6 +15633,10 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The identifier of the provider."
|
"description": "The identifier of the provider."
|
||||||
},
|
},
|
||||||
|
"vector_db_name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The name of the vector database."
|
||||||
|
},
|
||||||
"provider_vector_db_id": {
|
"provider_vector_db_id": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "The identifier of the vector database in the provider."
|
"description": "The identifier of the vector database in the provider."
|
||||||
|
|
|
||||||
9
docs/_static/llama-stack-spec.yaml
vendored
9
docs/_static/llama-stack-spec.yaml
vendored
|
|
@ -7984,6 +7984,8 @@ components:
|
||||||
type: string
|
type: string
|
||||||
embedding_dimension:
|
embedding_dimension:
|
||||||
type: integer
|
type: integer
|
||||||
|
vector_db_name:
|
||||||
|
type: string
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
required:
|
required:
|
||||||
- identifier
|
- identifier
|
||||||
|
|
@ -9494,10 +9496,6 @@ components:
|
||||||
type: string
|
type: string
|
||||||
description: >-
|
description: >-
|
||||||
The ID of the provider to use for this vector store.
|
The ID of the provider to use for this vector store.
|
||||||
provider_vector_db_id:
|
|
||||||
type: string
|
|
||||||
description: >-
|
|
||||||
The provider-specific vector database ID.
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
required:
|
required:
|
||||||
- name
|
- name
|
||||||
|
|
@ -10945,6 +10943,9 @@ components:
|
||||||
provider_id:
|
provider_id:
|
||||||
type: string
|
type: string
|
||||||
description: The identifier of the provider.
|
description: The identifier of the provider.
|
||||||
|
vector_db_name:
|
||||||
|
type: string
|
||||||
|
description: The name of the vector database.
|
||||||
provider_vector_db_id:
|
provider_vector_db_id:
|
||||||
type: string
|
type: string
|
||||||
description: >-
|
description: >-
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ class VectorDB(Resource):
|
||||||
|
|
||||||
embedding_model: str
|
embedding_model: str
|
||||||
embedding_dimension: int
|
embedding_dimension: int
|
||||||
|
vector_db_name: str | None = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def vector_db_id(self) -> str:
|
def vector_db_id(self) -> str:
|
||||||
|
|
@ -70,6 +71,7 @@ class VectorDBs(Protocol):
|
||||||
embedding_model: str,
|
embedding_model: str,
|
||||||
embedding_dimension: int | None = 384,
|
embedding_dimension: int | None = 384,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
|
vector_db_name: str | None = None,
|
||||||
provider_vector_db_id: str | None = None,
|
provider_vector_db_id: str | None = None,
|
||||||
) -> VectorDB:
|
) -> VectorDB:
|
||||||
"""Register a vector database.
|
"""Register a vector database.
|
||||||
|
|
@ -78,6 +80,7 @@ class VectorDBs(Protocol):
|
||||||
:param embedding_model: The embedding model to use.
|
:param embedding_model: The embedding model to use.
|
||||||
:param embedding_dimension: The dimension of the embedding model.
|
:param embedding_dimension: The dimension of the embedding model.
|
||||||
:param provider_id: The identifier of the provider.
|
:param provider_id: The identifier of the provider.
|
||||||
|
:param vector_db_name: The name of the vector database.
|
||||||
:param provider_vector_db_id: The identifier of the vector database in the provider.
|
:param provider_vector_db_id: The identifier of the vector database in the provider.
|
||||||
:returns: A VectorDB.
|
:returns: A VectorDB.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -346,7 +346,6 @@ class VectorIO(Protocol):
|
||||||
embedding_model: str | None = None,
|
embedding_model: str | None = None,
|
||||||
embedding_dimension: int | None = 384,
|
embedding_dimension: int | None = 384,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
provider_vector_db_id: str | None = None,
|
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
"""Creates a vector store.
|
"""Creates a vector store.
|
||||||
|
|
||||||
|
|
@ -358,7 +357,6 @@ class VectorIO(Protocol):
|
||||||
:param embedding_model: The embedding model to use for this vector store.
|
:param embedding_model: The embedding model to use for this vector store.
|
||||||
:param embedding_dimension: The dimension of the embedding vectors (default: 384).
|
:param embedding_dimension: The dimension of the embedding vectors (default: 384).
|
||||||
:param provider_id: The ID of the provider to use for this vector store.
|
:param provider_id: The ID of the provider to use for this vector store.
|
||||||
:param provider_vector_db_id: The provider-specific vector database ID.
|
|
||||||
:returns: A VectorStoreObject representing the created vector store.
|
:returns: A VectorStoreObject representing the created vector store.
|
||||||
"""
|
"""
|
||||||
...
|
...
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ from llama_stack.distribution.distribution import (
|
||||||
builtin_automatically_routed_apis,
|
builtin_automatically_routed_apis,
|
||||||
get_provider_registry,
|
get_provider_registry,
|
||||||
)
|
)
|
||||||
from llama_stack.distribution.stack import replace_env_vars
|
from llama_stack.distribution.stack import cast_image_name_to_string, replace_env_vars
|
||||||
from llama_stack.distribution.utils.config_dirs import EXTERNAL_PROVIDERS_DIR
|
from llama_stack.distribution.utils.config_dirs import EXTERNAL_PROVIDERS_DIR
|
||||||
from llama_stack.distribution.utils.dynamic import instantiate_class_type
|
from llama_stack.distribution.utils.dynamic import instantiate_class_type
|
||||||
from llama_stack.distribution.utils.prompt_for_config import prompt_for_config
|
from llama_stack.distribution.utils.prompt_for_config import prompt_for_config
|
||||||
|
|
@ -164,7 +164,8 @@ def upgrade_from_routing_table(
|
||||||
def parse_and_maybe_upgrade_config(config_dict: dict[str, Any]) -> StackRunConfig:
|
def parse_and_maybe_upgrade_config(config_dict: dict[str, Any]) -> StackRunConfig:
|
||||||
version = config_dict.get("version", None)
|
version = config_dict.get("version", None)
|
||||||
if version == LLAMA_STACK_RUN_CONFIG_VERSION:
|
if version == LLAMA_STACK_RUN_CONFIG_VERSION:
|
||||||
return StackRunConfig(**replace_env_vars(config_dict))
|
processed_config_dict = replace_env_vars(config_dict)
|
||||||
|
return StackRunConfig(**cast_image_name_to_string(processed_config_dict))
|
||||||
|
|
||||||
if "routing_table" in config_dict:
|
if "routing_table" in config_dict:
|
||||||
logger.info("Upgrading config...")
|
logger.info("Upgrading config...")
|
||||||
|
|
@ -175,4 +176,5 @@ def parse_and_maybe_upgrade_config(config_dict: dict[str, Any]) -> StackRunConfi
|
||||||
if not config_dict.get("external_providers_dir", None):
|
if not config_dict.get("external_providers_dir", None):
|
||||||
config_dict["external_providers_dir"] = EXTERNAL_PROVIDERS_DIR
|
config_dict["external_providers_dir"] = EXTERNAL_PROVIDERS_DIR
|
||||||
|
|
||||||
return StackRunConfig(**replace_env_vars(config_dict))
|
processed_config_dict = replace_env_vars(config_dict)
|
||||||
|
return StackRunConfig(**cast_image_name_to_string(processed_config_dict))
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
# the root directory of this source tree.
|
# the root directory of this source tree.
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import uuid
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from llama_stack.apis.common.content_types import (
|
from llama_stack.apis.common.content_types import (
|
||||||
|
|
@ -81,6 +82,7 @@ class VectorIORouter(VectorIO):
|
||||||
embedding_model: str,
|
embedding_model: str,
|
||||||
embedding_dimension: int | None = 384,
|
embedding_dimension: int | None = 384,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
|
vector_db_name: str | None = None,
|
||||||
provider_vector_db_id: str | None = None,
|
provider_vector_db_id: str | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
logger.debug(f"VectorIORouter.register_vector_db: {vector_db_id}, {embedding_model}")
|
logger.debug(f"VectorIORouter.register_vector_db: {vector_db_id}, {embedding_model}")
|
||||||
|
|
@ -89,6 +91,7 @@ class VectorIORouter(VectorIO):
|
||||||
embedding_model,
|
embedding_model,
|
||||||
embedding_dimension,
|
embedding_dimension,
|
||||||
provider_id,
|
provider_id,
|
||||||
|
vector_db_name,
|
||||||
provider_vector_db_id,
|
provider_vector_db_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -123,7 +126,6 @@ class VectorIORouter(VectorIO):
|
||||||
embedding_model: str | None = None,
|
embedding_model: str | None = None,
|
||||||
embedding_dimension: int | None = None,
|
embedding_dimension: int | None = None,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
provider_vector_db_id: str | None = None,
|
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
logger.debug(f"VectorIORouter.openai_create_vector_store: name={name}, provider_id={provider_id}")
|
logger.debug(f"VectorIORouter.openai_create_vector_store: name={name}, provider_id={provider_id}")
|
||||||
|
|
||||||
|
|
@ -135,17 +137,17 @@ class VectorIORouter(VectorIO):
|
||||||
embedding_model, embedding_dimension = embedding_model_info
|
embedding_model, embedding_dimension = embedding_model_info
|
||||||
logger.info(f"No embedding model specified, using first available: {embedding_model}")
|
logger.info(f"No embedding model specified, using first available: {embedding_model}")
|
||||||
|
|
||||||
vector_db_id = name
|
vector_db_id = f"vs_{uuid.uuid4()}"
|
||||||
registered_vector_db = await self.routing_table.register_vector_db(
|
registered_vector_db = await self.routing_table.register_vector_db(
|
||||||
vector_db_id,
|
vector_db_id=vector_db_id,
|
||||||
embedding_model,
|
embedding_model=embedding_model,
|
||||||
embedding_dimension,
|
embedding_dimension=embedding_dimension,
|
||||||
provider_id,
|
provider_id=provider_id,
|
||||||
provider_vector_db_id,
|
provider_vector_db_id=vector_db_id,
|
||||||
|
vector_db_name=name,
|
||||||
)
|
)
|
||||||
|
|
||||||
return await self.routing_table.get_provider_impl(registered_vector_db.identifier).openai_create_vector_store(
|
return await self.routing_table.get_provider_impl(registered_vector_db.identifier).openai_create_vector_store(
|
||||||
vector_db_id,
|
name=name,
|
||||||
file_ids=file_ids,
|
file_ids=file_ids,
|
||||||
expires_after=expires_after,
|
expires_after=expires_after,
|
||||||
chunking_strategy=chunking_strategy,
|
chunking_strategy=chunking_strategy,
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ class VectorDBsRoutingTable(CommonRoutingTableImpl, VectorDBs):
|
||||||
embedding_dimension: int | None = 384,
|
embedding_dimension: int | None = 384,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
provider_vector_db_id: str | None = None,
|
provider_vector_db_id: str | None = None,
|
||||||
|
vector_db_name: str | None = None,
|
||||||
) -> VectorDB:
|
) -> VectorDB:
|
||||||
if provider_vector_db_id is None:
|
if provider_vector_db_id is None:
|
||||||
provider_vector_db_id = vector_db_id
|
provider_vector_db_id = vector_db_id
|
||||||
|
|
@ -62,6 +63,7 @@ class VectorDBsRoutingTable(CommonRoutingTableImpl, VectorDBs):
|
||||||
"provider_resource_id": provider_vector_db_id,
|
"provider_resource_id": provider_vector_db_id,
|
||||||
"embedding_model": embedding_model,
|
"embedding_model": embedding_model,
|
||||||
"embedding_dimension": model.metadata["embedding_dimension"],
|
"embedding_dimension": model.metadata["embedding_dimension"],
|
||||||
|
"vector_db_name": vector_db_name,
|
||||||
}
|
}
|
||||||
vector_db = TypeAdapter(VectorDBWithOwner).validate_python(vector_db_data)
|
vector_db = TypeAdapter(VectorDBWithOwner).validate_python(vector_db_data)
|
||||||
await self.register_object(vector_db)
|
await self.register_object(vector_db)
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ from llama_stack.distribution.server.routes import (
|
||||||
initialize_route_impls,
|
initialize_route_impls,
|
||||||
)
|
)
|
||||||
from llama_stack.distribution.stack import (
|
from llama_stack.distribution.stack import (
|
||||||
|
cast_image_name_to_string,
|
||||||
construct_stack,
|
construct_stack,
|
||||||
replace_env_vars,
|
replace_env_vars,
|
||||||
validate_env_pair,
|
validate_env_pair,
|
||||||
|
|
@ -439,7 +440,7 @@ def main(args: argparse.Namespace | None = None):
|
||||||
logger.error(f"Error: {str(e)}")
|
logger.error(f"Error: {str(e)}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
config = replace_env_vars(config_contents)
|
config = replace_env_vars(config_contents)
|
||||||
config = StackRunConfig(**config)
|
config = StackRunConfig(**cast_image_name_to_string(config))
|
||||||
|
|
||||||
# now that the logger is initialized, print the line about which type of config we are using.
|
# now that the logger is initialized, print the line about which type of config we are using.
|
||||||
logger.info(log_line)
|
logger.info(log_line)
|
||||||
|
|
|
||||||
|
|
@ -267,6 +267,13 @@ def _convert_string_to_proper_type(value: str) -> Any:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def cast_image_name_to_string(config_dict: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
"""Ensure that any value for a key 'image_name' in a config_dict is a string"""
|
||||||
|
if "image_name" in config_dict and config_dict["image_name"] is not None:
|
||||||
|
config_dict["image_name"] = str(config_dict["image_name"])
|
||||||
|
return config_dict
|
||||||
|
|
||||||
|
|
||||||
def validate_env_pair(env_pair: str) -> tuple[str, str]:
|
def validate_env_pair(env_pair: str) -> tuple[str, str]:
|
||||||
"""Validate and split an environment variable key-value pair."""
|
"""Validate and split an environment variable key-value pair."""
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -217,7 +217,6 @@ class ChromaVectorIOAdapter(VectorIO, VectorDBsProtocolPrivate):
|
||||||
embedding_model: str | None = None,
|
embedding_model: str | None = None,
|
||||||
embedding_dimension: int | None = 384,
|
embedding_dimension: int | None = 384,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
provider_vector_db_id: str | None = None,
|
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in Chroma")
|
raise NotImplementedError("OpenAI Vector Stores API is not supported in Chroma")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,6 @@ class QdrantVectorIOAdapter(VectorIO, VectorDBsProtocolPrivate):
|
||||||
embedding_model: str | None = None,
|
embedding_model: str | None = None,
|
||||||
embedding_dimension: int | None = 384,
|
embedding_dimension: int | None = 384,
|
||||||
provider_id: str | None = None,
|
provider_id: str | None = None,
|
||||||
provider_vector_db_id: str | None = None,
|
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in Qdrant")
|
raise NotImplementedError("OpenAI Vector Stores API is not supported in Qdrant")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -172,8 +172,9 @@ class OpenAIVectorStoreMixin(ABC):
|
||||||
provider_vector_db_id: str | None = None,
|
provider_vector_db_id: str | None = None,
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
"""Creates a vector store."""
|
"""Creates a vector store."""
|
||||||
store_id = name or str(uuid.uuid4())
|
|
||||||
created_at = int(time.time())
|
created_at = int(time.time())
|
||||||
|
# Derive the canonical vector_db_id (allow override, else generate)
|
||||||
|
vector_db_id = provider_vector_db_id or f"vs_{uuid.uuid4()}"
|
||||||
|
|
||||||
if provider_id is None:
|
if provider_id is None:
|
||||||
raise ValueError("Provider ID is required")
|
raise ValueError("Provider ID is required")
|
||||||
|
|
@ -181,19 +182,19 @@ class OpenAIVectorStoreMixin(ABC):
|
||||||
if embedding_model is None:
|
if embedding_model is None:
|
||||||
raise ValueError("Embedding model is required")
|
raise ValueError("Embedding model is required")
|
||||||
|
|
||||||
# Use provided embedding dimension or default to 384
|
# Embedding dimension is required (defaulted to 384 if not provided)
|
||||||
if embedding_dimension is None:
|
if embedding_dimension is None:
|
||||||
raise ValueError("Embedding dimension is required")
|
raise ValueError("Embedding dimension is required")
|
||||||
|
|
||||||
provider_vector_db_id = provider_vector_db_id or store_id
|
# Register the VectorDB backing this vector store
|
||||||
vector_db = VectorDB(
|
vector_db = VectorDB(
|
||||||
identifier=store_id,
|
identifier=vector_db_id,
|
||||||
embedding_dimension=embedding_dimension,
|
embedding_dimension=embedding_dimension,
|
||||||
embedding_model=embedding_model,
|
embedding_model=embedding_model,
|
||||||
provider_id=provider_id,
|
provider_id=provider_id,
|
||||||
provider_resource_id=provider_vector_db_id,
|
provider_resource_id=vector_db_id,
|
||||||
|
vector_db_name=name,
|
||||||
)
|
)
|
||||||
# Register the vector DB
|
|
||||||
await self.register_vector_db(vector_db)
|
await self.register_vector_db(vector_db)
|
||||||
|
|
||||||
# Create OpenAI vector store metadata
|
# Create OpenAI vector store metadata
|
||||||
|
|
@ -207,11 +208,11 @@ class OpenAIVectorStoreMixin(ABC):
|
||||||
in_progress=0,
|
in_progress=0,
|
||||||
total=0,
|
total=0,
|
||||||
)
|
)
|
||||||
store_info = {
|
store_info: dict[str, Any] = {
|
||||||
"id": store_id,
|
"id": vector_db_id,
|
||||||
"object": "vector_store",
|
"object": "vector_store",
|
||||||
"created_at": created_at,
|
"created_at": created_at,
|
||||||
"name": store_id,
|
"name": name,
|
||||||
"usage_bytes": 0,
|
"usage_bytes": 0,
|
||||||
"file_counts": file_counts.model_dump(),
|
"file_counts": file_counts.model_dump(),
|
||||||
"status": status,
|
"status": status,
|
||||||
|
|
@ -231,18 +232,18 @@ class OpenAIVectorStoreMixin(ABC):
|
||||||
store_info["metadata"] = metadata
|
store_info["metadata"] = metadata
|
||||||
|
|
||||||
# Save to persistent storage (provider-specific)
|
# Save to persistent storage (provider-specific)
|
||||||
await self._save_openai_vector_store(store_id, store_info)
|
await self._save_openai_vector_store(vector_db_id, store_info)
|
||||||
|
|
||||||
# Store in memory cache
|
# Store in memory cache
|
||||||
self.openai_vector_stores[store_id] = store_info
|
self.openai_vector_stores[vector_db_id] = store_info
|
||||||
|
|
||||||
# Now that our vector store is created, attach any files that were provided
|
# Now that our vector store is created, attach any files that were provided
|
||||||
file_ids = file_ids or []
|
file_ids = file_ids or []
|
||||||
tasks = [self.openai_attach_file_to_vector_store(store_id, file_id) for file_id in file_ids]
|
tasks = [self.openai_attach_file_to_vector_store(vector_db_id, file_id) for file_id in file_ids]
|
||||||
await asyncio.gather(*tasks)
|
await asyncio.gather(*tasks)
|
||||||
|
|
||||||
# Get the updated store info and return it
|
# Get the updated store info and return it
|
||||||
store_info = self.openai_vector_stores[store_id]
|
store_info = self.openai_vector_stores[vector_db_id]
|
||||||
return VectorStoreObject.model_validate(store_info)
|
return VectorStoreObject.model_validate(store_info)
|
||||||
|
|
||||||
async def openai_list_vector_stores(
|
async def openai_list_vector_stores(
|
||||||
|
|
|
||||||
|
|
@ -821,6 +821,59 @@ def test_openai_vector_store_update_file(compat_client_with_empty_stores, client
|
||||||
assert retrieved_file.attributes["foo"] == "baz"
|
assert retrieved_file.attributes["foo"] == "baz"
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_vector_store_files_duplicate_vector_store_name(compat_client_with_empty_stores, client_with_models):
|
||||||
|
"""
|
||||||
|
This test confirms that client.vector_stores.create() creates a unique ID
|
||||||
|
"""
|
||||||
|
skip_if_provider_doesnt_support_openai_vector_stores(client_with_models)
|
||||||
|
skip_if_provider_doesnt_support_openai_vector_store_files_api(client_with_models)
|
||||||
|
|
||||||
|
if isinstance(compat_client_with_empty_stores, LlamaStackClient):
|
||||||
|
pytest.skip("Vector Store Files create is not yet supported with LlamaStackClient")
|
||||||
|
|
||||||
|
compat_client = compat_client_with_empty_stores
|
||||||
|
|
||||||
|
# Create a vector store with files
|
||||||
|
file_ids = []
|
||||||
|
for i in range(3):
|
||||||
|
with BytesIO(f"This is a test file {i}".encode()) as file_buffer:
|
||||||
|
file_buffer.name = f"openai_test_{i}.txt"
|
||||||
|
file = compat_client.files.create(file=file_buffer, purpose="assistants")
|
||||||
|
file_ids.append(file.id)
|
||||||
|
|
||||||
|
vector_store = compat_client.vector_stores.create(
|
||||||
|
name="test_store_with_files",
|
||||||
|
)
|
||||||
|
assert vector_store.file_counts.completed == 0
|
||||||
|
assert vector_store.file_counts.total == 0
|
||||||
|
assert vector_store.file_counts.cancelled == 0
|
||||||
|
assert vector_store.file_counts.failed == 0
|
||||||
|
assert vector_store.file_counts.in_progress == 0
|
||||||
|
|
||||||
|
vector_store2 = compat_client.vector_stores.create(
|
||||||
|
name="test_store_with_files",
|
||||||
|
)
|
||||||
|
|
||||||
|
vector_stores_list = compat_client.vector_stores.list()
|
||||||
|
assert len(vector_stores_list.data) == 2
|
||||||
|
|
||||||
|
created_file = compat_client.vector_stores.files.create(
|
||||||
|
vector_store_id=vector_store.id,
|
||||||
|
file_id=file_ids[0],
|
||||||
|
)
|
||||||
|
assert created_file.status == "completed"
|
||||||
|
|
||||||
|
_ = compat_client.vector_stores.delete(vector_store2.id)
|
||||||
|
created_file_from_non_deleted_vector_store = compat_client.vector_stores.files.create(
|
||||||
|
vector_store_id=vector_store.id,
|
||||||
|
file_id=file_ids[1],
|
||||||
|
)
|
||||||
|
assert created_file_from_non_deleted_vector_store.status == "completed"
|
||||||
|
|
||||||
|
vector_stores_list_post_delete = compat_client.vector_stores.list()
|
||||||
|
assert len(vector_stores_list_post_delete.data) == 1
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skip(reason="Client library needs to be scaffolded to support search_mode parameter")
|
@pytest.mark.skip(reason="Client library needs to be scaffolded to support search_mode parameter")
|
||||||
def test_openai_vector_store_search_modes():
|
def test_openai_vector_store_search_modes():
|
||||||
"""Test OpenAI vector store search with different search modes.
|
"""Test OpenAI vector store search with different search modes.
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,37 @@ from llama_stack.distribution.configure import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def config_with_image_name_int():
|
||||||
|
return yaml.safe_load(
|
||||||
|
f"""
|
||||||
|
version: {LLAMA_STACK_RUN_CONFIG_VERSION}
|
||||||
|
image_name: 1234
|
||||||
|
apis_to_serve: []
|
||||||
|
built_at: {datetime.now().isoformat()}
|
||||||
|
providers:
|
||||||
|
inference:
|
||||||
|
- provider_id: provider1
|
||||||
|
provider_type: inline::meta-reference
|
||||||
|
config: {{}}
|
||||||
|
safety:
|
||||||
|
- provider_id: provider1
|
||||||
|
provider_type: inline::meta-reference
|
||||||
|
config:
|
||||||
|
llama_guard_shield:
|
||||||
|
model: Llama-Guard-3-1B
|
||||||
|
excluded_categories: []
|
||||||
|
disable_input_check: false
|
||||||
|
disable_output_check: false
|
||||||
|
enable_prompt_guard: false
|
||||||
|
memory:
|
||||||
|
- provider_id: provider1
|
||||||
|
provider_type: inline::meta-reference
|
||||||
|
config: {{}}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def up_to_date_config():
|
def up_to_date_config():
|
||||||
return yaml.safe_load(
|
return yaml.safe_load(
|
||||||
|
|
@ -125,3 +156,8 @@ def test_parse_and_maybe_upgrade_config_old_format(old_config):
|
||||||
def test_parse_and_maybe_upgrade_config_invalid(invalid_config):
|
def test_parse_and_maybe_upgrade_config_invalid(invalid_config):
|
||||||
with pytest.raises(KeyError):
|
with pytest.raises(KeyError):
|
||||||
parse_and_maybe_upgrade_config(invalid_config)
|
parse_and_maybe_upgrade_config(invalid_config)
|
||||||
|
|
||||||
|
|
||||||
|
def test_parse_and_maybe_upgrade_config_image_name_int(config_with_image_name_int):
|
||||||
|
result = parse_and_maybe_upgrade_config(config_with_image_name_int)
|
||||||
|
assert isinstance(result.image_name, str)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue