图像生成

使用本地或云端的 Stable Diffusion、FLUX 或 DALL-E API 来生成图像。

可作为消息回复自动生成图像以实现完全沉浸, 可通过魔法棒菜单或斜杠命令从聊天历史和角色信息生成图像, 或者在聊天输入栏使用 /sd (anything_here) 命令以自定义提示词生成图像。

SillyTavern UI 中可自定义绝大多数常见的 Stable Diffusion 生成设置。

  • 支持本地和云端的多种图像生成来源
  • 针对角色、场景和自定义提示词的多种生成模式
  • 在聊天中方便地生成图像的斜杠命令
  • 基于自然语言请求触发图像生成的交互模式
  • 可自定义的提示词模板与前缀,以获得一致的画风与质量
  • 为定制角色图像而设的角色专属提示词前缀
  • 用于在不同图像生成设置间快速切换的风格预设
  • 针对聊天中生成图像的灵活可见性选项
  • 用于高度可定制工作流的高级 ComfyUI 集成
  • 在角色画廊中查看所有生成图像的能力
  • 在保持相同提示词的同时重新生成图像的图像滑动功能
  • 在生成前编辑提示词以及扩展自由模式提示词的选项
  • 与 AI 函数调用集成,以自动检测图像生成意图

支持的来源

来源 备注
AI/ML API 云端,付费
Black Forest Labs 云端,付费
Cloudflare Workers AI 云端,付费,多种带视觉能力的模型
Chutes 云端
ComfyUI 本地,开源(GPL3),免费,参见 ComfyUI 配置
Draw Things 本地,Mac/iOS,免费
Electron Hub 云端,付费
FAL.AI 云端,付费
Google AI Studio / Google Vertex AI 云端,付费。Imagen 模型系列。AI Studio 支持的模型较少。
HuggingFace Serverless 云端,免费
NanoGPT 云端,付费
NovelAI Diffusion 云端,需要有效的订阅
OpenAI 云端,付费
OpenRouter 云端
Pollinations 云端,开源(MIT),免费
SD.Next / vladmandic 本地,开源(AGPL3),免费
SillyTavern Extras 已弃用,不推荐
stable-diffusion.cpp 本地,开源(MIT),免费
Stability AI 云端,付费
Stable Diffusion WebUI / AUTOMATIC1111 本地,开源(AGPL3),免费
Stable Horde 云端,开源(AGPL3),免费
TogetherAI 云端
x.AI 云端,付费
Z.AI 云端,付费

生成模式

魔法棒菜单项 斜杠命令参数 说明 备注
"Yourself" you 当前角色的全身肖像。 -
"Your Face" face 当前角色的特写肖像。 强制使用肖像宽高比。
"Me" me 用户人格的肖像。 -
"The Whole Story" scene 对聊天事件的视觉回顾。 -
"The Last Message" last 对最后一条聊天消息的视觉回顾。 -
"Raw Last Message" raw_last 将最后一条消息原样用作提示词。 -
"Background" background 基于故事背景的聊天背景。 强制使用宽幅横屏宽高比。

如何生成图像

  1. 使用扩展上下文菜单(魔法棒)中的"Image Generation"项。
  2. 输入带参数的 /sd (argument) 斜杠命令,参数取自"生成模式"表。其他任何内容都会触发"自由模式",让 SD 生成你输入的任何内容。例如:/sd apple tree 会生成一张苹果树的图片。
  3. 在聊天消息的上下文操作中寻找画笔图标。这会针对所选消息强制使用"Raw Message"模式。

除 raw message 和自由模式之外的每一种生成模式,都会触发一次使用你当前选定的主生成 API 的提示词生成,将聊天上下文转换为 SD 提示词。 你可以使用扩展面板中的"SD Prompt Templates"设置抽屉,为每种生成模式配置用于生成提示词的指令模板。

/sd 命令的使用技巧

查看所有生成的图像

要查看某个角色(含其他对话)的所有已保存图像,可从角色信息面板上的"More..."下拉菜单打开画廊,或使用 /show-gallery 斜杠命令。

指定负向提示词

在提示词之前使用 negative 命名参数,可强制为本次生成指定特定的负向提示词。

stscript
/sd negative="fries" cute tater farmer holding a tayto in a spud-field

包含角色专属前缀

在自由提示词模式下使用特殊的 {{charPrefix}} 宏,以包含当前角色的正向和负向提示词前缀(如果已定义)。

stscript
/sd {{charPrefix}}, riding a bike

阻止发送聊天消息

