mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-07-08 11:56:59 +00:00
Show cached model scan failures
This commit is contained in:
@@ -932,10 +932,16 @@ def setup_cookbook_routes() -> APIRouter:
|
||||
cwd=str(Path.home()),
|
||||
)
|
||||
stdout_b, stderr_b = await asyncio.wait_for(proc.communicate(), timeout=60)
|
||||
stderr_txt = stderr_b.decode(errors="replace").strip()
|
||||
stdout_txt = stdout_b.decode(errors="replace").strip()
|
||||
if proc.returncode != 0:
|
||||
msg = stderr_txt or f"Cached model scan failed with exit code {proc.returncode}"
|
||||
logger.warning(f"Cached model scan failed host={host or 'local'} rc={proc.returncode}: {msg[:500]}")
|
||||
return {"models": [], "host": host or "local", "error": msg}
|
||||
|
||||
models = []
|
||||
try:
|
||||
raw = json.loads(stdout_b.decode(errors="replace").strip())
|
||||
raw = json.loads(stdout_txt)
|
||||
for m in raw:
|
||||
size_gb = m["size_bytes"] / (1024 ** 3)
|
||||
if size_gb >= 1:
|
||||
@@ -963,8 +969,11 @@ def setup_cookbook_routes() -> APIRouter:
|
||||
entry["gguf_files"] = m["gguf_files"]
|
||||
models.append(entry)
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to parse cached models: {e}")
|
||||
logger.warning(f"stderr: {stderr_b.decode(errors='replace')[:500]}")
|
||||
logger.warning(f"Failed to parse cached models host={host or 'local'}: {e}")
|
||||
if stderr_txt:
|
||||
logger.warning(f"stderr: {stderr_txt[:500]}")
|
||||
msg = stderr_txt or stdout_txt[:500] or str(e)
|
||||
return {"models": [], "host": host or "local", "error": msg}
|
||||
|
||||
return {"models": models, "host": host or "local"}
|
||||
|
||||
|
||||
@@ -625,7 +625,6 @@ export async function _hwfitFetch(fresh = false, opts = {}) {
|
||||
// Only fetch cached model IDs when server changes, not on every search/sort
|
||||
const remoteKey = _currentServerValue();
|
||||
if (!_cachedModelIds || _lastCacheHost() !== remoteKey) {
|
||||
_setLastCacheHost(remoteKey);
|
||||
const _cacheSrv = _serverByVal(_envState.remoteServerKey || remoteHost);
|
||||
const _cachePort = _cacheSrv?.port || '';
|
||||
const _cacheParams = new URLSearchParams();
|
||||
@@ -637,9 +636,11 @@ export async function _hwfitFetch(fresh = false, opts = {}) {
|
||||
fetch(`/api/model/cached?${_cacheParams}`, { credentials: 'same-origin' })
|
||||
.then(r => r.json())
|
||||
.then(d => {
|
||||
if (d && d.error) throw new Error(d.error);
|
||||
// Exclude stalled (download-shell) entries — a 12 KB README-only
|
||||
// folder shouldn't count as "downloaded" in the Scan/Download list.
|
||||
_cachedModelIds = new Set((d.models || []).filter(m => m.status !== 'stalled').map(m => m.repo_id));
|
||||
_setLastCacheHost(remoteKey);
|
||||
// Re-mark rows if already rendered
|
||||
list.querySelectorAll('.hwfit-row[data-model]').forEach(row => {
|
||||
const name = row.dataset.model;
|
||||
@@ -650,7 +651,10 @@ export async function _hwfitFetch(fresh = false, opts = {}) {
|
||||
}
|
||||
}
|
||||
});
|
||||
}).catch(() => {});
|
||||
}).catch((err) => {
|
||||
console.warn('Cached model marker scan failed:', err);
|
||||
_setLastCacheHost('');
|
||||
});
|
||||
}
|
||||
if (_paintedFromCache) {
|
||||
try { wp.destroy(); } catch {}
|
||||
|
||||
@@ -3657,7 +3657,10 @@ function _renderCachedModelsData(list, data, host) {
|
||||
if (!host) {
|
||||
list.innerHTML = '<div class="hwfit-loading" style="flex-direction:column;gap:6px;text-align:center;"><div>No cached models found</div><div style="font-size:11px;opacity:0.55;max-width:420px;line-height:1.4;">Docker Local uses Odysseus’s cache in <code>data/huggingface</code>. Download a model here, or copy an existing host HuggingFace cache into that folder once.</div></div>';
|
||||
} else {
|
||||
list.innerHTML = '<div class="hwfit-loading">No cached models found</div>';
|
||||
list.innerHTML = '<div class="hwfit-loading" style="flex-direction:column;gap:8px;text-align:center;"><div>No cached models found</div><div style="font-size:11px;opacity:0.55;max-width:420px;line-height:1.4;">No complete model folders were found on this server.</div><button type="button" class="hwfit-gpu-btn serve-empty-scan-btn" style="height:26px;padding:3px 10px;">Refresh</button></div>';
|
||||
list.querySelector('.serve-empty-scan-btn')?.addEventListener('click', () => {
|
||||
_fetchCachedModels(true);
|
||||
});
|
||||
}
|
||||
const tagContainer = document.getElementById('serve-tags');
|
||||
if (tagContainer) tagContainer.innerHTML = '';
|
||||
@@ -3822,12 +3825,16 @@ export async function _fetchCachedModels(fresh = false, opts = {}) {
|
||||
throw new Error(`HTTP ${res.status} ${res.statusText}${msg ? `: ${msg}` : ''}`);
|
||||
}
|
||||
const data = await res.json();
|
||||
if (data && data.error) throw new Error(data.error);
|
||||
_writeCachedModelScan(scanSig, data);
|
||||
_dlWp.destroy();
|
||||
_renderCachedModelsData(list, data, host);
|
||||
} catch (e) {
|
||||
_dlWp.destroy();
|
||||
list.innerHTML = `<div class="hwfit-loading">Failed: ${esc(e.message)}</div>`;
|
||||
list.innerHTML = `<div class="hwfit-loading" style="flex-direction:column;gap:8px;text-align:center;"><div style="color:var(--red);font-weight:600;">Cached model scan failed</div><div style="font-size:11px;opacity:0.65;max-width:420px;line-height:1.4;">${esc(e.message)}</div><button type="button" class="hwfit-gpu-btn serve-empty-scan-btn" style="height:26px;padding:3px 10px;">Retry</button></div>`;
|
||||
list.querySelector('.serve-empty-scan-btn')?.addEventListener('click', () => {
|
||||
_fetchCachedModels(true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user