修复种草图生成:以三合一主图为参考 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
+25 -24
View File
@@ -31,7 +31,7 @@ import yaml
from graph.agent import run_country
COUNTRIES = ["US", "GB", "JP", "AU", "MX"]
COUNTRIES = ["US", "GB", "JP", "AU", "MX", "DE", "BR", "SA", "PL", "ES", "IT", "CA"]
# LLM 只适配 OpenAI 兼容协议:openai(真调用,可在下方配置自定义模型/URL/Key)/ mock(无 key 演示占位)
PROVIDERS = ["openai", "mock"]
@@ -194,7 +194,7 @@ def _apply_provider_mode(config: dict, provider: str) -> None:
f"llm_screen={ls['provider']} compose={cp['backend']} product={pp['backend']}")
def fetch_keywords(country, provider, max_style, max_related, log_q, oai=None):
def fetch_keywords(country, provider, max_seeds, log_q, oai=None):
"""后台线程:仅跑「采集+去重过滤」链路(seed→fetch→filter),
把过滤后的关键词(数量不定)实时回传 UI 显示。"""
from graph.agent import build_country_config
@@ -205,8 +205,7 @@ def fetch_keywords(country, provider, max_style, max_related, log_q, oai=None):
config = load_config()
config["seed_provider"] = provider
cfg = config.setdefault("seed_provider_cfg", {})
cfg["max_style_seeds"] = max_style
cfg["max_related_seeds"] = max_related
cfg["max_seeds"] = max_seeds
apply_openai_cfg(config, oai)
_apply_provider_mode(config, provider) # OpenAI 模式开关(采集只用 seed,其余为后续统一)
@@ -278,7 +277,7 @@ def fetch_keywords(country, provider, max_style, max_related, log_q, oai=None):
log_q.put(("log", f"[UI] 缓存打包失败: {e}\n"))
def run_pipeline(countries, provider, max_style, max_related, log_q,
def run_pipeline(countries, provider, max_seeds, log_q,
spu_code="", sku_code="", spu_count=0,
spu_tasks=None, oai=None, markup_percent=0.0, code_prefix="DG",
template_path=""):
@@ -297,8 +296,7 @@ def run_pipeline(countries, provider, max_style, max_related, log_q,
config = load_config()
config["seed_provider"] = provider
cfg = config.setdefault("seed_provider_cfg", {})
cfg["max_style_seeds"] = max_style
cfg["max_related_seeds"] = max_related
cfg["max_seeds"] = max_seeds
apply_openai_cfg(config, oai)
# OpenAI 模式开关:provider=openai → 全链路真 LLM/真生图;mock → 全 mock 演示
_apply_provider_mode(config, provider)
@@ -451,21 +449,19 @@ class App(tk.Tk):
top.pack(fill="x")
ttk.Label(top, text="国家:").pack(side="left")
self.country_var = tk.StringVar(value="US")
for c in COUNTRIES:
ttk.Radiobutton(top, text=c, value=c, variable=self.country_var,
command=self._on_country_selected).pack(side="left", padx=4)
self.country_combo = ttk.Combobox(top, textvariable=self.country_var,
values=COUNTRIES, state="readonly", width=6)
self.country_combo.pack(side="left", padx=4)
self.country_combo.bind("<<ComboboxSelected>>", lambda e: self._on_country_selected())
ttk.Label(top, text=" 模式:").pack(side="left", padx=(14, 0))
self.provider_var = tk.StringVar(value=self._default_provider())
ttk.Radiobutton(top, text="OpenAI(真 LLM+生图)", value="openai",
variable=self.provider_var).pack(side="left", padx=2)
ttk.Radiobutton(top, text="Mock 演示", value="mock",
variable=self.provider_var).pack(side="left", padx=2)
ttk.Label(top, text=" 种子上限:").pack(side="left", padx=(14, 0))
self.style_var = tk.StringVar(value="12")
ttk.Entry(top, textvariable=self.style_var, width=4).pack(side="left")
ttk.Label(top, text="/").pack(side="left")
self.related_var = tk.StringVar(value="12")
ttk.Entry(top, textvariable=self.related_var, width=4).pack(side="left")
ttk.Label(top, text=" 种子数量:").pack(side="left", padx=(14, 0))
self.seed_var = tk.StringVar(value="24")
ttk.Entry(top, textvariable=self.seed_var, width=4).pack(side="left")
# 右上角:热点状态(缓存时间 / 采集时间)
self.hotspot_time_var = tk.StringVar(value="")
ttk.Label(top, textvariable=self.hotspot_time_var, anchor="e",
@@ -763,10 +759,9 @@ class App(tk.Tk):
if self._busy:
return
try:
ms = int(self.style_var.get())
mr = int(self.related_var.get())
ms = int(self.seed_var.get())
except ValueError:
messagebox.showerror("参数错误", "种子上限必须是数字")
messagebox.showerror("参数错误", "种子数量必须是数字")
return
try:
int(self.count_var.get())
@@ -780,7 +775,7 @@ class App(tk.Tk):
self.run_btn.config(state="disabled")
threading.Thread(
target=fetch_keywords,
args=(self.country_var.get(), self.provider_var.get(), ms, mr, self._q,
args=(self.country_var.get(), self.provider_var.get(), ms, self._q,
self._oai_cfg()),
daemon=True,
).start()
@@ -817,6 +812,13 @@ class App(tk.Tk):
"JP": ("日本站", "日本"),
"AU": ("澳大利亚站", "澳洲站", "澳洲"),
"MX": ("墨西哥站", "墨西哥"),
"DE": ("德国站", "德国"),
"BR": ("巴西站", "巴西"),
"SA": ("沙特站", "沙特阿拉伯站", "沙特阿拉伯", "沙特"),
"PL": ("波兰站", "波兰"),
"ES": ("西班牙站", "西班牙"),
"IT": ("意大利站", "意大利"),
"CA": ("加拿大站", "加拿大"),
}
allowed = country_sites.get(str(self.country_var.get()).upper(), ())
site_name = ""
@@ -887,12 +889,11 @@ class App(tk.Tk):
return
countries = [self.country_var.get()]
try:
ms = int(self.style_var.get())
mr = int(self.related_var.get())
ms = int(self.seed_var.get())
spu_count = int(self.count_var.get())
markup = float(self.markup_var.get())
except ValueError:
messagebox.showerror("参数错误", "种子上限 / 款号数量 / 加价% 必须是数字")
messagebox.showerror("参数错误", "种子数量 / 款号数量 / 加价% 必须是数字")
return
if spu_count < 1:
messagebox.showerror("参数错误", "款号数量必须 ≥ 1(不支持无上限)")
@@ -935,7 +936,7 @@ class App(tk.Tk):
self.fetch_btn.config(state="disabled")
threading.Thread(
target=run_pipeline,
args=(countries, self.provider_var.get(), ms, mr, self._q,
args=(countries, self.provider_var.get(), ms, self._q,
"", "", spu_count, tasks, self._oai_cfg(), markup,
self.code_prefix_var.get().strip() or "DG",
self.template_path_var.get().strip()),