dsh-feiyu-image 0.1.0 → 0.1.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # 更新记录
2
2
 
3
+ ## 0.1.2
4
+
5
+ - 角色换成**鲸鱼娘大肥鱼**(蓝发、鲸鱼鳍耳、鲸鱼尾、女仆装),设定图放在 `~/.dsh/feiyu-image/角色设定/`;
6
+ - 设定拆成两段:**固定特征**(长相、发色、耳、尾、瞳色)与**可变服装**(女仆装为默认,睡衣/浴巾/外出服以画面描述为准);
7
+ - 加比例约束:日系成人向、七头身、非 Q 版,画面比例正常;
8
+ - 头饰改为「默认戴,穿睡衣或外出时可不戴」。
9
+
10
+ ## 0.1.1
11
+
12
+ - 画风改成二次元(日系动画、赛璐璐上色);
13
+ - 角色形象锁定:固定「角色设定」每次一字不差带上 + 固定 `seed`,跨场景保持同一个人;
14
+ - 角色设定图存 `~/.dsh/feiyu-image/角色-设定.png`(不计入每日张数);
15
+ - 实测该接口不接受图片输入,所以改用文字设定 + seed 锁脸,README 里写清了边界。
16
+
3
17
  ## 0.1.0
4
18
 
5
19
  - 首个版本:`shoot` 工具(selfie / scene),调百炼 Token Plan 生图;
package/README.md CHANGED
@@ -8,6 +8,8 @@
8
8
  存成本地图片,回复里写 `![描述](路径)` 就能发到 QQ。
9
9
 
10
10
  生图走 **阿里百炼 Token Plan**(`wan2.7-image`,compatible-mode `chat/completions`,回图片 URL,2048×2048)。
11
+ 画风是**二次元**(日系成人向动画、赛璐璐上色),角色是**鲸鱼娘**(蓝发、鲸鱼鳍耳、鲸鱼尾、女仆装),
12
+ 长相靠「固定特征 + 固定 seed」钉住,衣服是可变量。
11
13
 
12
14
  ## 为什么不是 dsh-image-studio
13
15
 
@@ -21,7 +23,9 @@
21
23
  | --- | --- |
22
24
  | `shoot` | `提示`(可选,画面里还想要什么)+ `类型`(`selfie` 自拍 / `scene` 只拍场景)→ 生成并保存 |
23
25
 
24
- - 提示词自动拼:外观(配置)+ 此刻穿着(读 `dsh-feiyu-life` 的今日剧本)+ 所在场景 + 光线 + 风格;
26
+ - 提示词自动拼:**固定特征**(长相/发色/耳/尾/瞳色,一字不差每次带上)+ **可变服装**(默认女仆装,睡衣、浴巾、外出服以画面描述为准)+ 此刻穿着(读 `dsh-feiyu-life` 的今日剧本)+ 场景 + 光线 + 画风;
27
+ - 硬比例约束:日系成人向、七头身、非 Q 版;
28
+ - 固定 `seed`,同一个角色跨场景保持同一张脸(发色、发型、瞳色、鲸鱼发夹、卫衣);
25
29
  - 出图存 `~/.dsh/feiyu-image/feiyu-<时间戳>.png`;
26
30
  - 节流:默认每天 8 张、两次至少隔 30 秒(配置可调);
27
31
  - 生图失败会返回原因,不会卡住整轮对话。
@@ -68,7 +72,10 @@ shoot 类型=scene 提示="宿舍窗台上的绿萝,傍晚的光"
68
72
 
69
73
  ## 已知边界
70
74
 
71
- - 同一个人的脸**只能做到「像同一个人」**,不是完全一致;要稳定得配 LoRA 或参考图(未实现);
75
+ - 实测这条接口**不接受图片输入**(传参考图会 400:`Either 'text' or 'image' must be provided, but not both`),
76
+ 所以没法用「角色参考图 + 指令」的方式锁脸;现在靠固定设定 + 固定 seed,能做到「一看就是同一个人」,但细节会飘。
77
+ 要真正锁死得上 LoRA 或支持 image-edit 的接口;
78
+ - 角色设定图存在 `~/.dsh/feiyu-image/角色-设定.png`,改设定时对着它改;
72
79
  - 中文文字(黑板、书页)容易糊成乱码,尽量别让画面里出现要认的字;
