File size: 3,742 Bytes
9844436
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5f5f26d
9ae222c
9844436
 
 
 
5f5f26d
9844436
 
 
 
5d0a351
 
9844436
 
5d0a351
 
 
9844436
 
5d0a351
9844436
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
from fastapi import APIRouter, HTTPException, Depends
from app.models.schemas import CaseAnalysisRequest, CaseAnalysisResponse, HealthResponse
from app.services.legal_bert import LegalBertService
from app.services.rag_service import RAGService
from app.services.gemini_service import GeminiService
import logging

logger = logging.getLogger(__name__)
router = APIRouter()

legal_bert_service = LegalBertService()
rag_service = RAGService()
gemini_service = GeminiService()

@router.get("/health", response_model=HealthResponse)
async def health_check():
    try:
        services_status = {
            "legal_bert": legal_bert_service.is_healthy(),
            "rag": rag_service.is_healthy(),
            "gemini": gemini_service.is_healthy()
        }
        
        all_healthy = all(services_status.values())
        
        return HealthResponse(
            status="healthy" if all_healthy else "degraded",
            services=services_status,
            error=None
        )
    except Exception as e:
        logger.error(f"Health check failed: {str(e)}")
        return HealthResponse(
            status="unhealthy",
            services={},
            error=str(e)
        )

@router.post("/analyze-case", response_model=CaseAnalysisResponse)
async def analyze_case(request: CaseAnalysisRequest):
    try:
        logger.info(f"Analyzing case with text length: {len(request.caseText)}")
        
        
        initial_verdict = legal_bert_service.predictVerdict(request.caseText)
        confidence = legal_bert_service.getConfidence(request.caseText)
        
        logger.info(f"Initial verdict: {initial_verdict}, confidence: {confidence}")
        
        
        evaluation_result = gemini_service.evaluateCaseWithGemini(
            inputText=request.caseText,
            modelVerdict=initial_verdict,
            confidence=confidence,
            retrieveFn=rag_service,
            geminiQueryModel=gemini_service if request.useQueryGeneration else None
        )
        
        logger.info(f"Retrieved support chunks from RAG system")
        search_query = evaluation_result.get("ragSearchQuery", request.caseText)
        
        logger.info(f"Gemini evaluation completed. Final verdict: {evaluation_result.get('finalVerdictByGemini')}")
        
        support_chunks = evaluation_result.get("support", {})
        return CaseAnalysisResponse(
            initialVerdict=initial_verdict,
            initialConfidence=confidence,
            finalVerdict=evaluation_result.get("finalVerdictByGemini"),
            verdictChanged=evaluation_result.get("verdictChanged") == "changed",
            searchQuery=search_query,
            geminiExplanation=evaluation_result.get("geminiOutput"),
            supportingSources=support_chunks,
            analysisLogs=evaluation_result
        )
        
    except Exception as e:
        logger.error(f"Error analyzing case: {str(e)}")
        raise HTTPException(status_code=500, detail=f"Analysis failed: {str(e)}")

@router.get("/models/status")
async def get_models_status():
    try:
        status = {
            "legalBert": {
                "loaded": legal_bert_service.is_model_loaded(),
                "device": legal_bert_service.get_device()
            },
            "ragIndexes": {
                "loaded": rag_service.areIndexesLoaded(),
                "indexCount": len(rag_service.getLoadedIndexes())
            },
            "gemini": {
                "configured": gemini_service.is_configured()
            }
        }
        return status
    except Exception as e:
        logger.error(f"Error getting models status: {str(e)}")
        raise HTTPException(status_code=500, detail=f"Failed to get models status: {str(e)}")