From cf26474cc07bd696d08305a7d86d4395628a0dd9 Mon Sep 17 00:00:00 2001 From: qian Date: Sat, 6 Jun 2026 23:03:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(playground):=E4=BF=AE=E5=A4=8D=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/tenant/src/utils/playgroundApi.ts | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 web/tenant/src/utils/playgroundApi.ts diff --git a/web/tenant/src/utils/playgroundApi.ts b/web/tenant/src/utils/playgroundApi.ts new file mode 100644 index 0000000..26605a4 --- /dev/null +++ b/web/tenant/src/utils/playgroundApi.ts @@ -0,0 +1,41 @@ +import axios from 'axios' +import type { AxiosInstance } from 'axios' + +/** + * createPlaygroundApi 创建一个独立的 axios 实例,用于 Playground 直接调用 /v1/* 端点。 + * + * 与主 request.ts 的区别: + * - 使用 API Key(sk-xxx)认证,而非 JWT + * - 不走统一响应格式拦截(/v1/* 返回原生 OpenAI 格式) + * - 错误格式为 {error: {type, message}} + */ +export function createPlaygroundApi(apiKey: string): AxiosInstance { + const instance = axios.create({ + timeout: 60_000, + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}`, + }, + }) + + instance.interceptors.response.use( + (response) => response, + (error) => { + // 解析 OpenAI 错误格式: {error: {type, message, code}} + if (error.response?.data?.error) { + const relayError = error.response.data.error + const msg = relayError.message || '请求失败' + const err = new Error(msg) + ;(err as any).relayError = relayError + return Promise.reject(err) + } + // 网络或其它错误 + if (!error.response) { + return Promise.reject(new Error('网络连接异常,请稍后重试')) + } + return Promise.reject(error) + }, + ) + + return instance +}