2024-01-07 22:17:22 +00:00
|
|
|
"""
|
|
|
|
project: lollms_webui
|
|
|
|
file: latex_execution_engine.py
|
|
|
|
author: ParisNeo
|
|
|
|
description:
|
|
|
|
This is a utility for executing latex code
|
|
|
|
|
|
|
|
"""
|
|
|
|
from fastapi import APIRouter, Request, routing
|
|
|
|
from lollms_webui import LOLLMSWebUI
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from starlette.responses import StreamingResponse
|
|
|
|
from lollms.types import MSG_TYPE
|
|
|
|
from lollms.main_config import BaseConfig
|
2024-01-07 23:22:23 +00:00
|
|
|
from ascii_colors import get_trace_exception, trace_exception
|
2024-01-07 22:17:22 +00:00
|
|
|
from ascii_colors import ASCIIColors
|
2024-02-26 00:55:44 +00:00
|
|
|
from lollms.databases.discussions_database import DiscussionsDB
|
2024-01-07 22:17:22 +00:00
|
|
|
from pathlib import Path
|
|
|
|
import tqdm
|
|
|
|
from fastapi import FastAPI, UploadFile, File
|
|
|
|
import shutil
|
|
|
|
import time
|
|
|
|
import subprocess
|
|
|
|
import json
|
2024-02-28 00:06:59 +00:00
|
|
|
from lollms.client_session import Client
|
2024-06-23 20:27:27 +00:00
|
|
|
from lollms.utilities import discussion_path_to_url
|
2024-02-28 00:06:59 +00:00
|
|
|
|
2024-01-07 22:17:22 +00:00
|
|
|
|
|
|
|
lollmsElfServer:LOLLMSWebUI = LOLLMSWebUI.get_instance()
|
|
|
|
|
2024-02-28 00:06:59 +00:00
|
|
|
def execute_latex(code, client:Client, message_id):
|
2024-04-10 07:29:09 +00:00
|
|
|
# Start the timer.
|
|
|
|
start_time = time.time()
|
2024-01-07 22:17:22 +00:00
|
|
|
|
2024-04-10 07:29:09 +00:00
|
|
|
# Create a temporary file.
|
|
|
|
root_folder = client.discussion.discussion_folder
|
|
|
|
root_folder.mkdir(parents=True,exist_ok=True)
|
|
|
|
tmp_file = root_folder/f"latex_file_{message_id}.tex"
|
2024-04-10 07:40:15 +00:00
|
|
|
with open(tmp_file,"w", encoding="utf-8") as f:
|
2024-04-10 07:29:09 +00:00
|
|
|
f.write(code)
|
2024-01-07 22:17:22 +00:00
|
|
|
|
2024-04-10 07:29:09 +00:00
|
|
|
try:
|
|
|
|
# Determine the pdflatex command based on the provided or default path
|
|
|
|
if lollmsElfServer.config.pdf_latex_path:
|
|
|
|
pdflatex_command = lollmsElfServer.config.pdf_latex_path
|
|
|
|
else:
|
|
|
|
pdflatex_command = 'pdflatex'
|
|
|
|
# Set the execution path to the folder containing the tmp_file
|
|
|
|
execution_path = tmp_file.parent
|
2024-01-07 22:17:22 +00:00
|
|
|
|
2024-04-10 07:29:09 +00:00
|
|
|
# Execute the Python code in a temporary file.
|
|
|
|
process = subprocess.Popen(
|
|
|
|
[pdflatex_command, "-interaction=nonstopmode", str(tmp_file)],
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
stderr=subprocess.PIPE,
|
|
|
|
cwd=execution_path
|
|
|
|
)
|
2024-01-07 22:17:22 +00:00
|
|
|
|
2024-04-10 07:29:09 +00:00
|
|
|
# Get the output and error from the process.
|
|
|
|
output, error = process.communicate()
|
|
|
|
except Exception as ex:
|
2024-01-07 22:17:22 +00:00
|
|
|
# Stop the timer.
|
|
|
|
execution_time = time.time() - start_time
|
2024-04-10 07:29:09 +00:00
|
|
|
error_message = f"Error executing Python code: {ex}"
|
|
|
|
error_json = {"output": "<div class='text-red-500'>"+ex+"\n"+get_trace_exception(ex)+"</div>", "execution_time": execution_time}
|
|
|
|
return error_json
|
2024-01-07 22:17:22 +00:00
|
|
|
|
2024-04-10 07:29:09 +00:00
|
|
|
# Stop the timer.
|
|
|
|
execution_time = time.time() - start_time
|
|
|
|
|
|
|
|
# Check if the process was successful.
|
|
|
|
if process.returncode != 0:
|
|
|
|
# The child process threw an exception.
|
2024-04-10 07:40:15 +00:00
|
|
|
pdf_file = tmp_file.with_suffix('.pdf')
|
|
|
|
print(f"PDF file generated: {pdf_file}")
|
2024-04-10 07:29:09 +00:00
|
|
|
try:
|
2024-04-10 07:40:15 +00:00
|
|
|
error_message = f"Error executing Python code:\n{error.decode('utf-8', errors='ignore')}"
|
2024-04-10 07:29:09 +00:00
|
|
|
except:
|
|
|
|
error_message = f"Error executing Python code:\n{error}"
|
2024-04-10 07:40:15 +00:00
|
|
|
if pdf_file.exists():
|
|
|
|
# The child process was successful.
|
|
|
|
pdf_file=str(pdf_file).replace("\\","/")
|
|
|
|
if not "http" in lollmsElfServer.config.host and not "https" in lollmsElfServer.config.host:
|
|
|
|
host = "http://"+lollmsElfServer.config.host
|
|
|
|
else:
|
|
|
|
host = lollmsElfServer.config.host
|
|
|
|
|
2024-06-23 20:27:27 +00:00
|
|
|
url = f"{host}:{lollmsElfServer.config.port}/{discussion_path_to_url(pdf_file)}"
|
2024-04-10 07:40:15 +00:00
|
|
|
error_json = {"output": f"<div>Pdf file generated at: {pdf_file}\n<a href='{url}' target='_blank'>Click here to show</a></div><div>Output:{output.decode('utf-8', errors='ignore')}\n</div><div class='text-red-500'>"+error_message+"</div>", "execution_time": execution_time}
|
|
|
|
|
|
|
|
else:
|
|
|
|
error_json = {"output": f"<div>Output:{output.decode('utf-8', errors='ignore')}\n</div><div class='text-red-500'>"+error_message+"</div>", "execution_time": execution_time}
|
2024-04-10 07:29:09 +00:00
|
|
|
return error_json
|
|
|
|
|
|
|
|
# The child process was successful.
|
2024-04-10 07:40:15 +00:00
|
|
|
# If the compilation is successful, you will get a PDF file
|
|
|
|
pdf_file = tmp_file.with_suffix('.pdf')
|
|
|
|
print(f"PDF file generated: {pdf_file}")
|
|
|
|
|
2024-04-10 07:29:09 +00:00
|
|
|
# The child process was successful.
|
|
|
|
pdf_file=str(pdf_file).replace("\\","/")
|
|
|
|
if not "http" in lollmsElfServer.config.host and not "https" in lollmsElfServer.config.host:
|
|
|
|
host = "http://"+lollmsElfServer.config.host
|
|
|
|
else:
|
|
|
|
host = lollmsElfServer.config.host
|
|
|
|
|
2024-07-05 04:53:17 +00:00
|
|
|
url = f"{host}:{lollmsElfServer.config.port}{discussion_path_to_url(pdf_file)}"
|
2024-04-10 07:29:09 +00:00
|
|
|
output_json = {"output": f"Pdf file generated at: {pdf_file}\n<a href='{url}' target='_blank'>Click here to show</a>", "execution_time": execution_time}
|
|
|
|
return output_json
|