feat(knowledgebase): replace litellm-pgvector connector with memory-retrieval
Per docs/research/langchain-pgvector-vs-litellm-pgvector.md (issue #25): the vendored litellm-pgvector connector (793 lines, Prisma migrations, a fragile git-context build) is replaced by a ~90-line FastAPI service (services/memory-retrieval/) wrapping langchain_postgres.PGVector directly against pgvector-db. Same gateway boundary — it still calls litellm for embeddings, nothing talks to Postgres or the model directly except this service. - New services/memory-retrieval/ (main.py, Dockerfile, requirements.txt): POST /ingest, POST /query, GET /health. - docker-compose.yml: litellm-pgvector service replaced by memory-retrieval; pgvector-db and embedding-server untouched. - litellm-config.yaml: vector_store_registry block removed (no langchain_postgres provider exists to register against; callers query memory-retrieval directly instead of an in-band file_search tool call — that mechanism was never confirmed working per issue #24 anyway). - scripts/ingest-memory.sh rewritten for the new /ingest endpoint (same per-line chunking, no dedup). - .env vars renamed: LITELLM_PGVECTOR_API_KEY/LITELLM_PGVECTOR_EMBEDDING_KEY -> MEMORY_RETRIEVAL_API_KEY/MEMORY_RETRIEVAL_EMBEDDING_KEY. - vendor/litellm-pgvector/ removed entirely. - docs/memory-knowledgebase.md updated for the new setup/query flow. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Vendored
-86
@@ -1,86 +0,0 @@
|
||||
from typing import Optional, Dict, Any, List
|
||||
from pydantic import BaseModel
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class VectorStoreCreateRequest(BaseModel):
|
||||
name: str
|
||||
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
|
||||
Reference in New Issue
Block a user