diff --git a/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md b/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md index 875e6602..17a28629 100644 --- a/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md +++ b/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md @@ -26,7 +26,7 @@ - [x] **B1. Hardcoded machine specs in header** — `page.tsx:317` Subtitle reads `Apple M4 Pro · 48 GB · {system?.platform}` — should use `system?.chip` and `formatBytes(system?.memory.total)` dynamically so it works on any machine. -- [ ] **B2. Pull model blocks UI — no progress feedback** — `api/ollama/route.ts:84-92` +- [x] **B2. Pull model blocks UI — no progress feedback** — `api/ollama/route.ts:84-92` `handlePull` calls Ollama with `stream: false`. Large models (20+ GB) block for 30+ minutes. The Next.js API route will likely timeout. Must use `stream: true` and pipe progress events to the client. _(Combined with F1.)_ - [x] **B3. Dead code: non-streaming `generate` action** — `api/ollama/route.ts:69-82` @@ -41,10 +41,10 @@ - [x] **B6. Toast ID collision on HMR remount** — `page.tsx:156-159` `toastId.current` resets to 0 on component remount during dev. Use `Date.now()` or `crypto.randomUUID()` for robust uniqueness. -- [ ] **B7. vm_stat page size hardcoded** — `api/system/route.ts:103` +- [x] **B7. vm_stat page size hardcoded** — `api/system/route.ts:103` Hardcoded `16384`. Should parse from vm_stat's first line: `"(page size of NNNNN bytes)"` for portability. -- [ ] **B8. Whisper models dir not configurable** — `api/whisper/route.ts:24` +- [x] **B8. Whisper models dir not configurable** — `api/whisper/route.ts:24` Hardcoded to `~/whisper-models`. Should scan multiple known paths (`/opt/homebrew/share/whisper-cpp/models/`, `~/whisper-models`, `~/.cache/whisper/`) or accept `WHISPER_MODELS_DIR` env var. - [x] **B9. No AbortController for streaming fetch** — `page.tsx:250-289` @@ -86,7 +86,7 @@ ## 3. Features -- [ ] **F1. Streaming pull with progress bar** _(fixes B2)_ +- [x] **F1. Streaming pull with progress bar** _(fixes B2)_ Use Ollama `stream: true` for `/api/pull`. Create `/api/ollama/pull/route.ts` that pipes NDJSON progress. UI shows progress bar with `completed/total` bytes, speed, and ETA. - [ ] **F2. Model search/filter** @@ -101,7 +101,7 @@ - [ ] **F5. Model comparison (side-by-side)** Send same prompt to 2 models simultaneously. Display responses side-by-side with latency/quality comparison. -- [ ] **F6. Token/s metrics after generation** +- [x] **F6. Token/s metrics after generation** Parse `eval_count` and `eval_duration` from the final NDJSON chunk. Display tokens/second, total tokens, and latency in the response footer. - [ ] **F7. System resource sparklines (time-series)** @@ -186,12 +186,12 @@ ### Sprint 2 — Pull Progress + Metrics _(est. 2–3 hrs)_ -| # | ID | Task | Effort | Commit | -| --- | ----------- | ----------------------------------- | ------ | ------ | -| 10 | - [ ] B2+F1 | Streaming pull with progress bar | 60 min | | -| 11 | - [ ] F6 | Display tokens/s after generation | 30 min | | -| 12 | - [ ] B7 | Parse vm_stat page size dynamically | 10 min | | -| 13 | - [ ] B8 | Multi-path whisper model discovery | 15 min | | +| # | ID | Task | Effort | Commit | +| --- | ----------- | ----------------------------------- | ------ | --------- | +| 10 | - [x] B2+F1 | Streaming pull with progress bar | 60 min | `2d9475b` | +| 11 | - [x] F6 | Display tokens/s after generation | 30 min | `2d9475b` | +| 12 | - [x] B7 | Parse vm_stat page size dynamically | 10 min | `2d9475b` | +| 13 | - [x] B8 | Multi-path whisper model discovery | 15 min | `2d9475b` | ### Sprint 3 — Component Refactor _(est. 2–3 hrs)_ @@ -246,6 +246,7 @@ _Commits will be added here as work progresses._ | # | Date | Commit | Sprint | Items Completed | | --- | ------ | --------- | -------- | ------------------------------------ | | 1 | Feb 19 | `2da67c2` | Sprint 1 | B1, B3, B4, B5, B6, B9, B10, B11, P4 | +| 2 | Feb 19 | `2d9475b` | Sprint 2 | B2, B7, B8, F1, F6 | ---