File size: 2,054 Bytes
cc8a450
ae51d62
 
b4f3263
 
 
 
d5114e6
ae51d62
 
 
 
 
 
 
 
 
 
 
 
d5114e6
 
 
 
cc8a450
 
 
 
 
ae51d62
d5114e6
 
 
 
ae51d62
d5114e6
 
 
 
 
 
ae51d62
1c1651d
ae51d62
1c1651d
b4f3263
1c1651d
b4f3263
 
1c1651d
b4f3263
1c1651d
b4f3263
 
1c1651d
b4f3263
1c1651d
b4f3263
 
 
 
 
1c1651d
d5114e6
0729a48
d5114e6
 
b4f3263
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
from fastapi import FastAPI, Response, status
from pydantic import BaseModel
from hypothesis import BaseModelHypothesis
from random_forest_dependencies import RandomForestDependencies
from random_forest_model import RandomForestModel
from main_model import PredictMainModel
import numpy as np
from typing import List

app = FastAPI()


class PredictRequest(BaseModel):
    question: str
    answer: str
    backspace_count: int
    typing_duration: int
    letter_click_counts: dict[str, int]


class RequestModel(BaseModel):
    instances: List[PredictRequest]


@app.get("/health")
async def is_alive():
    return Response(status_code=status.HTTP_200_OK)


@app.post("/predict")
async def predict(request: RequestModel):
    responses = [process_instance(data) for data in request.instances]
    return {"predictions": responses}


def process_instance(data: PredictRequest):
    question = data.question
    answer = data.answer
    backspace_count = data.backspace_count
    typing_duration = data.typing_duration
    letter_click_counts = data.letter_click_counts

    # Data preparation for 1st model
    hypothesis = BaseModelHypothesis()
    additional_features = hypothesis.calculate_features_dataframe(answer)

    # 1st model prediction
    main_model = PredictMainModel()
    main_model_probability = main_model.predict(
        answer, additional_features)

    # Data preparation for 2nd model
    random_forest_features = RandomForestDependencies()
    secondary_model_features = random_forest_features.calculate_features(
        answer, main_model_probability, backspace_count, typing_duration, letter_click_counts)

    # 2nd model prediction
    secondary_model = RandomForestModel()
    secondary_model_prediction = secondary_model.predict(
        secondary_model_features)

    return {
        "predicted_class": "AI" if secondary_model_prediction == 1 else "HUMAN",
        "details": {
            "main_model_probability": str(main_model_probability),
            "final_prediction": secondary_model_prediction
        }
    }