扔给ai让他照着做就行,底模什么的自己改我就不提供了
给接手的 AI:把本地生图模型接进游戏先说结论不要做成“游戏直接调用模型”。做成三层: http://file:///C:/Users/admin/AppData/Local/Programs/LCode/resources/app.asar/out/renderer/material-icons/document.svgtext
游戏(发起请求、显示图、缓存 URL)
↓ HTTP
本地生图服务(缓存、排队、提示词改写、模型参数)
↓ HTTP
ComfyUI(按 graph 执行)
游戏永远不知道底模是什么。换模型、换 LoRA、换构图,只改服务端配置和 builder;游戏只认固定端口和稳定协议。提示词替换也全部在服务端完成,游戏传来的词只是原料。 这套已在 Wayward 上跑通:Lustify Krea2 + AureliaX LoRA,832×1216 底图 + 960×1408 Hires,游戏内 2:3 竖幅,单动作 POV 和多动作同框都实测出图。 1. 三层职责- 游戏层:单文件 HTML,内置生图客户端;默认端口 8191(源码 const Bb=8191);设置里有自动/指定地址/关闭;自动探测 /api/image/health。
- 服务层:wayward-imagegen,Bun + TypeScript,无构建步骤。核心文件:src/routes/image.ts、src/routes/catalogue.ts、src/comfy/workflows/index.ts、src/config.ts、src/comfy/jobRunner.ts。
- ComfyUI 层:8188,只认 API graph;模型可放别处,用 extra_model_paths.yaml 引用。
原项目默认图需要 Impact Pack、Inspire Pack、KJ Nodes;Krea2 主要用核心节点,但首次接入建议按 README 装好。 2. 协议(游戏 ↔ 服务)健康检查: http://file:///C:/Users/admin/AppData/Local/Programs/LCode/resources/app.asar/out/renderer/material-icons/document.svgtext
GET /api/image/health
200 = ComfyUI 可达;503 = 服务在、ComfyUI 不可达。游戏两种都视为“服务存在”。 生成: http://file:///C:/Users/admin/AppData/Local/Programs/LCode/resources/app.asar/out/renderer/material-icons/json.svgjson
POST /api/image/generate
{
"talentId": "pippa__scene-...__v-0",
"prompt": "1girl, solo, ...",
"negativePrompt": "lowres, bad anatomy, ...",
"workflow": "illustrious",
"width": 832,
"height": 1216,
"bypassCache": false,
"bulk": false
}
响应 { promptId, status: "queued", workflow };轮询 GET /api/image/status/:promptId,202 继续,200 完成,返回 imagePath / imageUrl。 关键点: - talentId 是缓存名,通常包含角色、场景、服装、房间、变体号。
- 游戏发 workflow: "illustrious",服务端 renderWorkflow 覆盖真正使用的 graph,但 job 和缓存键仍保留调用方的 illustrious。这是换预设不用改游戏的关键。
- 游戏传的 width/height/steps/cfg 对 Krea2 基本无效,只有 seed 和 prompt 流进去;尺寸由服务端配置决定。
- bypassCache 删掉该 talentId 下所有缓存,不只当前 hash。
- 缓存键:(workflow, talentName, imageType, promptHash)。
- /api/pack?since=&characters= 返回 packFormat: 1,游戏合并服务图库,priority 1;/api/image/check 用于先查缓存;/api/image-hit 可选统计。
3. 提示词管线http://file:///C:/Users/admin/AppData/Local/Programs/LCode/resources/app.asar/out/renderer/material-icons/document.svgtext
gamePrompt
→ 清洗(去 <lora:...>、去游戏角色身份词)
→ 分类(普通 / 单动作 / 多动作 / 多人)
→ 按模型能力改写构图
→ 正向拼装(顺序是硬约束)
→ 负向去冲突
→ 构建 graph
清洗:stripGameCharacter 按逗号切 tag、做子串匹配,能删掉加权/转义变体;krea2StripTags 放发色、瞳色、发型、体型、角色名;男性-only 场景可跳过女性角色注入。 分类:先判性爱,再数动作。detectKrea2Actions 统计插入、口交、手交、乳交、足交;sex/vaginal/penis 算同一次插入,vaginal + anal 才算 DP;只有姿势词不算插入。2+ 动作走多动作分支,单动作走 POV,其余普通。 正向顺序: - 普通:style → character → framing → scene。
- POV:style → character → 按动作生成的 POV 句 → scene。
- 多动作:framing(人数、动作、位置)→ style → character → scene。
多动作的顺序是实测出来的:人物长描述或风格前缀放前面,模型会当成肖像请求,直接退回单人特写。 负向:去身份词 → 去群体冲突 tag → 按场景删反场景词(壁炉/烛光场景删 fireplace/fire/candle;要求回看/转头时删 looking at viewer)→ 合并风格负面 → 追加解剖负面。CFG=1 时负向基本无效,构图、人数、动作必须全写进正向。 Graph: http://file:///C:/Users/admin/AppData/Local/Programs/LCode/resources/app.asar/out/renderer/material-icons/document.svgtext
UNETLoader → CLIPLoader(type=krea2) → VAELoader
→ LoRA 链 → ModelSamplingAuraFlow(shift=4)
→ CLIPTextEncode ×2 → EmptyLatent(832×1216)
→ KSampler(8步, CFG1, euler, beta)
→ [Hires: 4x_NMKD 放大 → 960×1408 → VAEEncode → KSampler(3步, CFG1, denoise 0.28)]
→ VAEDecode → SaveImage
Hires 的 denoise 0.75 会在放大阶段重画构图;0.28 才只做清晰度。 4. 三种场景普通场景只拼 style + character + scene,不触发 POV/多动作。先保证穿衣、日常、对话基线不变形,再谈复杂场景。 单动作 POV- 男人完全在画外;阴茎从画面边缘进入,画面边缘切掉根部;男人的手也在画外。
- 女方的手要有明确放置位置(大腿、墙、家具、对方胸口)。
- 按动作分支:口交、颜射、手交、乳交、足交、后入、未插入的摩擦,各有构图句;不要写死一种姿势。krea2PovPrompt 只是兜底。
- 不要写 first-person / POV;不要写“只露出男人的手和阴茎”——实测会被画成一只画外的手握着阴茎递到嘴边。
- 送模前删 pov、1boy、2boys、threesome 等会把构图拉回群体/第一人称的 tag。
- 当前动作是手交就走手交分支;不是手交但场景混入 handjob 标签,必须删掉,否则多一只手。负面词只禁男性手,挡不住女方的黑指甲手。
- 负面核心:disembodied hand, male hand holding penis, hand gripping penis, hand presenting penis, extra hands, a hand wrapped around the penis;口交再加 male hands, hands in frame, first-person view, pov hands;颜射非口交再加 penis in her mouth, licking the penis, sucking penis。
多动作同框- 开头先锁定人数:“Explicit threesome scene / Explicit group sex scene”,再写两个完全裸体的成年男人。只写“后入的男人跪着”而不先声明人数,模型会把前方男性画成第二个女人。
- 每个动作点名,每个参与者有位置;镜头中景、侧视或三分之四视角,保留上半身和髋部。
- 2:3 竖幅:前排男人跪姿、脸在画面上部,同时保留与女方的明确接触和后排动作;只写并排合影会丢剧情。
- 第三人及以后用画外配角:只留躯干和勃起阴茎在画面边缘,头和双手完全在画外;每个阴茎连在身体上,不要写漂浮阴茎。
- 骑乘/躺姿/站姿插入容易画成“她的阴茎”;当前解法是腰以上构图:插入男躺在下方面对她、手从下方扶腰,插入在画面下缘之外,画面不画阴茎;口交男只露躯干和阴茎在侧缘,她的双手在插入男胸口。底部露出她的阴部和插入男阴茎是用户接受的,不要再收紧裁切。
- 后入不要把口交男写成“跪在正前方、看着眼睛、脸在上部”,会合成“阴茎从她嘴里伸出 / 另一个男人舔同一根”;后入时口交男只露躯干和阴茎,头和手在画外,后入男的手放腰/肩胛,不放臀部。
- 多动作口交删 slack mouth、looking_back;冲突姿势 tag(如游戏里的 from_behind 镜头提示)也删。
- 三动作显式分配左右手;第三个人站在被空出的那只手一侧,写“双手放在身侧、只有她在摸”。
- 正面骑乘的口交写“她向前倾”,不要写“她转头”。
- 骑乘/躺姿可以让口交男站在她上方,但“脸在她上方”只适用于头部会被构图裁掉的机位;要露脸就放回画缘。
- krea2MultiActionOffFrameExtras: false 可回退“三个完整男人同框”的旧方案,但旧版会贴脸,不建议。
- 多动作分支不依赖 POV:即使 krea2PovMode 关闭,2+ 动作仍走同框构图;单动作才走 POV。
2026-10-31 验收(Lustify 单人先验): - 骑乘/躺姿 + 口交:腰以上构图,插入男躺在下方面对她、手从下方扶腰;口交男只露躯干和阴茎在侧缘、头和双手在画外;她双手在插入男胸口;插入在画面下缘外。底部露出她的阴部和插入男阴茎是接受的。
- 三动作:保留插入 + 口交,手交在骑乘/躺姿下被裁掉;这是取舍,不是配置错误。
- 后入 + 口交:保持画缘躯干构图;三根都在,但第三只手与第三根连接最弱。
- 5 个种子直连 8188 + 8191 端到端 960×1408,未再出现“男人的嘴含着自己的阴茎”这类贴脸合成。
- 参考图批次:wayward-imagegen/test-combined-acts/output-auto/(直连 8188,不经过 8191)。
重要限制:krea2multi(Krea-2 Turbo + KNP + AureliaX 0.7)能画多人同框,但同一三动作提示词只出站立群像,没有插入/口交/手交。多人同框 ≠ 多动作服从;KNP 1.0 + 自然语言动作能稳定两名男性完整同框,KNP 0.7 + 加权标签会退回单人。8191 已切回 Lustify,以 启动器\active-preset.json 为准。 5. 配置与启动关键字段: http://file:///C:/Users/admin/AppData/Local/Programs/LCode/resources/app.asar/out/renderer/material-icons/json.svgjson
{
"port": 8191,
"host": "127.0.0.1",
"imagesDir": "../images-lustify",
"stateDir": "../images-lustify/.state",
"comfyUrl": "http://127.0.0.1:8188",
"characterDirs": ["elena", "mara", "pippa", "patron", "st-louis"],
"renderWorkflow": "krea2",
"krea2Unet": "KR2\\lustifyNSFWCheckpoint_v10Krea2_fp8.safetensors",
"krea2Clip": "qwen3vl_4b_fp8_scaled.safetensors",
"krea2Vae": "wan_2.1_vae.safetensors",
"krea2Loras": [
{ "name": "KR2\\Characters\\BeMyHero_-_AureliaX_epoch_9.safetensors", "strength": 0.9 }
],
"krea2Steps": 8,
"krea2Cfg": 1,
"krea2Sampler": "euler",
"krea2Scheduler": "beta",
"krea2Shift": 4,
"krea2Width": 832,
"krea2Height": 1216,
"krea2StylePrompt": "professional photograph, photorealistic, warm low candlelight, dim stone room, detailed skin texture, shallow depth of field, high clarity",
"krea2CharacterPrompt": "AureliaX, ... adult, mature female, ...",
"krea2StripTags": ["st.louis", "long blue hair", "blue eyes", "blonde hair", "..."],
"krea2SkipCharacterForMaleOnly": true,
"krea2PovMode": true,
"krea2PovStripTags": ["2boys", "3boys", "multiple boys", "threesome", "mmf", "group sex", "gangbang", "1boy", "1man", "pov", "first-person", "first person"],
"krea2PovNegativeStripTags": ["2boys", "3boys", "multiple boys", "group sex", "gangbang", "looking at viewer"],
"krea2MultiActionMode": true,
"krea2MultiActionMinActs": 2,
"krea2MultiActionStylePrompt": "professional photograph, photorealistic, explicit adult scene, medium-wide shot, full upper body and hips visible, ...",
"krea2MultiActionAllowMen": true,
"krea2MultiActionOffFrameExtras": true,
"krea2Hires": {
"upscaler": "4x_NMKD-Superscale-SP_178000_G.pth",
"finalWidth": 960,
"finalHeight": 1408,
"steps": 3,
"cfg": 1,
"denoise": 0.28
},
"maxDiskGb": 0,
"maxQueued": 64,
"maxImagesPerHour": 400,
"allowDelete": false
}
启动: http://file:///C:/Users/admin/AppData/Local/Programs/LCode/resources/app.asar/out/renderer/material-icons/document.svgbat
cd /d D:\GAME\wayward\wayward-imagegen
bun src/cli.ts --config wayward-imagegen.lustify.config.json --port 8191
游戏:图像生成 → 指定地址 → http://127.0.0.1:8191。 预设:所有预设都跑 8191,游戏地址不变;每个预设独立图库、独立日志;切换脚本先停旧再起新;活动项在 启动器\active-preset.json。不要同时起两个 8191。先启动 ComfyUI 并等模型加载。 在会话终端里启动的 8191 会被会话进程树回收(端口掉线、日志没有配置报错);要常驻必须在会话外启动(WMI、计划任务或 Start-Process),再提交真实请求验收。 6. 复刻顺序- ComfyUI 单独出图:导 API graph,POST /prompt,确认 /history 有 SaveImage 输出,记录实际尺寸。
- 参数化 graph:prompt、negative、seed、尺寸、步数、CFG、LoRA 强度抽出来;两个不同 prompt 直连能出不同图。
- 服务骨架:health/generate/status/pack/static;端口固定,忙就报错,不要自动加 1。
- 游戏显示第一张图:指定地址,触发,确认 2:3 不变形,pack 包含。
- 普通场景 builder:只拼 style + character + scene,穿衣基线回归。
- Hires:960×1408,构图不变,denoise 0.28。
- 单动作 POV:口交/颜射/手交/乳交/足交/后入/未插入摩擦,每类 3 个种子;检查画外男性、多余手、阴茎连身体、女方手位置、复制人。
- 多动作:2 动作 → 3 动作,用游戏实际长 prompt,至少 5 个种子;检查动作是否都在、参与者完整、贴脸合成、前排头是否裁掉、是否退回特写。
- 预设/启动器/doctor:独立 config/图库/日志;统一 8191;doctor 检查 ComfyUI、节点、模型精确文件名、测试图。
新预设前置检查:模型/LoRA/VAE/放大器本机齐全(同名才算)、ComfyUI 支持所需节点和 CLIP type、后端已有 builder。缺一项不要加空壳菜单;先用临时原生端口实测,再写配置/菜单/README;完成后停掉临时服务。新预设必须走 8191 真实接口端到端验收(竖幅、Hires、缓存、独立图库)才算生效。 大模型下载:先探通道(代理/hf-mirror),分块并行合并时防止续传块重复拼接,截断到正确长度并校验官方 SHA-256,再让 ComfyUI 识别。 验收:doctor 全绿;health 200;实际图 960×1408;重启后 pack 仍含图;穿衣基线不变;POV 无多余手;多动作无贴脸/复制人;日志无端口冲突、节点缺失、2ms 空成功。 7. 坑清单- 模型文件名不匹配不报错:ComfyUI 丢掉 SaveImage,约 2ms“成功”但没图。看 /history/doctor。
- 端口不要自动加 1;游戏探测固定端口,换端口 = 找不到。
- Hires denoise 不要 0.75,会重画构图;0.28。
- CFG=1 时负向无效,构图必须写正向。
- 多动作顺序不能反:动作/人数第一;人物描述在前会退回单人肖像。
- 单人先验默认不要硬画两个完整男人;POV 是稳定降级。关闭 POV + 显式双动作时 Lustify 也能出两个完整男性,但稳定性依赖提示词/种子;要稳定多人同框用多人向底模。
- 多人同框 ≠ 多动作服从;krea2multi 能出三人,但三动作只出站立群像。
- POV 不要写 first-person/POV/“只露男人的手和阴茎”。
- POV 的 handjob 要删或走手交分支,否则多一只手;负面词挡不住女方的黑指甲手。
- fellatio 特写句会盖过 reverse_cowgirl_position 等剧情姿势;按姿势出图走多动作分支或改写该分支。
- 后入 + 口交不要写“跪在正前方、看眼睛、脸在上部”;会贴脸合成。
- 多动作口交删 slack mouth、looking_back。
- 游戏负面词会杀场景:壁炉/烛光/looking at viewer/bathhouse water,按场景删冲突项。
- 风格前缀会盖过房间:写“豪华现代室内”会把中世纪石室拉成现代;房间交给游戏 prompt。
- 2:3 竖幅硬约束,不要改宽幅;前排跪姿、脸在上部。
- 角色 LoRA 是相似不是同脸;同脸要 FaceID/IP-Adapter 或专门 LoRA。
- 图库按预设隔离,混用会串图。
- 会话内服务会被回收;会话外常驻。
- 不要同时起两个 8191;切换先停旧再起新。
- 首次启动 ComfyUI 等模型加载;刚启动就请求会失败。
- 验收看图,不只看 HTTP 200;至少 5 个种子。
- 不要仅凭文件齐全/多人同框激活 krea2multi;它不是多动作预设。
- 改 builder 前先读当前文件,可能有并行改动;只补缺失的一处,不覆盖已有逻辑。
- 大模型分块合并防重复拼接,校验哈希。
8. 如果游戏没有 hook最小客户端:base = localStorage.imageServer || "http://127.0.0.1:8191";先 /api/image/check,未命中再 /api/image/generate,轮询 /api/image/status/:promptId;失败回退自带图,不阻塞剧情;启动时拉 /api/pack 合并。设置提供自动/指定地址/关闭;自动探测 127.0.0.1:8191。file:// 页面服务端已允许;局域网要 --host 0.0.0.0,手机用 http://。 9. 期望管理- POV 是稳定降级,不是唯一方案;关闭 POV + 显式双动作时 Lustify 也能画两个完整男性,但默认多动作分支为三动作稳定会用离屏配角。
- 单人先验多动作“可读”但不是逐字服从;三动作手交被裁、后入第三根连接弱是取舍。
- 多人向底模是多人同框首选,能稳定两名男性 + 女性写实同框,但不逐字服从细节动作(“没插入、只张嘴”常被画成相近姿势)。
- 画质/构图跟种子强相关,必须多种子验收。
- 所有角色必须是成年人;遵守当地法律/平台规则。
10. 出问题收集doctor 输出、当前 config、一条真实 generate 请求、ComfyUI /history/<promptId>(看 SaveImage)、实际图片/尺寸、imagegen 日志最后 50 行、ComfyUI 日志最后 50 行、游戏设置截图。 先跑通第 6 节 1-4 步,再碰提示词改写;不要一上来调多动作。 |