import json import logging import os import sys from pathlib import Path import gradio as gr import structlog import uvicorn from dotenv import load_dotenv from fastapi import FastAPI from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from samgis_core.utilities import create_folders_if_not_exists from samgis_core.utilities import frontend_builder from samgis_core.utilities.session_logger import setup_logging # for some reason this do from spaces import GPU as SPACES_GPU from lisa_on_cuda.utils import app_helpers from lisa_on_cuda import routes load_dotenv() project_root_folder = Path(globals().get("__file__", "./_")).absolute().parent workdir = os.getenv("WORKDIR", project_root_folder) model_folder = Path(project_root_folder / "machine_learning_models") log_level = os.getenv("LOG_LEVEL", "INFO") setup_logging(log_level=log_level) app_logger = structlog.stdlib.get_logger() app_logger.info(f"PROJECT_ROOT_FOLDER:{project_root_folder}, WORKDIR:{workdir}.") folders_map = os.getenv("FOLDERS_MAP", "{}") markdown_text = os.getenv("MARKDOWN_TEXT", "") examples_text_list = os.getenv("EXAMPLES_TEXT_LIST", "").split("\n") example_body = json.loads(os.getenv("EXAMPLE_BODY", "{}")) mount_gradio_app = bool(os.getenv("MOUNT_GRADIO_APP", "")) static_dist_folder = Path(project_root_folder) / "static" / "dist" input_css_path = os.getenv("INPUT_CSS_PATH", "src/input.css") create_folders_if_not_exists.folders_creation(folders_map) CUSTOM_GRADIO_PATH = "/" CUSTOM_STATIC_PATH = "/static" FASTAPI_TITLE = "lisa_app" app = FastAPI(title=FASTAPI_TITLE, version="1.0") app.include_router(routes.router) frontend_builder.build_frontend( project_root_folder=workdir, input_css_path=input_css_path, output_dist_folder=static_dist_folder ) app_logger.info("build_frontend ok!") app.mount(CUSTOM_STATIC_PATH, StaticFiles(directory=static_dist_folder), name="static") @app.get(CUSTOM_STATIC_PATH) async def static() -> FileResponse: return FileResponse(path=str(static_dist_folder / "index.html"), media_type="text/html") templates = Jinja2Templates(directory="templates") app_logger.info(f"sys.argv:{sys.argv}.") args = app_helpers.parse_args([]) app_logger.info(f"prepared default arguments:{args}.") inference_fn = app_helpers.get_inference_model_by_args(args, inference_decorator=SPACES_GPU) app_logger.info(f"prepared inference_fn function:{inference_fn.__name__}, creating gradio interface...") io = app_helpers.get_gradio_interface(inference_fn, args=args) app_logger.info("created gradio interface") app = gr.mount_gradio_app(app, io, path=CUSTOM_GRADIO_PATH) app_logger.info("mounted gradio app within fastapi") if __name__ == '__main__': try: uvicorn.run(app, host="0.0.0.0", port=7860) except Exception as ex: logging.error(f"fastapi/gradio application {FASTAPI_TITLE} exception:{ex}.") raise ex