73
80
  - 依赖 `dsh-feiyu-life` 才有「穿着/场景」;没装也能用,只是提示词里少这两项。
74
81
 
package/lib/index.js CHANGED
@@ -20,8 +20,10 @@ const DAYS = join(DSH_HOME, 'feiyu-life-days')
20
20
  const 默认 = {
21
21
  总开关: true,
22
22
  模型: 'wan2.7-image',
23
- 外观: '中国大陆 21 岁女大学生,素颜淡妆,黑色齐肩发,皮肤偏白,身形偏瘦',
24
- 风格: '手机随手拍,自然光,轻微胶片颗粒,真实质感,不过度磨皮',
23
+ 种子: 20261109,
24
+ 外观: '鲸鱼娘:深蓝色及腰长卷发,发尾渐变成浅蓝;头顶一撮鲸鱼尾形状的呆毛;白色蕾丝女仆头饰,头饰右侧一个小蓝蝴蝶结;两侧各有一只鲸鱼鳍形状的耳,耳内侧白色;蓝色大眼,皮肤白皙,圆脸,21 岁成年女性的比例',
25
+ 服装: '深蓝色长袖女仆连衣裙,胸前白色荷叶边衬衣,白色大围裙,裙摆金色藤蔓刺绣,袖口白色荷叶边;身后一条深蓝色鲸鱼尾巴,尾鳍浅蓝;白色连裤袜,深蓝色玛丽珍鞋',
26
+ 风格: '偏成熟比例的日系动画人设,赛璐璐上色,清晰线稿,柔和光,非 Q 版,背景干净',
25
27
  每日上限: 8,
26
28
  最短间隔秒: 30,
27
29
  存图目录: '',
@@ -62,18 +64,19 @@ function 拼提示词(cfg, 参数) {
62
64
  const 生活 = 生活此刻()
63
65
  const 类型 = String(参数.类型 || 'selfie')
64
66
  const 主体 = String(参数.提示 || 参数.prompt || '').trim()
65
- const 片段 = []
67
+ // 只锁「长相」;衣服是变量 —— 不然洗澡、睡觉、出门都会被女仆装顶掉
68
+ const 片段 = [`【角色固定特征,长相必须一致】${cfg.外观}。`]
69
+ 片段.push(`默认服装:${cfg.服装};如果画面描述里指定了别的穿着(睡衣、浴巾、外套等),以画面描述为准。`)
66
70
  if (类型 === 'selfie') {
67
- 片段.push(cfg.外观)
68
- if (生活.穿) 片段.push(`穿着${生活.穿}`)
69
- if (生活.场景) 片段.push(`此刻在${生活.场景}`)
70
- 片段.push('第一人称手持手机自拍视角,脸在画面里,表情自然')
71
+ if (生活.穿) 片段.push(`此刻穿着:${生活.穿}`)
72
+ if (生活.场景) 片段.push(`场景:${生活.场景}`)
73
+ 片段.push('第一人称手持手机自拍构图,脸在画面里,表情自然')
71
74
  } else {
72
- if (生活.场景) 片段.push(`地点:${生活.场景}`)
75
+ if (生活.场景) 片段.push(`场景:${生活.场景}`)
73
76
  }
74
- if (主体) 片段.push(主体)
77
+ if (主体) 片段.push(`画面:${主体}`)
75
78
  片段.push(生活.光线)
76
- 片段.push(cfg.风格)
79
+ 片段.push(`画风:${cfg.风格}`)
77
80
  return 片段.filter(Boolean).join(';')
78
81
  }
79
82
 
@@ -82,7 +85,11 @@ async function 生图(cfg, prompt) {
82
85
  const r = await fetch(tp.chatBaseUrl.replace(/\/+$/, '') + '/chat/completions', {
83
86
  method: 'POST',
84
87
  headers: { Authorization: 'Bearer ' + tp.tokenPlanKey, 'Content-Type': 'application/json' },
85
- body: JSON.stringify({ model: cfg.模型, messages: [{ role: 'user', content: [{ type: 'text', text: prompt }] }] }),
88
+ body: JSON.stringify({
89
+ model: cfg.模型,
90
+ ...(Number(cfg.种子) ? { seed: Number(cfg.种子) } : {}),
91
+ messages: [{ role: 'user', content: [{ type: 'text', text: prompt }] }],
92
+ }),
86
93
  })
87
94
  const data = await r.json().catch(() => ({}))
88
95
  if (!r.ok) throw new Error('生图接口 ' + r.status + ':' + JSON.stringify(data).slice(0, 200))
@@ -107,7 +114,7 @@ function 今日用量(cfg) {
107
114
  let n = 0
108
115
  let 最后 = 0
109
116
  for (const f of 列目录(dir)) {
110
- if (!f.endsWith('.png')) continue
117
+ if (!/^feiyu-.*\.png$/.test(f)) continue // 角色设定图不算拍的照片
111
118
  const st = statSync(join(dir, f))
112
119
  if (new Date(st.mtimeMs + 8 * 3600e3).toISOString().slice(0, 10) === 今天) n++
113
120
  最后 = Math.max(最后, st.mtimeMs)
package/package.json CHANGED
@@ -1,22 +1,49 @@
1
1
  {
2
2
  "name": "dsh-feiyu-image",
3
- "version": "0.1.0",
4
- "description": "给大肥鱼一个相机:调百炼 Token Plan 生图(wan2.7-image),自动沿用她此刻的穿着和场景,出图存本地、可直接发到 QQ。",
3
+ "version": "0.1.2",
4
+ "description": "给大肥鱼一个相机:调百炼 wan2.7-image 出二次元图,角色形象用固定设定+固定种子钉住,自动带此刻的穿着和场景,出图可直接发到 QQ。",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
- "engines": { "node": ">=22" },
8
- "keywords": ["dsh", "dsh-plugin", "deepseek-harness", "image", "wanx", "bailian", "companion"],
7
+ "engines": {
8
+ "node": ">=22"
9
+ },
10
+ "keywords": [
11
+ "dsh",
12
+ "dsh-plugin",
13
+ "deepseek-harness",
14
+ "image",
15
+ "wanx",
16
+ "bailian",
17
+ "companion"
18
+ ],
9
19
  "author": "Vansnc",
10
- "repository": { "type": "git", "url": "git+https://github.com/Vansnc/dsh-feiyu-image.git" },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/Vansnc/dsh-feiyu-image.git"
23
+ },
11
24
  "homepage": "https://github.com/Vansnc/dsh-feiyu-image#readme",
12
- "bugs": { "url": "https://github.com/Vansnc/dsh-feiyu-image/issues" },
25
+ "bugs": {
26
+ "url": "https://github.com/Vansnc/dsh-feiyu-image/issues"
27
+ },
13
28
  "main": "lib/index.js",
14
29
  "exports": {
15
30
  ".": "./lib/index.js",
16
31
  "./cordis.patch.yml": "./cordis.patch.yml",
17
32
  "./package.json": "./package.json"
18
33
  },
19
- "files": ["lib", "cordis.patch.yml", "README.md", "CHANGELOG.md", "LICENSE"],
20
- "publishConfig": { "access": "public" },
21
- "dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
22
- }
34
+ "files": [
35
+ "lib",
36
+ "cordis.patch.yml",
37
+ "README.md",
38
+ "CHANGELOG.md",
39
+ "LICENSE"
40
+ ],
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "dsh": {
45
+ "bundle": {
46
+ "patch": "./cordis.patch.yml"
47
+ }
48
+ }
49
+ }