@@ -3065,7 +3104,8 @@ import type {
AccountPlatform,
AccountType,
CheckMixedChannelResponse,
- CreateAccountRequest
+ CreateAccountRequest,
+ OpenAICompactMode
} from '@/types'
import BaseDialog from '@/components/common/BaseDialog.vue'
import ConfirmDialog from '@/components/common/ConfirmDialog.vue'
@@ -3207,6 +3247,7 @@ const editWeeklyResetDay = ref(null)
const editWeeklyResetHour = ref(null)
const editResetTimezone = ref(null)
const modelMappings = ref([])
+const openAICompactModelMappings = ref([])
const modelRestrictionMode = ref<'whitelist' | 'mapping'>('whitelist')
const allowedModels = ref([])
const DEFAULT_POOL_MODE_RETRY_COUNT = 3
@@ -3219,6 +3260,7 @@ const customErrorCodeInput = ref(null)
const interceptWarmupRequests = ref(false)
const autoPauseOnExpired = ref(true)
const openaiPassthroughEnabled = ref(false)
+const openAICompactMode = ref('auto')
const openaiOAuthResponsesWebSocketV2Mode = ref(OPENAI_WS_MODE_OFF)
const openaiAPIKeyResponsesWebSocketV2Mode = ref(OPENAI_WS_MODE_OFF)
const codexCLIOnlyEnabled = ref(false)
@@ -3267,10 +3309,16 @@ const bedrockApiKeyValue = ref('')
const tempUnschedEnabled = ref(false)
const tempUnschedRules = ref([])
const getModelMappingKey = createStableObjectKeyResolver('create-model-mapping')
+const getOpenAICompactModelMappingKey = createStableObjectKeyResolver('create-openai-compact-model-mapping')
const getAntigravityModelMappingKey = createStableObjectKeyResolver('create-antigravity-model-mapping')
const getTempUnschedRuleKey = createStableObjectKeyResolver('create-temp-unsched-rule')
const geminiOAuthType = ref<'code_assist' | 'google_one' | 'ai_studio'>('google_one')
const geminiAIStudioOAuthEnabled = ref(false)
+const openAICompactModeOptions = computed(() => [
+ { value: 'auto', label: t('admin.accounts.openai.compactModeAuto') },
+ { value: 'force_on', label: t('admin.accounts.openai.compactModeForceOn') },
+ { value: 'force_off', label: t('admin.accounts.openai.compactModeForceOff') }
+])
function buildAntigravityExtra(): Record | undefined {
const extra: Record = {}
@@ -3279,6 +3327,9 @@ function buildAntigravityExtra(): Record | undefined {
return Object.keys(extra).length > 0 ? extra : undefined
}
+const buildOpenAICompactModelMapping = () =>
+ buildModelMappingObject('mapping', [], openAICompactModelMappings.value)
+
const showMixedChannelWarning = ref(false)
const mixedChannelWarningDetails = ref<{ groupName: string; currentPlatform: string; otherPlatform: string } | null>(
null
@@ -3670,6 +3721,14 @@ watch(
}
)
+const addOpenAICompactModelMapping = () => {
+ openAICompactModelMappings.value.push({ from: '', to: '' })
+}
+
+const removeOpenAICompactModelMapping = (index: number) => {
+ openAICompactModelMappings.value.splice(index, 1)
+}
+
const removeModelMapping = (index: number) => {
modelMappings.value.splice(index, 1)
}
@@ -3962,6 +4021,7 @@ const resetForm = () => {
editWeeklyResetHour.value = null
editResetTimezone.value = null
modelMappings.value = []
+ openAICompactModelMappings.value = []
modelRestrictionMode.value = 'whitelist'
allowedModels.value = [...claudeModels] // Default fill related models
@@ -3978,6 +4038,7 @@ const resetForm = () => {
interceptWarmupRequests.value = false
autoPauseOnExpired.value = true
openaiPassthroughEnabled.value = false
+ openAICompactMode.value = 'auto'
openaiOAuthResponsesWebSocketV2Mode.value = OPENAI_WS_MODE_OFF
openaiAPIKeyResponsesWebSocketV2Mode.value = OPENAI_WS_MODE_OFF
codexCLIOnlyEnabled.value = false
@@ -4060,6 +4121,11 @@ const buildOpenAIExtra = (base?: Record): Record 0 ? extra : undefined
}
@@ -4312,6 +4378,12 @@ const handleSubmit = async () => {
credentials.model_mapping = modelMapping
}
}
+ if (form.platform === 'openai') {
+ const compactModelMapping = buildOpenAICompactModelMapping()
+ if (compactModelMapping) {
+ credentials.compact_model_mapping = compactModelMapping
+ }
+ }
// Add pool mode if enabled
if (poolModeEnabled.value) {
@@ -4424,6 +4496,14 @@ const createAccountAndFinish = async (
finalExtra = quotaExtra
}
}
+ if (platform === 'openai') {
+ const compactModelMapping = buildOpenAICompactModelMapping()
+ if (compactModelMapping) {
+ credentials.compact_model_mapping = compactModelMapping
+ } else {
+ delete credentials.compact_model_mapping
+ }
+ }
await doCreateAccount({
name: form.name,
notes: form.notes,
@@ -4478,6 +4558,12 @@ const handleOpenAIExchange = async (authCode: string) => {
credentials.model_mapping = modelMapping
}
}
+ if (shouldCreateOpenAI) {
+ const compactModelMapping = buildOpenAICompactModelMapping()
+ if (compactModelMapping) {
+ credentials.compact_model_mapping = compactModelMapping
+ }
+ }
// 应用临时不可调度配置
if (!applyTempUnschedConfig(credentials)) {
@@ -4570,6 +4656,12 @@ const handleOpenAIBatchRT = async (refreshTokenInput: string, clientId?: string)
credentials.model_mapping = modelMapping
}
}
+ if (shouldCreateOpenAI) {
+ const compactModelMapping = buildOpenAICompactModelMapping()
+ if (compactModelMapping) {
+ credentials.compact_model_mapping = compactModelMapping
+ }
+ }
// Generate account name; fallback to email if name is empty (ent schema requires NotEmpty)
const baseName = form.name || tokenInfo.email || 'OpenAI OAuth Account'
diff --git a/frontend/src/components/account/EditAccountModal.vue b/frontend/src/components/account/EditAccountModal.vue
index 0a54919a..85f05395 100644
--- a/frontend/src/components/account/EditAccountModal.vue
+++ b/frontend/src/components/account/EditAccountModal.vue
@@ -1338,6 +1338,64 @@