diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index 5f968ac7..8a952075 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -2283,6 +2283,8 @@ export default { webSearchEmulation: 'Web Search Emulation', webSearchEmulationHint: '⚠️ When enabled, all accounts in this channel\'s Anthropic groups will intercept web_search requests. Use with caution.', webSearchEmulationGlobalDisabled: 'Please enable the global switch first in Settings → Gateway → Web Search Emulation', + codexImageGenerationBridge: 'Codex Image Generation Bridge', + codexImageGenerationBridgeHint: 'When enabled, Codex /responses text requests in OpenAI groups may be automatically given the image_generation tool. Keep off unless the routed accounts support image generation.', basicSettings: 'Basic Settings', addPlatform: 'Add Platform', noPlatforms: 'Click "Add Platform" to start configuring the channel', diff --git a/frontend/src/i18n/locales/zh.ts b/frontend/src/i18n/locales/zh.ts index a37a9786..14fe5bbd 100644 --- a/frontend/src/i18n/locales/zh.ts +++ b/frontend/src/i18n/locales/zh.ts @@ -2360,6 +2360,8 @@ export default { webSearchEmulation: 'Web Search 模拟', webSearchEmulationHint: '⚠️ 开启后该渠道下所有 Anthropic 分组的账号将自动拦截 web_search 请求,请谨慎操作', webSearchEmulationGlobalDisabled: '请先在系统设置 → 网关 → Web Search 模拟中启用全局开关', + codexImageGenerationBridge: 'Codex 图片生成桥接', + codexImageGenerationBridgeHint: '开启后,OpenAI 分组的 Codex /responses 文本请求可能会被自动注入 image_generation 工具。仅在路由账号支持图片生成时开启。', basicSettings: '基础设置', addPlatform: '添加平台', noPlatforms: '点击"添加平台"开始配置渠道', diff --git a/frontend/src/views/admin/ChannelsView.vue b/frontend/src/views/admin/ChannelsView.vue index e4452b98..89be573e 100644 --- a/frontend/src/views/admin/ChannelsView.vue +++ b/frontend/src/views/admin/ChannelsView.vue @@ -339,6 +339,21 @@ + +
+
+
+ +

+ {{ t('admin.channels.form.codexImageGenerationBridgeHint') }} +

+
+ +
+
+
@@ -643,6 +658,7 @@ interface PlatformSection { model_mapping: Record model_pricing: PricingFormEntry[] web_search_emulation: boolean + codex_image_generation_bridge: boolean account_stats_pricing_rules: FormPricingRule[] } @@ -738,6 +754,7 @@ function addPlatformSection(platform: GroupPlatform) { model_mapping: {}, model_pricing: [], web_search_emulation: false, + codex_image_generation_bridge: false, account_stats_pricing_rules: [], }) } @@ -1047,6 +1064,19 @@ function formToAPI(): { group_ids: number[], model_pricing: ChannelModelPricing[ delete featuresConfig.web_search_emulation } + const codexImageGenerationBridge: Record = {} + for (const section of form.platforms) { + if (!section.enabled) continue + if (section.platform === 'openai') { + codexImageGenerationBridge[section.platform] = !!section.codex_image_generation_bridge + } + } + if (Object.keys(codexImageGenerationBridge).length > 0) { + featuresConfig.codex_image_generation_bridge = codexImageGenerationBridge + } else { + delete featuresConfig.codex_image_generation_bridge + } + return { group_ids, model_pricing, model_mapping, features_config: featuresConfig } } @@ -1095,6 +1125,8 @@ function apiToForm(channel: Channel): PlatformSection[] { const fc = channel.features_config const wsEmulation = fc?.web_search_emulation as Record | undefined const webSearchEnabled = wsEmulation?.[platform] === true + const codexImageGenerationBridge = fc?.codex_image_generation_bridge as Record | undefined + const codexImageGenerationBridgeEnabled = codexImageGenerationBridge?.[platform] === true sections.push({ platform, @@ -1104,6 +1136,7 @@ function apiToForm(channel: Channel): PlatformSection[] { model_mapping: { ...mapping }, model_pricing: pricing, web_search_emulation: webSearchEnabled, + codex_image_generation_bridge: codexImageGenerationBridgeEnabled, account_stats_pricing_rules: [], }) }