feat(fc2b): ml / allowlist / aliases Pinia stores
Thin wrappers over the FC-2b API: ml (settings GET/PATCH, backfill + recompute triggers), allowlist (list, threshold patch, remove with optimistic local update), aliases (list, remove with optimistic update). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,26 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { useApi } from '../composables/useApi.js'
|
||||||
|
|
||||||
|
export const useAliasesStore = defineStore('aliases', () => {
|
||||||
|
const api = useApi()
|
||||||
|
const rows = ref([])
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
async function load() {
|
||||||
|
loading.value = true
|
||||||
|
try { rows.value = await api.get('/api/aliases') }
|
||||||
|
finally { loading.value = false }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function remove(aliasString, aliasCategory) {
|
||||||
|
await api.delete(
|
||||||
|
`/api/aliases/${encodeURIComponent(aliasString)}/${encodeURIComponent(aliasCategory)}`
|
||||||
|
)
|
||||||
|
rows.value = rows.value.filter(
|
||||||
|
r => !(r.alias_string === aliasString && r.alias_category === aliasCategory)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return { rows, loading, load, remove }
|
||||||
|
})
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { useApi } from '../composables/useApi.js'
|
||||||
|
|
||||||
|
export const useAllowlistStore = defineStore('allowlist', () => {
|
||||||
|
const api = useApi()
|
||||||
|
const rows = ref([])
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
async function load() {
|
||||||
|
loading.value = true
|
||||||
|
try { rows.value = await api.get('/api/allowlist') }
|
||||||
|
finally { loading.value = false }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateThreshold(tagId, minConfidence) {
|
||||||
|
await api.patch(`/api/tags/${tagId}/allowlist`, {
|
||||||
|
body: { min_confidence: minConfidence }
|
||||||
|
})
|
||||||
|
const r = rows.value.find(x => x.tag_id === tagId)
|
||||||
|
if (r) r.min_confidence = minConfidence
|
||||||
|
}
|
||||||
|
|
||||||
|
async function remove(tagId) {
|
||||||
|
await api.delete(`/api/tags/${tagId}/allowlist`)
|
||||||
|
rows.value = rows.value.filter(x => x.tag_id !== tagId)
|
||||||
|
}
|
||||||
|
|
||||||
|
return { rows, loading, load, updateThreshold, remove }
|
||||||
|
})
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { useApi } from '../composables/useApi.js'
|
||||||
|
|
||||||
|
export const useMLStore = defineStore('ml', () => {
|
||||||
|
const api = useApi()
|
||||||
|
const settings = ref(null)
|
||||||
|
const loading = ref(false)
|
||||||
|
const error = ref(null)
|
||||||
|
|
||||||
|
async function loadSettings() {
|
||||||
|
loading.value = true
|
||||||
|
error.value = null
|
||||||
|
try {
|
||||||
|
settings.value = await api.get('/api/ml/settings')
|
||||||
|
} catch (e) {
|
||||||
|
error.value = e.message
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchSettings(patch) {
|
||||||
|
settings.value = await api.patch('/api/ml/settings', { body: patch })
|
||||||
|
}
|
||||||
|
|
||||||
|
async function triggerBackfill() {
|
||||||
|
await api.post('/api/ml/backfill')
|
||||||
|
}
|
||||||
|
|
||||||
|
async function triggerRecomputeCentroids() {
|
||||||
|
await api.post('/api/ml/recompute-centroids')
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
settings, loading, error,
|
||||||
|
loadSettings, patchSettings, triggerBackfill, triggerRecomputeCentroids
|
||||||
|
}
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user