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"
        )