From 40d7d9e840e00760972508db8a76d474d6bee4b1 Mon Sep 17 00:00:00 2001 From: digua Date: Mon, 1 Jun 2026 22:27:00 +0800 Subject: [PATCH] fix(ai): harden validation and db handle reuse --- packages/http-routes/src/routes/web/ai-filter.ts | 12 ++---------- packages/http-routes/src/routes/web/ai-tools.ts | 5 ----- src/components/common/Settings/AI/useAIConfigForm.ts | 8 ++++---- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/packages/http-routes/src/routes/web/ai-filter.ts b/packages/http-routes/src/routes/web/ai-filter.ts index c1d0d791..de91fd4c 100644 --- a/packages/http-routes/src/routes/web/ai-filter.ts +++ b/packages/http-routes/src/routes/web/ai-filter.ts @@ -18,11 +18,7 @@ export function registerAiFilterRoutes(server: FastifyInstance, ctx: HttpRouteCo const db = ctx.dbManager.open(sessionId) if (!db) return reply.code(404).send({ error: `Session not found: ${sessionId}` }) - try { - return filterMessagesWithContext(db, { keywords, timeFilter, senderIds, contextSize, page, pageSize }) - } finally { - db.close() - } + return filterMessagesWithContext(db, { keywords, timeFilter, senderIds, contextSize, page, pageSize }) }) server.post<{ @@ -37,10 +33,6 @@ export function registerAiFilterRoutes(server: FastifyInstance, ctx: HttpRouteCo const db = ctx.dbManager.open(sessionId) if (!db) return reply.code(404).send({ error: `Session not found: ${sessionId}` }) - try { - return getMultipleSessionsMessages(db, chatSessionIds, page, pageSize) - } finally { - db.close() - } + return getMultipleSessionsMessages(db, chatSessionIds, page, pageSize) }) } diff --git a/packages/http-routes/src/routes/web/ai-tools.ts b/packages/http-routes/src/routes/web/ai-tools.ts index a9b83e49..78b001a3 100644 --- a/packages/http-routes/src/routes/web/ai-tools.ts +++ b/packages/http-routes/src/routes/web/ai-tools.ts @@ -82,11 +82,6 @@ export function registerAiToolRoutes(server: FastifyInstance, ctx: HttpRouteCont return { success: false, error: String(error) } } finally { activeToolTests.delete(testId) - try { - db.close() - } catch { - /* ignore close errors */ - } } }) diff --git a/src/components/common/Settings/AI/useAIConfigForm.ts b/src/components/common/Settings/AI/useAIConfigForm.ts index e8ffe2fc..6784d21c 100644 --- a/src/components/common/Settings/AI/useAIConfigForm.ts +++ b/src/components/common/Settings/AI/useAIConfigForm.ts @@ -357,8 +357,7 @@ export function useAIConfigForm(props: { const canFetchModels = computed(() => { if (effectiveApiFormat.value === 'anthropic-messages') return false const baseUrl = formData.value.baseUrl || currentProviderDef.value?.defaultBaseUrl || '' - const hasKey = - formData.value.apiKey.trim() || isLocalMode.value || canReuseStoredKey.value + const hasKey = formData.value.apiKey.trim() || isLocalMode.value || canReuseStoredKey.value return !!(baseUrl.trim() && hasKey) }) @@ -569,7 +568,8 @@ export function useAIConfigForm(props: { // ============ 验证 ============ async function validateKey() { - const { provider, apiKey, baseUrl } = formData.value + const { provider, baseUrl } = formData.value + const apiKey = formData.value.apiKey.trim() const canReuse = canReuseStoredKey.value if (!isPresetMode.value) { @@ -589,7 +589,7 @@ export function useAIConfigForm(props: { const configId = !apiKey && canReuse ? props.config.value?.id : undefined try { - const testApiKey = apiKey || 'sk-no-key-required' + const testApiKey = !apiKey && canReuse ? '' : apiKey || 'sk-no-key-required' const result = await useLLMService().validateApiKey( provider || 'openai-compatible', testApiKey,