Spaces:
Running
Running
from fastapi import FastAPI, Response, status | |
from pydantic import BaseModel | |
from hypothesis import BaseModelHypothesis | |
from secondary_model_dependencies import SecondaryModelDependencies | |
from secondary_model import SecondaryModel | |
from main_model import PredictMainModel | |
import numpy as np | |
from typing import List | |
app = FastAPI() | |
class PredictRequest(BaseModel): | |
answer: str | |
backspace_count: int | |
letter_click_counts: dict[str, int] | |
gpt4o_answer: str | |
class RequestModel(BaseModel): | |
instances: List[PredictRequest] | |
async def is_alive(): | |
return Response(status_code=status.HTTP_200_OK) | |
async def predict(request: RequestModel): | |
responses = [process_instance(data) for data in request.instances] | |
return {"predictions": responses} | |
def process_instance(data: PredictRequest): | |
answer = data.answer | |
backspace_count = data.backspace_count | |
letter_click_counts = data.letter_click_counts | |
gpt4o_answer = data.gpt4o_answer | |
# 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 | |
secondary_model_dependencies = SecondaryModelDependencies() | |
secondary_model_features = secondary_model_dependencies.calculate_features( | |
answer, main_model_probability, backspace_count, | |
letter_click_counts, gpt4o_answer) | |
# 2nd model prediction | |
secondary_model = SecondaryModel() | |
secondary_model_probability = secondary_model.predict( | |
secondary_model_features) | |
second_model_threshold = 0.54 | |
return { | |
"predicted_class": "AI" if secondary_model_probability > second_model_threshold else "HUMAN", | |
"main_model_probability": str(main_model_probability), | |
"secondary_model_probability": str(secondary_model_probability), | |
"confidence": get_confidence(main_model_probability, secondary_model_probability, second_model_threshold) | |
} | |
def get_confidence(main_model_output: float, secondary_model_output: int, threshold: float): | |
if (main_model_output >= 0.8 and secondary_model_output >= threshold) or (main_model_output <= 0.2 and secondary_model_output <= 1 - threshold): | |
return 'High Confidence' | |
elif (0.5 < main_model_output < 0.8 and secondary_model_output >= threshold) or (0.2 < main_model_output <= 0.5 and secondary_model_output < threshold): | |
return 'Partially Confident' | |
else: | |
return 'Low Confidence' | |