POST /v1/vector_stores always minted a random UUID for the new store's id, ignoring the request entirely. litellm-config.yaml's vector_store_registry addresses this store by a fixed id (memory-and-notes), which could never match a real row as a result — every search/write 404'd. Added an optional id field to VectorStoreCreateRequest; create_vector_store uses it when given, falls back to a random UUID otherwise (unchanged behavior for callers that don't care).
92 lines
2.4 KiB
Python
92 lines
2.4 KiB
Python
from typing import Optional, Dict, Any, List
|
|
from pydantic import BaseModel
|
|
from datetime import datetime
|
|
|
|
|
|
class VectorStoreCreateRequest(BaseModel):
|
|
name: str
|
|
# ponytail: not part of upstream litellm-pgvector — added locally so
|
|
# callers (litellm's vector_store_registry, scripts/ingest-memory.sh)
|
|
# can pin a human-readable id instead of getting a random UUID back.
|
|
# litellm-config.yaml's vector_store_registry addresses stores by a
|
|
# fixed vector_store_id, which only works if creation can honor it.
|
|
id: Optional[str] = None
|
|
file_ids: Optional[List[str]] = None
|
|
expires_after: Optional[Dict[str, Any]] = None
|
|
chunking_strategy: Optional[Dict[str, Any]] = None
|
|
metadata: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
class VectorStoreResponse(BaseModel):
|
|
id: str
|
|
object: str = "vector_store"
|
|
created_at: int
|
|
name: str
|
|
usage_bytes: int
|
|
file_counts: Dict[str, int]
|
|
status: str
|
|
expires_after: Optional[Dict[str, Any]] = None
|
|
expires_at: Optional[int] = None
|
|
last_active_at: Optional[int] = None
|
|
metadata: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
class VectorStoreSearchRequest(BaseModel):
|
|
query: str
|
|
limit: Optional[int] = 20
|
|
filters: Optional[Dict[str, Any]] = None
|
|
return_metadata: Optional[bool] = True
|
|
|
|
|
|
class ContentChunk(BaseModel):
|
|
type: str = "text"
|
|
text: str
|
|
|
|
|
|
class SearchResult(BaseModel):
|
|
file_id: str
|
|
filename: str
|
|
score: float
|
|
attributes: Optional[Dict[str, Any]] = None
|
|
content: List[ContentChunk]
|
|
|
|
|
|
class VectorStoreSearchResponse(BaseModel):
|
|
object: str = "vector_store.search_results.page"
|
|
search_query: str
|
|
data: List[SearchResult]
|
|
has_more: bool = False
|
|
next_page: Optional[str] = None
|
|
|
|
|
|
class EmbeddingCreateRequest(BaseModel):
|
|
content: str
|
|
embedding: List[float]
|
|
metadata: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
class EmbeddingResponse(BaseModel):
|
|
id: str
|
|
object: str = "embedding"
|
|
vector_store_id: str
|
|
content: str
|
|
metadata: Optional[Dict[str, Any]] = None
|
|
created_at: int
|
|
|
|
|
|
class EmbeddingBatchCreateRequest(BaseModel):
|
|
embeddings: List[EmbeddingCreateRequest]
|
|
|
|
|
|
class EmbeddingBatchCreateResponse(BaseModel):
|
|
object: str = "embedding.batch"
|
|
data: List[EmbeddingResponse]
|
|
created: int
|
|
|
|
|
|
class VectorStoreListResponse(BaseModel):
|
|
object: str = "list"
|
|
data: List[VectorStoreResponse]
|
|
first_id: Optional[str] = None
|
|
last_id: Optional[str] = None
|
|
has_more: bool = False |