refactor(ml): drop dead tagger/suggestion settings + columns (#1199)
Hygiene follow-up to the Camie retirement (#1189) — these were left inert to bound that change; nothing reads them now. Migration 0068 drops: - ml_settings: tagger_store_floor, tagger_model_version, suggestion_threshold_ character/general (already dead pre-retirement — scoring uses per-head thresholds), video_min_tag_frames (only the deleted video-prediction aggregator used it). - image_record: tagger_model_version (no writer), centroid_scores (dead JSON cache, no reader). Also: ml_admin _EDITABLE/GET/_validate pruned (dropped the store-floor invariant + video_min_tag_frames check); MLThresholdSliders trimmed to a video-embedding card (interval + max frames only); importer no longer resets the dropped cols; download_models drops the Camie fetch; stale CASCADE comments in cleanup_service no longer name the removed tables. Tests updated. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
This commit is contained in:
@@ -1,69 +1,30 @@
|
||||
<template>
|
||||
<MaintenanceTile
|
||||
icon="mdi-tune"
|
||||
title="Suggestion thresholds"
|
||||
blurb="Confidence cutoffs that gate auto-suggested tags + video sampling."
|
||||
icon="mdi-filmstrip"
|
||||
title="Video embedding"
|
||||
blurb="How videos are sampled into frames before embedding."
|
||||
>
|
||||
<div v-if="store.settings">
|
||||
<v-row v-for="f in fields" :key="f.key">
|
||||
<v-col cols="12">
|
||||
<v-slider
|
||||
v-model="local[f.key]" :label="f.label"
|
||||
:min="f.floorMin ? local.tagger_store_floor : 0" max="1" step="0.05"
|
||||
thumb-label hide-details
|
||||
color="accent" @end="save"
|
||||
/>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-divider class="my-4" />
|
||||
|
||||
<v-row>
|
||||
<v-col cols="12">
|
||||
<v-slider
|
||||
v-model="local.tagger_store_floor" label="Tagger store floor"
|
||||
min="0" max="1" step="0.05" thumb-label hide-details
|
||||
color="accent" @end="save"
|
||||
/>
|
||||
<div class="text-caption fc-muted mt-1">
|
||||
Tagger predictions below this confidence aren't stored — raising it
|
||||
keeps the image library lean. Suggestions can't be shown below the
|
||||
floor.
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-divider class="my-4" />
|
||||
|
||||
<div class="text-subtitle-2 mb-1">Video tagging</div>
|
||||
<div class="text-caption fc-muted mb-3">
|
||||
Videos are tagged by sampling frames at a fixed cadence. A tag is kept
|
||||
only if it shows up in enough frames (≈ that many × the interval in
|
||||
seconds of screen time), which filters one-frame noise without losing
|
||||
tags that only appear in part of a longer video.
|
||||
Videos are embedded by sampling frames at a fixed cadence and mean-pooling
|
||||
their SigLIP embeddings. The interval sets the cadence; the cap bounds how
|
||||
many frames a long video samples.
|
||||
</div>
|
||||
<v-row>
|
||||
<v-col cols="12" sm="4">
|
||||
<v-col cols="12" sm="6">
|
||||
<v-text-field
|
||||
v-model.number="local.video_frame_interval_seconds"
|
||||
label="Frame interval (s)" type="number" min="0.5" step="0.5"
|
||||
density="comfortable" hide-details @change="save"
|
||||
/>
|
||||
</v-col>
|
||||
<v-col cols="12" sm="4">
|
||||
<v-col cols="12" sm="6">
|
||||
<v-text-field
|
||||
v-model.number="local.video_max_frames"
|
||||
label="Max frames" type="number" min="1" step="1"
|
||||
density="comfortable" hide-details @change="save"
|
||||
/>
|
||||
</v-col>
|
||||
<v-col cols="12" sm="4">
|
||||
<v-text-field
|
||||
v-model.number="local.video_min_tag_frames"
|
||||
label="Min frames per tag" type="number" min="1" step="1"
|
||||
density="comfortable" hide-details @change="save"
|
||||
/>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</div>
|
||||
<div v-else><v-skeleton-loader type="paragraph" /></div>
|
||||
@@ -77,31 +38,14 @@ import { useMLStore } from '../../stores/ml.js'
|
||||
import MaintenanceTile from '../common/MaintenanceTile.vue'
|
||||
|
||||
const store = useMLStore()
|
||||
// 'artist' (FC-2d-vii-c) and 'copyright' (2026-06-01) retired as
|
||||
// suggestion categories; their threshold rows are gone.
|
||||
// floorMin: the per-category suggestion thresholds can't drop below the
|
||||
// tagger store floor (nothing below the floor is stored to surface).
|
||||
const fields = [
|
||||
{ key: 'suggestion_threshold_character', label: 'Character', floorMin: true },
|
||||
{ key: 'suggestion_threshold_general', label: 'General', floorMin: true }
|
||||
]
|
||||
const local = reactive({})
|
||||
watch(() => store.settings, (s) => { if (s) Object.assign(local, s) }, { immediate: true })
|
||||
|
||||
async function save() {
|
||||
// Mirror the server invariant: keep the category thresholds at or above the
|
||||
// store floor so a raised floor doesn't leave a threshold stranded below it.
|
||||
const floor = local.tagger_store_floor
|
||||
local.suggestion_threshold_character = Math.max(local.suggestion_threshold_character, floor)
|
||||
local.suggestion_threshold_general = Math.max(local.suggestion_threshold_general, floor)
|
||||
// Mirror the server invariant: a tag can't require more frames than are sampled.
|
||||
local.video_min_tag_frames = Math.min(local.video_min_tag_frames, local.video_max_frames)
|
||||
const patch = {}
|
||||
for (const f of fields) patch[f.key] = local[f.key]
|
||||
patch.tagger_store_floor = local.tagger_store_floor
|
||||
patch.video_frame_interval_seconds = local.video_frame_interval_seconds
|
||||
patch.video_max_frames = local.video_max_frames
|
||||
patch.video_min_tag_frames = local.video_min_tag_frames
|
||||
const patch = {
|
||||
video_frame_interval_seconds: local.video_frame_interval_seconds,
|
||||
video_max_frames: local.video_max_frames
|
||||
}
|
||||
try { await store.patchSettings(patch) }
|
||||
catch (e) { toast({ text: e.message, type: 'error' }) }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user