Commit graph

194 commits

Author SHA1 Message Date
71bf88d09b feat: implement results table, rating buttons, export UI, and a11y polish 2026-05-11 08:16:52 -07:00
bc4ca1095c feat: add embed-compare route, sidebar nav entry, and full input UI 2026-05-11 08:14:30 -07:00
b6aed3dd1b chore: add pagepiper imitate entry and embed_bench section to config example 2026-05-11 08:11:30 -07:00
1ad7ba322a feat: add embed-bench rate and export endpoints 2026-05-11 08:07:17 -07:00
32e3b2a0dd feat: add embed-bench run endpoint with SSE streaming 2026-05-07 09:05:34 -07:00
12117ad0c6 fix: narrow exception types in get_models, fix patch targets in tests, add type annotation 2026-05-07 09:03:37 -07:00
5939c67b9f feat: add embed-bench models endpoint and register router in aggregator 2026-05-07 09:01:25 -07:00
5ea77da97d fix: add _cosine dimension guard, fix return type annotation, add zero-vector test 2026-05-07 08:59:24 -07:00
276bdadb92 feat: add embed_bench module scaffold and _cosine() helper 2026-05-07 08:37:18 -07:00
6f9aad126e docs(readme): landing page rewrite — three-stage pipeline explained, full CLI reference, data flow diagram, label table 2026-05-06 08:51:46 -07:00
258bbdc0af chore(deps): fix 10 Dependabot CVEs — vite 7.3.2, defu 6.1.7, yaml 2.8.4, picomatch 4.0.4, undici 7.25.0 2026-05-06 08:41:05 -07:00
32872d1ec6 fix: assigned-only state, remove dead HfNodeModelPanel prop, deduplicate yaml example 2026-05-05 22:11:02 -07:00
1521198cb1 fix: code quality fixes from review (SSE abort, aria-live, shared types, type safety)
- Add AbortController to SSE pull stream in OllamaModelPanel; abort on unmount
- Fix SSE loop: break on success/error events, call fetchModels() after the loop
- Add AbortController to fetchModels() and fetchProfile() one-shot fetches
- Add onUnmounted cleanup to both panel components
- Extract GpuEntry, ServiceInfo, NodeSummary to web/src/types/nodes.ts
- Remove duplicate interface definitions from NodeCard, GpuRow, NodeManagementView
- Fix aria-live regions: persistent container with v-if on inner span (avoids
  screen reader announcement miss on initial mount)
- Tighten STATE_LABELS/STATE_ICONS to Record<ServiceState, string> for exhaustiveness
- Add explicit (await r.json()) as NodeSummary[] cast in fetchNodes()
2026-05-05 21:35:13 -07:00
8dda040480 fix: move /nodes route immediately after /fleet per spec 2026-05-05 21:29:35 -07:00
bf675ed1f6 feat: add OllamaModelPanel and HfNodeModelPanel Vue components 2026-05-05 21:24:38 -07:00
0efd1aedbe feat: add NodeCard, GpuRow, ServiceBadge Vue components 2026-05-05 21:24:32 -07:00
4c225b94f5 feat: add /nodes route, AppSidebar nav item, and NodeManagementView 2026-05-05 21:24:27 -07:00
1cd9c5d455 fix: move json import to module scope in nodes.py 2026-05-05 21:01:32 -07:00
5702a7190b feat: add Ollama list/pull-SSE/delete endpoints 2026-05-05 20:41:29 -07:00
55b017ba3b fix: log coordinator reload failures in update_gpu_services
- Replace bare `except Exception: pass` with `except Exception as exc` and a
  logger.warning call that surfaces node_id and the exception for diagnostics.
- Move `import os as _os` from mid-file (between test functions) to the
  top-level import block to satisfy PEP 8 and linter expectations.
2026-05-05 20:36:08 -07:00
f952ec8971 feat: add profile endpoint and GPU service assignment with compatibility check 2026-05-05 20:33:41 -07:00
fd8cb622a1 feat: add GET /api/nodes-mgmt/nodes/{node_id}/profile endpoint 2026-05-05 20:31:22 -07:00
47cb9f661f fix: narrow exception handling in list_nodes, move mock imports to top
- Remove redundant httpx.ConnectError from nodes except clause (it's a
  subclass of HTTPError so the tuple catch was redundant)
- Narrow services except clause from bare Exception to httpx.HTTPError,
  add logger.warning with coordinator_url for debuggability
- Move `from unittest.mock import MagicMock, patch` from mid-file to
  the top-of-file import block with the other stdlib/third-party imports
2026-05-05 20:18:50 -07:00
c2de9e53da feat: implement GET /api/nodes-mgmt/nodes with coordinator proxy and profile merge 2026-05-05 20:16:06 -07:00
c039ea4698 fix: remove unused imports and em dash in nodes.py scaffold
- Drop unused StreamingResponse import from app/nodes.py (will be
  re-added in Task 2 when the SSE endpoint is implemented)
- Replace em dash with colon in _get_ollama_url HTTPException detail
- Remove unused os and unittest.mock imports from test_nodes.py
  (mock imports will return in Task 2 tests)
2026-05-05 19:59:32 -07:00
95afddb772 feat: add nodes.py scaffold with set_config_dir and router mount
- Create app/nodes.py with _CONFIG_DIR testability seam, _load_config,
  _profiles_dir, _profile_path, _load_profile, _get_ollama_url helpers,
  and stub list_nodes endpoint returning [] when no coordinator_url is set
