mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-12-27 07:58:06 +00:00
chore: Adding OpenAI Vector Stores Files API compatibility for PGVector
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
This commit is contained in:
parent
4ae5656c2f
commit
dd6e6f9ac2
2 changed files with 95 additions and 6 deletions
|
|
@ -273,16 +273,105 @@ class PGVectorVectorIOAdapter(OpenAIVectorStoreMixin, VectorIO, VectorDBsProtoco
|
||||||
async def _save_openai_vector_store_file(
|
async def _save_openai_vector_store_file(
|
||||||
self, store_id: str, file_id: str, file_info: dict[str, Any], file_contents: list[dict[str, Any]]
|
self, store_id: str, file_id: str, file_info: dict[str, Any], file_contents: list[dict[str, Any]]
|
||||||
) -> None:
|
) -> None:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in PGVector")
|
"""Save vector store file metadata to Postgres database."""
|
||||||
|
if self.conn is None:
|
||||||
|
raise RuntimeError("PostgreSQL connection is not initialized")
|
||||||
|
try:
|
||||||
|
with self.conn.cursor() as cur:
|
||||||
|
cur.execute(
|
||||||
|
"""
|
||||||
|
CREATE TABLE IF NOT EXISTS openai_vector_store_files (
|
||||||
|
store_id TEXT,
|
||||||
|
file_id TEXT,
|
||||||
|
metadata JSONB,
|
||||||
|
PRIMARY KEY (store_id, file_id)
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
cur.execute(
|
||||||
|
"""
|
||||||
|
CREATE TABLE IF NOT EXISTS openai_vector_store_files_contents (
|
||||||
|
store_id TEXT,
|
||||||
|
file_id TEXT,
|
||||||
|
contents JSONB,
|
||||||
|
PRIMARY KEY (store_id, file_id)
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
cur.execute(
|
||||||
|
"INSERT INTO openai_vector_store_files (store_id, file_id, metadata) VALUES (%s, %s, %s)"
|
||||||
|
" ON CONFLICT (store_id, file_id) DO UPDATE SET metadata = EXCLUDED.metadata",
|
||||||
|
(store_id, file_id, Json(file_info)),
|
||||||
|
)
|
||||||
|
cur.execute(
|
||||||
|
"INSERT INTO openai_vector_store_files_contents (store_id, file_id, contents) VALUES (%s, %s, %s)"
|
||||||
|
" ON CONFLICT (store_id, file_id) DO UPDATE SET contents = EXCLUDED.contents",
|
||||||
|
(store_id, file_id, Json(file_contents)),
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Error saving openai vector store file {file_id} for store {store_id}: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
async def _load_openai_vector_store_file(self, store_id: str, file_id: str) -> dict[str, Any]:
|
async def _load_openai_vector_store_file(self, store_id: str, file_id: str) -> dict[str, Any]:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in PGVector")
|
"""Load vector store file metadata from Postgres database."""
|
||||||
|
if self.conn is None:
|
||||||
|
raise RuntimeError("PostgreSQL connection is not initialized")
|
||||||
|
try:
|
||||||
|
with self.conn.cursor() as cur:
|
||||||
|
cur.execute(
|
||||||
|
"SELECT metadata FROM openai_vector_store_files WHERE store_id = %s AND file_id = %s",
|
||||||
|
(store_id, file_id),
|
||||||
|
)
|
||||||
|
row = cur.fetchone()
|
||||||
|
return row[0] if row and row[0] is not None else {}
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Error loading openai vector store file {file_id} for store {store_id}: {e}")
|
||||||
|
return {}
|
||||||
|
|
||||||
async def _load_openai_vector_store_file_contents(self, store_id: str, file_id: str) -> list[dict[str, Any]]:
|
async def _load_openai_vector_store_file_contents(self, store_id: str, file_id: str) -> list[dict[str, Any]]:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in PGVector")
|
"""Load vector store file contents from Postgres database."""
|
||||||
|
if self.conn is None:
|
||||||
|
raise RuntimeError("PostgreSQL connection is not initialized")
|
||||||
|
try:
|
||||||
|
with self.conn.cursor() as cur:
|
||||||
|
cur.execute(
|
||||||
|
"SELECT contents FROM openai_vector_store_files_contents WHERE store_id = %s AND file_id = %s",
|
||||||
|
(store_id, file_id),
|
||||||
|
)
|
||||||
|
row = cur.fetchone()
|
||||||
|
return row[0] if row and row[0] is not None else []
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Error loading openai vector store file contents for {file_id} in store {store_id}: {e}")
|
||||||
|
return []
|
||||||
|
|
||||||
async def _update_openai_vector_store_file(self, store_id: str, file_id: str, file_info: dict[str, Any]) -> None:
|
async def _update_openai_vector_store_file(self, store_id: str, file_id: str, file_info: dict[str, Any]) -> None:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in PGVector")
|
"""Update vector store file metadata in Postgres database."""
|
||||||
|
if self.conn is None:
|
||||||
|
raise RuntimeError("PostgreSQL connection is not initialized")
|
||||||
|
try:
|
||||||
|
with self.conn.cursor() as cur:
|
||||||
|
cur.execute(
|
||||||
|
"UPDATE openai_vector_store_files SET metadata = %s WHERE store_id = %s AND file_id = %s",
|
||||||
|
(Json(file_info), store_id, file_id),
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Error updating openai vector store file {file_id} for store {store_id}: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
async def _delete_openai_vector_store_file_from_storage(self, store_id: str, file_id: str) -> None:
|
async def _delete_openai_vector_store_file_from_storage(self, store_id: str, file_id: str) -> None:
|
||||||
raise NotImplementedError("OpenAI Vector Stores API is not supported in PGVector")
|
"""Delete vector store file metadata from Postgres database."""
|
||||||
|
if self.conn is None:
|
||||||
|
raise RuntimeError("PostgreSQL connection is not initialized")
|
||||||
|
try:
|
||||||
|
with self.conn.cursor() as cur:
|
||||||
|
cur.execute(
|
||||||
|
"DELETE FROM openai_vector_store_files WHERE store_id = %s AND file_id = %s",
|
||||||
|
(store_id, file_id),
|
||||||
|
)
|
||||||
|
cur.execute(
|
||||||
|
"DELETE FROM openai_vector_store_files_contents WHERE store_id = %s AND file_id = %s",
|
||||||
|
(store_id, file_id),
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
log.error(f"Error deleting openai vector store file {file_id} for store {store_id}: {e}")
|
||||||
|
raise
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ def skip_if_provider_doesnt_support_openai_vector_stores(client_with_models):
|
||||||
def skip_if_provider_doesnt_support_openai_vector_store_files_api(client_with_models):
|
def skip_if_provider_doesnt_support_openai_vector_store_files_api(client_with_models):
|
||||||
vector_io_providers = [p for p in client_with_models.providers.list() if p.api == "vector_io"]
|
vector_io_providers = [p for p in client_with_models.providers.list() if p.api == "vector_io"]
|
||||||
for p in vector_io_providers:
|
for p in vector_io_providers:
|
||||||
if p.provider_type in ["inline::faiss", "inline::sqlite-vec", "inline::milvus"]:
|
if p.provider_type in ["inline::faiss", "inline::sqlite-vec", "inline::milvus", "remote::pgvector"]:
|
||||||
return
|
return
|
||||||
|
|
||||||
pytest.skip("OpenAI vector stores are not supported by any provider")
|
pytest.skip("OpenAI vector stores are not supported by any provider")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue