feat: 初始化画个标仓库 - AI驱动设计系统(BYOK模式) - 224源/371504图标+25海报源+130技能

This commit is contained in:
sgp
2026-10-03 21:44:18 +08:00
commit 9e222877ea
497 changed files with 43611 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
/**
* 🤖 bottts 机器人头像生成共享逻辑(预览页与 PNG 渲染共用,保证 seed 序列一致)
* - 过滤负面表情变体:eyes.dizzy(眩晕)、mouth.bite(龇牙)
* - 确定性 seed(agent-N),负面/重复时自动追加后缀重试
*/
'use strict';
/** 负面变体特征字符串(来自 dicebear-bottts.js 定义,命中即视为负面表情) */
const NEG_MARKERS = [
'M30.5 15.3c.4-.4', // eyes.dizzy(眩晕旋转眼)
'6-8H10z' // mouth.bite(咬合龇牙)
];
function isNegative(svg) {
return NEG_MARKERS.some(m => svg.includes(m));
}
/**
* 生成 count 个不重复、非负面表情的头像
* @param {(seed:string)=>{svg:string}} render 渲染函数(同 seed 同输出)
* @param {number} count 数量
* @returns {{seed:string, svg:string}[]}
*/
function generateSeeds(render, count) {
const out = [];
let n = 1;
let guard = 0;
const MAX_GUARD = count * 120 + 5000;
while (out.length < count) {
if (++guard > MAX_GUARD) {
throw new Error(`[bot-common] 生成 ${count} 个唯一头像失败:该风格可能渲染无变化(n=${n}, 已有 ${out.length})`);
}
let seed = 'agent-' + n;
let svg = render(seed).svg;
if (!svg) { n++; continue; } // 空渲染直接跳过
let attempt = 0;
while (isNegative(svg) || out.some(o => o.svg === svg)) {
attempt++;
if (attempt > 60) break; // 保护
seed = 'agent-' + n + '-' + attempt;
svg = render(seed).svg;
if (!svg) { n++; break; }
}
if (!isNegative(svg) && !out.some(o => o.svg === svg)) {
out.push({ seed, svg });
}
n++;
}
return out;
}
module.exports = { generateSeeds, isNegative };