通过传入 quiet=true 命名参数,可以避免将生成的图像发布到聊天中。该图像仍会被添加到角色画廊,并且命令会生成一个指向该图像的相对 URL,可供其他命令使用。

下面的示例将以用户人格的身份,使用 Markdown 发送生成的图像。

stscript
/sd quiet=true me | /send Here's a picture of me: ![my portrait]({{pipe}})

图像滑动

图像滑动允许在保持相同提示词的同时重新生成图像。如果设置了固定种子,下一次生成时它会随机化。通过 /sd 斜杠命令覆盖的图像尺寸在滑动的图像中会保留。

要循环浏览图像,可将鼠标光标悬停(在移动端为轻点)在生成的图像上,以显示箭头按钮和滑动计数器。在最新图像上轻点右箭头将生成一张新图像。

这里的"滑动"(Swipes)只是个名称,请不要真的尝试滑动手势,因为那会重新生成消息本身,而不是所附的图像。

选项

在生成前编辑提示词

此选项允许你在自动生成的提示词被发送到图像生成 API 之前对其进行编辑。在重新生成最初通过 /sd 命令创建的图像时,你还可以编辑或丢弃已保存的负向提示词,并覆盖分辨率。

使用函数工具

使用函数调用自动检测生成图像的意图。

要求:

  1. 必须使用受支持的来源配置好图像生成。
  2. 必须使用受支持的聊天补全 API 模型,并在 AI 响应设置中启用函数工具调用。
  3. 必须在图像生成设置中启用"Use function tool"选项。
  4. 用户应在聊天消息中表达出生成图像的意图,例如"Send me a picture of a cat"。

使用交互模式

允许你对符合特定模式的用户消息,触发图像生成(而非文本)作为回复:

  1. 包含以下动词之一:send、mail、imagine、generate、make、create、draw、paint、render
  2. 后接以下名词之一(距离不超过 10 个字符):pic、picture、image、drawing、painting、photo、photograph
  3. 后接图像生成的目标主体,主体前可选地带有"of a"或"of this"之类的短语。

有效请求及其捕获的主体的示例:

  • Can you please send me a picture of a cat => cat
  • Generate a picture of the Eiffel tower => Eiffel tower
  • Let's draw a painting of Mona Lisa => Mona Lisa

某些特殊主体会触发预定义的生成模式:

  • 'you, 'yourself' => "Yourself"
  • 'your face', 'your portrait', 'your selfie' => "Your Face"
  • 'me', 'myself' => "Me"
  • 'story', 'scenario', 'whole story' => "The Whole Story"
  • 'last message' => "The Last Message"
  • 'background', 'scene background', 'scene', 'scenery', 'surroundings', 'environment' => "Background"

扩展自由模式提示词

当使用斜杠命令的交互模式时,通过向主 API 发起提示词请求,自动扩展自由模式生成的主体描述。

最小化提示词处理

启用后,会减少对 LLM 为图像生成返回的提示词所做的处理。仅执行规范化和空白缩减,跳过默认进行的激进净化。这在使用接受结构化提示词格式(如 JSON)的高级工作流(例如 ComfyUI)时非常有用。

对齐自动调整的分辨率

将带有强制宽高比(肖像、背景)的图像生成请求对齐到最接近的已知分辨率,同时尽量保持绝对像素数不变。可从"Resolution"下拉菜单中查看可选的列表。

推荐用于 SDXL 模型

通用提示词前缀

会添加到每个生成的或自由模式的提示词之前。通常用于设置图片的整体风格。

示例:best quality, anime lineart

负向提示词

你不希望出现在输出中的图像特征。

示例:bad quality, watermark

角色专属提示词前缀

描述当前所选角色的任何特征。会添加到通用前缀之后。

示例:female, green eyes, brown hair, pink shirt

你还可以为任何不想要的内容指定负向提示词前缀。它将与通用负向提示词合并使用。

限制:

  1. 仅在单聊中有效。群聊中不会被使用。
  2. 不会用于背景和自由模式生成。

如果你想与他人共享这些前缀,请勾选"Shareable"复选框。这会将它们随角色数据一起保存,而不是保存在你的本地设置中。

风格

使用此功能可快速保存和恢复你最爱的风格/质量预设,以便日后使用或在模型间切换时使用。风格预设包含以下内容:

  1. 通用提示词前缀
  2. 负向提示词

你也可以使用 /imagine-style 命令(或 /sd-style/img-style)在风格之间切换。

聊天消息可见性

