updated app.py
Browse files
app.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
| 1 |
-
import
|
| 2 |
-
from
|
| 3 |
-
from fastapi import FastAPI, HTTPException
|
| 4 |
from pydantic import BaseModel
|
| 5 |
-
from
|
|
|
|
| 6 |
import asyncio
|
|
|
|
| 7 |
|
| 8 |
# FastAPI app instance
|
| 9 |
app = FastAPI()
|
|
@@ -11,6 +12,9 @@ app = FastAPI()
|
|
| 11 |
# Global model and tokenizer variables
|
| 12 |
model, tokenizer = None, None
|
| 13 |
|
|
|
|
|
|
|
|
|
|
| 14 |
# Function to load model and tokenizer
|
| 15 |
def load_model():
|
| 16 |
model_path = "./Ai-Text-Detector/model"
|
|
@@ -21,7 +25,7 @@ def load_model():
|
|
| 21 |
config = GPT2Config.from_pretrained(model_path)
|
| 22 |
model = GPT2LMHeadModel(config)
|
| 23 |
model.load_state_dict(torch.load(weights_path, map_location=torch.device("cpu")))
|
| 24 |
-
model.eval()
|
| 25 |
except Exception as e:
|
| 26 |
raise RuntimeError(f"Error loading model: {str(e)}")
|
| 27 |
|
|
@@ -61,14 +65,20 @@ def classify_text(sentence: str):
|
|
| 61 |
|
| 62 |
return result, perplexity
|
| 63 |
|
| 64 |
-
# POST route to analyze text
|
| 65 |
@app.post("/analyze")
|
| 66 |
-
async def analyze_text(data: TextInput):
|
| 67 |
user_input = data.text.strip()
|
|
|
|
| 68 |
if not user_input:
|
| 69 |
raise HTTPException(status_code=400, detail="Text cannot be empty")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
|
| 71 |
-
# Run classification asynchronously to prevent blocking
|
| 72 |
result, perplexity = await asyncio.to_thread(classify_text, user_input)
|
| 73 |
|
| 74 |
return {
|
|
|
|
| 1 |
+
from fastapi import FastAPI, HTTPException, Depends
|
| 2 |
+
from fastapi.security import HTTPBearer
|
|
|
|
| 3 |
from pydantic import BaseModel
|
| 4 |
+
from transformers import GPT2LMHeadModel, GPT2TokenizerFast, GPT2Config
|
| 5 |
+
import torch
|
| 6 |
import asyncio
|
| 7 |
+
from contextlib import asynccontextmanager
|
| 8 |
|
| 9 |
# FastAPI app instance
|
| 10 |
app = FastAPI()
|
|
|
|
| 12 |
# Global model and tokenizer variables
|
| 13 |
model, tokenizer = None, None
|
| 14 |
|
| 15 |
+
# HTTPBearer instance for security
|
| 16 |
+
bearer_scheme = HTTPBearer()
|
| 17 |
+
|
| 18 |
# Function to load model and tokenizer
|
| 19 |
def load_model():
|
| 20 |
model_path = "./Ai-Text-Detector/model"
|
|
|
|
| 25 |
config = GPT2Config.from_pretrained(model_path)
|
| 26 |
model = GPT2LMHeadModel(config)
|
| 27 |
model.load_state_dict(torch.load(weights_path, map_location=torch.device("cpu")))
|
| 28 |
+
model.eval()
|
| 29 |
except Exception as e:
|
| 30 |
raise RuntimeError(f"Error loading model: {str(e)}")
|
| 31 |
|
|
|
|
| 65 |
|
| 66 |
return result, perplexity
|
| 67 |
|
| 68 |
+
# POST route to analyze text with Bearer token
|
| 69 |
@app.post("/analyze")
|
| 70 |
+
async def analyze_text(data: TextInput, token: str = Depends(bearer_scheme)):
|
| 71 |
user_input = data.text.strip()
|
| 72 |
+
|
| 73 |
if not user_input:
|
| 74 |
raise HTTPException(status_code=400, detail="Text cannot be empty")
|
| 75 |
+
|
| 76 |
+
# Check if there are at least two words
|
| 77 |
+
word_count = len(user_input.split())
|
| 78 |
+
if word_count < 2:
|
| 79 |
+
raise HTTPException(status_code=400, detail="Text must contain at least two words")
|
| 80 |
+
|
| 81 |
|
|
|
|
| 82 |
result, perplexity = await asyncio.to_thread(classify_text, user_input)
|
| 83 |
|
| 84 |
return {
|