File size: 3,145 Bytes
3a01f1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env python3
"""Hugging Face Space — MiniMax Video Prompt Enhancer (CPU / GGUF).

Serves the fine-tuned 350M model via llama.cpp on CPU. No ZeroGPU quota,
no CUDA, no login required for inference.

llama-cpp-python is installed from a prebuilt manylinux wheel (see
requirements.txt) — never compile from source on the Space.

Model weights (Q4_K_M GGUF) come from preload_from_hub / Hub download unless
a local models/*.gguf or GGUF_PATH is set.
"""

from __future__ import annotations

import os
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parent
if str(ROOT) not in sys.path:
    sys.path.insert(0, str(ROOT))

# Fail fast with a clear message if the wheel did not install.
try:
    import llama_cpp  # noqa: F401
except Exception as exc:  # pragma: no cover
    raise SystemExit(
        "llama-cpp-python failed to import. The Space must install the prebuilt "
        "manylinux wheel from requirements.txt (not a source build).\n"
        f"Import error: {exc}"
    ) from exc

from huggingface_hub import hf_hub_download

from minimax.apps.gradio import build_app
from minimax.modeling.gguf_runtime import effective_cpus, resolve_gguf_file
from minimax.paths import DEFAULT_GGUF_FILE, DEFAULT_GGUF_REPO

GGUF_REPO = os.environ.get("GGUF_REPO", DEFAULT_GGUF_REPO)
GGUF_FILE = os.environ.get("GGUF_FILE", DEFAULT_GGUF_FILE)
LOCAL_MODELS = ROOT / "models"
N_THREADS = int(os.environ.get("N_THREADS", "0")) or None
N_CTX = int(os.environ.get("N_CTX", "4096"))


def resolve_model_path() -> str:
    env = os.environ.get("GGUF_PATH") or os.environ.get("MODEL_ID")
    if env and (Path(env).exists() or str(env).endswith(".gguf")):
        p = Path(env)
        if p.exists():
            return str(resolve_gguf_file(p) if p.is_dir() else p)
        if str(env).endswith(".gguf") and (LOCAL_MODELS / env).is_file():
            return str(LOCAL_MODELS / env)

    if LOCAL_MODELS.is_dir() and list(LOCAL_MODELS.glob("*.gguf")):
        path = str(resolve_gguf_file(LOCAL_MODELS))
        print(f"[boot] using local GGUF {path}", flush=True)
        return path

    # Prefer HF cache from preload_from_hub; falls back to download.
    print(f"[boot] resolving {GGUF_REPO}/{GGUF_FILE} …", flush=True)
    return hf_hub_download(repo_id=GGUF_REPO, filename=GGUF_FILE)


print(f"[boot] llama_cpp ok  cpus={effective_cpus()}", flush=True)
MODEL_PATH = resolve_model_path()
print(
    f"[boot] GGUF={MODEL_PATH}  n_threads={N_THREADS or 'auto'}  n_ctx={N_CTX}",
    flush=True,
)

demo = build_app(
    model_path=MODEL_PATH,
    backend="gguf",
    n_ctx=N_CTX,
    n_threads=N_THREADS,
    n_gpu_layers=0,
    prefer_cpu=True,
)

# Eager-load so the first visitor is not hit with cold-start load only.
_session = demo._minimax_session  # type: ignore[attr-defined]
_loaded = _session.ensure_loaded()
print(
    f"[boot] ready  path={getattr(_loaded, 'path', MODEL_PATH)}  "
    f"n_threads={getattr(_loaded, 'n_threads', '?')}",
    flush=True,
)

if __name__ == "__main__":
    demo.queue(default_concurrency_limit=1)
    demo.launch(server_name="0.0.0.0", server_port=int(os.environ.get("PORT", 7860)))