File size: 1,664 Bytes
495526b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json

from fastapi import APIRouter
from fastapi.responses import StreamingResponse

from backend.app.models.schemas import (
    ChatRequest,
    ChatResponse,
    IncidentClassificationRequest,
    IncidentClassificationResponse,
    RiskAssessmentRequest,
    RiskAssessmentResponse,
)
from backend.app.services.inference_service import classify_incident, generate_response, stream_response
from backend.app.services.risk_engine import compute_risk

router = APIRouter(prefix="/v1", tags=["worlddisasterlm"])


@router.post("/chat", response_model=ChatResponse)
def chat(request: ChatRequest) -> ChatResponse:
    return generate_response(request.messages, language=request.language, region=request.region)


@router.post("/chat/stream")
async def chat_stream(request: ChatRequest) -> StreamingResponse:
    async def event_stream():
        async for chunk in stream_response(request.messages, language=request.language, region=request.region):
            yield f"data: {json.dumps({'token': chunk})}\n\n"
        yield "data: [DONE]\n\n"

    return StreamingResponse(event_stream(), media_type="text/event-stream")


@router.post("/risk/score", response_model=RiskAssessmentResponse)
def risk_score(request: RiskAssessmentRequest) -> RiskAssessmentResponse:
    return compute_risk(
        hazard_type=request.hazard_type,
        vulnerability_index=request.vulnerability_index,
        exposure_index=request.exposure_index,
    )


@router.post("/incidents/classify", response_model=IncidentClassificationResponse)
def classify(request: IncidentClassificationRequest) -> IncidentClassificationResponse:
    return classify_incident(request.text)