Spaces:
				
			
			
	
			
			
					
		Running
		
	
	
	
			
			
	
	
	
	
		
		
					
		Running
		
	| from fastapi import FastAPI, Request | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification | |
| import torch | |
| import uvicorn | |
| app = FastAPI(title="AI Detector API") | |
| # Load the model once at startup | |
| MODEL_NAME = "roberta-base-openai-detector" | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
| model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME) | |
| model.eval() | |
| def get_ai_probability(text: str) -> float: | |
| """Return AI probability (0–100%) for the given text.""" | |
| inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512) | |
| with torch.no_grad(): | |
| logits = model(**inputs).logits | |
| probs = torch.softmax(logits, dim=1) | |
| ai_score = probs[0][1].item() * 100 | |
| return round(ai_score, 2) | |
| async def analyze_text(request: Request): | |
| """ | |
| Example body: | |
| { | |
| "text": "Your text here" | |
| } | |
| """ | |
| data = await request.json() | |
| text = data.get("text", "").strip() | |
| if not text: | |
| return {"error": "No text provided"} | |
| paragraphs = [p.strip() for p in text.split("\n") if p.strip()] | |
| results = [] | |
| for i, para in enumerate(paragraphs, start=1): | |
| ai_score = get_ai_probability(para) | |
| results.append({ | |
| "paragraph": i, | |
| "ai_score": ai_score, | |
| "human_score": round(100 - ai_score, 2), | |
| "content_preview": para[:200] + ("..." if len(para) > 200 else "") | |
| }) | |
| overall = sum([r["ai_score"] for r in results]) / len(results) | |
| return { | |
| "overall_ai_score": round(overall, 2), | |
| "overall_human_score": round(100 - overall, 2), | |
| "paragraphs": results | |
| } | |
| async def root(): | |
| return {"message": "AI Detector API is running. Use POST /analyze"} | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="0.0.0.0", port=7860) | |