detector / app.py
Abhimanyu993
deployment
4fc2485
import os
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
import torch
from safetensors.torch import load_file
from transformers import RobertaTokenizer, RobertaForSequenceClassification
# Ensure CPU is always used
device = torch.device('cpu')
os.environ["HF_HOME"] = "/tmp/huggingface_cache"
os.environ["TRANSFORMERS_CACHE"] = os.environ["HF_HOME"]
os.makedirs(os.environ["HF_HOME"], exist_ok=True)
app = FastAPI()
class CodeBERTClassifier(torch.nn.Module):
def __init__(self):
super(CodeBERTClassifier, self).__init__()
self.model = RobertaForSequenceClassification.from_pretrained(
"microsoft/codebert-base",
num_labels=2,
cache_dir=os.environ["HF_HOME"]
).to(device) # Ensure model is on CPU
def forward(self, input_ids, attention_mask=None):
outputs = self.model(input_ids, attention_mask=attention_mask)
return outputs.logits
def load_model():
model = CodeBERTClassifier()
model.load_state_dict(load_file('model.safetensors'), strict=False)
model.eval()
tokenizer = RobertaTokenizer.from_pretrained(
"microsoft/codebert-base",
cache_dir=os.environ["HF_HOME"]
)
return model, tokenizer
model, tokenizer = load_model()
class CodeRequest(BaseModel):
code_samples: list[str]
def preprocess_input_code(code_samples):
inputs = tokenizer(code_samples, padding="max_length", truncation=True, max_length=512, return_tensors="pt")
return inputs["input_ids"].to(device), inputs["attention_mask"].to(device) # Move tensors to CPU
def predict(code_samples):
tokens, masks = preprocess_input_code(code_samples)
with torch.no_grad():
logits = model(tokens, attention_mask=masks)
probabilities = torch.nn.functional.softmax(logits, dim=1).numpy() # Keep on CPU for processing
return probabilities
@app.get("/")
def home():
return {"message": "API is running!"}
@app.post("/predict/")
async def predict_code(request: CodeRequest):
probabilities = predict(request.code_samples)
prediction_labels = []
for prob in probabilities:
ai_generated_prob = prob[1] * 100
human_generated_prob = prob[0] * 100
if ai_generated_prob > human_generated_prob:
prediction_labels.append(f"{ai_generated_prob:.2f}% Of code similar to AI-generated code.")
else:
prediction_labels.append(f"{human_generated_prob:.2f}% Of code similar to Human-generated code.")
return {"predictions": prediction_labels}
@app.post("/detect/")
async def detect_code(request: CodeRequest):
probabilities = predict(request.code_samples)
results = [{"AI": f"{prob[1]*100:.2f}%", "Human": f"{prob[0]*100:.2f}%"} for prob in probabilities]
return {"predictions": results}
if __name__ == "__main__":
port = int(os.environ.get("PORT", 7860))
uvicorn.run(app, host="0.0.0.0", port=port)