插入到聊天中的生成图像默认会在主 API 提示词中被隐藏,但可按生成发起方("魔法棒"图标、斜杠命令、交互模式)单独覆盖此行为。这可以让角色"看到"图像,从而让体验更具沉浸感。聊天补全 API 中的多模态模型在启用"Send inline images"时也可能"看到"这些图像。

文本消息可通过修改"Image Prompt Templates"下的"Chat Message Template"来自定义。该模板中可使用所有常规宏,外加一个特殊的 {{prompt}} 宏,用于指定图像提示词的添加位置。

ComfyUI 配置

ComfyUI 是一种快速且非常灵活的图像生成方案。

如果你熟悉 ComfyUI,长话短说就是:在 ComfyUI 中制作你的工作流,以 API 格式下载它,然后粘贴到 SillyTavern ComfyUI 工作流编辑器中。ST 会将你的工作流提交给 ComfyUI 的 API,你将在聊天中得到一张图像。但能力越大,责任也越大,而主要责任就是在你的工作流 JSON 中插入占位符,以便你可以从 SillyTavern 中更改设置。

如果你不熟悉 ComfyUI,仍可以使用默认工作流在 SillyTavern 中生成图像。等到你想要更强大的能力时,再去学习如何使用 ComfyUI 即可……

控制

此面板允许你配置和管理 ComfyUI 与 SillyTavern 的集成。

服务器类型

  • 标准服务器是指你直接调用 ComfyUI,无论它是在你的本地机器上还是托管在别处。
  • RunPod 无服务器端点用于通过 RunPod 的无服务器 API 运行 ComfyUI。无服务器方案可作为远程生成的不错选择,因为你既能获得与标准服务器相同的工作流控制能力,又能利用更强大的托管 GPU,并且仅在主动生成图像时才计费。绝大多数用法相同。与标准服务器设置和行为的不同之处在下文说明。

标准服务器设置

ComfyUI URL 输入框中输入你的 ComfyUI 服务器的 URL。默认值为 http://127.0.0.1:8188。 如果你使用的是 SwarmUI,其托管的 ComfyUI 服务器的默认端口为 7821,比 SwarmUI 的默认端口高 20。

输入 URL 后,选择 Connect 以验证并建立连接。ComfyUI 服务器必须能从 SillyTavern 宿主机访问。

ComfyUI RunPod 设置

  • 你需要一个 RunPod 账户并为其充值。在 RTX 4090 上进行 Qwen 图像生成,大约每张图像可能花费 2 美分,不过因人而异。5 美元的额度应该够用一段时间。
  • https://console.runpod.io/hub/runpod-workers/worker-comfyui 是一个 flux1 dev 配置,你可以用它创建自己的无服务器端点。
    • 那里有关于如何创建你自己的配置的信息,如果你想使用不同的模型或添加 LoRA 的话。
  • 创建一个用于访问无服务器端点的 API 密钥:https://console.runpod.io/user/settings
  • 在 ST 中,选择 ComfyUI 作为来源,选择 RunPod Serverless Endpoint 作为服务器类型
  • ComfyUI RunPod URL 设置为你的端点 URL。
  • 设置 API 密钥。
  • 点击 Connect。如果 API 密钥和 URL 正确,你应该会看到表示成功的 toast 通知。
  • ComfyUI 工作流配置流程与本地相同。
    • 使用"Export (API)"选项。
    • 根据你的本地配置,你可能需要/想要为在 RunPod 上使用而挑选一个模型变体。例如,如果你在本地使用量化的 GGUF,但在 RunPod 上想使用 fp16 版本。你在 ST 中使用的 JSON 工作流需要进行相应改动。
    • 模型、采样器、VAE 等无法被动态确定,因此你的工作流需要将这些硬编码(不进行 %model% 替换)。
    • 其他替换应与本地使用方式相同。

工作流管理

从下拉菜单中选择一个 ComfyUI 工作流。提供了两个默认工作流:

  • Default_Comfy_Workflow.json:一个基本的文生图工作流,支持最常见的图像生成设置。
  • Char_Avatar_Comfy_Workflow.json:一个图生图示例工作流,使用角色头像加上提示词来生成图像。

使用以下按钮来管理你的工作流:

  • Open workflow editor 用于查看和修改所选工作流。
  • Create new workflow 用于以自定义名称创建一个新工作流。
  • Delete workflow 用于删除所选工作流。

工作流编辑器

ComfyUI 工作流编辑器允许你查看和修改 ComfyUI 工作流,以供 SillyTavern 使用。

编辑器的主要组件是一个大文本区域,你可以在其中插入或编辑 JSON 格式的 ComfyUI 工作流。

