mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-09-22 06:00:56 +02:00

* feat: Add Code Interpreter Plugin Adds a Simple Code Interpreter Plugin. ## Features: - Runs code using local Python Environment ## Issues - Code execution is not sandboxed. * Add Docker Sandbox for Python Server
65 lines
No EOL
1.8 KiB
Python
65 lines
No EOL
1.8 KiB
Python
import asyncio
|
|
import websockets
|
|
import io
|
|
import sys
|
|
import os as ps
|
|
import shutil
|
|
|
|
|
|
def execute_code(code):
|
|
try:
|
|
stdout_capture = io.StringIO()
|
|
sys.stdout = stdout_capture
|
|
exec(code, globals())
|
|
stdout_output = stdout_capture.getvalue()
|
|
sys.stdout = sys.__stdout__
|
|
return stdout_output
|
|
except Exception as e:
|
|
return str(e)
|
|
|
|
|
|
def move_files():
|
|
assets_path = "/app/pyassets" # Update the assets folder path
|
|
current_dir = ps.getcwd()
|
|
moved_files = []
|
|
for filename in ps.listdir(current_dir):
|
|
full_path = ps.path.join(current_dir, filename)
|
|
if ps.path.isfile(full_path) and filename != 'server.py':
|
|
new_path = ps.path.join(assets_path, filename)
|
|
shutil.move(full_path, new_path)
|
|
moved_files.append(filename)
|
|
return moved_files
|
|
|
|
|
|
def generate_links(filenames):
|
|
base_url = ps.environ['BASE_URL']
|
|
if(base_url == ''):
|
|
return
|
|
base_url = base_url + '/assets/pyassets'
|
|
links = [f"" for filename in filenames]
|
|
return links
|
|
|
|
|
|
async def handle_client(websocket, path):
|
|
try:
|
|
code = await websocket.recv()
|
|
result = execute_code(code)
|
|
filenames = move_files()
|
|
links = generate_links(filenames)
|
|
final_result = f"{result}\n"
|
|
final_result += "\n".join(links)
|
|
await websocket.send(final_result)
|
|
except websockets.exceptions.ConnectionClosed:
|
|
pass
|
|
|
|
async def server(websocket, path):
|
|
print(f"Incoming connection from {websocket.remote_address}")
|
|
while True:
|
|
await handle_client(websocket, path)
|
|
|
|
start_server = websockets.serve(server, '0.0.0.0', 3380)
|
|
|
|
print('Server started, listening on localhost:3380')
|
|
|
|
asyncio.get_event_loop().run_until_complete(start_server)
|
|
asyncio.get_event_loop().run_forever() |