From e3f428013eacfea6de3182726bd66d697c1a5252 Mon Sep 17 00:00:00 2001
From: linshen <32978552+linshenkx@users.noreply.github.com>
Date: Wed, 21 Jan 2026 22:47:56 +0800
Subject: [PATCH] feat(ui): warn about CORS-restricted providers
Expose optional corsRestricted provider metadata and show tags/dialogs on connection tests in web. Also hide the warning tag in desktop where IPC bypasses CORS.
---
.../core/src/services/image-model/manager.ts | 19 ++-
.../src/services/image/adapters/dashscope.ts | 1 +
.../src/services/image/adapters/modelscope.ts | 1 +
.../src/services/image/adapters/seedream.ts | 1 +
packages/core/src/services/llm/types.ts | 6 +
packages/core/src/services/shared/types.ts | 6 +
.../ui/src/components/ImageModelEditModal.vue | 30 ++++-
.../ui/src/components/ImageModelManager.vue | 119 +++++++++++-------
.../ui/src/components/TextModelEditModal.vue | 31 ++++-
packages/ui/src/components/TextModelList.vue | 12 +-
.../ui/src/components/TextModelManager.vue | 28 ++++-
packages/ui/src/components/Toast.vue | 8 +-
packages/ui/src/i18n/locales/en-US.ts | 2 +
packages/ui/src/i18n/locales/zh-CN.ts | 2 +
packages/ui/src/i18n/locales/zh-TW.ts | 2 +
15 files changed, 209 insertions(+), 59 deletions(-)
diff --git a/packages/core/src/services/image-model/manager.ts b/packages/core/src/services/image-model/manager.ts
index 88350bcd..d45a26a8 100644
--- a/packages/core/src/services/image-model/manager.ts
+++ b/packages/core/src/services/image-model/manager.ts
@@ -350,8 +350,25 @@ export class ImageModelManager implements IImageModelManager {
// 确保配置是自包含的(包含完整的provider和model信息)
private ensureSelfContained(config: ImageModelConfig): ImageModelConfig {
- // 如果已经有完整的自包含字段,直接返回
+ // 如果已经有完整的自包含字段,尽量补齐新增的 provider 字段(保持向后兼容)
if (config.provider && config.model) {
+ // 旧存储数据里 provider 可能缺少新字段;用当前 adapter 的 provider 元数据补齐。
+ if (config.provider.corsRestricted === undefined) {
+ try {
+ const latestProvider = this.registry.getAdapter(config.providerId).getProvider()
+ if (latestProvider.corsRestricted !== undefined) {
+ return {
+ ...config,
+ provider: {
+ ...config.provider,
+ corsRestricted: latestProvider.corsRestricted
+ }
+ }
+ }
+ } catch {
+ // ignore - unknown provider or adapter failure
+ }
+ }
return config
}
diff --git a/packages/core/src/services/image/adapters/dashscope.ts b/packages/core/src/services/image/adapters/dashscope.ts
index a8caec38..503beea7 100644
--- a/packages/core/src/services/image/adapters/dashscope.ts
+++ b/packages/core/src/services/image/adapters/dashscope.ts
@@ -36,6 +36,7 @@ export class DashScopeImageAdapter extends AbstractImageProviderAdapter {
id: 'dashscope',
name: '阿里百炼',
description: '阿里云百炼图像生成服务,支持通义千问图像模型(文生图/图生图)',
+ corsRestricted: true,
requiresApiKey: true,
defaultBaseURL: 'https://dashscope.aliyuncs.com',
supportsDynamicModels: false,
diff --git a/packages/core/src/services/image/adapters/modelscope.ts b/packages/core/src/services/image/adapters/modelscope.ts
index 5947c233..5fbf6955 100644
--- a/packages/core/src/services/image/adapters/modelscope.ts
+++ b/packages/core/src/services/image/adapters/modelscope.ts
@@ -38,6 +38,7 @@ export class ModelScopeImageAdapter extends AbstractImageProviderAdapter {
id: 'modelscope',
name: 'ModelScope',
description: 'ModelScope 魔搭社区图像生成服务,每天免费 2000 次调用',
+ corsRestricted: true,
requiresApiKey: true,
defaultBaseURL: 'https://api-inference.modelscope.cn/v1',
supportsDynamicModels: false,
diff --git a/packages/core/src/services/image/adapters/seedream.ts b/packages/core/src/services/image/adapters/seedream.ts
index ae979d48..b66ef64e 100644
--- a/packages/core/src/services/image/adapters/seedream.ts
+++ b/packages/core/src/services/image/adapters/seedream.ts
@@ -21,6 +21,7 @@ export class SeedreamImageAdapter extends AbstractImageProviderAdapter {
id: 'seedream',
name: 'Seedream (火山方舟)',
description: '火山方舟 Seedream 图像生成模型',
+ corsRestricted: true,
requiresApiKey: true,
defaultBaseURL: 'https://ark.cn-beijing.volces.com/api/v3',
supportsDynamicModels: false, // 不支持动态获取
diff --git a/packages/core/src/services/llm/types.ts b/packages/core/src/services/llm/types.ts
index 2565e21c..07662ccf 100644
--- a/packages/core/src/services/llm/types.ts
+++ b/packages/core/src/services/llm/types.ts
@@ -27,6 +27,12 @@ export interface TextProvider {
readonly name: string
/** 描述信息 */
readonly description?: string
+ /**
+ * 浏览器环境是否会被 CORS 限制(无法直接请求该 API)。
+ * - true: Web 端可能因 CORS 被浏览器拦截,建议使用 Desktop 或自行配置代理
+ * - false/undefined: 未标记为 CORS 限制(不代表一定可用,仍可能受网络/鉴权等影响)
+ */
+ readonly corsRestricted?: boolean
/** 是否必须提供 API Key */
readonly requiresApiKey: boolean
/** 默认 API 地址 */
diff --git a/packages/core/src/services/shared/types.ts b/packages/core/src/services/shared/types.ts
index 8433a8c5..212ba282 100644
--- a/packages/core/src/services/shared/types.ts
+++ b/packages/core/src/services/shared/types.ts
@@ -27,6 +27,12 @@ export interface BaseProvider {
readonly name: string;
/** 描述信息 */
readonly description?: string;
+ /**
+ * 浏览器环境是否会被 CORS 限制(无法直接请求该 API)。
+ * - true: Web 端可能因 CORS 被浏览器拦截,建议使用 Desktop 或自行配置代理
+ * - false/undefined: 未标记为 CORS 限制(不代表一定可用,仍可能受网络/鉴权等影响)
+ */
+ readonly corsRestricted?: boolean;
/** 是否必须提供 API Key */
readonly requiresApiKey: boolean;
/** 默认 API 地址 */
diff --git a/packages/ui/src/components/ImageModelEditModal.vue b/packages/ui/src/components/ImageModelEditModal.vue
index bc0f41a6..67320dd9 100644
--- a/packages/ui/src/components/ImageModelEditModal.vue
+++ b/packages/ui/src/components/ImageModelEditModal.vue
@@ -232,23 +232,24 @@
diff --git a/packages/ui/src/components/TextModelManager.vue b/packages/ui/src/components/TextModelManager.vue
index 0b0b8126..7d535f56 100644
--- a/packages/ui/src/components/TextModelManager.vue
+++ b/packages/ui/src/components/TextModelManager.vue
@@ -20,15 +20,18 @@