from fastapi import FastAPI, Request from fastapi.responses import Response from fastapi.responses import FileResponse from pydantic import BaseModel import random import re import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages import pandas as pd import io app = FastAPI() # Define the ticket schema using Pydantic class Ticket(BaseModel): name: str department: str category: str description: str service_category: str difficulty: int # Adjust type as needed (e.g., int or str) class Code(BaseModel): code: str project_id: str chain_id: str session_id: str @app.get("/") def greet_json(): return {"Hello": "World!"} @app.post("/ticket") async def create_ticket(ticket: Ticket): # Here you can process the ticket, e.g., save it to a database. # For now, we simply return the received ticket data. tick = ticket.dict() tick["number"] = random.randint(1000, 9999) return { "message": "Ticket created successfully", "ticket": tick } @app.post("/run_code") async def run_code(code: Code, request: Request): # img_buffer = io.BytesIO() pattern = f"""```python([\s\S]*?)```""" codes = re.findall(pattern, code.code) if codes: print(codes) exec("\n".join(codes)) else: print(code.code) exec(code.code) # img_buffer.seek(0) # Reset buffer position file_path = f"graphs_{code.project_id}_{code.chain_id}_{code.session_id}.pdf" # if "plt.subplots(" in code.code: # print("SUBPLOTS DETECTED") # exec(code.code + "\nfig.savefig(file_path)\nplt.close()") # else: # print("NO SUBPLOTS") # exec(code.code + "\nplt.savefig(file_path)\nplt.close()") # plt.close() # plt.savefig(file_path) # plt.close() # Get all open figures figures = [plt.figure(i) for i in plt.get_fignums()] # Save all figures in a single PDF using PdfPages # pdf_filename = "all_graphs.pdf" with PdfPages(file_path) as pdf: for fig in figures: pdf.savefig(fig) # Save each figure as a page in the PDF plt.close(fig) # Close the figure to free memory print(f"Saved all figures to {file_path}") # return Response(content=img_buffer.getvalue(), media_type="image/png") # return FileResponse(file_path, media_type="image/png") # return FileResponse(file_path, media_type="application/pdf", filename="graph.pdf") return { "message": "Graph created succesfully!", "url": str(request.base_url) + f"chart/{code.project_id}/{code.chain_id}/{code.session_id}" } @app.get("/chart/{project_id}/{chain_id}/{session_id}") async def get_chart(project_id: str, chain_id: str, session_id: str): pdf_path = f"graphs_{project_id}_{chain_id}_{session_id}.pdf" return FileResponse(pdf_path, media_type="application/pdf")