Spaces:
Sleeping
Sleeping
| """app.py — entrypoint used by Hugging Face Spaces | |
| Creates a writable files directory for Chainlit and starts the Chainlit app. | |
| This file is robust for both Docker and non-Docker runtimes: | |
| - If CHAINLIT_FILES_DIR is set (e.g. by the Dockerfile), it will use that. | |
| - Otherwise it tries /home/user/app/.files (the Docker image's path created at build-time). | |
| - If neither is writable it will fall back to /tmp/mini_transformer_files. | |
| It then runs the chainlit CLI against the packaged `mini_transformer.apps.chainlit_app`. | |
| """ | |
| import os | |
| import subprocess | |
| import sys | |
| from pathlib import Path | |
| # Prefer an externally provided writable directory | |
| files_dir = os.environ.get("CHAINLIT_FILES_DIR") | |
| if files_dir: | |
| files_path = Path(files_dir) | |
| else: | |
| # prefer repo-level .files under /home/user/app (created by Dockerfile), else fallback to /tmp | |
| candidate = Path("/home/user/app/.files") | |
| if candidate.exists() and os.access(candidate, os.W_OK): | |
| files_path = candidate | |
| else: | |
| files_path = Path(os.environ.get("TMPDIR", "/tmp")) / "mini_transformer_files" | |
| # Ensure directory exists and is writable | |
| try: | |
| files_path.mkdir(parents=True, exist_ok=True) | |
| # Try to set permissive access for the runtime user | |
| try: | |
| files_path.chmod(0o700) | |
| except Exception: | |
| pass | |
| except Exception as exc: # pragma: no cover - permissive in container | |
| print(f"Failed to create files dir {files_path}: {exc}", file=sys.stderr) | |
| raise | |
| # Export helpful env vars for Chainlit and other libs | |
| os.environ.setdefault("CHAINLIT_FILES_DIR", str(files_path)) | |
| os.environ.setdefault("TMPDIR", str(files_path)) | |
| os.environ.setdefault("XDG_CACHE_HOME", str(files_path / "cache")) | |
| os.environ.setdefault("XDG_STATE_HOME", str(files_path / "state")) | |
| port = os.environ.get("PORT", os.environ.get("MINI_TRANSFORMER_UI_PORT", "7860")) | |
| host = os.environ.get("HOST", "0.0.0.0") | |
| # Resolve path to packaged chainlit app. If the source files aren't present, rely on installed package. | |
| app_path = Path(__file__).parent / "src" / "mini_transformer" / "apps" / "chainlit_app.py" | |
| if not app_path.exists(): | |
| try: | |
| import mini_transformer.apps.chainlit_app as packed | |
| app_path = Path(packed.__file__) | |
| except Exception: | |
| print("Could not locate mini_transformer.apps.chainlit_app. Make sure package files are present.", file=sys.stderr) | |
| raise SystemExit(1) | |
| cmd = ["chainlit", "run", str(app_path), "--host", host, "--port", str(port)] | |
| print("Starting Chainlit with:\n", " ".join(cmd)) | |
| # Run Chainlit as foreground process | |
| try: | |
| subprocess.run(cmd, check=True) | |
| except FileNotFoundError: | |
| print("'chainlit' CLI not found. Ensure 'chainlit' is in requirements.txt and installed.", file=sys.stderr) | |
| raise | |