- Fix: recognize Windows
pnpm.cmd/npm.cmdshims and invoke them throughcmd.exeduring CLI setup. - Feat: add
POST /api/v1/detections/export-allfor exporting all saved detections in any supported format. - Fix: return a clear
400response when a full export is requested with no saved detections. - Docs: document the Windows CLI behavior and full-dataset export endpoint in EN/ZH README and API docs.
- Test: add regression coverage for Windows command resolution and full-dataset ZIP export.
- Fix: mount the shared Hugging Face cache at the backend
appuserhome in Docker and setHF_HOMEexplicitly. - Fix: load SAM2 from local Hugging Face cache or
SAM2_CHECKPOINT_PATHbefore falling back to network download. - Fix: make
cli.py download --models=sam2use the samesam2.build_sam2_hfcheckpoint path as runtime. - Docs: clarify SAM2 cache location and offline deployment layout in EN/ZH README.
- Fix: propagate real VLM model loading and inference exceptions through API responses instead of returning only a generic detection failure.
- Fix: batch detection no longer swallows non-abort errors, so frontend toasts now show backend details such as CUDA OOM, missing GPU runtime, driver errors, or dependency import failures.
- Fix: model status switches to
errorwhen device preflight fails, preventing staleLoading to GPUstatus after an unsupported CPU/no-GPU setup. - Docs: add EN/ZH troubleshooting steps for VLM stuck at
Loading to GPUwith Docker log and CUDA diagnostic commands.
- Perf: increase chunk upload size 5MB → 20MB for 4× faster dataset imports
- Feat:
max_import_size_mbconfig (default 10GB) with validation in chunk_init and frontend file picker - Depr: mark
POST /datasets/importdirect upload endpoint as deprecated in favor of chunked upload - Feat: increase video upload limit 100MB → 500MB with dedicated
max_video_upload_size_mbsetting - Feat: per-request HTTP timeouts — 10min for detection, 5min for uploads, 1min default
- Feat: rename training jobs via Popconfirm with inline text input (
POST /train/jobs/{id}/rename) - Feat:
namecolumn added toTrainingJobmodel (nullable String(128)) - Style: num_classes count shown in
text-primary-600
- Feat: virtualize training job list (
JobHistoryList) and video list (VideoList) with@tanstack/react-virtual - Feat: infinite scroll pagination for detection history, training jobs, and videos
- Feat:
useInfiniteScrollhook — unified scroll-to-bottom trigger for all virtual lists - Feat:
useLoadAllhook — "Load All" button that fetches remaining pages in bulk - Feat: "Load All (X remaining)" button in detection history and training panel count lines
- Feat: scroll hint text at bottom of virtual lists — loading spinner, loaded count, or "All loaded"
- Feat: increase pageSize limits — detections 100000, training jobs 1000, videos 1000
- Fix: training preview canvas label position clamped at image edges (matching DetectionCanvas logic)
- Fix: video list item overlap — add
measureElementfor dynamic row heights
- Test: 10-image detect→train→validate→download end-to-end integration test
- Test:
test_rename_job+test_rename_job_404integration tests - Test: 4
useLoadAll+ 4useScrollLoadhook unit tests - Total: 81 backend + 42 frontend tests passing
- Feat:
python3 cli.py all— one-command setup, model download, and launch - Feat:
--models=vlm|sam2|allselect which models to pre-download (~6GB / ~2.4GB) - Feat:
stop/status/downloadcommands,--help,--no-models - Feat: automatic SAM3 HF_TOKEN check with step-by-step setup guide
- Feat: cross-platform (Windows/Linux/macOS), pnpm auto-install, port conflict detection
- Fix: ZIP path traversal — validate each member against extract_dir with
Path.is_relative_to - Fix: chunk upload hardening — random UUID uploadId, chunkSize validation (1-50MB), Content-Length pre-check, assembly size verify, fixed docstring for resume semantics
- Fix: database migration fail-fast for PostgreSQL (create_all only for dev/SQLite)
- Fix: SSE reconnect timer leak on component unmount
- Fix: "Clear All Videos" bulk delete paginates through all rows, always queries page=1
- Refactor: split
dataset_import.py(629 lines) into package (yolo,coco,voc,createml+ helpers) - Refactor: extract
VideoList+ExtractionPanelfromVideoPanel(591→224 lines) - Refactor: extract
Header+DetectionControlsfromSidebar(496→233 lines) - Refactor: rename
useInfiniteScroll→useScrollLoad(avoid ahooks name conflict) - Perf: increase virtual list
overscan10→20 to reduce scroll white flash
- Fix: multiprocessing start method
spawnfor CUDA compatibility in YOLO training
- Feat: embed GPU passthrough in
docker-compose.yml— no manual yaml editing required - Feat: add
.dockerignorefor backend and frontend — excludes ~2.8GB venv/node_modules from build context - Fix: add Free disk space step before Docker build in CI to prevent disk-full crashes
- Feat: class map Popover on hover for
num_classesin training job metrics
- Refactor: extract
detection_service.py— orchestrates GPU offload → inference → persistence - Refactor: replace raw strings with
StrEnum(ModelType, FilterMode, DetectionStatus) - Refactor: add
DetectionParamsschema to group 7 scattered detection parameters - Refactor: repository methods gain optional
commit=param, removing ad-hocrepo.db.commit()calls - Refactor: strategies receive dependencies via constructor DI instead of lazy imports
- Feat: import datasets from ZIP archives in 5 formats: YOLO, YOLO Seg, COCO, Pascal VOC, CreateML
- Feat: chunked upload with Web Worker — 5MB chunks, 3 retries, progress bar
- Feat: resume support — deterministic uploadId from fileName+size, skip already-uploaded chunks
- Feat: backend parsers for all 5 formats with proper coordinate conversion and edge case handling
- Feat:
DatasetImportModalwith format selector, drag-drop zone, progress tracking, cancel - Test: 21 unit tests for format parsers (YOLO line, names, polygon, COCO, VOC, CreateML)
- Feat: background worker picks up pending training jobs, runs one at a time via multiprocessing
- Feat: cancel training —
POST /train/jobs/{id}/cancelterminates running process, sets "cancelled" - Feat: training button disabled when job running; detection disabled with amber warning
- Feat:
Popconfirmreplaceswindow.confirm()for all delete/cancel actions - Feat: "Import Dataset" button in TrainingPanel
- Feat: cancel in-flight detection with AbortController — truly aborts HTTP requests
- Fix: SAM3 health check race condition — wait for
status=="loaded", not just HTTP 200 - Fix: Enum
values_callableto match existing DB data (e.g.'vlm+sam2'not'vlm_sam2') - Fix: validation conf/iou parameters now read from Zustand (were stale local state)
- Fix: canvas image load race condition with
loadIdcounter - Fix: model status flicker — skip
optimisticModelLoadingwhen already loaded - Fix: batch thumbnails show loading only for actively-processing images
- Fix: batch detection
resultcleanup → thumbnails visible immediately
- Refactor: migrate components from flat
.tsxto directory structure (ComponentName/index.tsx) - Refactor: decompose
useHomeState(394 lines) intouseDetectionProcess,useDetectionHistory,useDetectionAnnotation,useDetectionTimer,useDetection - Refactor: move
result/batchResultsfrom hook local state to ZustanduseAppStore - Test: add vitest +
@testing-library/react+jsdomwith 28 test files (34 tests) - Test: add
setupTests.tswith i18n mock, axios mock, EventSource mock, matchMedia mock
- Chore: rewrite
ja.jsonwith kanji-heavy Japanese (取消, 登録, 導入, 出力, 一括, etc.) - Chore: sync all i18n keys across zh/en/ja (cancel, bbox, mask, dataset import, delete confirm)
- Fix:
setPreviewUrlno longer auto-revokes blob URLs (caused broken thumbnails) - Fix: blob URL lifecycle with
useRef-based caching to prevent URL churn - Fix:
maskClosable→mask.closable(antd deprecation) - Fix:
_read_yolo_namesunboundnamesvariable whendata.yamlmissing - Fix: strategy test constructor calls (DI requires mock functions)
- Fix: test SAM3 skip condition also checks local model cache
- Fix:
test-results/added to.gitignore
- Refactor: introduce Zustand (
useAppStore) for global state, replacing 4 individual hooks - Remove:
useModelConfig,useUploadState,useAnnotationState(consolidated into store) - Simplify:
useHomeStatenow reads from store, ~100 lines lighter - Simplify:
Sidebarprops reduced from 60+ to 14,Homereads state directly from store
- Feat: loading overlay shows contextual text ("模型加载中" / "检测进行中")
- Feat: optimistic model status updates — loading/unload reflects immediately without waiting for SSE poll
- Fix: SAM2 loading state not shown when model loads faster than SSE interval
- Fix: model unload status delayed up to 10s — now instant via optimistic update
- Fix: unused
threadingimport intrain.py - Fix: E2E detection test selector (Ant Design uses div, not
<table>)
- Refactor: split
useHomeState(311-line giant hook) intouseModelConfig,useUploadState,useAnnotationState,useDetectionTimer—useHomeStatenow coordinates - Test: add Playwright E2E tests (6 cases: page render, model switch, history list, detail view, model status, upload+detect)
- Test: add integration tests (10 cases: VLM/SAM3 detection, list/detail consistency, SSE, model management, mask validation)
- Test: add regression snapshot tests (7 cases: 5 images × box position + model type consistency)
- Test: add
test_api_integration.pywith data integrity checks (box bounds, confidence range, polygon validity, list/detail consistency) - Chore: add commitlint config (conventional commits)
- Fix: SAM3 stuck at "loading" when HF_TOKEN not set — fall back to
local_files_only=Truefor cached models - Fix: SAM3 load errors silently swallowed — wrap
load_modelin try/except, report errors via/health - Fix: HF_TOKEN required even when model cached — only check token when cache missing
- Fix: SAM3 stdout/stderr redirected to log file instead of DEVNULL for debugging
- Fix: SAM3 server using wrong Python interpreter — always prefer
sam3-venv/bin/python3when available - Opt: skip alembic migration check when database already at head revision, reducing startup time
- Fix: history detail view not showing mask polygons —
handleSelectHistorynow fetches full detection detail - Fix: frontend CI build failure — add missing
modelTypefield inuseYoloValidation - Fix:
ruff formatviolation indetection_strategy.py - Fix: remove
.playwright-mcpdebug artifacts from git tracking and add to.gitignore
- Batch thumbnails show box count badge
- Keyboard arrow keys (← →) navigate between batch results
- SAM3 service in
docker-compose.yml(port 8002,sam3-cachevolume,HF_TOKENenv) - Dockerfile creates dedicated
sam3-venvfor dependency isolation requirements-sam3.txtfor SAM3 server dependencies
- Add
test_detection_strategy.py(9 tests: strategy creation, DetectionResult, SAM3 priority) - Add macOS MPS SAM3 benchmarks to
docs/BENCHMARKS.md - Update
docs/STRUCTURE.mdand user guides with SAM3 content
- Feat: add SAM3 (facebook/sam3) as third detection strategy — text-driven open-vocabulary detection + segmentation
- Feat: SAM3 standalone HTTP service on port 8002 with dedicated venv (transformers 5.x, torch 2.12)
- Feat: model selector toggle in sidebar (VLM+SAM2 / SAM3)
- Feat: SAM3 confidence threshold slider (0–1, default 0.5) and mask threshold slider (0–1, default 0.5)
- Feat: SAM3 segmentation on/off checkbox — bbox-only mode skips mask extraction
- Feat: SAM3 idle watchdog — auto-unload after
MODEL_IDLE_TIMEOUT_SECONDS(default 10 min) - Feat: SAM3 manual unload button with toast feedback
- Feat: backend auto-unloads competing models on detection (SAM3 ↔ VLM/SAM2)
- Feat: SAM3 server async startup — HTTP ready immediately, model loads in background,
/healthreportsstarting→loading→loaded
- Feat: strategy pattern (
detection_strategy.py) —VLMDetection,VLMWithSAM2,SAM3Detection - Feat: unified SSE endpoint
GET /api/v1/model/events— VLM/SAM2/SAM3 status in one EventSource, replaces 3 polling intervals - Feat:
useModelEventshook — single SSE subscriber, all model status components read from it - Feat:
Detection.model_typecolumn — labels each record asvlm,vlm+sam2, orsam3 - Feat: list endpoint returns lightweight boxes without
maskPolygon; detail endpoint retains full mask data - Feat:
HoverPreviewcomponent — on-demand fetch of detection detail for training hover preview - Fix: VLM detection coordinate scaling lost during refactoring — boxes now correctly scaled back to original image space
- Fix: SAM3 server multipart body construction — fields properly separated with boundary markers
- Fix:
create_strategyswallowing kwargs —use_sam3_seg, threshold params now passed todetect()
- Feat: model type badges in history list and training candidate list (color-coded: blue=VLM, amber=VLM+SAM2, violet=SAM3)
- Feat: batch detection loading states — canvas overlay cleared once first result arrives
- Fix: model status polling now continues when
unloaded(3s interval), preventing missed loading transitions
- Docs: update README (EN/ZH) — SAM3 architecture, SSE status, strategy pattern, detection parameters
- Docs: update CLAUDE.md — startup env requirements, SAM3 architecture, SSE, directory conventions
- Docs: update API.md —
/detectform parameters, model management SSE endpoint, detection object schema
- Integrate cloud benchmark records (RTX 4080) into local PostgreSQL database
- UX: Add global loading progress bar for all pending queries and mutations
- Deployment: Mount frontend static files to root (
/) for single-container Docker deployments - Add
benchmark_script.pyanddecorddependency
- Fix: use base color when confidence is null (was showing red)
- Feat: expose SAM2 score threshold slider for mask quality filtering
- CI: restore tag-triggered Docker and Release workflows
- Feat: improve CategoryInput — add remove button, dedup, visual polish
- Docs: bump GPU VRAM minimum from 10GB to 12GB, add throttling warning
- Docs: add star badge and star-history chart to READMEs (EN/ZH)
- Docs: add badges and emoji pipeline flow to README headers (EN/ZH)
- Docs: rewrite CLAUDE.md with architecture overview, commands, and workflow rules
- CI: Docker and Release workflows now trigger on published Release, not every tag
- Japanese (日本語) i18n — full UI translation
- Three-button language selector (中 / EN / 日) matching theme toggle style
- SAM2 status labels — "SAM2 模型" instead of "VLM 模型"
- Frontend: HistoryList pagination, training component refactor
- Fix:
MAX_LONG_SIDElazy-init so tests can import without GPU (CI on CPU runners)
- VLM confidence score infrastructure:
<conf>parser, DB wiring, canvas color-coding - Fix:
parse_boxestest assertions for new confidence field
- Class-based color mapping on canvas (color per category name)
- Ruff format — 2 files
- SQLite support — zero-config local database fallback
- Docs restructure: API, structure, benchmarks extracted to
docs/ - Chinese docs:
API_ZH.md,STRUCTURE_ZH.md,BENCHMARKS_ZH.md - Frontend restructure: training sub-components,
HistoryListItem - Ruff lint + format all green
- Fix: remove non-existent
reset_image()call that broke SAM2 mask generation - Full README rewrite (EN + ZH) — cold/warm benchmark separation
- GPU memory strategy pattern (
gpu_memory.py) — centralized CUDA/MPS cleanup expandable_segments:Truereplacesmax_split_size_mbfor CUDA- MPS
synchronize+empty_cache+gcafter each detection - Mac memory stable at 9.8–13GB across 6 rounds
- VRAM-aware image long-side cap (auto: 800/1024/1333px)
- Stable Mac MPS & Windows CUDA benchmarks
- SAM2 mask coordinate fix (original image space alignment)
- Fix: SAM2 mask misalignment when
detect()resizes large images - Unify box/mask coordinates to original image space
- Aggressive VRAM cleanup +
max_split_size_mb:128allocator tuning - Sustained inference memory management
- VRAM optimizations for 10GB GPUs
- Reduce
max_new_tokensfrom 2048 to 512 — fix VRAM pressure on 10GB GPUs
- SAM2.1 segmentation — bbox → pixel-precise mask polygons
- Multi-format dataset export: YOLO, YOLO-Seg, COCO, Pascal VOC, CreateML
- Instance segmentation training support (Segment task type)
- BBox / Mask independent toggle on canvas and hover preview
- Model idle watchdog — auto-unload after configurable timeout
- Windows cross-platform support, model download progress, UX improvements
- SAM2 integration, multi-format export, instance segmentation training
- Restore
MAX_IMAGE_PXto 1024×1024 for GPU inference
- Fix Docker volume config, clarify platform support (Windows WSL2 + NVIDIA GPU)
- Video annotation & keyframe extraction (scene/motion/interval)
- MJPEG / SSE video validation
- Remove CPU mode — LocateAnything-3B requires GPU
- Fix frontend layouts, CI triggers, unify database naming
- Initial stable release
- VLM detection with LocateAnything-3B
- YOLO training (v5/v8/v11/v26) with SSE real-time progress
- Model validation (MJPEG live stream, SSE video, batch images)
- Canvas-based manual annotation with NMS filtering
- Detection history management
- Box filter service (best/NMS/all)
- Cross-platform: macOS MPS + Windows/Linux CUDA
- English / 中文 README with project structure and API docs
- Initial commit — YOLO auto-labeling training platform
- VLM detection pipeline with LocateAnything-3B
- YOLO training integration (v5/v8/v11/v26) with cascading model variant selector
- Manual box annotation with canvas drawing mode
- Detection history with thumbnails, tag filtering, hover preview popover
- Cross-platform device auto-detect (CUDA / MPS)
- Box filter service: best / NMS / all modes
- Database redesign with JSONB types and association tables
- CI/CD workflows (lint, test, Docker, release)
- Light/dark/system theme with inline button group
- i18n: English / 中文 via i18next