2024-02-05 22:50:40 +00:00
"""
project : lollms_webui
file : shell_execution_engine . py
author : ParisNeo
description :
This is a utility for executing python code
"""
from lollms_webui import LOLLMSWebUI
from ascii_colors import get_trace_exception , trace_exception
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-05-05 21:25:12 +00:00
from pathlib import Path
2024-02-05 22:50:40 +00:00
lollmsElfServer : LOLLMSWebUI = LOLLMSWebUI . get_instance ( )
2024-04-21 14:19:35 +00:00
def build_graphviz_output ( code , ifram_name = None ) :
2024-02-05 22:50:40 +00:00
"""
This function creates an HTML5 iframe with the given HTML content and iframe name .
Args :
html ( str ) : The HTML content to be displayed in the iframe .
ifram_name ( str , optional ) : The name of the iframe . Defaults to " unnamed " .
Returns :
str : The HTML string for the iframe .
"""
# Start the timer.
2024-04-21 14:19:35 +00:00
start_time = time . time ( )
2024-04-21 15:14:00 +00:00
if ifram_name is not None :
2024-04-21 14:19:35 +00:00
rendered = " \n " . join ( [
' <div style= " width: 100 % ; margin: 0 auto; " > ' ,
f ' <iframe id= " { ifram_name } " srcdoc= \' ' ,
' <style> ' ,
' iframe { ' ,
' width: 100 % ; ' ,
' height: 100 % ; ' ,
' border: none; ' ,
2024-05-05 21:25:12 +00:00
' } ' ,
2024-04-21 14:19:35 +00:00
' .graph { ' ,
' background-color: transparent; ' ,
' padding: 20px; ' ,
' border-radius: 10px; ' ,
' display: flex; ' ,
' justify-content: center; ' ,
' align-items: center; ' ,
' height: 100 % ; ' ,
' } ' ,
2024-05-05 21:25:12 +00:00
' #svg-container { ' ,
' border: 1px solid black; ' ,
' display: inline-block; ' ,
' } ' ,
' #controls { ' ,
' margin-top: 10px; ' ,
' } ' ,
2024-04-21 14:19:35 +00:00
' </style> ' ,
2024-05-05 21:25:12 +00:00
' <div id= " controls " > ' ,
' <button id= " zoom-in " >Zoom In</button> ' ,
' <button id= " zoom-out " >Zoom Out</button> ' ,
' <button id= " save-svg " >Save</button> ' ,
' </div> ' ,
' <div id= " svg-container " > ' ,
2024-04-21 14:19:35 +00:00
' <div id= " graph " class= " graph " ></div> ' ,
2024-05-05 21:25:12 +00:00
' </div> ' ,
2024-04-21 14:19:35 +00:00
' <script src= " https://github.com/mdaines/viz-js/releases/download/release-viz-3.2.4/viz-standalone.js " ></script> ' ,
' <script> ' ,
' // Initialize the mermaid library and render our diagram ' ,
' Viz.instance().then(function(viz) { ' ,
' var svg = viz.renderSVGElement(` ' ,
" \n " . join ( [ c . replace ( " ' " , " \" " ) for c in code . split ( " \n " ) if c . strip ( ) != " " ] ) ,
' `); ' ,
' document.getElementById( " graph " ).appendChild(svg); ' ,
' }); ' ,
' </script> ' ,
' <div style= " text-align: center; " > ' ,
' </div> ' ,
' \' style= " width: 100 % ; height: 600px; border: none; " ></iframe> ' ,
' </div> '
2024-05-05 21:25:12 +00:00
2024-04-21 14:19:35 +00:00
]
)
else :
2024-05-05 21:25:12 +00:00
with open ( Path ( __file__ ) . parent / " assets " / " graphviz_container.html " , " r " , encoding = " utf-8 " ) as f :
data = f . read ( )
rendered = data . replace ( " {{ svg_data}} " , " \n " . join ( [ c . replace ( " ' " , " \' " ) for c in code . split ( " \n " ) if c . strip ( ) != " " ] ) )
2024-04-21 14:19:35 +00:00
2024-02-05 22:50:40 +00:00
execution_time = time . time ( ) - start_time
return { " output " : rendered , " execution_time " : execution_time }
2024-04-21 00:50:43 +00:00
def execute_graphviz ( code , client : Client , message_id , build_file = False ) :
if build_file :
# Start the timer.
start_time = time . time ( )
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-02-05 22:50:40 +00:00
2024-04-21 00:50:43 +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 " ai_code_ { message_id } .html "
with open ( tmp_file , " w " , encoding = " utf8 " ) as f :
2024-04-21 02:05:53 +00:00
f . write ( build_graphviz_output ( code ) [ " output " ] )
2024-06-23 20:27:27 +00:00
link = f " { host } : { lollmsElfServer . config . port } / { discussion_path_to_url ( tmp_file ) } "
2024-04-30 07:18:01 +00:00
execution_time = time . time ( ) - start_time
2024-04-21 00:50:43 +00:00
output_json = { " output " : f ' <b>Page built successfully</b><br><a href= " { link } " target= " _blank " >Press here to view the page</a> ' , " execution_time " : execution_time }
return output_json
else :
2024-04-21 15:14:00 +00:00
return build_graphviz_output ( code , ifram_name = " iframe " )