"""套图提示词引擎:按模型家族分发,各家族独立封装。 不同家族的生图语义差异极大,共用一套提示词会导致语义错配 (gpt-image-2 按文字重造商品即由此而来),故按家族各自成册: alibaba 通义 wan*/qwen*(DashScope)—— 主体参考语义 doubao 豆包 Seedream(火山方舟)—— 主体参考语义,与通义共用装配 gpt gpt-image-2 / gpt-image-2-vip(RightAPI)—— /v1/images/edits 编辑语义 google nano-banana 系列(RightAPI)—— 原生主体保持语义 路由规则:provider 为主;rightapi 内再按模型名细分 gpt / google。 """ from __future__ import annotations from . import alibaba, doubao, google, gpt from .common import build_context, type_name _MODULE_BY_FAMILY = { "alibaba": alibaba, "doubao": doubao, "gpt": gpt, "google": google, } def prompt_family(provider: str, model: str | None) -> str: """(provider, model) → 提示词家族名。""" if provider == "rightapi": if (model or "").lower().startswith("nano-banana"): return "google" return "gpt" # gpt-image-* 及未知中转模型默认按 edits 语义处理 if provider == "tongyi": return "alibaba" return "doubao" # doubao 及默认 provider def build_prompt(provider: str, model: str | None, type_id: str, ctx: dict, style_set: int, lang: str, extra: dict | None = None, style_prompt: str | None = None, requirements: str | None = None) -> str: """按模型家族构造指定图类型的完整生图 prompt。参数含义见各家族 build_prompt。""" module = _MODULE_BY_FAMILY[prompt_family(provider, model)] return module.build_prompt( type_id, ctx, style_set, lang, extra=extra, style_prompt=style_prompt, requirements=requirements, )