feat: add guarded image generation controls

This commit is contained in:
john
2026-07-20 07:37:43 +08:00
parent 72ed4dde83
commit 105a72c1f1
19 changed files with 482 additions and 23 deletions
+16 -5
View File
@@ -32,10 +32,10 @@ export const ASSET_PLUGIN_CATALOG = [
];
export const IMAGE_MAKE_PURPOSE_CATALOG = [
{ id: 'inline_image', label: '页面正文图片', presetId: 'memind_square_illustration' },
{ id: 'hero', label: '页面头图', presetId: 'memind_dark_hero' },
{ id: 'card_cover', label: '卡片封面', presetId: 'memind_card_cover' },
{ id: 'feed_cover', label: '信息流缩略图源图', presetId: 'memind_feed_cover_source' },
{ id: 'inline_image', label: '页面正文图片', presetId: 'memind_square_illustration', strategy: 'generate', sourcePurpose: null },
{ id: 'hero', label: '页面头图', presetId: 'memind_dark_hero', strategy: 'generate', sourcePurpose: null },
{ id: 'card_cover', label: '卡片封面', presetId: 'memind_card_cover', strategy: 'derive', sourcePurpose: 'hero' },
{ id: 'feed_cover', label: '信息流缩略图', presetId: 'memind_feed_cover_source', strategy: 'derive', sourcePurpose: 'hero' },
];
const imageMakePurposeIds = new Set(IMAGE_MAKE_PURPOSE_CATALOG.map((purpose) => purpose.id));
@@ -281,10 +281,21 @@ export function createAssetGatewayConfigService(pool, { llmProviderService = nul
if (!resolved.plugin.purposes?.[purpose]) {
return { ok: false, code: 'purpose_disabled', message: '该图片用途未启用,可安全降级到原有流程' };
}
const purposeConfig = IMAGE_MAKE_PURPOSE_CATALOG.find((item) => item.id === purpose);
if (purposeConfig?.strategy === 'derive' && resolved.plugin.purposes?.hero) {
return {
ok: false,
code: 'reuse_hero_required',
message: '页面头图已启用:请只生成一次 hero,并从该主图派生卡片封面和信息流缩略图',
sourcePurpose: 'hero',
};
}
return {
ok: true,
purpose,
presetId: IMAGE_MAKE_PURPOSE_CATALOG.find((item) => item.id === purpose)?.presetId,
presetId: purposeConfig?.presetId,
strategy: purposeConfig?.strategy ?? 'generate',
sourcePurpose: purposeConfig?.sourcePurpose ?? null,
plugin: resolved.plugin,
};
},