diff --git a/python/api/restart.py b/python/api/restart.py new file mode 100644 index 000000000..864e16968 --- /dev/null +++ b/python/api/restart.py @@ -0,0 +1,9 @@ +from python.helpers.api import ApiHandler +from flask import Request, Response + +from python.helpers import process + +class Restart(ApiHandler): + async def process(self, input: dict, request: Request) -> dict | Response: + process.reload() + return Response(status=200) \ No newline at end of file diff --git a/python/helpers/api.py b/python/helpers/api.py index 87bf6720f..c7133eba3 100644 --- a/python/helpers/api.py +++ b/python/helpers/api.py @@ -6,6 +6,9 @@ from agent import AgentContext from initialize import initialize from python.helpers.print_style import PrintStyle from python.helpers.errors import format_error +from werkzeug.serving import make_server + + class ApiHandler: diff --git a/python/helpers/process.py b/python/helpers/process.py new file mode 100644 index 000000000..e30662d3b --- /dev/null +++ b/python/helpers/process.py @@ -0,0 +1,35 @@ +import os +import sys +from python.helpers import runtime + +_server = None + +def set_server(server): + global _server + _server = server + +def get_server(server): + global _server + return _server + +def stop_server(): + global _server + if _server: + _server.shutdown() + _server = None + +def reload(): + stop_server() + if runtime.is_dockerized(): + exit_process() + else: + restart_process() + +def restart_process(): + print("Restarting process...") + python = sys.executable + os.execv(python, [python] + sys.argv) + +def exit_process(): + print("Exiting process...") + sys.exit(0) \ No newline at end of file diff --git a/run_ui.py b/run_ui.py index 117e0e774..73df32bb9 100644 --- a/run_ui.py +++ b/run_ui.py @@ -5,7 +5,7 @@ from flask import Flask, request, Response from flask_basicauth import BasicAuth from python.helpers import files, git from python.helpers.files import get_abs_path -from python.helpers import persist_chat, runtime, dotenv +from python.helpers import persist_chat, runtime, dotenv, process from python.helpers.cloudflare_tunnel import CloudflareTunnel from python.helpers.extract_tools import load_classes_from_folder from python.helpers.api import ApiHandler @@ -51,20 +51,22 @@ async def serve_index(): version_no=gitinfo["version"], version_time=gitinfo["commit_time"], ) + def run(): print("Initializing framework...") # Suppress only request logs but keep the startup messages from werkzeug.serving import WSGIRequestHandler + from werkzeug.serving import make_server class NoRequestLoggingWSGIRequestHandler(WSGIRequestHandler): def log_request(self, code="-", size="-"): pass # Override to suppress request logging # Get configuration from environment - port = runtime.get_arg("port") or int(os.environ.get("WEB_UI_PORT", 0)) or None - host = runtime.get_arg("host") or os.environ.get("WEB_UI_HOST") or None + port = runtime.get_arg("port") or int(os.environ.get("WEB_UI_PORT", 0)) or 5000 + host = runtime.get_arg("host") or os.environ.get("WEB_UI_HOST") or "localhost" use_cloudflare = ( runtime.get_arg("cloudflare_tunnel") or os.environ.get("USE_CLOUDFLARE", "false").lower() == "true" @@ -83,6 +85,8 @@ def run(): # initialize contexts from persisted chats persist_chat.load_tmp_chats() + server = None + def register_api_handler(app, handler): name = handler.__module__.split(".")[-1] instance = handler(app, lock) @@ -101,14 +105,14 @@ def run(): for handler in handlers: register_api_handler(app, handler) - - - try: + server = make_server(host=host, port=port, app=app, request_handler=NoRequestLoggingWSGIRequestHandler, threaded=True) + process.set_server(server) + server.serve_forever() # Run Flask app - app.run( - request_handler=NoRequestLoggingWSGIRequestHandler, port=port, host=host - ) + # app.run( + # request_handler=NoRequestLoggingWSGIRequestHandler, port=port, host=host + # ) finally: # Clean up tunnel if it was started if tunnel: diff --git a/webui/index.css b/webui/index.css index b2778a191..e9a15a1bd 100644 --- a/webui/index.css +++ b/webui/index.css @@ -780,7 +780,9 @@ font-size: var(--font-size-small) margin-bottom: var(--spacing-xs); padding: var(--spacing-sm) 0.75rem; text-wrap: nowrap; - width: 48%; + width: calc(50% - var(--spacing-xs)); + float:left; + margin-right: var(--spacing-xs); max-height: 2.3rem; -webkit-transition: all var(--transition-speed), transform 0.1s ease-in-out; transition: all var(--transition-speed), transform 0.1s ease-in-out; diff --git a/webui/index.html b/webui/index.html index e62897f1d..fc46ab212 100644 --- a/webui/index.html +++ b/webui/index.html @@ -20,10 +20,10 @@ - + - - + + @@ -73,6 +73,7 @@ + +