Browse Source

fix(ventAI): 点击解读路径复用 StreamError 结构化错误并转可读文案 (M2)

lizuo 5 ngày trước cách đây
mục cha
commit
2c2673eb72

+ 2 - 1
src/views/ventAI/dataPicker/api.ts

@@ -1,5 +1,6 @@
 import type { SSERawEvent } from './types';
 import { getToken } from '/@/utils/auth';
+import { throwStreamHttpError } from '/@/views/ventAI/manageAssistent/api';
 
 enum Api {
   clickTun = '/ventAI/api/interpret/click/tun',
@@ -48,7 +49,7 @@ async function ssePost(
   });
 
   if (!response.ok) {
-    throw new Error(`HTTP错误: ${response.status}`);
+    await throwStreamHttpError(response);
   }
 
   const reader = response.body!.getReader();

+ 21 - 1
src/views/ventAI/dataPicker/useDataPicker.ts

@@ -6,6 +6,7 @@ import DataPickerModal from './components/DataPickerModal.vue';
 import aiCloseIcon from '@/assets/images/ventAI/dataPicker/AI-close.svg';
 import aiOpenIcon from '@/assets/images/ventAI/dataPicker/AI-open.svg';
 import { getActions } from '/@/qiankun/state';
+import { StreamError } from '/@/views/ventAI/manageAssistent/api';
 
 // ─── 全局开关:控制悬停模式浮动按钮是否启用 ─────────────────────────────────
 const STORAGE_KEY = 'dataPickerHoverEnabled';
@@ -338,6 +339,25 @@ export function useDataPicker(
     }
   }
 
+  /** 点击解读失败时,把结构化 StreamError 转成可读文案 */
+  function formatClickError(e: any): string {
+    const fallback = e?.message || '请求失败';
+    if (e instanceof StreamError && e.status === 429) {
+      if (typeof e.retryAfter === 'number') {
+        const minutes = Math.ceil(e.retryAfter / 60);
+        return `${fallback}(约${minutes < 1 ? '不到 1 分钟' : `${minutes} 分钟`}后恢复)`;
+      }
+      return `${fallback}(请稍后再试)`;
+    }
+    if (e instanceof StreamError && e.status === 413 && (!e.message || e.message === 'HTTP错误: 413')) {
+      return '附件体积超过上限,请减小文件后重试';
+    }
+    if (e instanceof StreamError && e.status === 404 && (!e.message || e.message === 'HTTP错误: 404')) {
+      return '会话不存在或无权访问';
+    }
+    return fallback;
+  }
+
   // 点击触发
   function handleClick(item: any) {
     modalVisible.value = true;
@@ -356,7 +376,7 @@ export function useDataPicker(
 
     request
       .catch((e: any) => {
-        error.value = e?.message || '请求失败';
+        error.value = formatClickError(e);
       })
       .finally(() => {
         loading.value = false;

+ 1 - 1
src/views/ventAI/manageAssistent/api.ts

@@ -66,7 +66,7 @@ export class StreamError extends Error {
   }
 }
 
-const throwStreamHttpError = async (response: Response): Promise<never> => {
+export const throwStreamHttpError = async (response: Response): Promise<never> => {
   let detail: ApiErrorDetail | undefined;
   let message = `HTTP错误: ${response.status}`;
   try {