Spaces:
Running
Running
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)}"
)
|