Gate setup/llama subprocess paths behind provider check; allow zerogpu_transformers
Browse files
app.py
CHANGED
|
@@ -798,7 +798,7 @@ def api_update_settings(payload: dict[str, Any]) -> dict[str, Any]:
|
|
| 798 |
updates["PHANTOM_GRID_LLAMACPP_GPU_LAYERS"] = gpu_layers
|
| 799 |
|
| 800 |
provider = updates.get("PHANTOM_GRID_LLM_PROVIDER", load_settings().llm_provider)
|
| 801 |
-
if provider not in {"minicpm_omni", "llama_cpp_server", "external_llama_cpp_server"}:
|
| 802 |
raise HTTPException(status_code=400, detail="Choose a supported AI backend.")
|
| 803 |
if provider == "llama_cpp_server":
|
| 804 |
model_path = Path(updates.get("PHANTOM_GRID_LLAMACPP_MODEL_PATH") or str(load_settings().llamacpp_model_path or "")).expanduser()
|
|
@@ -858,6 +858,17 @@ def api_llama_action(action: str, payload: dict[str, Any]) -> dict[str, Any]:
|
|
| 858 |
api_update_settings(payload)
|
| 859 |
settings = load_settings()
|
| 860 |
normalized = action.strip().lower()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 861 |
if settings.llm_provider == "external_llama_cpp_server" and normalized in {"start", "restart", "stop"}:
|
| 862 |
llama_status, omni_status = _service_statuses(settings)
|
| 863 |
return {
|
|
@@ -929,6 +940,24 @@ def api_omni_models() -> dict[str, Any]:
|
|
| 929 |
|
| 930 |
def api_setup_status() -> dict[str, Any]:
|
| 931 |
global _SETUP_PROCESS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 932 |
paths = _local_runtime_paths()
|
| 933 |
scan = scan_minicpm_models(paths["models"])
|
| 934 |
files_ready = (
|
|
@@ -983,6 +1012,10 @@ def api_setup_status() -> dict[str, Any]:
|
|
| 983 |
|
| 984 |
def api_setup_start(payload: dict[str, Any] | None = None) -> dict[str, Any]:
|
| 985 |
global _SETUP_PROCESS
|
|
|
|
|
|
|
|
|
|
|
|
|
| 986 |
# Persist any picker choices before kicking off setup so the provisioner
|
| 987 |
# and the launcher both see the chosen model/GPU/context.
|
| 988 |
if payload:
|
|
@@ -1504,6 +1537,9 @@ def _llama_status(settings, health: dict[str, Any] | None = None) -> dict[str, A
|
|
| 1504 |
|
| 1505 |
def _start_llama_process(settings) -> dict[str, Any]:
|
| 1506 |
global _LLAMA_PROCESS
|
|
|
|
|
|
|
|
|
|
| 1507 |
if _LLAMA_PROCESS is not None and _LLAMA_PROCESS.poll() is None:
|
| 1508 |
return {"ok": True, "event": f"The selected AI backend is already managed as PID {_LLAMA_PROCESS.pid}."}
|
| 1509 |
if settings.llm_provider == "external_llama_cpp_server":
|
|
|
|
| 798 |
updates["PHANTOM_GRID_LLAMACPP_GPU_LAYERS"] = gpu_layers
|
| 799 |
|
| 800 |
provider = updates.get("PHANTOM_GRID_LLM_PROVIDER", load_settings().llm_provider)
|
| 801 |
+
if provider not in {"minicpm_omni", "llama_cpp_server", "external_llama_cpp_server", "zerogpu_transformers"}:
|
| 802 |
raise HTTPException(status_code=400, detail="Choose a supported AI backend.")
|
| 803 |
if provider == "llama_cpp_server":
|
| 804 |
model_path = Path(updates.get("PHANTOM_GRID_LLAMACPP_MODEL_PATH") or str(load_settings().llamacpp_model_path or "")).expanduser()
|
|
|
|
| 858 |
api_update_settings(payload)
|
| 859 |
settings = load_settings()
|
| 860 |
normalized = action.strip().lower()
|
| 861 |
+
# ZeroGPU: no subprocess to start/stop/restart. Report status; ignore lifecycle verbs.
|
| 862 |
+
if settings.llm_provider == "zerogpu_transformers":
|
| 863 |
+
llama_status, omni_status = _service_statuses(settings)
|
| 864 |
+
event = "ZeroGPU backend runs in-process." if normalized in {"start", "restart", "stop"} else None
|
| 865 |
+
return {
|
| 866 |
+
"ok": True,
|
| 867 |
+
"event": event,
|
| 868 |
+
"llama": llama_status,
|
| 869 |
+
"omni": omni_status,
|
| 870 |
+
"settings": _settings_payload(settings),
|
| 871 |
+
}
|
| 872 |
if settings.llm_provider == "external_llama_cpp_server" and normalized in {"start", "restart", "stop"}:
|
| 873 |
llama_status, omni_status = _service_statuses(settings)
|
| 874 |
return {
|
|
|
|
| 940 |
|
| 941 |
def api_setup_status() -> dict[str, Any]:
|
| 942 |
global _SETUP_PROCESS
|
| 943 |
+
# ZeroGPU provider: the model is loaded in-process by llm/zerogpu_backend.py
|
| 944 |
+
# at import. There is no local runtime to install, no subprocess to manage,
|
| 945 |
+
# and no cmake/llama-server dependency. Report ready so the UI's auto-poll
|
| 946 |
+
# doesn't fire /api/setup/start (which would spawn the cmake provisioner).
|
| 947 |
+
if load_settings().llm_provider == "zerogpu_transformers":
|
| 948 |
+
health = OmniClient(load_settings()).health()
|
| 949 |
+
ready = bool(health.get("ready"))
|
| 950 |
+
return {
|
| 951 |
+
"ok": True,
|
| 952 |
+
"state": "ready" if ready else "installing",
|
| 953 |
+
"stage": "ready" if ready else "service",
|
| 954 |
+
"message": "ZeroGPU model is ready." if ready else "ZeroGPU model is loading...",
|
| 955 |
+
"progress": 100 if ready else 80,
|
| 956 |
+
"files_ready": True,
|
| 957 |
+
"service_ready": ready,
|
| 958 |
+
"installing": False,
|
| 959 |
+
"updated_at": None,
|
| 960 |
+
}
|
| 961 |
paths = _local_runtime_paths()
|
| 962 |
scan = scan_minicpm_models(paths["models"])
|
| 963 |
files_ready = (
|
|
|
|
| 1012 |
|
| 1013 |
def api_setup_start(payload: dict[str, Any] | None = None) -> dict[str, Any]:
|
| 1014 |
global _SETUP_PROCESS
|
| 1015 |
+
# ZeroGPU provider: nothing to install or launch — the in-process backend
|
| 1016 |
+
# was loaded at import. The setup-start request is a no-op.
|
| 1017 |
+
if load_settings().llm_provider == "zerogpu_transformers":
|
| 1018 |
+
return {**api_setup_status(), "event": "ZeroGPU runtime is in-process; no setup needed.", "ok": True}
|
| 1019 |
# Persist any picker choices before kicking off setup so the provisioner
|
| 1020 |
# and the launcher both see the chosen model/GPU/context.
|
| 1021 |
if payload:
|
|
|
|
| 1537 |
|
| 1538 |
def _start_llama_process(settings) -> dict[str, Any]:
|
| 1539 |
global _LLAMA_PROCESS
|
| 1540 |
+
# The ZeroGPU backend is in-process — there is no subprocess to spawn.
|
| 1541 |
+
if settings.llm_provider == "zerogpu_transformers":
|
| 1542 |
+
return {"ok": True, "event": "ZeroGPU backend runs in-process; no llama subprocess is needed."}
|
| 1543 |
if _LLAMA_PROCESS is not None and _LLAMA_PROCESS.poll() is None:
|
| 1544 |
return {"ok": True, "event": f"The selected AI backend is already managed as PID {_LLAMA_PROCESS.pid}."}
|
| 1545 |
if settings.llm_provider == "external_llama_cpp_server":
|