From 091449e81bf1f8e14de6b4fa92624409441d4bdb Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Mon, 5 Aug 2024 16:34:37 -0700 Subject: [PATCH] build ui on custom path --- litellm/proxy/common_utils/admin_ui_utils.py | 65 ++++++++++++++++++++ litellm/proxy/proxy_server.py | 5 +- ui/litellm-dashboard/build_ui_custom_path.sh | 4 -- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/common_utils/admin_ui_utils.py b/litellm/proxy/common_utils/admin_ui_utils.py index bb35ecd69..3389f723d 100644 --- a/litellm/proxy/common_utils/admin_ui_utils.py +++ b/litellm/proxy/common_utils/admin_ui_utils.py @@ -1,4 +1,5 @@ import os +import subprocess def show_missing_vars_in_env(): @@ -165,3 +166,67 @@ def missing_keys_form(missing_key_names: str): """ return missing_keys_html_form.format(missing_keys=missing_key_names) + + +def setup_admin_ui_on_server_root_path(): + """ + Helper util to setup Admin UI on Server root path + """ + from litellm._logging import verbose_proxy_logger + + server_root_path = os.getenv("SERVER_ROOT_PATH", "") + if server_root_path != "": + if os.getenv("PROXY_BASE_URL") is None: + os.environ["PROXY_BASE_URL"] = server_root_path + + # re-build admin UI on server root path + # Save the original directory + original_dir = os.getcwd() + + current_dir = ( + os.path.dirname(os.path.abspath(__file__)) + + "/../../../ui/litellm-dashboard/" + ) + build_ui_path = os.path.join(current_dir, "build_ui_custom_path.sh") + package_path = os.path.join(current_dir, "package.json") + + verbose_proxy_logger.debug( + f"Setting up Admin UI on {server_root_path}/ui ......." + ) # noqa + + try: + # Change the current working directory + os.chdir(current_dir) + + # Make the script executable + subprocess.run(["chmod", "+x", "build_ui_custom_path.sh"], check=True) + + # Run npm install + subprocess.run(["npm", "install"], check=True) + + # Run npm run build + subprocess.run(["npm", "run", "build"], check=True) + + # Run the custom build script with the argument + subprocess.run( + ["./build_ui_custom_path.sh", f"{server_root_path}/ui"], check=True + ) + + verbose_proxy_logger.debug("Admin UI setup completed successfully.") # noqa + + except subprocess.CalledProcessError as e: + verbose_proxy_logger.debug( + f"An error occurred during the Admin UI setup: {e}" + ) # noqa + + except Exception as e: + verbose_proxy_logger.debug(f"An unexpected error occurred: {e}") + + finally: + # Always return to the original directory, even if an error occurred + os.chdir(original_dir) + verbose_proxy_logger.debug( + f"Returned to original directory: {original_dir}" + ) # noqa + + pass diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 17b23a361..260c728b5 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -138,6 +138,7 @@ from litellm.proxy.auth.user_api_key_auth import user_api_key_auth from litellm.proxy.caching_routes import router as caching_router from litellm.proxy.common_utils.admin_ui_utils import ( html_form, + setup_admin_ui_on_server_root_path, show_missing_vars_in_env, ) from litellm.proxy.common_utils.debug_utils import router as debugging_endpoints_router @@ -282,8 +283,8 @@ except Exception as e: pass server_root_path = os.getenv("SERVER_ROOT_PATH", "") -if server_root_path != "" and os.getenv("PROXY_BASE_URL") is None: - os.environ["PROXY_BASE_URL"] = server_root_path +if server_root_path != "": + setup_admin_ui_on_server_root_path() _license_check = LicenseCheck() premium_user: bool = _license_check.is_premium() ui_link = f"{server_root_path}/ui/" diff --git a/ui/litellm-dashboard/build_ui_custom_path.sh b/ui/litellm-dashboard/build_ui_custom_path.sh index ceb8c733d..f947f87d3 100755 --- a/ui/litellm-dashboard/build_ui_custom_path.sh +++ b/ui/litellm-dashboard/build_ui_custom_path.sh @@ -29,10 +29,6 @@ if [ $? -ne 0 ]; then exit 1 fi -# print contents of ui_colors.json -echo "Contents of ui_colors.json:" -cat ui_colors.json - # Run npm build with the environment variable UI_BASE_PATH=$UI_BASE_PATH npm run build