mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-07-29 15:23:51 +00:00
chore: Migrating VectorDB to use OpenAI compatible identifier
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
This commit is contained in:
parent
b094960199
commit
ddb29b306c
9 changed files with 44 additions and 22 deletions
10
docs/_static/llama-stack-spec.html
vendored
10
docs/_static/llama-stack-spec.html
vendored
|
@ -11285,6 +11285,9 @@
|
||||||
},
|
},
|
||||||
"embedding_dimension": {
|
"embedding_dimension": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"provider_vector_db_name": {
|
||||||
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -13543,7 +13546,8 @@
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": [
|
"required": [
|
||||||
"name"
|
"name",
|
||||||
|
"provider_vector_db_id"
|
||||||
],
|
],
|
||||||
"title": "OpenaiCreateVectorStoreRequest"
|
"title": "OpenaiCreateVectorStoreRequest"
|
||||||
},
|
},
|
||||||
|
@ -15571,6 +15575,10 @@
|
||||||
"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."
|
||||||
|
},
|
||||||
|
"provider_vector_db_name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The name of the vector database."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|
6
docs/_static/llama-stack-spec.yaml
vendored
6
docs/_static/llama-stack-spec.yaml
vendored
|
@ -7944,6 +7944,8 @@ components:
|
||||||
type: string
|
type: string
|
||||||
embedding_dimension:
|
embedding_dimension:
|
||||||
type: integer
|
type: integer
|
||||||
|
provider_vector_db_name:
|
||||||
|
type: string
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
required:
|
required:
|
||||||
- identifier
|
- identifier
|
||||||
|
@ -9461,6 +9463,7 @@ components:
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
required:
|
required:
|
||||||
- name
|
- name
|
||||||
|
- provider_vector_db_id
|
||||||
title: OpenaiCreateVectorStoreRequest
|
title: OpenaiCreateVectorStoreRequest
|
||||||
VectorStoreFileCounts:
|
VectorStoreFileCounts:
|
||||||
type: object
|
type: object
|
||||||
|
@ -10897,6 +10900,9 @@ components:
|
||||||
type: string
|
type: string
|
||||||
description: >-
|
description: >-
|
||||||
The identifier of the vector database in the provider.
|
The identifier of the vector database in the provider.
|
||||||
|
provider_vector_db_name:
|
||||||
|
type: string
|
||||||
|
description: The name of the vector database.
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
required:
|
required:
|
||||||
- vector_db_id
|
- vector_db_id
|
||||||
|
|
|
@ -19,6 +19,7 @@ class VectorDB(Resource):
|
||||||
|
|
||||||
embedding_model: str
|
embedding_model: str
|
||||||
embedding_dimension: int
|
embedding_dimension: int
|
||||||
|
provider_vector_db_name: str | None = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def vector_db_id(self) -> str:
|
def vector_db_id(self) -> str:
|
||||||
|
@ -71,6 +72,7 @@ class VectorDBs(Protocol):
|
||||||
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,
|
||||||
|
provider_vector_db_name: str | None = None,
|
||||||
) -> VectorDB:
|
) -> VectorDB:
|
||||||
"""Register a vector database.
|
"""Register a vector database.
|
||||||
|
|
||||||
|
@ -79,6 +81,7 @@ class VectorDBs(Protocol):
|
||||||
: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 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.
|
||||||
|
:param provider_vector_db_name: The name of the vector database.
|
||||||
:returns: A VectorDB.
|
:returns: A VectorDB.
|
||||||
"""
|
"""
|
||||||
...
|
...
|
||||||
|
|
|
@ -346,7 +346,7 @@ 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,
|
provider_vector_db_id: str = "",
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
"""Creates a vector store.
|
"""Creates a vector store.
|
||||||
|
|
||||||
|
|
|
@ -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 (
|
||||||
|
@ -82,6 +83,7 @@ class VectorIORouter(VectorIO):
|
||||||
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,
|
||||||
|
provider_vector_db_name: 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}")
|
||||||
await self.routing_table.register_vector_db(
|
await self.routing_table.register_vector_db(
|
||||||
|
@ -90,6 +92,7 @@ class VectorIORouter(VectorIO):
|
||||||
embedding_dimension,
|
embedding_dimension,
|
||||||
provider_id,
|
provider_id,
|
||||||
provider_vector_db_id,
|
provider_vector_db_id,
|
||||||
|
provider_vector_db_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def insert_chunks(
|
async def insert_chunks(
|
||||||
|
@ -123,7 +126,7 @@ 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,
|
provider_vector_db_id: str = "",
|
||||||
) -> 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 +138,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,
|
||||||
embedding_model,
|
embedding_model,
|
||||||
embedding_dimension,
|
embedding_dimension,
|
||||||
provider_id,
|
provider_id,
|
||||||
provider_vector_db_id,
|
provider_vector_db_id,
|
||||||
|
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,
|
||||||
file_ids=file_ids,
|
file_ids=file_ids,
|
||||||
expires_after=expires_after,
|
expires_after=expires_after,
|
||||||
chunking_strategy=chunking_strategy,
|
chunking_strategy=chunking_strategy,
|
||||||
|
|
|
@ -35,9 +35,10 @@ class VectorDBsRoutingTable(CommonRoutingTableImpl, VectorDBs):
|
||||||
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,
|
||||||
provider_vector_db_id: str | None = None,
|
provider_vector_db_id: str = "",
|
||||||
|
provider_vector_db_name: str | None = None,
|
||||||
) -> VectorDB:
|
) -> VectorDB:
|
||||||
if provider_vector_db_id is None:
|
if provider_vector_db_id == "":
|
||||||
provider_vector_db_id = vector_db_id
|
provider_vector_db_id = vector_db_id
|
||||||
if provider_id is None:
|
if provider_id is None:
|
||||||
if len(self.impls_by_provider_id) > 0:
|
if len(self.impls_by_provider_id) > 0:
|
||||||
|
@ -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": provider_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)
|
||||||
|
|
|
@ -217,7 +217,7 @@ 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,
|
provider_vector_db_id: str = "",
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in Chroma")
|
raise NotImplementedError("OpenAI Vector Stores API is not supported in Chroma")
|
||||||
|
|
||||||
|
|
|
@ -247,7 +247,7 @@ class PGVectorVectorIOAdapter(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,
|
provider_vector_db_id: str = "",
|
||||||
) -> VectorStoreObject:
|
) -> VectorStoreObject:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in PGVector")
|
raise NotImplementedError("OpenAI Vector Stores API is not supported in PGVector")
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ import asyncio
|
||||||
import logging
|
import logging
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import time
|
import time
|
||||||
import uuid
|
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
@ -144,11 +143,12 @@ class OpenAIVectorStoreMixin(ABC):
|
||||||
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,
|
provider_vector_db_id: str = "",
|
||||||
) -> 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())
|
||||||
|
if provider_vector_db_id is None:
|
||||||
|
raise ValueError("Provider vector DB ID is required")
|
||||||
|
|
||||||
if provider_id is None:
|
if provider_id is None:
|
||||||
raise ValueError("Provider ID is required")
|
raise ValueError("Provider ID is required")
|
||||||
|
@ -160,13 +160,13 @@ class OpenAIVectorStoreMixin(ABC):
|
||||||
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
|
|
||||||
vector_db = VectorDB(
|
vector_db = VectorDB(
|
||||||
identifier=store_id,
|
identifier=provider_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=provider_vector_db_id,
|
||||||
|
provider_vector_db_name=name,
|
||||||
)
|
)
|
||||||
# Register the vector DB
|
# Register the vector DB
|
||||||
await self.register_vector_db(vector_db)
|
await self.register_vector_db(vector_db)
|
||||||
|
@ -182,11 +182,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": provider_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,
|
||||||
|
@ -206,18 +206,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(provider_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[provider_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(provider_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[provider_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(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue