systemforge-ai / src /api /main.py
JacobJA's picture
Fix CORS issue for HF deployment
dc7a25e
Raw
History Blame Contribute Delete
2.6 kB
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from src.workflows.crew import run_systemforge
from src.api.pdf_generator import generate_architecture_pdf
import traceback
app = FastAPI(
title="SystemForge API"
)
# CORS for Next.js frontend
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class WorkflowRequest(BaseModel):
workflow: list[str]
@app.get("/")
def root():
return {
"message": "SystemForge API Running"
}
@app.post("/run-systemforge")
def generate_architecture(
request: WorkflowRequest
):
try:
if not request.workflow:
raise HTTPException(
status_code=400,
detail="Workflow steps cannot be empty"
)
result = run_systemforge(
request.workflow
)
return result
except HTTPException:
raise
except Exception as e:
print("========== FULL BACKEND ERROR ==========")
print(f"SystemForge Error: {str(e)}")
traceback.print_exc()
print("========================================")
raise HTTPException(
status_code=500,
detail=f"Failed to generate architecture: {str(e)}"
)
@app.post("/download-report")
def download_report(
request: WorkflowRequest
):
"""
Generates PDF architecture report
and returns downloadable file
"""
try:
if not request.workflow:
raise HTTPException(
status_code=400,
detail="Workflow steps cannot be empty"
)
# Generate architecture first
result = run_systemforge(
request.workflow
)
# Create PDF
file_path = generate_architecture_pdf(
data=result,
filename="architecture_report.pdf"
)
return FileResponse(
path=file_path,
filename="SystemForge_Architecture_Report.pdf",
media_type="application/pdf"
)
except HTTPException:
raise
except Exception as e:
print("========== FULL BACKEND ERROR ==========")
print(f"PDF Generation Error: {str(e)}")
traceback.print_exc()
print("========================================")
raise HTTPException(
status_code=500,
detail=f"Failed to download pdf: {str(e)}"
)