diff --git a/backend/internal/service/app_settings.go b/backend/internal/service/app_settings.go index a5e4a2b..92a0f6e 100644 --- a/backend/internal/service/app_settings.go +++ b/backend/internal/service/app_settings.go @@ -51,6 +51,7 @@ type CreditSettings struct { // DeAISettings is the per-tier surcharge (积分) for the 去AI特征 option on the // 画图台 — charged on top of the model's image price when the toggle is on. type DeAISettings struct { + Enabled bool `json:"enabled"` Price1K int `json:"price_1k"` Price2K int `json:"price_2k"` Price4K int `json:"price_4k"` @@ -343,6 +344,10 @@ func (s *AppSettingsService) TestProxy(ctx context.Context, proxy string) (map[s } func (s *AppSettingsService) DeAI(ctx context.Context) (*DeAISettings, error) { + enabledRaw, err := s.settings.GetValue(ctx, "deai.enabled") + if err != nil { + return nil, err + } p1Raw, err := s.settings.GetValue(ctx, "deai.price_1k") if err != nil { return nil, err @@ -356,6 +361,7 @@ func (s *AppSettingsService) DeAI(ctx context.Context) (*DeAISettings, error) { return nil, err } return &DeAISettings{ + Enabled: parseBoolSetting(enabledRaw, false), Price1K: clampNonNegative(parseIntSetting(p1Raw, 1)), Price2K: clampNonNegative(parseIntSetting(p2Raw, 2)), Price4K: clampNonNegative(parseIntSetting(p4Raw, 3)), @@ -364,6 +370,7 @@ func (s *AppSettingsService) DeAI(ctx context.Context) (*DeAISettings, error) { func (s *AppSettingsService) SaveDeAI(ctx context.Context, in DeAISettings) (*DeAISettings, error) { if err := s.settings.UpsertValues(ctx, map[string]string{ + "deai.enabled": strconv.FormatBool(in.Enabled), "deai.price_1k": strconv.Itoa(clampNonNegative(in.Price1K)), "deai.price_2k": strconv.Itoa(clampNonNegative(in.Price2K)), "deai.price_4k": strconv.Itoa(clampNonNegative(in.Price4K)), diff --git a/backend/internal/service/v1.go b/backend/internal/service/v1.go index 0f1b6c0..1e8f065 100644 --- a/backend/internal/service/v1.go +++ b/backend/internal/service/v1.go @@ -418,6 +418,11 @@ func (s *V1Service) prepareImageExecution(ctx context.Context, principal *APIPri return nil, err } } + // 去AI特征 is gated by a system-settings switch (default off) — drop the + // flag when disabled so no surcharge is charged and no processing runs. + if in.DeAI && !s.deaiEnabled(ctx) { + in.DeAI = false + } genCtx, cancel := context.WithTimeout(ctx, 8*time.Minute) defer cancel() @@ -2879,6 +2884,19 @@ func guessRatio(w, h int) string { // firstPricedResolution returns the model's lowest priced image tier (1K/2K/4K // order), or "" if none is priced. Used to rescue a request whose resolution // the model doesn't support. +// deaiEnabled reports whether the 去AI特征 feature is switched on in system +// settings (default off). When off, an incoming deai flag is ignored entirely. +func (s *V1Service) deaiEnabled(ctx context.Context) bool { + if s.settings == nil { + return false + } + raw, err := s.settings.GetValue(ctx, "deai.enabled") + if err != nil { + return false + } + return parseBoolSetting(raw, false) +} + // deaiSurcharge returns the 去AI特征 surcharge (积分) for an image resolution // tier, from site settings (defaults: 1K=1, 2K=2, 4K=3). func (s *V1Service) deaiSurcharge(ctx context.Context, resolution string) float64 { diff --git a/frontend/src/views/ConfigView.vue b/frontend/src/views/ConfigView.vue index 82497bf..a4a1fbd 100644 --- a/frontend/src/views/ConfigView.vue +++ b/frontend/src/views/ConfigView.vue @@ -121,7 +121,7 @@ const credits = reactive({ checkin_enabled: true, checkin_reward: 3, invite_enab const credBusy = ref(false); const credSaved = ref(false) // ---- deai (去AI特征 附加价格) ---- -const deaiCfg = reactive({ price_1k: 1, price_2k: 2, price_4k: 3 }) +const deaiCfg = reactive({ enabled: false, price_1k: 1, price_2k: 2, price_4k: 3 }) const deaiBusy = ref(false); const deaiSaved = ref(false) async function loadDeai() { const r = await api('/settings/deai') @@ -130,6 +130,7 @@ async function loadDeai() { async function saveDeai() { deaiBusy.value = true; deaiSaved.value = false const r = await api('/settings/deai', jsonBody('PUT', { + enabled: !!deaiCfg.enabled, price_1k: Number(deaiCfg.price_1k) || 0, price_2k: Number(deaiCfg.price_2k) || 0, price_4k: Number(deaiCfg.price_4k) || 0, @@ -489,14 +490,18 @@ onMounted(() => { loadSite(); loadReg(); loadSmtp(); loadCredits(); loadAnnounce

画图台开启「去AI特征」后,按画质档位在模型价格之上额外扣除的积分。仅对图片生成生效。

+ -
-
+