- Mount nodes router at /api/nodes-mgmt in app/api.py
- Add profiles_dir comment to config/label_tool.yaml.example cforch section
- Create tests/test_nodes.py with autouse fixture and two passing tests
2026-05-05 19:35:28 -07:00
cbe8c0f03e feat(benchmark): wire EmbeddingKNNAdapter into MODEL_REGISTRY; add embed_model config
- Add embed_model: nomic-embed-text to config/label_tool.yaml (local, gitignored)
- Add # embed_model: commented example to config/label_tool.yaml.example
- Add pyyaml>=6.0 to requirements.txt (explicit dep for _resolve_urls yaml.safe_load)
- Add params assertion to test_embed_knn_nomic_registry_entry
2026-05-05 14:05:45 -07:00
5df33b0f41 feat(benchmark): wire EmbeddingKNNAdapter into MODEL_REGISTRY as embed-knn-nomic 2026-05-05 12:43:48 -07:00
41584de5df fix(benchmark): guard empty exemplars, warn on malformed JSON in build_exemplars_from_jsonl 2026-05-05 12:41:46 -07:00
1d4c07e4a0 feat(benchmark): add build_exemplars_from_jsonl() for k-NN seed 2026-05-05 11:43:12 -07:00
e823b5e76d fix(classifier): majority-vote key, partial-load guard, sparse label test 2026-05-05 11:39:24 -07:00
88bc6bed67 feat(classifier): implement EmbeddingKNNAdapter.classify() with k-NN vote 2026-05-05 08:04:54 -07:00
4a64a6686d fix(classifier): atomic embed assignment, logging on orch failure, guard double load 2026-05-05 07:53:15 -07:00
f2f150b4fb feat(classifier): implement EmbeddingKNNAdapter.load() and unload() 2026-05-05 07:12:53 -07:00
72449561cf feat(classifier): add EmbeddingKNNAdapter skeleton and constructor tests 2026-05-05 06:08:21 -07:00
c177fb1628 fix(classifier): quality fixes for DEFAULT_EXEMPLARS — remove forward __all__ entry, tighten tests, fix survey exemplar 2026-05-04 20:03:18 -07:00
3be5055e31 feat(classifier): add DEFAULT_EXEMPLARS for embedding k-NN fallback 2026-05-04 17:44:44 -07:00
78b64d007d feat(classifier): add _cosine() helper for embedding similarity 2026-05-04 17:41:45 -07:00
bce932461a feat: plans benchmark harness — model scoring for CF planning prompts
Adds benchmark_plans.py script, plans_bench API router, PlansBenchTab Vue
component, and registers /api/plans-bench in api.py. Also extends models
registry (cf-text catalog integration), cforch client, LlmEvalTab, and
ModelsView with cf-orch fleet support. Wires Planning mode into BenchmarkView.
2026-05-02 23:36:04 -07:00
e11db5ccd9 fix: align train job/results API envelope, config_json key, progress SSE, dashboard model_key
- GET /api/train/jobs now returns {"jobs":[...]} instead of bare array
- GET /api/train/results now returns {"results":[...]} instead of bare array
- POST /api/train/jobs body key renamed config -> config_json to match Pydantic model
- SSE log handler now handles 'progress' event type (backend never emits 'log')
- Dashboard _get_active_jobs() adds model_key to SELECT and return dict
- corrections.py docstring updated: both /api/corrections and /api/sft prefixes noted
- test_train.py assertions updated to unwrap new envelope shapes
2026-05-02 21:22:18 -07:00
13d1a394d5 fix: add loading state, widen nullable types, add API response guard in TrainResultsView 2026-05-02 20:49:34 -07:00
b077371107 feat: add TrainResultsView with training history table and Fleet registration links 2026-05-02 20:46:03 -07:00
53b25b27ab fix: surface cancel errors, fix SSE sentinel scroll, add missing test coverage in TrainJobsView 2026-05-02 20:33:03 -07:00
e014da2dec feat: add TrainJobsView with job queue, form submission, cancel, and SSE log streaming 2026-05-02 20:28:19 -07:00
c48db45d91 test: fix async flush and add mode-switch coverage in BenchmarkView 2026-05-02 19:35:02 -07:00
d0ba75b995 feat: extract CompareView at /eval/compare; remove Compare tab from BenchmarkView 2026-05-02 18:03:13 -07:00
a134af8b7b feat: add DashboardView with flywheel stage cards and CTA nudges 2026-05-02 16:50:24 -07:00
6ef6f06023 feat: restructure AppSidebar into two-domain nav with section headers and flywheel signal badges 2026-05-02 13:52:45 -07:00
5bdb095235 feat: restructure router into /data/* /eval/* /train/* domains with backward-compat redirects
- Export named `routes` array from router/index.ts for testability
- Move label/fetch/corrections/imitate under /data/* namespace
- Move benchmark/compare under /eval/* namespace
- Add /train/jobs and /train/results under /train/* namespace
- Add / -> DashboardView and /fleet -> ModelsView (replaces old / -> LabelView)
- Add backward-compat redirects for all old flat paths (/benchmark, /models, /stats, /label, /fetch, /corrections, /imitate)
- Add stub views for DashboardView, CompareView, TrainJobsView, TrainResultsView (implemented in later tasks)
- Add router.test.ts: 16 tests covering route structure and redirect targets
2026-05-02 13:00:04 -07:00
0904967320 feat: slim api.py to factory-only; all domain routes in dedicated modules
Replace 149-line api.py (with inline helpers, JSONL utilities, and ad-hoc
router registrations) with a 57-line pure factory. All business logic was
already extracted to domain modules in B1-B7; this removes the dead code
and adds the /api/corrections/* prefix alongside the /api/sft/* backward-
compat alias. Smoke tests updated to cover the new /api/corrections/ingest
and /api/dashboard routes.
2026-05-02 09:55:58 -07:00