Engine-Update-Fix: neueste Release MIT Vulkan-Asset waehlen (404 vermeiden)
Ursache des fehlgeschlagenen Engine-Updates: die allerneueste llama.cpp-Release traegt oft noch KEINE CI-Binaries (0 Assets). update-engine.sh lud aber stur von releases/latest → 404 „Download fehlgeschlagen". Fix: - update-engine.sh: nimmt die neueste Release, die wirklich ein ubuntu-vulkan-x64.tar.gz traegt, und nutzt dessen echte browser_download_url (robust gegen Namensaenderungen). - maintenance.py: _engine_update_available + engine_update_details pruefen jetzt ebenfalls gegen die neueste ASSET-tragende Release → das Badge luegt nicht mehr („verfuegbar", aber Download 404). Verifiziert: aufgeloeste URL liefert HTTP 200. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,24 @@ ENGINE_PATH = os.environ.get("MC_ENGINE_PATH", "/opt/llamacpp-vulkan")
|
|||||||
ENGINE_REPO = os.environ.get("MC_ENGINE_REPO", "ggml-org/llama.cpp")
|
ENGINE_REPO = os.environ.get("MC_ENGINE_REPO", "ggml-org/llama.cpp")
|
||||||
_engine_cache = {"ts": 0.0, "avail": False}
|
_engine_cache = {"ts": 0.0, "avail": False}
|
||||||
|
|
||||||
|
# Neueste Release, die WIRKLICH ein Vulkan-x64-Binary trägt. Die allerneueste Release hat
|
||||||
|
# manchmal noch keine CI-Assets (0 Assets) → ihr Download-Link 404t. Sowohl der Update-Check
|
||||||
|
# als auch der Download (update-engine.sh) müssen daher die neueste ASSET-tragende Release
|
||||||
|
# nehmen, sonst zeigt das UI „Update verfügbar", das dann beim Einspielen scheitert.
|
||||||
|
_ENGINE_ASSET_RX = re.compile(r"ubuntu-vulkan-x64\.tar\.gz$", re.I)
|
||||||
|
|
||||||
|
|
||||||
|
def _latest_engine_asset_release() -> dict | None:
|
||||||
|
try:
|
||||||
|
rels = httpx.get(f"https://api.github.com/repos/{ENGINE_REPO}/releases?per_page=15",
|
||||||
|
timeout=8, headers={"User-Agent": "MissionControl2"}).json()
|
||||||
|
for rel in (rels if isinstance(rels, list) else []):
|
||||||
|
if any(_ENGINE_ASSET_RX.search(a.get("name", "")) for a in (rel.get("assets") or [])):
|
||||||
|
return rel
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return None
|
||||||
|
|
||||||
# Router = llama-swap (mostlygeek): proxyt Anfragen und wechselt die Modelle heiß. Eigenes
|
# Router = llama-swap (mostlygeek): proxyt Anfragen und wechselt die Modelle heiß. Eigenes
|
||||||
# Upstream-Projekt mit eigenem Release-Zyklus → getrennt von der Engine geführt.
|
# Upstream-Projekt mit eigenem Release-Zyklus → getrennt von der Engine geführt.
|
||||||
SWAP_UPDATE_CMD = os.environ.get(
|
SWAP_UPDATE_CMD = os.environ.get(
|
||||||
@@ -86,14 +104,13 @@ def _engine_update_available() -> bool:
|
|||||||
return _engine_cache["avail"]
|
return _engine_cache["avail"]
|
||||||
avail = False
|
avail = False
|
||||||
try:
|
try:
|
||||||
rel = httpx.get(f"https://api.github.com/repos/{ENGINE_REPO}/releases/latest",
|
rel = _latest_engine_asset_release() or {}
|
||||||
timeout=6, headers={"User-Agent": "MissionControl2"}).json()
|
|
||||||
tag = str(rel.get("tag_name", ""))
|
tag = str(rel.get("tag_name", ""))
|
||||||
latest = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None
|
latest = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None
|
||||||
installed = _installed_engine_build()
|
installed = _installed_engine_build()
|
||||||
if latest is not None and installed is not None:
|
if latest is not None and installed is not None:
|
||||||
avail = latest > installed # präziser Build-Nummer-Vergleich
|
avail = latest > installed # präziser Build-Nummer-Vergleich
|
||||||
else: # Fallback: Release-Datum vs. Engine-mtime
|
elif rel.get("published_at"): # Fallback: Release-Datum vs. Engine-mtime
|
||||||
pub = datetime.fromisoformat(rel["published_at"].replace("Z", "+00:00")).timestamp()
|
pub = datetime.fromisoformat(rel["published_at"].replace("Z", "+00:00")).timestamp()
|
||||||
avail = pub > os.path.getmtime(ENGINE_PATH) + 86400
|
avail = pub > os.path.getmtime(ENGINE_PATH) + 86400
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -360,8 +377,7 @@ def engine_update_details() -> dict:
|
|||||||
"latest_build": None, "latest_tag": None, "name": None,
|
"latest_build": None, "latest_tag": None, "name": None,
|
||||||
"url": None, "body": None}
|
"url": None, "body": None}
|
||||||
try:
|
try:
|
||||||
rel = httpx.get(f"https://api.github.com/repos/{ENGINE_REPO}/releases/latest",
|
rel = _latest_engine_asset_release() or {}
|
||||||
timeout=8, headers={"User-Agent": "MissionControl2"}).json()
|
|
||||||
tag = str(rel.get("tag_name", ""))
|
tag = str(rel.get("tag_name", ""))
|
||||||
info["latest_tag"] = tag
|
info["latest_tag"] = tag
|
||||||
info["latest_build"] = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None
|
info["latest_build"] = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None
|
||||||
|
|||||||
+11
-6
@@ -26,16 +26,21 @@ replace_dir(){
|
|||||||
[ -x "$VULKAN_DIR/llama-server" ]
|
[ -x "$VULKAN_DIR/llama-server" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
# 1. Release ermitteln + laden (vor jedem Eingriff am laufenden System)
|
# 1. Release ermitteln + laden (vor jedem Eingriff am laufenden System).
|
||||||
|
# ACHTUNG: Die ALLERNEUESTE Release traegt oft noch keine CI-Binaries (0 Assets) → ihr
|
||||||
|
# Download-Link 404t. Darum NICHT stumpf releases/latest nehmen, sondern die neueste
|
||||||
|
# Release, die WIRKLICH ein `ubuntu-vulkan-x64.tar.gz`-Asset hat, und dessen echte
|
||||||
|
# browser_download_url direkt verwenden (robust auch gegen kuenftige Namensaenderungen).
|
||||||
|
ASSET_RX='ubuntu-vulkan-x64\.tar\.gz$'
|
||||||
if [ -n "$PIN_BUILD" ]; then
|
if [ -n "$PIN_BUILD" ]; then
|
||||||
TAG="$PIN_BUILD"
|
TAG="$PIN_BUILD"
|
||||||
|
URL="https://github.com/ggml-org/llama.cpp/releases/download/${TAG}/llama-${TAG}-bin-ubuntu-vulkan-x64.tar.gz"
|
||||||
else
|
else
|
||||||
TAG="$(curl -s https://api.github.com/repos/ggml-org/llama.cpp/releases/latest | jq -r .tag_name)"
|
REL_JSON="$(curl -s 'https://api.github.com/repos/ggml-org/llama.cpp/releases?per_page=15')"
|
||||||
|
URL="$(printf '%s' "$REL_JSON" | jq -r --arg rx "$ASSET_RX" '[.[] | .assets[]? | select(.name|test($rx))][0].browser_download_url // empty')"
|
||||||
|
TAG="$(printf '%s' "$REL_JSON" | jq -r --arg rx "$ASSET_RX" '[.[] | select(any(.assets[]?; .name|test($rx)))][0].tag_name // empty')"
|
||||||
fi
|
fi
|
||||||
[ -n "$TAG" ] && [ "$TAG" != "null" ] || die "Konnte neuesten Release-Tag nicht ermitteln"
|
[ -n "$URL" ] && [ "$URL" != "null" ] || die "Kein Vulkan-x64-Build in den letzten Releases gefunden (404-Schutz)"
|
||||||
|
|
||||||
ASSET="llama-${TAG}-bin-ubuntu-vulkan-x64.tar.gz"
|
|
||||||
URL="https://github.com/ggml-org/llama.cpp/releases/download/${TAG}/${ASSET}"
|
|
||||||
TMP="$(mktemp -d)"
|
TMP="$(mktemp -d)"
|
||||||
trap 'rm -rf "$TMP"' EXIT
|
trap 'rm -rf "$TMP"' EXIT
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user