koishi-plugin-p-draw 1.2.10 → 1.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +37 -6
- package/package.json +1 -1
- package/readme.md +1 -1
package/index.js
CHANGED
|
@@ -81,6 +81,7 @@ const zhCN = {
|
|
|
81
81
|
img2imgDenoise: { $description: '普通以图生图(p-draw i2i)的去噪强度,越小越接近原图(建议 0.4-0.7)' },
|
|
82
82
|
i2iMode: { $description: 'i2i 模式选择方式:ask=每次询问 / style=直接换风格(漫画化)/ ootd=直接换装换姿势 / plain=普通 img2img' },
|
|
83
83
|
i2iAskTimeout: { $description: 'i2i 模式询问等待时间(秒)' },
|
|
84
|
+
seriesAskTimeout: { $description: '连续图 LLM 使用确认等待时间(秒)' },
|
|
84
85
|
i2iStyleDenoise: { $description: '换风格模式(漫画化)的去噪强度,越大风格变化越彻底(建议 0.7-0.85)' },
|
|
85
86
|
i2iOotdDenoise: { $description: '换装换姿势模式(保留角色)的去噪强度(建议 0.5-0.6)' },
|
|
86
87
|
i2iControlNetStrength: { $description: '换风格模式的 ControlNet 强度,越大构图锁得越死(建议 0.5-0.8)' },
|
|
@@ -156,6 +157,9 @@ const zhCN = {
|
|
|
156
157
|
'multi-degraded': '多人视觉校验不可用{0},本次已直接发送生成结果。',
|
|
157
158
|
'multi-verify-error': '多人视觉校验调用失败:{0}',
|
|
158
159
|
'series-usage': '连续图:p-draw 连续 <角色>:<阶段1> → <阶段2> → ...\n例:p-draw 连续 少女:清纯校服 → 换上晚礼服 → 华丽登场\n或用 | 分隔,可加 --seed 固定种子保证角色一致。',
|
|
160
|
+
'series-llm-ask': '是否使用 LLM 优化连续图各阶段提示词?\n1. 是(使用 LLM,自动整理成 Danbooru tags)\n2. 否(不使用 LLM,直接用你输入的内容)\n3. 取消(不生成)\n请回复 1 / 2 / 3',
|
|
161
|
+
'series-llm-invalid': '未识别的回答,请回复 1(使用 LLM)/ 2(不使用 LLM)/ 3(取消)。',
|
|
162
|
+
'series-no-llm': '本次未使用 LLM 优化,直接使用你输入的描述/tags。',
|
|
159
163
|
'series-ok': '已扣除 {0} P 点,共 {1} 张连续图(seed={2})',
|
|
160
164
|
'model-usage': '当前模型:{0}\n可用模型:\n{1}\n用法:p-draw 模型 <名称>(支持模糊匹配,如 anima-aesthetic);p-draw 模型 默认 恢复默认。',
|
|
161
165
|
'model-switched': '已切换为模型「{0}」,对之后的生图生效。',
|
|
@@ -245,6 +249,7 @@ exports.Config = Schema.object({
|
|
|
245
249
|
img2imgDenoise: Schema.number().default(0.55).description('普通以图生图(p-draw i2i)的去噪强度,越小越接近原图(建议 0.4-0.7)'),
|
|
246
250
|
i2iMode: Schema.string().default('ask').description('i2i 模式选择方式:ask=每次询问 / style=直接换风格(漫画化)/ ootd=直接换装换姿势 / plain=普通 img2img'),
|
|
247
251
|
i2iAskTimeout: Schema.number().default(60).description('i2i 模式询问等待时间(秒)'),
|
|
252
|
+
seriesAskTimeout: Schema.number().default(60).description('连续图 LLM 使用确认等待时间(秒)'),
|
|
248
253
|
i2iStyleDenoise: Schema.number().default(0.75).description('换风格模式(漫画化)的去噪强度,越大风格变化越彻底(建议 0.7-0.85)'),
|
|
249
254
|
i2iOotdDenoise: Schema.number().default(0.55).description('换装换姿势模式(保留角色)的去噪强度(建议 0.5-0.6)'),
|
|
250
255
|
i2iControlNetStrength: Schema.number().default(0.7).description('换风格模式的 ControlNet-LLLite 强度,越大构图锁得越死(建议 0.5-0.8;需安装 kohya-ss/ComfyUI-Anima-LLLite 节点与权重)'),
|
|
@@ -1696,7 +1701,7 @@ exports.apply = async function apply(ctx, cfg) {
|
|
|
1696
1701
|
const steps = Math.round(Number(overrides.steps) || workCfg.steps)
|
|
1697
1702
|
const cfgVal = Number(overrides.cfg) || workCfg.cfg
|
|
1698
1703
|
const seed = Number(overrides.seed) || crypto.randomInt(1, 2 ** 32 - 1)
|
|
1699
|
-
const negativePrompt = overrides.negativePrompt || cfg.negativePrompt || ''
|
|
1704
|
+
const negativePrompt = joinPromptParts([overrides.negativePrompt || cfg.negativePrompt || ''])
|
|
1700
1705
|
const i2iImage = overrides.i2iImage
|
|
1701
1706
|
if (i2iImage && cfg.customWorkflowEnabled && cfg.customWorkflowPath) {
|
|
1702
1707
|
return { ok: false, message: 'i2i(以图生图)暂不支持自定义工作流(customWorkflowEnabled),请关闭后再试。' }
|
|
@@ -2022,7 +2027,7 @@ exports.apply = async function apply(ctx, cfg) {
|
|
|
2022
2027
|
parts.push(String(cfg.styleTags).trim())
|
|
2023
2028
|
}
|
|
2024
2029
|
parts.push(userPrompt)
|
|
2025
|
-
return { prompt:
|
|
2030
|
+
return { prompt: joinPromptParts(parts), degraded: false }
|
|
2026
2031
|
}
|
|
2027
2032
|
|
|
2028
2033
|
// ---------------- 多人(移植自 anima /anm 多人) ----------------
|
|
@@ -2666,6 +2671,20 @@ exports.apply = async function apply(ctx, cfg) {
|
|
|
2666
2671
|
|
|
2667
2672
|
// 连续图/过程图主流程:同一角色多阶段(固定身份 + 阶段描述 + 全阶段共用同一 seed 保证一致性)
|
|
2668
2673
|
// 语法:连续 <角色>:<阶段1> → <阶段2> → ... 或 连续 <角色>:<阶段1>|<阶段2>|...
|
|
2674
|
+
// 询问是否使用 LLM 优化,返回 'yes' / 'no' / 'cancel' / null(无法交互或超时)
|
|
2675
|
+
async function askSeriesLLMUse(session) {
|
|
2676
|
+
if (typeof session.prompt !== 'function') return null
|
|
2677
|
+
await session.send(session.text('.series-llm-ask'))
|
|
2678
|
+
const reply = await session.prompt((cfg.seriesAskTimeout || 60) * 1000).catch(() => null)
|
|
2679
|
+
const ans = String((reply && (reply.content != null ? reply.content : reply)) || '').trim()
|
|
2680
|
+
if (/^(是|1|①|用|使用|使用llm|yes|y)$/i.test(ans)) return 'yes'
|
|
2681
|
+
if (/^(否|2|②|不用|不使用|不使用llm|不优化|不用llm|no|n)$/i.test(ans)) return 'no'
|
|
2682
|
+
if (/^(取消|3|③|算了|不生成|cancel|c)$/i.test(ans)) return 'cancel'
|
|
2683
|
+
if (!ans) return null
|
|
2684
|
+
await session.send(session.text('.series-llm-invalid'))
|
|
2685
|
+
return askSeriesLLMUse(session)
|
|
2686
|
+
}
|
|
2687
|
+
|
|
2669
2688
|
async function handleGenerateSeries(session, rawText) {
|
|
2670
2689
|
const USERID = session.userId
|
|
2671
2690
|
const isAdmin = isAdminUser(session)
|
|
@@ -2723,16 +2742,27 @@ exports.apply = async function apply(ctx, cfg) {
|
|
|
2723
2742
|
const ready = await ensureComfyuiReady()
|
|
2724
2743
|
if (!ready.ok) return ready.message
|
|
2725
2744
|
|
|
2745
|
+
// 询问是否使用 LLM 优化:是=用 LLM / 否=直接使用原始描述 / 取消=不生成。
|
|
2746
|
+
// 未配置 LLM 或平台不支持交互式询问时,沿用原有「配置了 LLM 就逐阶段优化」行为。
|
|
2747
|
+
let useLLM = true
|
|
2748
|
+
if (cfg.llmModel && cfg.llmBaseUrl && typeof session.prompt === 'function') {
|
|
2749
|
+
const choice = await askSeriesLLMUse(session)
|
|
2750
|
+
if (choice === 'cancel') return ''
|
|
2751
|
+
if (choice === 'no') useLLM = false
|
|
2752
|
+
}
|
|
2753
|
+
|
|
2726
2754
|
// 组装各阶段提示词:身份(含固定角色 tags)+ 阶段描述。
|
|
2727
|
-
//
|
|
2728
|
-
//
|
|
2729
|
-
//
|
|
2755
|
+
// 使用 LLM 时逐阶段优化(不受 promptOptimizeEnabled 限制),因为 anima 是
|
|
2756
|
+
// Danbooru-tag 模型,中文阶段描述必须转成 tags 才能体现在画面里;
|
|
2757
|
+
// 用户选择「否」或未配置 LLM 时,直接使用各阶段原始描述(不注入身份前缀)。
|
|
2730
2758
|
const fixedChars = parsePresetList(cfg.fixedCharacters)
|
|
2731
2759
|
const stagePrompts = []
|
|
2732
2760
|
let degradedStages = 0
|
|
2733
2761
|
for (const st of stageList) {
|
|
2734
2762
|
const base = identity ? `${identity},${st}` : st
|
|
2735
|
-
const result =
|
|
2763
|
+
const result = useLLM
|
|
2764
|
+
? await optimizeSeriesStage(base, identity)
|
|
2765
|
+
: { ok: true, prompt: st, drops: [], reason: 'user_skipped_llm' }
|
|
2736
2766
|
if (!result.ok) degradedStages += 1
|
|
2737
2767
|
const stageTags = result.prompt || base
|
|
2738
2768
|
const drops = result.drops || []
|
|
@@ -2769,6 +2799,7 @@ exports.apply = async function apply(ctx, cfg) {
|
|
|
2769
2799
|
const notice = []
|
|
2770
2800
|
if (clamped) notice.push(session.text('.batch-limit', [count]))
|
|
2771
2801
|
if (identity && fixedChars[identity]) notice.push(`已固定角色「${identity}」的身份 tags,各阶段外观将保持一致。`)
|
|
2802
|
+
if (!useLLM) notice.push(session.text('.series-no-llm'))
|
|
2772
2803
|
if (degradedStages) notice.push(session.text('.prompt-degraded', ['(连续图阶段优化失败,已使用原始描述)']))
|
|
2773
2804
|
if (cfg.queueEnabled) {
|
|
2774
2805
|
notice.push(session.text('.queued', [firstPosition, cfg.queueMaxRequests || '∞']))
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -106,7 +106,7 @@ plugins:
|
|
|
106
106
|
- 固定种子 `--seed 数字`(支持 `--seed:` `--seed=` `--seed=` 形式)在**单张 / 批量 / 连续图**里都可用,且会从提示词中自动剥离,不会混进 tags。
|
|
107
107
|
- 多人指令的视觉校验需要单独配置视觉模型(`verifyLlm*`),未配置时会跳过校验直接发送。
|
|
108
108
|
- 连续图用「同一角色 + 全阶段共用 seed」保证一致性。固定角色的身份 tags(角色名 / 种族 / 尖耳朵等)会**始终注入每一阶段**,保证图跟角色相关;阶段描述里明确改变的外观(发色/瞳色/种族变化等)会自动从固定 tags 中剔除,避免"固定银发把黑化阶段拉回去"。
|
|
109
|
-
-
|
|
109
|
+
- **连续图配置了 LLM(`llmBaseUrl`/`llmModel`)时会交互式询问是否使用 LLM 逐阶段优化**:回复 `1 / 是` 使用 LLM(把中文描述转成 Danbooru tags),回复 `2 / 否` 不使用 LLM(直接按你输入的内容生图,适合已写好英文 tags 的情况),回复 `3 / 取消` 则不生成。等待时间由 `seriesAskTimeout`(秒)控制;未配置 LLM 或平台不支持交互时,配置了 LLM 就自动逐阶段优化。anima 是 tag 模型,中文不翻译就体现不到画面里。阶段描述尽量写**能看见的变化**(发色渐变、眼神、服装破损、光环变黑、表情),心理/抽象描述("感到厌恶""沉迷")模型很难画出来。
|
|
110
110
|
- **提示词优化券**:当全局 `promptOptimizeEnabled` 关闭时,普通用户生图会**交互式询问**是否使用券(记录在 `p_system.llmToken`):
|
|
111
111
|
- 有券 → 询问是否使用;确认后消耗券并 LLM 优化,**拒绝则取消本次生图**(不扣 P);
|
|
112
112
|
- 没券/券不足 → 询问是否购买并显示价格(默认 `couponPrice` 3000 P/张,也可自动读取 `data/p-shop.json` 里覆盖的价格);确认后扣 P 购买并消耗、优化生图;**拒绝一次会再次警告**(提示不用券图可能不好看)并再问一次,**再次拒绝则直接生图**(不优化)。**P 点不足买不起券时,会询问是否仍然生图**(回复「否」则取消本次生图)。
|