From 12a00f17024cef90a292bad24f33608a004b3085 Mon Sep 17 00:00:00 2001 From: marcomarcogd <35049765+marcomarcogd@users.noreply.github.com> Date: Tue, 25 Aug 2026 10:46:09 +0800 Subject: [PATCH] fix(ai): return user-friendly errors across AI features --- .../src/components/article/AISearchBar.vue | 3 +- .../modals/settings/ai/AIProfileList.vue | 10 +- .../modals/settings/ai/AIProfileModal.vue | 5 +- frontend/src/composables/ai/useAIProfiles.ts | 7 +- .../composables/article/useArticleSummary.ts | 16 +- frontend/src/i18n/locales/en.ts | 20 +++ frontend/src/i18n/locales/zh.ts | 15 ++ frontend/src/types/aiProfile.ts | 1 + frontend/src/utils/aiError.ts | 118 ++++++++++++++ internal/ai/deepseek_test.go | 43 ++++- internal/ai/user_error.go | 152 ++++++++++++++++++ internal/handlers/ai/ai_handlers.go | 18 ++- internal/handlers/ai/ai_profiles_handlers.go | 18 ++- internal/handlers/ai/ai_search.go | 55 ++++--- internal/handlers/summary/summary_handlers.go | 5 +- .../translation/translation_handlers.go | 14 +- 16 files changed, 432 insertions(+), 68 deletions(-) create mode 100644 frontend/src/utils/aiError.ts create mode 100644 internal/ai/user_error.go diff --git a/frontend/src/components/article/AISearchBar.vue b/frontend/src/components/article/AISearchBar.vue index 517f1f24c..97019445e 100644 --- a/frontend/src/components/article/AISearchBar.vue +++ b/frontend/src/components/article/AISearchBar.vue @@ -3,6 +3,7 @@ import { ref, computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { PhMagnifyingGlass, PhX, PhSparkle, PhSpinner } from '@phosphor-icons/vue'; import type { Article } from '@/types/models'; +import { getAIErrorMessage } from '@/utils/aiError'; const { t } = useI18n(); @@ -37,7 +38,7 @@ async function performAISearch() { const data = await response.json(); if (!data.success) { - errorMessage.value = data.error || t('aiSearch.searchFailed'); + errorMessage.value = getAIErrorMessage(data, response.status); window.showToast(errorMessage.value, 'error'); return; } diff --git a/frontend/src/components/modals/settings/ai/AIProfileList.vue b/frontend/src/components/modals/settings/ai/AIProfileList.vue index ac0c3817b..f0a02e0c7 100644 --- a/frontend/src/components/modals/settings/ai/AIProfileList.vue +++ b/frontend/src/components/modals/settings/ai/AIProfileList.vue @@ -15,6 +15,7 @@ import type { AIProfile, AIProfileTestResult, AIProfileFormData } from '@/types/ import { useAIProfiles } from '@/composables/ai/useAIProfiles'; import { getProviderIconUrl } from '@/composables/ai/useAIProvider'; import AIProfileModal from './AIProfileModal.vue'; +import { getAIErrorMessage } from '@/utils/aiError'; const { t } = useI18n(); const { @@ -130,6 +131,11 @@ function getTestStatus(profileId: number): 'success' | 'error' | 'unknown' { if (!result) return 'unknown'; return result.config_valid && result.connection_success ? 'success' : 'error'; } + +function getTestError(profileId: number): string { + const result = testResults.value.get(profileId); + return result ? getAIErrorMessage(result) : ''; +}