Spaces:
Running
Running
import re | |
import requests | |
from fastapi import FastAPI, HTTPException | |
from pydantic import BaseModel | |
from dotenv import load_dotenv | |
import os | |
from fake_useragent import UserAgent | |
from fastapi.responses import RedirectResponse | |
# Load environment variables | |
load_dotenv() | |
# Get environment variables | |
API_URL = os.getenv("API_URL") | |
MODEL = os.getenv("MODEL") | |
Origin = os.getenv("ORIGIN") | |
# Initialize FastAPI app with custom documentation URLs | |
app = FastAPI( | |
title="Roast API", | |
description="API for generating custom roasts. For more details, visit [Roast API Documentation](https://roastapi-docs.netlify.app/).", | |
version="1.0.0", | |
docs_url="/docs", | |
openapi_url="/openapi.json" | |
) | |
class RoastRequest(BaseModel): | |
content: str | |
def fetch_roasts(content: str): | |
ua = UserAgent() | |
headers = { | |
'origin': Origin, | |
'user-agent': ua.random, | |
'accept': '*/*', | |
'accept-encoding': 'gzip, deflate, br, zstd', | |
'accept-language': 'en-US,en;q=0.9,en-IN;q=0.8', | |
} | |
try: | |
# Make API request with a 30-second timeout | |
response = requests.post( | |
API_URL, | |
headers=headers, | |
data={'content': content, 'model': MODEL}, | |
timeout=30 # Add timeout here | |
) | |
response.raise_for_status() # Raises HTTPError for bad responses | |
# Parse the result and extract roasts | |
result = response.json().get('result', '') | |
roasts = re.findall(r'<roast>(.*?)</roast>', result) | |
return roasts | |
except requests.exceptions.Timeout: | |
raise HTTPException(status_code=504, detail="The request timed out.") | |
except requests.exceptions.RequestException as e: | |
raise HTTPException(status_code=503, detail=f"Network error: {e}") | |
except KeyError as e: | |
raise HTTPException(status_code=500, detail=f"Response format error: {e}") | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=f"Unexpected error: {e}") | |
async def root(): | |
return RedirectResponse(url="https://roastapi-docs.netlify.app/") | |
async def generate_roasts(request: RoastRequest): | |
roasts = fetch_roasts(request.content) | |
if not roasts: | |
raise HTTPException(status_code=404, detail="No roasts found.") | |
return {"roasts": roasts} | |
if __name__ == "__main__": | |
import uvicorn | |
print("Starting FastAPI server...") | |
uvicorn.run(app, host="0.0.0.0", port=8000) | |