图像生成
使用本地或云端的 Stable Diffusion、FLUX 或 DALL-E API 来生成图像。
可作为消息回复自动生成图像以实现完全沉浸,
可通过魔法棒菜单或斜杠命令从聊天历史和角色信息生成图像,
或者在聊天输入栏使用 /sd (anything_here) 命令以自定义提示词生成图像。
SillyTavern UI 中可自定义绝大多数常见的 Stable Diffusion 生成设置。
- 支持本地和云端的
多种图像生成来源 - 针对角色、场景和自定义提示词的多种
生成模式 - 在聊天中方便地生成图像的
斜杠命令 - 基于自然语言请求触发图像生成的
交互模式 - 可自定义的提示词模板与
前缀 ,以获得一致的画风与质量 - 为定制角色图像而设的
角色专属提示词前缀 - 用于在不同图像生成设置间快速切换的
风格预设 - 针对聊天中生成图像的灵活
可见性选项 - 用于高度可定制工作流的高级
ComfyUI 集成 - 在角色画廊中
查看所有生成图像 的能力 - 在保持相同提示词的同时重新生成图像的
图像滑动 功能 在生成前编辑提示词 以及扩展自由模式提示词 的选项- 与 AI
函数调用 集成,以自动检测图像生成意图
支持的来源
生成模式
如何生成图像
- 使用扩展上下文菜单(魔法棒)中的"Image Generation"项。
- 输入带参数的
/sd (argument)斜杠命令,参数取自"生成模式"表。其他任何内容都会触发"自由模式",让 SD 生成你输入的任何内容。例如:/sd apple tree会生成一张苹果树的图片。 - 在聊天消息的上下文操作中寻找画笔图标。这会针对所选消息强制使用"Raw Message"模式。
除 raw message 和自由模式之外的每一种生成模式,都会触发一次使用你当前选定的主生成 API 的提示词生成,将聊天上下文转换为 SD 提示词。 你可以使用扩展面板中的"SD Prompt Templates"设置抽屉,为每种生成模式配置用于生成提示词的指令模板。
/sd 命令的使用技巧
查看所有生成的图像
要查看某个角色(含其他对话)的所有已保存图像,可从角色信息面板上的"More..."下拉菜单打开画廊,或使用 /show-gallery 斜杠命令。
指定负向提示词
在提示词之前使用 negative 命名参数,可强制为本次生成指定特定的负向提示词。
/sd negative="fries" cute tater farmer holding a tayto in a spud-field
包含角色专属前缀
在自由提示词模式下使用特殊的 {{charPrefix}} 宏,以包含当前角色的正向和负向提示词前缀(如果已定义)。
/sd {{charPrefix}}, riding a bike
阻止发送聊天消息
通过传入 quiet=true 命名参数,可以避免将生成的图像发布到聊天中。该图像仍会被添加到角色画廊,并且命令会生成一个指向该图像的相对 URL,可供其他命令使用。
下面的示例将以用户人格的身份,使用 Markdown 发送生成的图像。
/sd quiet=true me | /send Here's a picture of me: 
图像滑动
图像滑动允许在保持相同提示词的同时重新生成图像。如果设置了固定种子,下一次生成时它会随机化。通过 /sd 斜杠命令覆盖的图像尺寸在滑动的图像中会保留。
要循环浏览图像,可将鼠标光标悬停(在移动端为轻点)在生成的图像上,以显示箭头按钮和滑动计数器。在最新图像上轻点右箭头将生成一张新图像。
这里的"滑动"(Swipes)只是个名称,请不要真的尝试滑动手势,因为那会重新生成消息本身,而不是所附的图像。
选项
在生成前编辑提示词
此选项允许你在自动生成的提示词被发送到图像生成 API 之前对其进行编辑。在重新生成最初通过 /sd 命令创建的图像时,你还可以编辑或丢弃已保存的负向提示词,并覆盖分辨率。
使用函数工具
使用函数调用自动检测生成图像的意图。
要求:
- 必须使用受支持的来源配置好图像生成。
- 必须使用受支持的聊天补全 API 模型,并在 AI 响应设置中启用函数工具调用。
- 必须在图像生成设置中启用"Use function tool"选项。
- 用户应在聊天消息中表达出生成图像的意图,例如"Send me a picture of a cat"。
当函数工具启用时,交互模式将不会被触发。
使用交互模式
允许你对符合特定模式的用户消息,触发图像生成(而非文本)作为回复:
- 包含以下动词之一:send、mail、imagine、generate、make、create、draw、paint、render
- 后接以下名词之一(距离不超过 10 个字符):pic、picture、image、drawing、painting、photo、photograph
- 后接图像生成的目标主体,主体前可选地带有"of a"或"of this"之类的短语。
有效请求及其捕获的主体的示例:
Can you please send me a picture of a cat=>catGenerate a picture of the Eiffel tower=>Eiffel towerLet'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 模型。
通用提示词前缀
专业提示
使用 {prompt} 宏来指定生成的提示词的确切插入位置。
会添加到每个生成的或自由模式的提示词之前。通常用于设置图片的整体风格。
示例:best quality, anime lineart。
负向提示词
你不希望出现在输出中的图像特征。
示例:bad quality, watermark。
角色专属提示词前缀
专业提示
如果生成来源支持,你也可以在此处使用 LoRA/嵌入,例如:<lora:DonaldDuck:1>。
描述当前所选角色的任何特征。会添加到通用前缀之后。
示例:female, green eyes, brown hair, pink shirt。
你还可以为任何不想要的内容指定负向提示词前缀。它将与通用负向提示词合并使用。
限制:
- 仅在单聊中有效。群聊中不会被使用。
- 不会用于背景和自由模式生成。
Note
要强制在自由模式提示词中包含角色前缀,请在提示词的任意位置使用 {{charPrefix}} 宏。
如果你想与他人共享这些前缀,请勾选"Shareable"复选框。这会将它们随角色数据一起保存,而不是保存在你的本地设置中。
风格
使用此功能可快速保存和恢复你最爱的风格/质量预设,以便日后使用或在模型间切换时使用。风格预设包含以下内容:
- 通用提示词前缀
- 负向提示词
你也可以使用 /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 中查看种子或提示词。这只是 RunPod 处理程序的一个限制,可以在该侧添加此能力。
工作流管理
从下拉菜单中选择一个 ComfyUI 工作流。提供了两个默认工作流:
- Default_Comfy_Workflow.json:一个基本的文生图工作流,支持最常见的图像生成设置。
- Char_Avatar_Comfy_Workflow.json:一个图生图示例工作流,使用角色头像加上提示词来生成图像。
使用以下按钮来管理你的工作流:
- Open workflow editor 用于查看和修改所选工作流。
- Create new workflow 用于以自定义名称创建一个新工作流。
- Delete workflow 用于删除所选工作流。
工作流编辑器
ComfyUI 工作流编辑器允许你查看和修改 ComfyUI 工作流,以供 SillyTavern 使用。
编辑器的主要组件是一个大文本区域,你可以在其中插入或编辑 JSON 格式的 ComfyUI 工作流。
要将 ComfyUI 工作流添加到编辑器,请按以下步骤操作:
- 在 ComfyUI 设置中启用 'Dev Mode'。
- 在 ComfyUI 中使用 'Save (API Format)' 选项下载 JSON 数据。
- 在 SillyTavern 中创建一个新工作流并打开编辑器。
- 将下载的 JSON 数据粘贴到文本区域中。
- 根据你的使用场景,用占位符替换特定值。
提示
你可以将 API 格式的 JSON 文件直接添加到你 SillyTavern 安装目录下的 data/default-user/user/workflows 目录中。这样可以省去第 3、4 步。
请保留原始 JSON 文件。如果你需要再次在 ComfyUI 中打开工作流进行修改,编辑原始文件要比编辑那个全是占位符的文件方便得多。
占位符
编辑器提供了一份预定义占位符列表,可在你的工作流 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 模式下更清晰:
提示词 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)"
}
}
如果你的 ComfyUI 中有常规 SD 检查点以外的模型类型
Stable Diffusion 检查点、SD UNet 和 GGUF 量化的 UNet 都会出现在模型下拉菜单中。 一种类型的模型无法与预期为另一种类型的工作流/加载器节点配合使用。 如果你在 ST 中选择了不兼容的模型类型,ComfyUI 会报告加载器节点存在问题。
头像图像
使用 %user_avatar% 和 %char_avatar% 占位符将用户和角色头像纳入工作流。当工作流执行时,这些占位符会被替换为头像的 PNG 数据。图像数据采用 base64 编码,因此你必须在你的工作流中对其进行解码。完成此任务的一个常用选择是 Load image (Base64) 节点。
在本示例中,角色头像通过一个 Load Image (Base64) 节点加载。它还使用了一个 Image 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% 中的每张图像生成一个新的随机种子。
自定义占位符
你可以向工作流添加自定义占位符:
- 在预定义占位符下方查找"Custom"区域。
- 点击"+"按钮添加一个新的自定义占位符。
- 在
find字段中输入占位符的名称。 - 在
replace字段中输入你希望替换该占位符的值。
自定义占位符会出现在预定义占位符下方的独立列表中。
例如,你可以用一个自定义占位符替换默认工作流中已保存图像文件名的"SillyTavern"前缀。添加一个新的自定义占位符,find 设为 filename_prefix,replace 设为 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,它们都会被加载到你的工作流中。
这也使得在
从样式或斜杠命令设置工作流值
你可以在自定义占位符的值中使用宏。作为一个实际示例, 假设你有时希望生成没有背景的图像,并希望通过斜杠命令或图像样式来切换它。你可以这样做:
- 制作一个 ComfyUI 工作流,根据某个输入的值来移除或保留图像背景
- 使用一个自定义占位符来设置该输入的值,但将
{{getvar::remove_background}}用作 replace 值 - 现在你可以在生成图像之前,使用
/setvar key=remove_background true或/setvar key=remove_background false来设置remove_background的值 - 工作流会使用你设置的值来决定是否移除背景
- 创建一个通用提示词前缀为
{{setvar::remove_background::true}}的图像样式"No background" - 使用样式控件或
/imagine-style No background,在生成图像之前将remove_background的值设为true