From 125d7e7d61974d562b86e4dd62b7e4be6165da44 Mon Sep 17 00:00:00 2001 From: Michael Chihlas Date: Thu, 5 Mar 2026 11:41:22 -0500 Subject: [PATCH] fix: RAG vector search SQL syntax error breaking assistant chat - Use CAST(:embedding AS vector) instead of :embedding::vector to avoid SQLAlchemy named param conflict with PostgreSQL :: cast syntax - Add db.rollback() before recording AI usage on failure to prevent InFailedSQLTransactionError cascade Co-Authored-By: Claude Opus 4.6 --- backend/app/api/endpoints/assistant_chat.py | 1 + backend/app/services/rag_service.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/app/api/endpoints/assistant_chat.py b/backend/app/api/endpoints/assistant_chat.py index 5edf53c5..42bd104c 100644 --- a/backend/app/api/endpoints/assistant_chat.py +++ b/backend/app/api/endpoints/assistant_chat.py @@ -155,6 +155,7 @@ async def post_message( raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) except Exception as e: logger.exception("Assistant chat message failed: %s", e) + await db.rollback() await record_ai_usage( user_id=current_user.id, account_id=current_user.account_id, diff --git a/backend/app/services/rag_service.py b/backend/app/services/rag_service.py index 080c0098..806f9b1a 100644 --- a/backend/app/services/rag_service.py +++ b/backend/app/services/rag_service.py @@ -143,13 +143,13 @@ async def search( te.chunk_text, te.chunk_type, te.node_id, - 1 - (te.embedding <=> :embedding::vector) as similarity + 1 - (te.embedding <=> CAST(:embedding AS vector)) as similarity FROM tree_embeddings te JOIN trees t ON t.id = te.tree_id WHERE te.account_id = :account_id AND t.deleted_at IS NULL {exclude_clause} - ORDER BY te.embedding <=> :embedding::vector + ORDER BY te.embedding <=> CAST(:embedding AS vector) LIMIT :limit """), params,