要将 ComfyUI 工作流添加到编辑器,请按以下步骤操作:

  1. 在 ComfyUI 设置中启用 'Dev Mode'。
  2. 在 ComfyUI 中使用 'Save (API Format)' 选项下载 JSON 数据。
  3. 在 SillyTavern 中创建一个新工作流并打开编辑器。
  4. 将下载的 JSON 数据粘贴到文本区域中。
  5. 根据你的使用场景,用占位符替换特定值。

占位符

编辑器提供了一份预定义占位符列表,可在你的工作流 JSON 中使用。当工作流在 SillyTavern 中执行时,这些占位符会被替换为动态值。

标有 的占位符已存在于你的工作流 JSON 中。标有 的占位符不存在于你的工作流 JSON 中。你可以根据需要将这些占位符添加到工作流 JSON 中。你不需要添加所有占位符,只需添加你的工作流实际用到、且希望动态替换的那些。

提示词

%prompt%%negative_prompt% 占位符用于将图像生成提示词插入工作流。其中包含由 SillyTavern 生成的最终提示词,包括你所选 /sd 模式生成的提示词、通用提示词前缀、负向提示词以及角色专属提示词前缀。

例如,你可能曾在 ComfyUI 中用"forest elf"这样的提示词测试过你的工作流。要在 SillyTavern 中使用该工作流,你可以将"forest elf"提示词替换为 %prompt% 占位符:

{
    "class_type": "CLIPTextEncode",
    "inputs": {
        "clip": ["4", 1],
        "text": "%prompt%"
    }
}
{
    "class_type": "CLIPTextEncode",
    "inputs": {
        "clip": ["4", 1],
        "text": "forest elf"
    }
}

注意占位符被双引号包裹。这对 JSON 格式很重要,也是 SillyTavern 占位符替换系统所要求的。即使是数字,你也必须在模板 JSON 中使用双引号。

有时提示词(或其他值)并不会出现在你可能预期的位置。如果某些节点在 API 模式下并非工作流运行所必需的,ComfyUI 会将它们从工作流的 API 版本中移除。

例如,这个工作流使用了一个 LoRA 标签加载器节点和一个提示词 primitive,以便工作流在 UI 模式下更清晰:

Prompt primitive and LoRA loader
Prompt primitive and LoRA loader

提示词 primitive 节点会从工作流的 API 版本中被移除,因此你需要将占位符插入到 LoraTagLoader 节点中。在工作流中找到文本"apple tree"并将其替换为 %prompt% 占位符:

{
    "inputs": {
      "text": "%prompt%",
      "model": ["112", 0],
      "clip": ["112", 1]
    },
    "class_type": "LoraTagLoader",
    "_meta": {"title": "Load LoRA Tag"}
}
{
    "inputs": {
      "text": "apple tree",
      "model": ["112", 0],
      "clip": ["112", 1]
    },
    "class_type": "LoraTagLoader",
    "_meta": {"title": "Load LoRA Tag"}
}

在某些情况下,你可能需要在工作流 JSON 中进行多处替换,即使提示词在 UI 中只出现一次。

模型

%model% 占位符会插入图像生成设置中所选模型的值。

来自默认文生图工作流的一个示例:

{
    "class_type": "CheckpointLoaderSimple",
    "inputs": {
        "ckpt_name": "%model%"
    }
}
{
    "class_type": "CheckpointLoaderSimple",
    "inputs": {
        "ckpt_name": "sd15.safetensors"
    }
}

要加载 GGUF 量化的 UNet,请在工作流中使用 UNet Loader (GGUF) 节点, 在 SillyTavern 模型下拉菜单中选择一个 GGUF 模型,并像这样在该节点的设置中使用 %model% 占位符:

{
    "inputs": {
      "unet_name": "%model%"
    },
    "class_type": "UnetLoaderGGUF",
    "_meta": {
      "title": "Unet Loader (GGUF)"
    }
}
{
    "inputs": {
      "unet_name": "flux1-dev-Q4_0.gguf"
    },
    "class_type": "UnetLoaderGGUF",
    "_meta": {
      "title": "Unet Loader (GGUF)"
    }
}

头像图像

使用 %user_avatar%%char_avatar% 占位符将用户和角色头像纳入工作流。当工作流执行时,这些占位符会被替换为头像的 PNG 数据。图像数据采用 base64 编码,因此你必须在你的工作流中对其进行解码。完成此任务的一个常用选择是 Load image (Base64) 节点。

在本示例中,角色头像通过一个 Load Image (Base64) 节点加载。它还使用了一个 Image Resize 节点,将图像缩放到图像生成设置中所指定的尺寸:

