File size: 2,063 Bytes
e2eff86 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import List
import logging
import sys
import os
# Add the backend directory to the path to allow absolute imports
sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from database import get_db
from models.book_content import BookContentResponse
from api.schemas import ChatbotQueryResponse
from middleware.auth import get_current_user
from models.user import User
from ai.embeddings import qwen_embeddings
from database.vector_db import vector_db
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/book", tags=["book"])
@router.get("/search", response_model=List[dict])
async def search_book_content(
q: str,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""
Search book content by query
"""
try:
# Generate embedding for the search query
query_embedding = qwen_embeddings.get_embedding(q)
# Search for similar content in the vector database
similar_contents = vector_db.search_similar(query_embedding, limit=5)
# Format results
results = []
for content in similar_contents:
metadata = content['metadata']
results.append({
"id": content['content_id'],
"title": metadata['title'],
"content_preview": metadata['content'][:200] + "..." if len(metadata['content']) > 200 else metadata['content'],
"source_path": metadata['source_path']
})
logger.info(f"Book content search performed by user {current_user.email}")
return results
except Exception as e:
logger.error(f"Error searching book content: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error searching book content"
) |