修复种草图生成:以三合一主图为参考 img2img 生成,按颜色分配(每色优先、超出随机补足);新增 BR/CA/DE/ES/IT/PL/SA 七国配置与提示词;删除验证用测试脚本

This commit is contained in:
2026-08-24 14:02:19 +08:00
parent f493bde8a9
commit 3c341d2e78
51 changed files with 2571 additions and 514 deletions
+15 -6
View File
@@ -8,7 +8,8 @@
4. 用完全用:池中种子数 ≤ 需要数时全部使用(不再随机限量/截断);
5. 每个国家独立配置:configs/countries/<country>.yaml 的 style.seeds / related.seed_keywords。
limit 由 seed_node 从 context 注入max_style_seeds / max_related_seeds0 或缺失=不限)。
limit 由 seed_node 从 context 注入max_seeds(单一总量,不再按类型分,从统一池随机抽后均分
style/related);兼容旧参数 max_style_seeds / max_related_seeds0 或缺失=不限)。
LLM 后端生成失败时自动回退到静态+节日主题,保证不中断。
"""
import random
@@ -87,14 +88,22 @@ class DynamicStrategy(SeedStrategy):
add(dyn_related, 1.0, "dynamic")
items = list(pool.values())
limit_total = int(context.get("max_seeds") or 0)
limit_style = int(context.get("max_style_seeds") or 0)
limit_related = int(context.get("max_related_seeds") or 0)
# 2) 每次随机取(加权,不重复);池不足 → 全部用
style_pick = _weighted_sample(items, limit_style)
style_keys = {id(it) for it in style_pick}
remaining = [it for it in items if id(it) not in style_keys]
related_pick = _weighted_sample(remaining, limit_related)
if limit_total > 0:
# 不再按类型分:从统一池随机抽 max_seeds 个,均分到 style/related(各约一半)
pick = _weighted_sample(items, limit_total)
half = (len(pick) + 1) // 2
style_pick = pick[:half]
related_pick = pick[half:]
else:
# 兼容旧参数(max_style_seeds / max_related_seeds 分别限量)
style_pick = _weighted_sample(items, limit_style)
style_keys = {id(it) for it in style_pick}
remaining = [it for it in items if id(it) not in style_keys]
related_pick = _weighted_sample(remaining, limit_related)
return {
"style_seeds": [it["word"] for it in style_pick],
+71
View File
@@ -101,6 +101,74 @@ _HOLIDAYS_BY_COUNTRY: Dict[str, List[tuple]] = {
("Boxing Day", 12, 26, None, 21),
("Halloween", 10, 31, None, 21),
],
"DE": [
("New Year", 1, 1, None, 14),
("Valentine's Day", 2, 14, None, 21),
("Easter", 0, 0, "easter", 21),
("Oktoberfest", 9, 21, "third_saturday", 30), # 啤酒节(9 月第三个周六)
("German Unity Day", 10, 3, None, 21),
("Halloween", 10, 31, None, 30),
("Advent Season", 11, 30, None, 30),
("Christmas", 12, 25, None, 30),
("Boxing Day", 12, 26, None, 14),
],
"BR": [
("New Year", 1, 1, None, 14),
("Carnival", 2, 15, None, 30), # 狂欢节(浮动,2 月近似)
("Easter", 0, 0, "easter", 21),
("Tiradentes Day", 4, 21, None, 14),
("Independence Day (BR)", 9, 7, None, 21),
("Children's Day (BR)", 10, 12, None, 21),
("Halloween", 10, 31, None, 30),
("Christmas", 12, 25, None, 30),
("New Year Eve", 12, 31, None, 14),
],
"SA": [
("New Year", 1, 1, None, 14),
("Saudi Founding Day", 2, 22, None, 21),
("Saudi National Day", 9, 23, None, 30),
("Winter Season", 12, 1, None, 30),
],
"PL": [
("New Year", 1, 1, None, 14),
("Valentine's Day", 2, 14, None, 21),
("Easter", 0, 0, "easter", 21),
("Constitution Day (PL)", 5, 3, None, 21),
("Halloween", 10, 31, None, 30),
("Independence Day (PL)", 11, 11, None, 21),
("Christmas", 12, 25, None, 30),
("Boxing Day", 12, 26, None, 14),
],
"ES": [
("Three Kings Day", 1, 6, None, 14),
("Valentine's Day", 2, 14, None, 21),
("Easter (Semana Santa)", 0, 0, "easter", 21),
("Feria de Abril", 4, 15, None, 21),
("La Tomatina", 8, 27, None, 21),
("Halloween", 10, 31, None, 30),
("Christmas", 12, 25, None, 30),
("New Year Eve", 12, 31, None, 14),
],
"IT": [
("New Year", 1, 1, None, 14),
("Epiphany", 1, 6, None, 14),
("Valentine's Day", 2, 14, None, 21),
("Carnevale", 2, 15, None, 21),
("Easter", 0, 0, "easter", 21),
("Ferragosto", 8, 15, None, 21),
("Halloween", 10, 31, None, 30),
("Christmas", 12, 25, None, 30),
],
"CA": [
("New Year", 1, 1, None, 14),
("Valentine's Day", 2, 14, None, 21),
("Easter", 0, 0, "easter", 21),
("Canada Day", 7, 1, None, 21),
("Thanksgiving (CA)", 10, 12, None, 21), # 10 月第 2 周一(近似固定日)
("Halloween", 10, 31, None, 30),
("Christmas", 12, 25, None, 30),
("Boxing Day", 12, 26, None, 14),
],
}
@@ -147,6 +215,9 @@ def _resolve(name: str, month: int, day: int, rule, year: int) -> Optional[datet
if rule == "labor":
first = datetime.date(year, month, 1)
return first + datetime.timedelta(days=(0 - first.weekday()) % 7)
if rule == "third_saturday":
first = datetime.date(year, month, 1)
return first + datetime.timedelta(days=(5 - first.weekday()) % 7 + 2 * 7)
return None