chore: Migrating VectorDB to use OpenAI compatible identifier

Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
This commit is contained in:
Francisco Javier Arceo 2025-07-03 22:02:06 -04:00
parent b094960199
commit ddb29b306c
9 changed files with 44 additions and 22 deletions

View file

@ -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,

View file

@ -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

View file

@ -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.
""" """
... ...

View file

@ -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.

View file

@ -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,

View file

@ -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)

View file

@ -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")

View file

@ -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")

View file

@ -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(