Fix monitor: use API slugs, show KB for small sizes

- Fetch real workspace slugs from AnythingLLM API instead of guessing
- Show KB instead of 0MB for small LanceDB/vector sizes
- Fixes incorrect vector detection after embedding engine change

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
salvacybersec
2026-04-07 00:40:13 +03:00
parent 3176ebf102
commit fd29c0efb6

View File

@@ -108,6 +108,19 @@ def collect_status():
lance_ws = get_lance_workspaces() lance_ws = get_lance_workspaces()
lance_sizes = get_lance_sizes() lance_sizes = get_lance_sizes()
# Get real slugs from API
api_slugs = {} # workspace name → slug
if requests:
try:
url = f"{config['anythingllm']['base_url']}/workspaces"
headers = {"Authorization": f"Bearer {config['anythingllm']['api_key']}"}
resp = requests.get(url, headers=headers, timeout=5)
if resp.status_code == 200:
for ws in resp.json().get("workspaces", []):
api_slugs[ws["name"]] = ws["slug"]
except Exception:
pass
# Build expected doc counts per persona # Build expected doc counts per persona
folder_counts = {} folder_counts = {}
for fpath, info in uploaded.items(): for fpath, info in uploaded.items():
@@ -117,13 +130,8 @@ def collect_status():
personas = [] personas = []
for codename, ws_cfg in workspaces.items(): for codename, ws_cfg in workspaces.items():
slug = ws_cfg["name"].lower() # Use real slug from API, fallback to name-based guess
# Normalize slug like AnythingLLM does slug = api_slugs.get(ws_cfg["name"], codename)
import re
slug = re.sub(r'[^a-z0-9\s-]', '', slug.replace('ş', 's').replace('ç', 'c')
.replace('ğ', 'g').replace('ü', 'u').replace('ö', 'o')
.replace('ı', 'i').replace('İ', 'i').replace('&', 'and'))
slug = re.sub(r'\s+', '-', slug.strip())
# Expected docs from mapped folders # Expected docs from mapped folders
expected = 0 expected = 0
@@ -142,6 +150,7 @@ def collect_status():
personas.append({ personas.append({
"codename": codename, "codename": codename,
"name": ws_cfg["name"], "name": ws_cfg["name"],
"slug": slug,
"expected": expected, "expected": expected,
"assigned": assigned, "assigned": assigned,
"has_vectors": has_vectors, "has_vectors": has_vectors,
@@ -362,7 +371,7 @@ function render(data) {
<div class="summary-card"><div class="label">Uploaded</div><div class="value">${data.total_uploaded}</div><div class="unit">files</div></div> <div class="summary-card"><div class="label">Uploaded</div><div class="value">${data.total_uploaded}</div><div class="unit">files</div></div>
<div class="summary-card"><div class="label">Assigned</div><div class="value">${data.total_assigned}</div><div class="unit">docs</div></div> <div class="summary-card"><div class="label">Assigned</div><div class="value">${data.total_assigned}</div><div class="unit">docs</div></div>
<div class="summary-card"><div class="label">Vectors</div><div class="value">${data.personas_with_vectors}<span class="unit">/${data.total_personas}</span></div><div class="unit">${pctVec}%</div></div> <div class="summary-card"><div class="label">Vectors</div><div class="value">${data.personas_with_vectors}<span class="unit">/${data.total_personas}</span></div><div class="unit">${pctVec}%</div></div>
<div class="summary-card"><div class="label">LanceDB</div><div class="value">${Math.round(data.lancedb_size_mb)}<span class="unit">MB</span></div></div> <div class="summary-card"><div class="label">LanceDB</div><div class="value">${data.lancedb_size_mb < 1 ? Math.round(data.lancedb_size_mb * 1024) + '<span class="unit">KB</span>' : Math.round(data.lancedb_size_mb) + '<span class="unit">MB</span>'}</div></div>
<div class="summary-card"><div class="label">Documents</div><div class="value">${Math.round(data.docs_size_mb)}<span class="unit">MB</span></div></div> <div class="summary-card"><div class="label">Documents</div><div class="value">${Math.round(data.docs_size_mb)}<span class="unit">MB</span></div></div>
`; `;
@@ -389,7 +398,7 @@ function render(data) {
const pct = p.expected > 0 ? Math.round(p.assigned / p.expected * 100) : 0; const pct = p.expected > 0 ? Math.round(p.assigned / p.expected * 100) : 0;
const vecClass = p.has_vectors ? 'vec-ok' : 'vec-no'; const vecClass = p.has_vectors ? 'vec-ok' : 'vec-no';
const vecIcon = p.has_vectors ? '' : ''; const vecIcon = p.has_vectors ? '' : '';
const sizeStr = p.vector_size_mb > 0 ? Math.round(p.vector_size_mb) + 'MB' : ''; const sizeStr = p.vector_size_mb > 0 ? (p.vector_size_mb < 1 ? Math.round(p.vector_size_mb * 1024) + 'KB' : Math.round(p.vector_size_mb) + 'MB') : '';
html += `<tr> html += `<tr>
<td class="vec-icon ${vecClass}">${vecIcon}</td> <td class="vec-icon ${vecClass}">${vecIcon}</td>
<td class="persona-name">${code}</td> <td class="persona-name">${code}</td>