diff --git a/components/ResearchFeedback.vue b/components/ResearchFeedback.vue index 4d584ed..916eed7 100644 --- a/components/ResearchFeedback.vue +++ b/components/ResearchFeedback.vue @@ -19,7 +19,7 @@ }>() const { t, locale } = useI18n() - const { config, showConfigManager } = storeToRefs(useConfigStore()) + const { showConfigManager, isConfigValid } = storeToRefs(useConfigStore()) const toast = useToast() const reasoningContent = ref('') @@ -41,10 +41,7 @@ ) async function getFeedback() { - const aiConfig = config.value.ai - const webSearchConfig = config.value.webSearch - - if (!aiConfig.model || !aiConfig.apiKey || !webSearchConfig.apiKey) { + if (!isConfigValid.value) { toast.add({ title: t('index.missingConfigTitle'), description: t('index.missingConfigDescription'), diff --git a/pages/index.vue b/pages/index.vue index 33dcfde..d02d0f5 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -65,9 +65,6 @@ researchResultInjectionKey, } from '~/constants/injection-keys' - const { t } = useI18n() - const { config } = storeToRefs(useConfigStore()) - const toast = useToast() const version = useRuntimeConfig().public.version const configManagerRef = ref>() @@ -93,18 +90,6 @@ provide(researchResultInjectionKey, researchResult) async function generateFeedback() { - const aiConfig = config.value.ai - const webSearchConfig = config.value.webSearch - - if (!aiConfig.model || !aiConfig.apiKey || !webSearchConfig.apiKey) { - toast.add({ - title: t('index.missingConfigTitle'), - description: t('index.missingConfigDescription'), - color: 'error', - }) - configManagerRef.value?.show() - return - } feedbackRef.value?.getFeedback() } diff --git a/stores/config.ts b/stores/config.ts index 1192029..93d4840 100644 --- a/stores/config.ts +++ b/stores/config.ts @@ -30,6 +30,18 @@ export interface Config { webSearch: ConfigWebSearch } +function validateConfig(config: Config) { + const ai = config.ai + if (ai.provider !== 'ollama' && !ai.apiKey) return false + if (typeof ai.contextSize !== 'undefined' && ai.contextSize < 0) return false + + const ws = config.webSearch + if (!ws.apiKey) return false + if (typeof ws.concurrencyLimit !== 'undefined' && ws.concurrencyLimit! < 1) + return false + return true +} + export const useConfigStore = defineStore('config', () => { const config = useLocalStorage('deep-research-config', { ai: { @@ -47,6 +59,7 @@ export const useConfigStore = defineStore('config', () => { 'dismiss-update-version', '', ) + const isConfigValid = computed(() => validateConfig(config.value)) const aiApiBase = computed(() => { if (config.value.ai.provider === 'openrouter') { @@ -65,6 +78,7 @@ export const useConfigStore = defineStore('config', () => { return { config: skipHydrate(config), + isConfigValid, aiApiBase, showConfigManager, dismissUpdateVersion: skipHydrate(dismissUpdateVersion),