BridgeIT / app.py
kaiozwald's picture
Switched to free model distilgpt2
e58a657
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel
from typing import List
from transformers import pipeline
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
from datetime import datetime
import uuid
app = FastAPI()
# Load model once at startup
generator = pipeline("text-generation", model="distilgpt2")
SECTIONS = [
"Abstract",
"Introduction",
"Literature Review",
"Methodology",
"System Design",
"Implementation",
"Evaluation",
"Conclusion and Future Work"
]
class TaskItem(BaseModel):
task: str
class ReportRequest(BaseModel):
tasks: List[TaskItem]
def build_overview(self) -> str:
overview = ["This project summarizes a year of academic effort including planning, development, and evaluation.\n"]
for item in self.tasks:
overview.append(f"- {item.task}")
overview.append("")
return "\n".join(overview)
def generate_section(section_name: str, overview: str) -> str:
prompt = f"""
You are an academic writer. Write a section titled '{section_name}' for a graduation project report based on:
{overview}
Avoid conclusions or references. Use formal language.
"""
result = generator(prompt, max_length=512, num_return_sequences=1)
return result[0]['generated_text']
def create_word_doc(sections_content, filename="Graduation_Project_Report.docx"):
doc = Document()
style = doc.styles['Normal']
font = style.font
font.name = 'Times New Roman'
font.size = Pt(12)
doc.add_heading("Graduation Project Report", 0).alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph("Author: Your Name")
doc.add_paragraph("Supervisor: Supervisor Name")
doc.add_paragraph("Department: Computer Science")
doc.add_paragraph("University: Your University")
doc.add_paragraph("Date: " + datetime.today().strftime("%B %d, %Y"))
doc.add_page_break()
for section_name, section_text in sections_content.items():
doc.add_heading(section_name, level=1)
for paragraph in section_text.split('\n'):
line = paragraph.strip()
if line:
doc.add_paragraph(line)
doc.add_page_break()
doc.save(filename)
return filename
@app.post("/generate-report")
def generate_report(req: ReportRequest):
overview = req.build_overview()
sections = {}
for section in SECTIONS:
sections[section] = generate_section(section, overview)
unique_filename = f"report_{uuid.uuid4().hex[:8]}.docx"
create_word_doc(sections, unique_filename)
return {"download_url": f"/download/{unique_filename}"}
@app.get("/download/{filename}")
def download_file(filename: str):
return FileResponse(path=filename, filename=filename, media_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
@app.get("/")
def root():
return {"status": "Running"}