5c9b5ef69e
主要改动 1. 阿里云通用抠图接入(新增 platform-matting crate) 手搓阿里云 VIAPI 通用抠图接口(ACS3-HMAC-SHA256 签名),跨区输入走临时桶通道。 图片抠图升级为三档降级:BgFilter → 阿里云 → 本地键色兜底。 动作视频逐帧抠图改用阿里云,remove_editor_generated_green_screen_background 降为最后兜底。 2. 背景色不再写死绿色,改多背景色自动决策 动作视频背景色和生图一样从候选调色板自动选,选项继承。 3. 视觉背景色决策(修"蓝撞蓝") 让 LLM 看参考图选背景色(gpt-4o-mini 视觉模型,路由到 VectorEngine 视觉客户端),修复原纯文本盲选。 4. 背景色候选硬过滤器(新增 editor_screen_background_filter) 按参考图前景配色算 Lab 危险质量 + 皮肤专属三判据(ΔE 距离 / 色调投影 / RGB 分离)剔除撞色候选,LLM 只在安全集合里审美选。露肤角色自动收敛到冷区。新增"灰竹绿"候选补齐安全弧绿色段。 5. 源图合成到背景色(修视频背景变白) 透明源图先填成选定实色再发给 Ark,视频背景确定性等于抠图键色,不再赌模型服从提示词。 6. screenColorHex 结构化记录 + 死代码清理 四条链路统一把实际背景色写进 generation_inputs,修复生图链路"抠图背景色"字段从未生效的旧逻辑。 清理前端抠绿 + qwenSprite 死代码,移除一次性探针示例。 Reviewed-on: https://git.genarrative.world/git/GenarrativeAI/Genarrative/pulls/75 Reviewed-by: kdletters <kdletters@qq.com> Co-authored-by: Linghong <ink29535@proton.me> Co-committed-by: Linghong <ink29535@proton.me>
81 lines
2.7 KiB
JavaScript
81 lines
2.7 KiB
JavaScript
import {mergeApiServerEnv} from './dev-utils.mjs';
|
||
|
||
const REQUIRED_FOR_PUZZLE_GENERATION = [
|
||
'VECTOR_ENGINE_BASE_URL',
|
||
'VECTOR_ENGINE_API_KEY',
|
||
'ALIYUN_OSS_BUCKET',
|
||
'ALIYUN_OSS_ENDPOINT',
|
||
'ALIYUN_OSS_ACCESS_KEY_ID',
|
||
'ALIYUN_OSS_ACCESS_KEY_SECRET',
|
||
];
|
||
|
||
const COMMON_MISTYPED_KEYS = [
|
||
'ALIYUN_0SS_BUCKET',
|
||
'ALIYUN_0SS_ENDPOINT',
|
||
'ALIYUN_0SS_ACCESS_KEY_ID',
|
||
'ALIYUN_0SS_ACCESS_KEY_SECRET',
|
||
];
|
||
|
||
function hasValue(value) {
|
||
return typeof value === 'string' && value.trim().length > 0;
|
||
}
|
||
|
||
function printStatus(key, present) {
|
||
console.log(`${key}: ${present ? 'present' : 'missing'}`);
|
||
}
|
||
|
||
const env = mergeApiServerEnv(process.cwd(), process.env);
|
||
const missing = [];
|
||
|
||
console.log('[api-server-env] 认证短信配置检查');
|
||
printStatus('SMS_AUTH_ENABLED', env.SMS_AUTH_ENABLED === 'true');
|
||
printStatus('SMS_AUTH_PROVIDER', hasValue(env.SMS_AUTH_PROVIDER));
|
||
|
||
console.log('[api-server-env] 拼图真实生成配置检查');
|
||
for (const key of REQUIRED_FOR_PUZZLE_GENERATION) {
|
||
const present = hasValue(env[key]);
|
||
printStatus(key, present);
|
||
if (!present) {
|
||
missing.push(key);
|
||
}
|
||
}
|
||
|
||
const typoKeys = COMMON_MISTYPED_KEYS.filter((key) => hasValue(env[key]));
|
||
if (typoKeys.length > 0) {
|
||
console.log(
|
||
`[api-server-env] 检测到疑似拼错的 OSS 键名:${typoKeys.join(', ')}`,
|
||
);
|
||
}
|
||
|
||
// 阿里云通用抠图兜底层:默认 enabled=true,但 AccessKey 缺失时会被静默跳过,
|
||
// BgFilter 失败直接本地去背(质量下降)。属可选降级项,只告警不阻断部署。
|
||
console.log('[api-server-env] 抠图兜底(阿里云通用抠图)配置检查');
|
||
const mattingEnabled = env.GENARRATIVE_ALIYUN_MATTING_ENABLED !== 'false';
|
||
const mattingKeyPresent =
|
||
hasValue(env.GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_ID) ||
|
||
hasValue(env.ALIBABA_CLOUD_ACCESS_KEY_ID);
|
||
const mattingSecretPresent =
|
||
hasValue(env.GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_SECRET) ||
|
||
hasValue(env.ALIBABA_CLOUD_ACCESS_KEY_SECRET);
|
||
printStatus(
|
||
'GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_ID / ALIBABA_CLOUD_ACCESS_KEY_ID',
|
||
mattingKeyPresent,
|
||
);
|
||
printStatus(
|
||
'GENARRATIVE_ALIYUN_MATTING_ACCESS_KEY_SECRET / ALIBABA_CLOUD_ACCESS_KEY_SECRET',
|
||
mattingSecretPresent,
|
||
);
|
||
if (mattingEnabled && !(mattingKeyPresent && mattingSecretPresent)) {
|
||
console.warn(
|
||
'[api-server-env] 警告:GENARRATIVE_ALIYUN_MATTING_ENABLED 未关闭但缺少 AccessKey,' +
|
||
'阿里云抠图兜底层将被跳过,BgFilter 失败后直接本地去背(质量下降)。',
|
||
);
|
||
}
|
||
|
||
if (missing.length > 0) {
|
||
console.error(`[api-server-env] 缺少:${missing.join(', ')}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
console.log('[api-server-env] 配置齐全。重启 npm run dev:api-server 或 npm run dev 后生效。');
|