Summify / app.py
uumerrr684's picture
Update app.py
f3bb358 verified
import os
import time
import json
from pathlib import Path
from dotenv import load_dotenv
import requests
from datetime import datetime
import gradio as gr
# Configuration
QUOTA_FILE = "api_quota.json"
RATE_LIMIT_DELAY = 1.0
DEFAULT_MODEL = "facebook/bart-large-cnn"
MAX_RETRIES = 3
RETRY_DELAY = 5
# --- Core Functions ---
def load_quota():
try:
if Path(QUOTA_FILE).exists():
with open(QUOTA_FILE, "r") as f:
return json.load(f)
except:
pass
return {"remaining": 600, "last_updated": datetime.now().isoformat()}
def save_quota(quota):
with open(QUOTA_FILE, "w") as f:
json.dump(quota, f)
def summarize_text(text, model=DEFAULT_MODEL):
try:
load_dotenv()
token = os.getenv("HF_API_TOKEN")
if not token:
return "⚠️ Add your Hugging Face token to .env file", "0/600"
except Exception as e:
return f"⚠️ Config error: {str(e)}", "0/600"
api_url = f"https://api-inference.huggingface.co/models/{model}"
headers = {"Authorization": f"Bearer {token}"}
payload = {"inputs": text, "parameters": {"max_length": 50, "min_length": 20}}
for attempt in range(MAX_RETRIES):
try:
time.sleep(RATE_LIMIT_DELAY)
response = requests.post(api_url, headers=headers, json=payload, timeout=10)
quota = load_quota()
quota["remaining"] = max(0, quota.get("remaining", 600) - 1)
save_quota(quota)
if response.status_code == 200:
result = response.json()
if isinstance(result, list):
return result[0].get("summary_text", "⚠️ No summary generated"), f"{quota['remaining']}/600"
if response.status_code == 503:
time.sleep(RETRY_DELAY)
continue
return f"⚠️ API Error: {response.text[:200]}", f"{quota['remaining']}/600"
except requests.exceptions.RequestException as e:
if attempt == MAX_RETRIES - 1:
return f"⚠️ Network error: {str(e)}", "0/600"
time.sleep(RETRY_DELAY)
return "⚠️ Failed after multiple attempts", "0/600"
# --- Gradio Interface ---
css = """
button {
background: #A41F13 !important;
color: white !important;
border: none !important;
border-radius: 8px !important;
padding: 12px 24px !important;
font-weight: bold !important;
transition: transform 0.2s ease-in-out;
}
button:hover {
transform: scale(1.05);
cursor: pointer;
}
"""
with gr.Blocks(theme=gr.themes.Soft(), css=css, title="My AI Summarizer") as app:
gr.Markdown("# ✨ My Text Summarizer")
gr.Markdown("Paste any text and get a concise summary using AI!")
with gr.Row():
input_text = gr.Textbox(label="Input Text", lines=8, placeholder="Paste your article/story here...")
output_text = gr.Textbox(label="Summary", lines=8, interactive=False)
with gr.Row():
submit_btn = gr.Button("Summarize", variant="primary")
quota_display = gr.Textbox(label="API Status", interactive=False)
submit_btn.click(
fn=summarize_text,
inputs=input_text,
outputs=[output_text, quota_display]
)
gr.Examples(
examples=[
"He prayed Fajr half-asleep...",
"Scientists discovered octopuses can edit their RNA...",
"The quick brown fox jumps over the lazy dog."
],
inputs=input_text
)
if __name__ == "__main__":
app.launch()