From f1a5fac1b94fb6e03447901b36930c8adffd2108 Mon Sep 17 00:00:00 2001 From: Chris Coutinho Date: Thu, 20 Nov 2025 12:32:27 +0100 Subject: [PATCH] fix: Update models and viz to use int-only doc_id - algorithms.py: Revert SearchResult.id to int (all docs use int IDs now) - semantic.py: Revert SemanticSearchResult.id to int, remove Union import - viz_routes.py: Remove str() conversion when querying doc_id from Qdrant - viz_routes.py: Convert doc_id from query param to int in chunk context Fixes vector visualization which was collapsing all chunks to a single point because Qdrant queries were failing to match doc_id (string vs int). --- nextcloud_mcp_server/auth/viz_routes.py | 6 ++++-- nextcloud_mcp_server/models/semantic.py | 2 +- nextcloud_mcp_server/search/algorithms.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/nextcloud_mcp_server/auth/viz_routes.py b/nextcloud_mcp_server/auth/viz_routes.py index 1599073..56edf48 100644 --- a/nextcloud_mcp_server/auth/viz_routes.py +++ b/nextcloud_mcp_server/auth/viz_routes.py @@ -235,7 +235,7 @@ async def vector_visualization_search(request: Request) -> JSONResponse: must_conditions = [ FieldCondition( key="doc_id", - match=MatchValue(value=str(result.id)), + match=MatchValue(value=result.id), ), FieldCondition( key="user_id", @@ -524,6 +524,8 @@ async def chunk_context_endpoint(request: Request) -> JSONResponse: start = int(start_str) end = int(end_str) + # Convert doc_id to int (all document types use int IDs) + doc_id_int = int(doc_id) # Get authenticated Nextcloud client from nextcloud_mcp_server.auth.userinfo_routes import ( @@ -536,7 +538,7 @@ async def chunk_context_endpoint(request: Request) -> JSONResponse: chunk_context = await get_chunk_with_context( nc_client=nc_client, user_id=request.user.display_name, # User ID from auth - doc_id=doc_id, + doc_id=doc_id_int, doc_type=doc_type, chunk_start=start, chunk_end=end, diff --git a/nextcloud_mcp_server/models/semantic.py b/nextcloud_mcp_server/models/semantic.py index e6cea54..2a1941b 100644 --- a/nextcloud_mcp_server/models/semantic.py +++ b/nextcloud_mcp_server/models/semantic.py @@ -10,7 +10,7 @@ from .base import BaseResponse class SemanticSearchResult(BaseModel): """Model for semantic search results with additional metadata.""" - id: int = Field(description="Document ID") + id: int = Field(description="Document ID (int for all document types)") doc_type: str = Field( description="Document type (note, calendar_event, deck_card, etc.)" ) diff --git a/nextcloud_mcp_server/search/algorithms.py b/nextcloud_mcp_server/search/algorithms.py index 416d0d7..932a92b 100644 --- a/nextcloud_mcp_server/search/algorithms.py +++ b/nextcloud_mcp_server/search/algorithms.py @@ -123,7 +123,7 @@ class SearchResult: """A single search result with metadata and score. Attributes: - id: Document ID + id: Document ID (int for all document types) doc_type: Document type (note, file, calendar, contact, etc.) title: Document title excerpt: Content excerpt showing match context