File size: 2,495 Bytes
5b89d45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""
Chat endpoint - Ask questions about the indexed codebase
"""
import time
from fastapi import APIRouter, HTTPException
from api.schemas import ChatRequest, ChatResponse, SourceInfo

router = APIRouter()


@router.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest):
    """
    Ask a question about the indexed codebase.
    
    Args:
        request: ChatRequest with question and settings
        
    Returns:
        ChatResponse with answer, sources, and metadata
    """
    from api.state import app_state
    
    # Check if codebase is indexed
    if app_state.chat_engine is None:
        raise HTTPException(
            status_code=400,
            detail="No codebase indexed. Use POST /api/index first."
        )
    
    start_time = time.time()
    
    try:
        # Update chat engine settings if needed
        if request.provider.value != app_state.provider:
            # Would need to reinitialize with new provider
            raise HTTPException(
                status_code=400,
                detail=f"Provider mismatch. Current: {app_state.provider}, Requested: {request.provider.value}. Re-index to change provider."
            )
        
        # Get response from chat engine
        result = app_state.chat_engine.query(
            request.question,
            use_agent=request.use_agent
        )
        
        processing_time = time.time() - start_time
        
        # Extract sources from result
        sources = []
        if hasattr(result, 'source_documents'):
            for doc in result.source_documents[:5]:  # Limit to 5 sources
                sources.append(SourceInfo(
                    file_path=doc.metadata.get('file_path', 'unknown'),
                    relevance_score=doc.metadata.get('score', None)
                ))
        
        # Determine mode used
        mode = "agent" if request.use_agent else "linear"
        if hasattr(result, 'mode'):
            mode = result.mode
        
        # Get answer text
        answer = str(result) if isinstance(result, str) else result.get('answer', str(result))
        
        return ChatResponse(
            answer=answer,
            sources=sources,
            mode=mode,
            processing_time=round(processing_time, 2)
        )
        
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(
            status_code=500,
            detail=f"Error processing query: {str(e)}"
        )