Files
Hermes-ui/src/stores/app.ts
T

90 lines
2.2 KiB
TypeScript
Raw Normal View History

2026-04-11 15:59:14 +08:00
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { checkHealth, fetchAvailableModels, updateDefaultModel, type AvailableModelGroup } from '@/api/system'
2026-04-11 15:59:14 +08:00
export const useAppStore = defineStore('app', () => {
2026-04-15 09:12:54 +08:00
const sidebarOpen = ref(false)
2026-04-11 15:59:14 +08:00
const connected = ref(false)
const serverVersion = ref('')
const modelGroups = ref<AvailableModelGroup[]>([])
const selectedModel = ref('')
2026-04-11 15:59:14 +08:00
const healthPollTimer = ref<ReturnType<typeof setInterval>>()
// Settings
const streamEnabled = ref(true)
const sessionPersistence = ref(true)
const maxTokens = ref(4096)
async function checkConnection() {
try {
const res = await checkHealth()
connected.value = res.status === 'ok'
2026-04-11 15:59:14 +08:00
if (res.version) serverVersion.value = res.version
} catch {
connected.value = false
}
}
async function loadModels() {
try {
const res = await fetchAvailableModels()
modelGroups.value = res.groups
selectedModel.value = res.default
2026-04-11 15:59:14 +08:00
} catch {
// ignore
}
}
async function switchModel(modelId: string, providerOverride?: string) {
try {
// Find the group containing this model to get provider info
const group = modelGroups.value.find(g => g.models.includes(modelId))
const provider = providerOverride || group?.provider || ''
await updateDefaultModel({ default: modelId, provider })
selectedModel.value = modelId
} catch (err: any) {
console.error('Failed to switch model:', err)
}
}
2026-04-11 15:59:14 +08:00
function startHealthPolling(interval = 30000) {
stopHealthPolling()
checkConnection()
healthPollTimer.value = setInterval(checkConnection, interval)
}
function stopHealthPolling() {
if (healthPollTimer.value) {
clearInterval(healthPollTimer.value)
healthPollTimer.value = undefined
}
}
2026-04-15 09:12:54 +08:00
function toggleSidebar() {
sidebarOpen.value = !sidebarOpen.value
}
function closeSidebar() {
sidebarOpen.value = false
}
2026-04-11 15:59:14 +08:00
return {
2026-04-15 09:12:54 +08:00
sidebarOpen,
toggleSidebar,
closeSidebar,
2026-04-11 15:59:14 +08:00
connected,
serverVersion,
modelGroups,
selectedModel,
2026-04-11 15:59:14 +08:00
streamEnabled,
sessionPersistence,
maxTokens,
checkConnection,
loadModels,
switchModel,
2026-04-11 15:59:14 +08:00
startHealthPolling,
stopHealthPolling,
}
})