Load image from base64 string and resize
Load image from base64 string and resize

%char_avatar%%width%%height% 占位符插入到 Load Image (Base64) 和 Image Resize 节点的 JSON 中:

{
    "97": {
        "inputs": {
            "image": "%char_avatar%"
        },
        "class_type": "ETN_LoadImageBase64",
        "_meta": {"title": "Load Image (Base64)"}
    },
    "98": {
        "inputs": {
            "mode": "resize",
            "resize_width": "%width%",
            "resize_height": "%height%",
            "image": ["97", 0]
        },
        "class_type": "Image Resize",
        "_meta": {"title": "Resize image"}
    }
}

要获取用于在 ComfyUI 中测试工作流的 base64 编码图像字符串,可使用任何将图像转换为 base64 字符串的在线工具。 这里有一个可用于初步测试的示例字符串:sd-comfy-base64-test-string.txt

其他占位符

大多数其他占位符使用图像生成设置中相应控件的值,或你通过 /sd 命令指定的值:

  • %vae%,但大多数 SD 模型已包含 VAE,因此默认工作流不使用此占位符。可在自定义工作流中与 UNet 一同加载 VAE、覆盖默认 VAE 等情况下使用。
  • %sampler%
  • %scheduler%
  • %steps%
  • %scale%
  • %width%
  • %height%
  • %denoise%:用于示例图生图工作流,在约 0.5(对源图像几乎不可察觉的改动)到 1.0(完全不同的图像,相当于没有使用源图像)之间改变去噪量。默认文生图工作流不使用此占位符,因为对文生图来说使用非 1.0 的值没有意义。
  • %clip_skip%:默认工作流不使用,但可供自定义工作流使用。

如果你指定了种子值,%seed% 占位符会插入该控件的种子值。如果你将种子设为 -1,SillyTavern 会为 %seed% 中的每张图像生成一个新的随机种子。

自定义占位符

你可以向工作流添加自定义占位符:

  1. 在预定义占位符下方查找"Custom"区域。
  2. 点击"+"按钮添加一个新的自定义占位符。
  3. find 字段中输入占位符的名称。
  4. replace 字段中输入你希望替换该占位符的值。

自定义占位符会出现在预定义占位符下方的独立列表中。

例如,你可以用一个自定义占位符替换默认工作流中已保存图像文件名的"SillyTavern"前缀。添加一个新的自定义占位符,find 设为 filename_prefixreplace 设为 ServiceTensor。将新的 %filename_prefix% 占位符插入你的工作流 JSON 中。现在你只需更改自定义占位符的值,就可以把文件名前缀从 SillyTavern 改为 ServiceTensor。

{
    "class_type": "SaveImage",
    "inputs": {
        "filename_prefix": "%filename_prefix%",
        "images": ["8", 0]
    }
}
{
    "class_type": "SaveImage",
    "inputs": {
        "filename_prefix": "SillyTavern",
        "images": ["8", 0]
    }
}

Comfy 技巧

请阅读本页的所有通用信息,以便熟悉各种图像生成选项。诸如可切换的样式和通用提示词前缀等选项,结合 ComfyUI 工作流的完全灵活性,能让你创建出各种各样的图像生成配置。

加载 LoRA

使用 LoRA 标签加载器节点(例如 Load LoRA Tag)来加载提示词中指定的任何 LoRA。 现在你可以在提示词中用诸如 <lora:CroissantStyle:0.8> 的标签添加任意数量的 LoRA,它们都会被加载到你的工作流中。 这也使得在角色专属提示词前缀中使用 LoRA 的"专业提示"能配合 ComfyUI 工作。

从样式或斜杠命令设置工作流值

你可以在自定义占位符的值中使用宏。作为一个实际示例, 假设你有时希望生成没有背景的图像,并希望通过斜杠命令或图像样式来切换它。你可以这样做:

  1. 制作一个 ComfyUI 工作流,根据某个输入的值来移除或保留图像背景
  2. 使用一个自定义占位符来设置该输入的值,但将 {{getvar::remove_background}} 用作 replace 值
  3. 现在你可以在生成图像之前,使用 /setvar key=remove_background true/setvar key=remove_background false 来设置 remove_background 的值
  4. 工作流会使用你设置的值来决定是否移除背景
  5. 创建一个通用提示词前缀为 {{setvar::remove_background::true}} 的图像样式"No background"
  6. 使用样式控件或 /imagine-style No background,在生成图像之前将 remove_background 的值设为 true