cortico-world-image 0.2.0 → 0.5.4
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/ENV_PROMPT.md +8 -3
- package/README.md +164 -106
- package/describe.json +17 -9
- package/dist/webui.js +677 -13
- package/package.json +2 -2
- package/src/chain.js +261 -0
- package/src/chat-image-patch.js +93 -262
- package/src/comfyui.js +801 -0
- package/src/config.js +16 -4
- package/src/tools.js +20 -9
- package/src/world.js +314 -70
- package/tools/check.mjs +718 -65
- package/tools/patch.mjs +178 -398
package/ENV_PROMPT.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## 四个工具
|
|
4
4
|
|
|
5
5
|
- `image_draw`:按一段文字描述画一张新图。图会存到磁盘、附加进本次对话(你自己看得到)、并显示在控制台「图片工坊 → 作品」页。
|
|
6
|
-
- `image_edit`:拿一张已有的图按指令改(换风格、改细节)。`image` 给绝对路径,或 `image_gallery`
|
|
6
|
+
- `image_edit`:拿一张已有的图按指令改(换风格、改细节)。`image` 给绝对路径,或 `image_gallery` 里的编号。`size` 一般不传(本地 ComfyUI 那档会照参考图的比例出图);要固定尺寸就写 `宽x高`。服务端支不支持改图由接口决定,报错就照实告诉用户。
|
|
7
7
|
- `image_gallery`:列出画过的图,最新的在前,带编号和绝对路径。编号可以交给 `image_show` 或 `image_edit`。
|
|
8
8
|
- `image_show`:把一张旧图重新放回眼前(重新附加进对话,并在作品页高亮)。
|
|
9
9
|
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
|
|
12
12
|
当前接口状态:`{{image.ready | 未知。不确定就别调用,先告诉用户去控制台「图片工坊 → 状态」看看。}}`
|
|
13
13
|
|
|
14
|
+
## 模型链
|
|
15
|
+
|
|
16
|
+
后台可能配了一串模型(「图片工坊 → 状态 → 模型链」),本地 ComfyUI 和云端接口都在里面,按顺序试:
|
|
17
|
+
前一档连不上、超时、额度用完、模型没装,就自动换下一档;回执里会写「前几档没成」和最后用的是哪一档。
|
|
18
|
+
|
|
14
19
|
## 规矩
|
|
15
20
|
|
|
16
21
|
1. **别每轮都画。** 用户明确想看/想让你画,或者确实需要一张图来解释、来送人,才调用。闲聊、讨论、解释概念都不需要配图。
|
|
@@ -18,7 +23,7 @@
|
|
|
18
23
|
3. **描述要具体。** 主体、画风、构图、光线、色调、背景,一句到位;别只给两三个词,也别把整段聊天记录塞进去。
|
|
19
24
|
4. **说人话,不念路径。** 回执里的绝对路径是给工具用的,不是给用户看的。画完就用一句自然的话告诉用户画了什么,像 `pet_say` 那样说话。不要把路径、编号、`blobs`、JSON 念出来,也不要贴 Markdown 图片语法。
|
|
20
25
|
5. **发到别处要另走一步。** 图默认只在你自己的界面里。
|
|
21
|
-
-
|
|
22
|
-
- 要发到 QQ
|
|
26
|
+
- 想让主人在控制台的「对话」页看到它,画完之后调桌宠的 `pet_say`,`images` 填回执里 `[blob …]` 行的句柄(就是 `[blob ` 后面那一串),`script` 给空串就只贴图不出声;想配一句话就写进 `script`(那句话会在气泡里说出来)。图只进「对话」页,不进气泡。
|
|
27
|
+
- 要发到 QQ 会话:把回执里 `[blob …]` 行的句柄交给 QQ 世界的发图工具。官方 QQ 扩展用 `qq_draft`(`image` 填句柄,`to` 填 `group:<群号>` 或 `private:<QQ号>`,再用 `qq_confirm` 确认发送);旧版 QQ 扩展(`qqbot`)用 `qq_send_image`,`image` 填回执里的绝对路径。
|
|
23
28
|
6. **失败就停。** 如果回执说没配密钥、接口报错、超时,不要换个说法反复重试。把情况告诉用户,让他去控制台「图片工坊 → 状态」里填密钥或改接口地址。
|
|
24
29
|
7. **别凭空说画好了。** 只有工具回执真的带着图回来,才算画好了。
|
package/README.md
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
# 图片工坊 · cortico-world-image
|
|
2
2
|
|
|
3
|
-
给 Coopanion 桌宠加两件事:**调用图片生成 API
|
|
3
|
+
给 Coopanion 桌宠加两件事:**调用图片生成 API 画图,并把图交回对话**;以及**把图贴进控制台的「对话」页**——后者用桌宠包自带的 `pet_say.images`(本扩展的工具回执里带着附件句柄),不再给桌宠打补丁。唯一还会被改写的是**第三方 QQ 扩展**里的两处路径解析(可选补丁,程序自动更新覆写回去之后,扩展下次启动会自己补回来)。
|
|
4
4
|
|
|
5
5
|
这是一个 `cortico` 的 **World 扩展**(`kind: world`,`api: 6`),只补一个 `image` 世界,
|
|
6
6
|
不依赖任何第三方 npm 包(纯 ESM JS + Node 内置模块)。
|
|
7
7
|
|
|
8
8
|
> **性质说明**:这是给 Coopanion 写的**非官方**扩展,走的是框架公开的扩展接口
|
|
9
|
-
> (`kind: world` + `webUiClient` 面板 + 必需的 `describe.json`
|
|
10
|
-
>
|
|
11
|
-
>
|
|
12
|
-
>
|
|
13
|
-
>
|
|
9
|
+
> (`kind: world` + `webUiClient` 面板 + 必需的 `describe.json` 自描述)。唯一伸手动别人的地方是「QQ 发图路径」
|
|
10
|
+
> 那两处可选补丁——它按锚点改写**第三方 QQ 扩展**(`cortico-world-qq-better-alont1`)的 `src/world.ts`,改之前留一份
|
|
11
|
+
> `.coopanion-orig` 备份,程序自动更新覆写后会自己补回来(细节与还原方式见那一节)。
|
|
12
|
+
> 补丁只给**正在用的那个 QQ 扩展**打:读 `<安装>\data\home\companion\config.json`,
|
|
13
|
+
> `worlds.qqbot.enabled` 不是 `true`(比如已经切到官方 `cortico-world-qq`)就整段跳过,一个字节都不碰。
|
|
14
|
+
> **桌宠包本身完全不碰**:0.3.0 起改用官方的 `pet_say.images`,早先版本打进去的旧补丁会被自动还原。
|
|
15
|
+
> 不愿意让脚本动那个第三方包,就把 QQ 扩展的补丁关掉(它认不出原文只会记一条失败,不会硬改)。
|
|
14
16
|
>
|
|
15
17
|
> MIT 许可,见 [LICENSE](LICENSE)。
|
|
16
18
|
|
|
@@ -20,8 +22,8 @@
|
|
|
20
22
|
|
|
21
23
|
| 工具 | 标签 | 作用 |
|
|
22
24
|
| --- | --- | --- |
|
|
23
|
-
| `image_draw` | `act` |
|
|
24
|
-
| `image_edit` | `act` | 拿一张已有的图按指令改(支持上传改图,或阿里云百炼式的 `image`
|
|
25
|
+
| `image_draw` | `act` | 按文字描述画一张新图,落盘、记进索引(可带 `model` 点名用哪一档) |
|
|
26
|
+
| `image_edit` | `act` | 拿一张已有的图按指令改(支持上传改图,或阿里云百炼式的 `image` 扩展字段;同样能带 `model`) |
|
|
25
27
|
| `image_gallery` | `read` | 列出画过的图,带编号与绝对路径 |
|
|
26
28
|
| `image_show` | `speak` | 把一张旧图重新放回对话与作品页 |
|
|
27
29
|
|
|
@@ -36,72 +38,49 @@
|
|
|
36
38
|
> 桌宠窗口的说话气泡也只会渲染纯文本——只有选项卡片的图片位认 `data:image/`。
|
|
37
39
|
> 硬往气泡里塞图会改框架,不是扩展该做的事。所以本扩展走「工具回执 blob + 自己的控制台页」这条正规通道。
|
|
38
40
|
>
|
|
39
|
-
>
|
|
41
|
+
> 例外是**控制台的「对话」页**:那里用桌宠包自带的 `pet_say.images` 就能显示图(见下一节),
|
|
40
42
|
> 但桌宠**头顶气泡**仍然只画文字。
|
|
41
43
|
|
|
42
|
-
##
|
|
44
|
+
## 把图贴到「对话」页:官方 `pet_say` 的 `images`
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
桌宠包从 **0.2.0** 起,`pet_say` 自带 `images` 参数,所以本扩展**不再给桌宠打任何补丁**:
|
|
45
47
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
- 认 PNG / JPEG / WebP / GIF(先嗅文件头,认不出才看后缀),单张上限 8 MB;
|
|
51
|
-
- 标签是 `act` 不是 `speak`,**名字也不是 `pet_say`**,所以 CosyVoice TTS 那类只监听 `pet_say`
|
|
52
|
-
的扩展不会把它念出来;
|
|
53
|
-
- 图片随事件存成附件(`log:` 句柄),对话页通过面板的 `blob` 方法取图;对话记录里翻回旧消息也还在。
|
|
54
|
-
|
|
55
|
-
### 为什么要打补丁
|
|
56
|
-
|
|
57
|
-
对话页的时间线是**桌宠世界自己**推的流:只有它能写 `source: 'desktop-pet'` 的事件。0.1.22 及更早的框架里:
|
|
48
|
+
```js
|
|
49
|
+
pet_say({ script: '', images: ['<句柄>'] }) // 只贴图、不说话
|
|
50
|
+
pet_say({ script: '看,画好了。', images: ['<句柄>'] }) // 气泡里说一句,图贴到对话页
|
|
51
|
+
```
|
|
58
52
|
|
|
59
|
-
-
|
|
60
|
-
`
|
|
61
|
-
-
|
|
53
|
+
- 参数收的是**附件句柄**:就是工具回执里 `[blob <handle> <mime> <name>]` 那一行的 `<handle>`。
|
|
54
|
+
本扩展的 `image_draw` / `image_edit` / `image_show` 回执本来就带附件,框架会把它渲染成这样一行交给模型。
|
|
55
|
+
- `script` 空串 = 只有图、没台词;图只进控制台「对话」页,**不进气泡**。写一句话就同时说、同时贴。
|
|
56
|
+
- **任意本地文件要两步**:先 `image_show({ path })` 把文件读成附件、拿到句柄,再 `pet_say`。
|
|
57
|
+
多一次工具调用,并且那张图会被渲染给模型看(约 1k+ token/张,一次性);对话里刚画好的图
|
|
58
|
+
直接用 `image_draw` 回执里的句柄,不额外花。
|
|
59
|
+
- 0.3.0 起**没有 `pet_show_image` 这个工具了**。
|
|
62
60
|
|
|
63
|
-
|
|
64
|
-
`chat.broadcast`,`chatPage()` 也只读 `source === 'desktop-pet'`)。0.1.23 之前靠补丁把这两段补上;
|
|
65
|
-
**0.1.23 框架自己已经内置,那 4 处补丁已经删掉**(见下一节)。现在补丁一共 8 处:
|
|
66
|
-
前 6 处是你这份安装里本来就有的文件(`world.ts` 5 处 + `definition.ts` 1 处,最后 3 处让
|
|
67
|
-
`pet_show_image` 也认相对路径),后 2 处(`optional`)落在**第三方 QQ 扩展**上,没装那个扩展就记
|
|
68
|
-
`absent`——不算失败、也不进状态页的总数:
|
|
61
|
+
### 0.3.0 删掉的桌宠补丁(7 处)
|
|
69
62
|
|
|
70
|
-
|
|
|
63
|
+
| 原来的补丁 id | 文件 | 原本做什么 |
|
|
71
64
|
| --- | --- | --- |
|
|
72
|
-
| `pet-fs-import` | 桌宠 `src/world.ts` | `node:fs` 导入加 `readFileSync
|
|
65
|
+
| `pet-fs-import` | 桌宠 `src/world.ts` | `node:fs` 导入加 `readFileSync` |
|
|
73
66
|
| `pet-path-import` | 桌宠 `src/world.ts` | `node:path` 导入加 `basename/extname/isAbsolute` |
|
|
74
67
|
| `pet-show-image-tool` | 桌宠 `src/world.ts` | `CHAT_IMAGE_TOOL` 常量、`sniffImageMime()`、`showImage()`、挂进 `tools()` |
|
|
75
|
-
| `pet-workspace-option` | 桌宠 `src/world.ts` | 世界选项加 `workspaceDir?: () => string
|
|
76
|
-
| `pet-workspace-relpaths` | 桌宠 `src/world.ts` | `pet_show_image` 的相对路径按 `workspaceDir()`
|
|
68
|
+
| `pet-workspace-option` | 桌宠 `src/world.ts` | 世界选项加 `workspaceDir?: () => string` |
|
|
69
|
+
| `pet-workspace-relpaths` | 桌宠 `src/world.ts` | `pet_show_image` 的相对路径按 `workspaceDir()` 拼,说明同步 |
|
|
77
70
|
| `pet-workspace-wire` | 桌宠 `src/definition.ts` | 装配层把 `join(ctx.botDir, 'workspace')` 传进世界 |
|
|
78
|
-
| `
|
|
79
|
-
| `qq-image-hints`(可选) | 同上 | 那两个工具的参数说明也改成「相对桌宠工作区的路径,如 `blobs/xx.jpg`」 |
|
|
80
|
-
|
|
81
|
-
改法一律是**精确锚点 + 幂等标记**(`coopanion-chat-image`):
|
|
82
|
-
认不出锚点就记一条失败并**不动那个文件**,绝不硬猜。第一次改写前会把原文留一份
|
|
83
|
-
`<文件>.coopanion-orig`。
|
|
84
|
-
|
|
85
|
-
补丁器不写死源码里的变量名:`tools()` 那处不写死
|
|
86
|
-
`DESKTOP_PET_TOOL_DECLS.map(...)`,而是包住 `tools()` 里现有的 `return ...;`。
|
|
87
|
-
所以升级换了写法之后照样能打上。
|
|
88
|
-
|
|
89
|
-
### 框架 0.1.23 之后为什么少了 4 处补丁
|
|
90
|
-
|
|
91
|
-
0.1.23 起「把图发到对话页」是框架原生能力,不再是这个扩展要补的洞:
|
|
92
|
-
|
|
93
|
-
- 桌宠 `pet_say` 工具原生就有 `images` 参数(给 `[blob …]` 句柄),`world.ts` 的
|
|
94
|
-
`record(meta, text, blobs = [])` 原生把图片附件写进事件;
|
|
95
|
-
- `chat.ts` 原生有 `wireImages()`:把事件 `blobs` 里 `image/*` 的映射成 `WireImage`,`ChatItem` 的
|
|
96
|
-
say 变体本身带 `images?: WireImage[]`;
|
|
97
|
-
- 客户端 bundle 的 say 一段原生就画 `chat-thumb` 缩略图并挂 lightbox。
|
|
71
|
+
| `pet-show-image-describe` | 桌宠 `src/definition.ts` | 把 `pet_show_image` 补进 `describe.tools`(框架 0.2 会核对,缺了记「工具不在 describe.tools 里」) |
|
|
98
72
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
73
|
+
**为什么能全删**:0.1.23 起原生就有 `pet_say.images` 与「事件 `blobs` → 对话页缩略图」,
|
|
74
|
+
0.2.0 起桌宠包的 `pet_say` 会 `host.blob()` 取句柄里的字节、写进事件(`deliver: false`,
|
|
75
|
+
不会再把图投回模型);而本扩展四个工具的回执本来就带 `blobs`,框架会把它们渲染成 `[blob …]` 句柄。
|
|
76
|
+
`pet_show_image` 当年是唯一「按路径贴图」的入口,现在 `image_show` + `pet_say` 覆盖同一场景——
|
|
77
|
+
注入的工具、它的相对路径、工作区接线、自描述四处都不再需要,一并删掉。
|
|
102
78
|
|
|
103
|
-
|
|
104
|
-
`
|
|
79
|
+
**旧安装怎么收尾**:`revertObsoletePetPatches()` 在每次启动时检查桌宠包的
|
|
80
|
+
`src/world.ts` / `src/definition.ts`——只要文件里还有我们的标记(`coopanion-chat-image` /
|
|
81
|
+
`COOPANION_CHAT_IMAGE_TOOL` / `name: 'pet_show_image'`)且有 `.coopanion-orig` 备份,
|
|
82
|
+
就用备份覆盖回原文(等于把桌宠包恢复成上游原样),并在「状态」页记一笔。
|
|
83
|
+
桌宠包自己升级过(标记没了)就一律不动。
|
|
105
84
|
|
|
106
85
|
### 为什么顺手改了 QQ 扩展(`optional` 那两处)
|
|
107
86
|
|
|
@@ -110,51 +89,47 @@
|
|
|
110
89
|
桌宠手里只有 `blobs/qq-test.jpg` 这种相对工作区的路径,工具先去扩展目录里找,找不到就回一句
|
|
111
90
|
「本地没有这个文件:…」,图发不出去。
|
|
112
91
|
|
|
113
|
-
|
|
92
|
+
| 补丁 id | 文件 | 做什么 |
|
|
93
|
+
| --- | --- | --- |
|
|
94
|
+
| `qq-image-relpaths`(可选) | `<安装>\data\extensions\node_modules\cortico-world-qq-better-alont1\src\world.ts` | `qq_send_image` / `qq_view_image` 认「相对桌宠工作区」的路径 |
|
|
95
|
+
| `qq-image-hints`(可选) | 同上 | 那两个工具的参数说明改成「相对桌宠工作区的路径,如 `blobs/xx.jpg`」 |
|
|
96
|
+
|
|
97
|
+
补上的这处只做一件事——`resolveLocalImagePath()`:相对路径**先按桌宠工作区
|
|
114
98
|
(`this.config.memoryDir`,装配层给的 `<botDir>/workspace`)解析,工作区没有才退回扩展目录**
|
|
115
|
-
|
|
116
|
-
|
|
99
|
+
(装配层没给工作区时退回老行为);绝对路径原样返回。工具的参数说明也跟着改成同一口径——
|
|
100
|
+
模型只看得到说明,说明不改它不敢写短路径。
|
|
117
101
|
|
|
118
|
-
|
|
102
|
+
这个包是第三方的,升级会换目录、文件也会被覆写,所以走同一套自愈:找不到那份
|
|
119
103
|
`world.ts` 记 `absent`(没装这个扩展不算失败、不进总数),认不出它原来的写法记 `failed` 并且
|
|
120
104
|
**不动那个文件**,原文备份同样是 `world.ts.coopanion-orig`。改的是 TS 源码,**要重启才生效**。
|
|
121
105
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
所以得三处一起改——世界选项加一个可选的 `workspaceDir?: () => string`(`pet-workspace-option`),
|
|
127
|
-
`showImage()` 里那行 `const raw = …` 改成 `let` 并加一段「相对路径就拼工作区,没给工作区仍然报错、
|
|
128
|
-
只认绝对路径」(`pet-workspace-relpaths`,同时改工具说明),最后在装配层
|
|
129
|
-
`cortico-world-desktop-pet/src/definition.ts` 里把 `join(ctx.botDir, 'workspace')` 传进去
|
|
130
|
-
(`pet-workspace-wire`)。
|
|
131
|
-
|
|
132
|
-
三处都是**精确锚点**,认不出原文就记 `failed` 且不动文件;`pet-workspace-relpaths` 的 `done` 判据是
|
|
133
|
-
「真的拼上了工作区」(`raw = join(ws, raw);`),光有工具说明不算打过。装配层没给 `workspaceDir`
|
|
134
|
-
(比如桌宠包又改了装配代码、只有前两处打上)时,行为退回老样子:相对路径报错、要求绝对路径——
|
|
135
|
-
不会静默拿到错的路径。
|
|
106
|
+
**切到别的 QQ 扩展就自动让路**:每个补丁都标了它服务的世界 id(`worldId: 'qqbot'`),
|
|
107
|
+
应用时会读 `<安装>\data\home\companion\config.json` 的 `worlds.qqbot.enabled`——
|
|
108
|
+
不是 `true`(例如官方 `cortico-world-qq` 顶替了它)就整段跳过,两处都记 `absent`、文件一个字节不动、
|
|
109
|
+
不请求重启,状态页这张卡片也不显示备份行(0.3.1 起)。读不到配置时**不猜**,照旧检查并打补丁。
|
|
136
110
|
|
|
137
111
|
### 自愈怎么工作
|
|
138
112
|
|
|
139
113
|
扩展模块的顶层代码**每次启动都会跑**(`loadExtensions()` 无差别 import 所有已装扩展,与
|
|
140
114
|
`worlds.<id>.enabled` 无关),所以这里不用等用户做任何事:
|
|
141
115
|
|
|
142
|
-
1.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
116
|
+
1. 启动时先**还原**桌宠包上早先版本留下的旧补丁(0.3.0 起不再注入),再检查 QQ 扩展那两处;
|
|
117
|
+
如果这次真的改了文件,状态文件里记 `requested: true`,并在 4 秒后
|
|
118
|
+
`POST http://127.0.0.1:<web.port>/api/run/restart` 请控制台重启一次(QQ 扩展的 TS 源码要重启才装载);
|
|
119
|
+
2. 重启后再跑:文件已经是对的样子 → 2 处全部 `done`(没装 QQ 扩展、或 `worlds.qqbot` 没启用时两处都是 `absent`)→ 不再请求重启(**不会反复重启**);
|
|
120
|
+
3. 程序自动更新(或 QQ 扩展升级)把文件覆写回原样 → 下一轮启动又补上,再重启一次,回到第 2 步;
|
|
146
121
|
4. 万一「已经请求过重启,这次还是缺」——说明补丁根本落不到进程真正加载的那份文件上,
|
|
147
122
|
这时记 `stuck`,**故意不再重启**(防死循环),并在「状态」页把 `id — 原因` 列出来给人看。
|
|
148
123
|
|
|
149
|
-
状态文件是扩展目录下的 `.chat-image-patch.json`(`{at, appRoot, patched, failed, requested}`)。
|
|
124
|
+
状态文件是扩展目录下的 `.chat-image-patch.json`(`{at, appRoot, patched, failed, reverted, requested}`)。
|
|
150
125
|
想彻底关掉这套自愈(比如做回归测试),设环境变量 `COOPANION_CHAT_IMAGE_PATCH=0`。
|
|
151
126
|
|
|
152
|
-
控制台「图片工坊 →
|
|
127
|
+
控制台「图片工坊 → 状态」页有一张**补丁卡片**:QQ 两处打没打上、上次检查时间、
|
|
153
128
|
每一处的备份(`<文件>.coopanion-orig` 在不在、与当前文件是否一致)、上次还原记录、
|
|
154
129
|
上次重启请求的结果,外加三个按钮:
|
|
155
130
|
|
|
156
131
|
- **重打补丁**——立刻再对一遍(不改就不请求重启);
|
|
157
|
-
-
|
|
132
|
+
- **还原备份**——用更新下发的原文把改过的文件覆盖回去(可逆,备份不删,随时能再打回来);
|
|
158
133
|
- **重启控制台**——等价于点菜单里的重启。
|
|
159
134
|
|
|
160
135
|
### 备份与还原
|
|
@@ -168,7 +143,7 @@
|
|
|
168
143
|
备份是**每份目标文件旁边的 `<文件>.coopanion-orig`**,第一次改写前拷一次,之后一直留着
|
|
169
144
|
(再打补丁不会覆盖它——它永远是「更新下发的原文」)。还原 = 拿它覆盖回去,所以:
|
|
170
145
|
|
|
171
|
-
-
|
|
146
|
+
- 还原后 QQ 发图回到「只认扩展目录的相对路径」,要**重启控制台**才生效;面板上的「还原备份」故意不自动重启;
|
|
172
147
|
- 还原不是终点:下次启动(或再点**重打补丁**)会自动补回来,所以试错很安全。
|
|
173
148
|
|
|
174
149
|
### 页面陈旧与浏览器缓存
|
|
@@ -192,9 +167,9 @@
|
|
|
192
167
|
修法是抬版本 + 重启,主程序会在 Core 就绪时自动重载控制台外壳(
|
|
193
168
|
`resources\app\app\main.cjs:285` `if (settings) settings.loadURL(consoleUrl());`):
|
|
194
169
|
|
|
195
|
-
1. 把 `package.json` 的 `version` 抬一格(例如 `0.
|
|
170
|
+
1. 把 `package.json` 的 `version` 抬一格(例如 `0.5.0` → `0.5.1`);
|
|
196
171
|
2. 重启控制台(状态页「重启控制台」或 `node tools/patch.mjs --restart`);
|
|
197
|
-
3. 程序内窗口自动重载 → 新的 URL `/assets/extensions/cortico-world-image/0.
|
|
172
|
+
3. 程序内窗口自动重载 → 新的 URL `/assets/extensions/cortico-world-image/0.5.1/webui.js`
|
|
198
173
|
取到新脚本,旧 URL 立刻变 404。
|
|
199
174
|
|
|
200
175
|
不想抬版本也行,但要**先完全退出程序**再删缓存目录:`<安装>\data\Cache`、
|
|
@@ -230,7 +205,7 @@ registry 上有版本时直接从 npm 装;想自己改代码、或者 `npm vie
|
|
|
230
205
|
或者用命令行,在 `data/extensions` 目录里(`extensions/package.json` 所在处)执行:
|
|
231
206
|
|
|
232
207
|
```powershell
|
|
233
|
-
pnpm add cortico-world-image --ignore-workspace # 想钉住版本就写 cortico-world-image@0.1
|
|
208
|
+
pnpm add cortico-world-image --ignore-workspace # 想钉住版本就写 cortico-world-image@0.5.1
|
|
234
209
|
```
|
|
235
210
|
|
|
236
211
|
装完重启。升级同理:重跑一遍(控制台的「扩展」页会显示已装版本与最新版本),装完同样要重启。
|
|
@@ -256,7 +231,8 @@ pnpm add "D:\path\to\cortico-world-image" --ignore-workspace
|
|
|
256
231
|
|
|
257
232
|
**装完必须重启 Coopanion**:扩展是 ESM 模块,进程内不会重新加载。重启后在
|
|
258
233
|
`config.json` 的 `worlds.image.enabled` 上打开(控制台里也有这个开关),四个工具才会挂给桌宠。
|
|
259
|
-
|
|
234
|
+
同一轮启动里,扩展还会把 QQ 发图路径那 2 处补丁检查一遍(没装 QQ 扩展、或已切到别的 QQ 扩展就跳过),缺了就补、并自己请控制台重启一次;
|
|
235
|
+
桌宠包上早先版本留下的旧补丁会在同一轮里被还原成上游原样
|
|
260
236
|
(详见上一节)。
|
|
261
237
|
|
|
262
238
|
### 一份能用的 `worlds.image` 长什么样
|
|
@@ -290,10 +266,11 @@ pnpm add "D:\path\to\cortico-world-image" --ignore-workspace
|
|
|
290
266
|
| 键 | 默认 | 说明 |
|
|
291
267
|
| --- | --- | --- |
|
|
292
268
|
| `enabled` | `false` | 是否把四个工具挂给桌宠 |
|
|
293
|
-
| `baseUrl` | `https://api.openai.com/v1` | OpenAI
|
|
269
|
+
| `baseUrl` | `https://api.openai.com/v1` | OpenAI 兼容的图片接口根地址(没配 `models` 时用它) |
|
|
294
270
|
| `apiKeySecret` | `IMAGE_API_KEY` | 密钥的**变量名**:先看部署 `.env`,再退到同级的端点 `.env` |
|
|
295
|
-
| `model` | `gpt-image-1` |
|
|
296
|
-
| `
|
|
271
|
+
| `model` | `gpt-image-1` | 模型名(没配 `models` 时用它) |
|
|
272
|
+
| `models` | 空 | 模型链:一串后端按优先级顺序试,见下面「模型链」(0.4.0 起) |
|
|
273
|
+
| `size` | `1024x1024` | 尺寸:`1024x1536`、比例 `16:9`/`4:3`、或 `square`/`portrait`/`landscape`;`auto` 或留空=不指定(云端不发这个参数,本地按图生图规则处理) |
|
|
297
274
|
| `quality` | `auto` | `low`/`medium`/`high` 或 `standard`/`hd`;`auto` 不发 |
|
|
298
275
|
| `format` | `png` | 接口没给格式时按这个存盘(`png`/`jpeg`/`webp`) |
|
|
299
276
|
| `timeoutMs` | `180000` | 单次画图等待上限 |
|
|
@@ -301,6 +278,71 @@ pnpm add "D:\path\to\cortico-world-image" --ignore-workspace
|
|
|
301
278
|
| `keep` | `200` | 超出后自动删最旧的,`0` = 不清理 |
|
|
302
279
|
| `pushToConsole` | `true` | 画完实时推给「作品」页 |
|
|
303
280
|
|
|
281
|
+
### 模型链:一串后端按顺序试(0.4.0)
|
|
282
|
+
|
|
283
|
+
`worlds.image.models` 是一份 JSON 数组,**数组顺序就是优先级**。前档连不上、超时、额度用完、
|
|
284
|
+
模型没装、参数不支持时自动换下一档;只有「内容审核拦了提示词」这类换谁都一样的错才不换。
|
|
285
|
+
状态页的「模型链」卡片里它就是**一串小卡片**(见下),不用手写 JSON。
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
[
|
|
289
|
+
{ "name": "local", "preset": "comfyui", "baseUrl": "http://127.0.0.1:8188", "ckpt": "sd_xl_base_1.0.safetensors" },
|
|
290
|
+
{ "name": "cloud", "preset": "openai", "baseUrl": "https://api.openai.com/v1", "model": "gpt-image-1" }
|
|
291
|
+
]
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
留空 = 用上面那套单档 `baseUrl` + `model`。两种 `preset`:
|
|
295
|
+
|
|
296
|
+
- `openai`:原有的 OpenAI 兼容接口(`/images/generations`、`/images/edits`),要密钥。
|
|
297
|
+
- `comfyui`:本地 ComfyUI(默认 `http://127.0.0.1:8188`),**不要密钥**,但要写模型文件:
|
|
298
|
+
`ckpt`(checkpoint 文件名,就是 `ComfyUI/models/checkpoints/` 里那个),或者 **裸 UNet 三件套**
|
|
299
|
+
`unet` + `textEncoder` + `vaeName`(Anima、Flux 这类不是 all-in-one 的模型;填了 `unet` 就不看 `ckpt`)。
|
|
300
|
+
|
|
301
|
+
每档都能写这些。`baseUrl` / `model` / `apiKeySecret` / `size` / `quality` / `format` / `timeoutMs` 不写就继承
|
|
302
|
+
`worlds.image` 的单档设置;其余(`ckpt`、`loras`、采样参数等)只有链里的档才有,按下面的默认值走:
|
|
303
|
+
|
|
304
|
+
| 键 | 说明 |
|
|
305
|
+
| --- | --- |
|
|
306
|
+
| `name` | 这一档的名字;面板与报错里用它,工具参数 `model` 也按它点名 |
|
|
307
|
+
| `preset` | `openai` / `comfyui` |
|
|
308
|
+
| `baseUrl` / `model` / `apiKeySecret` / `size` / `quality` / `format` / `timeoutMs` | 同上面那张表 |
|
|
309
|
+
| `ckpt` | ComfyUI 的 checkpoint 文件名(`comfyui` 必填,除非写了 `unet`) |
|
|
310
|
+
| `unet` / `textEncoder` / `vaeName` | 裸 UNet 三件套:`ComfyUI/models/diffusion_models`、`text_encoders`、`vae` 里的文件名。**填了 `unet` 就顶掉 `ckpt`**,只出裸 UNet 那份工作流 |
|
|
311
|
+
| `textEncoderType` | `unet` 的文本编码器类型,默认 `stable_diffusion`;Qwen 系编码器填 `qwen_image`(还认 `sd3` / `flux` / `cosmos` / `lumina2`) |
|
|
312
|
+
| `loras` | ComfyUI 的 LoRA:`["add_detail.safetensors:0.6", {"name":"x.safetensors","strength":0.4,"clipStrength":0.25}]`(名字带扩展名,文件得先在 ComfyUI 的 `models/loras` 里) |
|
|
313
|
+
| `steps` / `cfg` / `sampler` / `scheduler` / `denoise` / `negative` | ComfyUI 采样参数(默认 25 / 7 / euler / normal / 0.6)。`denoise` 在改图时就是改动幅度:0.6 起改得明显,只微调用 0.2~0.35 |
|
|
314
|
+
| `workflow` | 自定义 ComfyUI API 工作流(对象)。给了就整份替换内置模板,占位符见下 |
|
|
315
|
+
| `edit` | `false` = 这一档只用来画、不接改图(改图会跳到下一档) |
|
|
316
|
+
| `enabled` | `false` = 跳过这一档 |
|
|
317
|
+
|
|
318
|
+
工具参数 `model` 可以点名某一档(`name`、`ckpt` 或 `model` 三者之一):点了名就**只用那一档**,
|
|
319
|
+
失败了直接报错、不偷偷换——想让它自己挑就别传 `model`。
|
|
320
|
+
|
|
321
|
+
状态页的「模型链」卡片默认就是友好编辑:一档一张小卡片,填「名称 / 类型 / 地址 / 模型或 ckpt」,
|
|
322
|
+
用「上移 / 下移」调优先级、「删除」去掉一档,「+ 本地 ComfyUI」「+ 云端接口」加档。
|
|
323
|
+
本地 ComfyUI 那档还多一个「高级参数」按钮:能加**多行 LoRA**(文件名 / 强度 / CLIP 强度,文件名要带
|
|
324
|
+
扩展名、可带子目录),也能改 `negative`、`steps`、`cfg`、`sampler`、`scheduler`、`denoise`,
|
|
325
|
+
以及**裸 UNet 三件套**(`unet` / `textEncoder` / `textEncoderType` / `vaeName`;填了它就忽略这一档的 `ckpt`)
|
|
326
|
+
——存的就是该档的 `loras`、`negative`、`steps`、`unet` 这些字段,等于面板版的「高级:JSON」。
|
|
327
|
+
保存就是写 `worlds.image.models`;`workflow` 这类只能手写的字段仍点「高级:JSON」改原文——**链还空着时它自带一份现成范例**
|
|
328
|
+
(一档本地 ComfyUI,带 `ckpt`、两条 LoRA、采样参数与负面提示;一档云端),
|
|
329
|
+
把 `ckpt` / `loras` 换成自己 `models` 里的文件名,「应用 JSON」再「保存模型链」就能用。
|
|
330
|
+
「测试模型链」会挨档探活:ComfyUI 看 `/system_stats`,再用 `/object_info` 一次性核对 `ckpt`(或
|
|
331
|
+
`unet` / `textEncoder` / `vaeName`)在不在;OpenAI 兼容看 `/models`(端点没这条路由也算在线)。
|
|
332
|
+
探活每档最多等 6 秒;链上有没保存的改动时会先拦住。
|
|
333
|
+
|
|
334
|
+
#### ComfyUI 这档会调哪些路
|
|
335
|
+
|
|
336
|
+
`POST /prompt`(提交工作流)、`GET /history/<prompt_id>`(轮询等结果)、`GET /view?filename=…`
|
|
337
|
+
(取成品图)、`POST /upload/image`(改图时把参考图放进 `input/`)、`POST /interrupt`(超时收尾)、
|
|
338
|
+
`GET /system_stats`、`GET /object_info`(核对模型文件名,拿不到就跳过核对)。
|
|
339
|
+
|
|
340
|
+
不会替你去下模型:checkpoint 与 LoRA 得先放进 ComfyUI 的 `models/checkpoints` 与 `models/loras`,
|
|
341
|
+
`ckpt` 写文件名(在子目录里就写相对路径);裸 UNet 的三个文件放进 `models/diffusion_models`、
|
|
342
|
+
`models/text_encoders`、`models/vae`。自定义 `workflow` 里可用的占位符:
|
|
343
|
+
`prompt`、`negative`、`ckpt`、`width`、`height`、`size`、`steps`、`cfg`、`sampler`、`scheduler`、
|
|
344
|
+
`seed`、`denoise`、`image`、`loras`、`prefix`、`filename`(写成 `{{prompt}}` 这样,认不出的原样留着)。
|
|
345
|
+
|
|
304
346
|
### 密钥
|
|
305
347
|
|
|
306
348
|
密钥**不写进 `config.json`**。两种填法:
|
|
@@ -381,9 +423,9 @@ node tools/live.mjs # 可加 LIVE_BASE_URL
|
|
|
381
423
|
|
|
382
424
|
跑一次视端点而定,通常 20–60 秒(一张 1024×1024)。没有配好密钥的端点就别跑这一份。
|
|
383
425
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
`--backups` / `--restore` / `--restart`
|
|
426
|
+
第四份管 QQ 发图路径那两处补丁:默认在临时副本上自测(认锚点、幂等、留备份、还原、esbuild 语法、
|
|
427
|
+
上游改过锚点时必须报失败、自动更新覆写后能补回来但不进重启死循环、桌宠包上的旧补丁能被还原),
|
|
428
|
+
另有 `--apply` / `--backups` / `--restore` / `--restart` 四种真动作,见上面「为什么顺手改了 QQ 扩展」一节。
|
|
387
429
|
|
|
388
430
|
```powershell
|
|
389
431
|
node tools/patch.mjs
|
|
@@ -416,7 +458,9 @@ cortico-world-image/
|
|
|
416
458
|
│ ├─ definition.js # id/label/defaults/preflight/create
|
|
417
459
|
│ ├─ config.js # worlds.image 默认值、中英文案、配置组 schema
|
|
418
460
|
│ ├─ world.js # ImageWorld:工具、控制台面板、流式推送、生命周期
|
|
419
|
-
│ ├─
|
|
461
|
+
│ ├─ chain.js # 模型链:解析 worlds.image.models、排序、逐档回退、报错归纳
|
|
462
|
+
│ ├─ comfyui.js # 本地 ComfyUI 适配器(内置工作流 / 自定义 workflow / 改图 / 探活)
|
|
463
|
+
│ ├─ chat-image-patch.js # QQ 发图路径的 2 处可选补丁、旧桌宠补丁还原、状态文件、重启请求(自愈核心)
|
|
420
464
|
│ ├─ api.js # OpenAI 兼容客户端的取图/落盘/错误归一化
|
|
421
465
|
│ ├─ gallery.js # 作品仓库:目录 + index.json
|
|
422
466
|
│ └─ png.js # 零依赖 PNG 编码器 + 自检样图
|
|
@@ -427,7 +471,7 @@ cortico-world-image/
|
|
|
427
471
|
├─ describe.mts # 生成 / 核对 describe.json(--check 只核对)
|
|
428
472
|
├─ drymount.mts # 用框架自带判据跑 dry-mount
|
|
429
473
|
├─ live.mjs # 联网真画一张(自测整条链路)
|
|
430
|
-
├─ patch.mjs #
|
|
474
|
+
├─ patch.mjs # QQ 发图路径补丁:自测 / --apply / --backups / --restore / --restart
|
|
431
475
|
└─ prepublish.mjs # 发布前自检:契约 / files / 隐私串 / 语法,顺手跑上面几套
|
|
432
476
|
```
|
|
433
477
|
|
|
@@ -435,13 +479,27 @@ cortico-world-image/
|
|
|
435
479
|
|
|
436
480
|
- 控制台页面自己有缓存/陈旧问题:换版本或控制台重启后,更新之前就开着的那个标签页可能不再更新,
|
|
437
481
|
Ctrl+F5 即可(详见「页面陈旧与浏览器缓存」)。
|
|
438
|
-
-
|
|
439
|
-
- `pet_show_image`
|
|
440
|
-
|
|
441
|
-
|
|
482
|
+
- 桌宠**头顶气泡**仍然只画文字;图片出现在控制台「对话」页(`pet_say.images`),不在气泡里。
|
|
483
|
+
- 贴**任意本地文件**要两步(先 `image_show` 换句柄,再 `pet_say`),会比以前的 `pet_show_image` 多一次
|
|
484
|
+
工具调用、多花约 1k+ token/张(那次调用会把图渲染给模型看)。
|
|
485
|
+
- 桌宠包早于 0.2.0 时没有 `pet_say.images`,贴图这条路走不通(0.3.0 也因此不再支持老桌宠包)。
|
|
442
486
|
- `image_edit` 先走 `/images/edits`(multipart 上传);端点没这条路由(404/405)时自动退回
|
|
443
487
|
`/images/generations` 的 `image` 扩展字段(data URI,阿里云百炼那类)。两条路都不通时会回一条
|
|
444
488
|
带 HTTP 码的错误,不是静默失败。
|
|
489
|
+
- 尺寸:`size` 能写 `1024x1536`、比例 `16:9` / `4:3`、或 `square` / `portrait` / `landscape`(中文
|
|
490
|
+
`竖图` / `横图` / `方图` 也认),比例会换成一套对齐好的尺寸(16:9 → 1344×768,4:3 → 1152×864);
|
|
491
|
+
写死的数字只按 latent 要求对齐到 8,不动你写的整数。
|
|
492
|
+
- 改图的尺寸:ComfyUI 那档**不传 `size`、或写 `auto`,就照参考图的比例**出图(最长边压到 1536、对齐
|
|
493
|
+
16),传了 `size` 就按给的;云端那档走接口自己的默认(一般不传尺寸)。所以改一张 1600×1200 的图
|
|
494
|
+
会出 1536×1152,不会变成方图。图生图的回执/作品页记的是**实际出的尺寸**,不再是 `auto`。
|
|
495
|
+
- 模型链的 ComfyUI 那档**不会替你下模型**:checkpoint / LoRA 得先放进 ComfyUI 的
|
|
496
|
+
`models/checkpoints`、`models/loras`,`ckpt` 写文件名;本机没开 ComfyUI 时这档直接算不可用,
|
|
497
|
+
链会落到下一档。**裸 UNet 要放 `models/diffusion_models`**(老版本是 `models/unet`),放错到
|
|
498
|
+
`checkpoints` 里会被当成 checkpoint、`UNETLoader` 那边永远看不到——这种时候插件会把 ComfyUI 的
|
|
499
|
+
校验错误翻成人话:缺哪个字段、给了什么值、它现在认哪些名字、文件该放哪个目录。
|
|
500
|
+
- 用错加载方式也会解释:拿 checkpoint 节点去开一个没有 CLIP / VAE 的裸模型时,ComfyUI 只丢一句
|
|
501
|
+
`clip input is invalid: None`,插件会说明「这是裸模型 → 改用模型文件三件套、文件放 diffusion_models」;
|
|
502
|
+
显存不足、缺自定义节点也各有对应的一句话。
|
|
445
503
|
- 只有 Windows 上的「打开文件夹」会真的弹资源管理器;其他平台返回一句说明。
|
|
446
504
|
- 画图本身要联网,只有自检样图是纯本地的。
|
|
447
505
|
|
|
@@ -462,7 +520,7 @@ README 里只写结论,**逐步命令、npm 账号/Token、registry、缓存
|
|
|
462
520
|
|
|
463
521
|
MIT,见 [LICENSE](LICENSE)。
|
|
464
522
|
|
|
465
|
-
这是一个**非官方**扩展:与 Coopanion / cortico
|
|
466
|
-
|
|
523
|
+
这是一个**非官方**扩展:与 Coopanion / cortico 的作者无关。QQ 发图路径那两处补丁会改写
|
|
524
|
+
**第三方 QQ 扩展**的源码(`data/extensions/node_modules/cortico-world-qq-better-alont1/src/world.ts`),
|
|
467
525
|
升级、重装或自动更新前请先看那一节并留好 `.coopanion-orig` 备份;`node tools/patch.mjs --restore`
|
|
468
|
-
|
|
526
|
+
就是按这些备份还原。桌宠包本身不改(早先版本的旧补丁会被还原)。
|
package/describe.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"tools": [
|
|
3
3
|
{
|
|
4
4
|
"name": "image_draw",
|
|
5
|
-
"description": "Draw a picture from a text description through the configured
|
|
5
|
+
"description": "Draw a picture from a text description through the configured model chain (a local ComfyUI, an OpenAI-compatible cloud endpoint, or both in priority order). The picture is saved to disk, attached to this conversation so you can see it, and shown in the Image Studio console page. The reply carries the absolute file path; hand that path to a channel tool such as qq_send_image to actually deliver the picture to someone.",
|
|
6
6
|
"parameters": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"properties": {
|
|
@@ -10,17 +10,21 @@
|
|
|
10
10
|
"type": "string",
|
|
11
11
|
"description": "What to draw: subject, style, composition, lighting. Any language."
|
|
12
12
|
},
|
|
13
|
+
"model": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Optional chain entry name (for example \"local\" or \"cloud\"). Leave empty to try the chain in priority order."
|
|
16
|
+
},
|
|
13
17
|
"note": {
|
|
14
18
|
"type": "string",
|
|
15
19
|
"description": "Short label for this picture in the studio list."
|
|
16
20
|
},
|
|
17
21
|
"size": {
|
|
18
22
|
"type": "string",
|
|
19
|
-
"description": "Override the configured size,
|
|
23
|
+
"description": "Override the configured size: \"1024x1536\", a ratio like \"16:9\" or \"4:3\", or \"square\" / \"portrait\" / \"landscape\"."
|
|
20
24
|
},
|
|
21
25
|
"quality": {
|
|
22
26
|
"type": "string",
|
|
23
|
-
"description": "Override the configured quality, e.g. low / medium / high."
|
|
27
|
+
"description": "Override the configured quality, e.g. low / medium / high. Ignored by ComfyUI."
|
|
24
28
|
}
|
|
25
29
|
},
|
|
26
30
|
"required": [
|
|
@@ -31,13 +35,13 @@
|
|
|
31
35
|
"act"
|
|
32
36
|
],
|
|
33
37
|
"summary": {
|
|
34
|
-
"zh": "
|
|
35
|
-
"en": "Draw a new picture from a text description, save it to disk and show it in the conversation."
|
|
38
|
+
"zh": "按一段文字描述画一张新图(本地 ComfyUI 或云端接口,按模型链的顺序),存到磁盘、贴进对话,并显示在作品页。",
|
|
39
|
+
"en": "Draw a new picture from a text description through the model chain, save it to disk and show it in the conversation."
|
|
36
40
|
}
|
|
37
41
|
},
|
|
38
42
|
{
|
|
39
43
|
"name": "image_edit",
|
|
40
|
-
"description": "Redraw an existing local picture
|
|
44
|
+
"description": "Redraw an existing local picture following a text instruction, through the same model chain as image_draw. `image` takes an absolute file path, or a picture id from image_gallery. OpenAI-compatible entries use /images/edits (multipart upload) or a base64 `image` field on /images/generations (e.g. Aliyun Bailian); ComfyUI entries upload the picture and run an img2img workflow.",
|
|
41
45
|
"parameters": {
|
|
42
46
|
"type": "object",
|
|
43
47
|
"properties": {
|
|
@@ -49,17 +53,21 @@
|
|
|
49
53
|
"type": "string",
|
|
50
54
|
"description": "Absolute path of the source picture, or a picture id from image_gallery."
|
|
51
55
|
},
|
|
56
|
+
"model": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "Optional chain entry name. Leave empty to try the chain in priority order."
|
|
59
|
+
},
|
|
52
60
|
"note": {
|
|
53
61
|
"type": "string",
|
|
54
62
|
"description": "Short label for the result in the studio list."
|
|
55
63
|
},
|
|
56
64
|
"size": {
|
|
57
65
|
"type": "string",
|
|
58
|
-
"description": "Override the
|
|
66
|
+
"description": "Override the output size: \"1024x1024\", a ratio like \"16:9\", or \"square\" / \"portrait\" / \"landscape\". Leave it empty to keep the source picture ratio (local ComfyUI) — that is the usual choice for edits."
|
|
59
67
|
},
|
|
60
68
|
"quality": {
|
|
61
69
|
"type": "string",
|
|
62
|
-
"description": "Override the configured quality."
|
|
70
|
+
"description": "Override the configured quality. Ignored by ComfyUI."
|
|
63
71
|
}
|
|
64
72
|
},
|
|
65
73
|
"required": [
|
|
@@ -126,7 +134,7 @@
|
|
|
126
134
|
"key": "worlds.image.envPrompt",
|
|
127
135
|
"title": "环境说明(图片工坊)",
|
|
128
136
|
"role": "envPrompt",
|
|
129
|
-
"content": "你可以作画。这一节说明工具箱和规矩。\n\n## 四个工具\n\n- `image_draw`:按一段文字描述画一张新图。图会存到磁盘、附加进本次对话(你自己看得到)、并显示在控制台「图片工坊 → 作品」页。\n- `image_edit`:拿一张已有的图按指令改(换风格、改细节)。`image` 给绝对路径,或 `image_gallery`
|
|
137
|
+
"content": "你可以作画。这一节说明工具箱和规矩。\n\n## 四个工具\n\n- `image_draw`:按一段文字描述画一张新图。图会存到磁盘、附加进本次对话(你自己看得到)、并显示在控制台「图片工坊 → 作品」页。\n- `image_edit`:拿一张已有的图按指令改(换风格、改细节)。`image` 给绝对路径,或 `image_gallery` 里的编号。`size` 一般不传(本地 ComfyUI 那档会照参考图的比例出图);要固定尺寸就写 `宽x高`。服务端支不支持改图由接口决定,报错就照实告诉用户。\n- `image_gallery`:列出画过的图,最新的在前,带编号和绝对路径。编号可以交给 `image_show` 或 `image_edit`。\n- `image_show`:把一张旧图重新放回眼前(重新附加进对话,并在作品页高亮)。\n\n图片保存目录:`{{image.dir | 尚未确定;先看控制台「图片工坊 → 状态」。}}`\n\n当前接口状态:`{{image.ready | 未知。不确定就别调用,先告诉用户去控制台「图片工坊 → 状态」看看。}}`\n\n## 模型链\n\n后台可能配了一串模型(「图片工坊 → 状态 → 模型链」),本地 ComfyUI 和云端接口都在里面,按顺序试:\n前一档连不上、超时、额度用完、模型没装,就自动换下一档;回执里会写「前几档没成」和最后用的是哪一档。\n\n## 规矩\n\n1. **别每轮都画。** 用户明确想看/想让你画,或者确实需要一张图来解释、来送人,才调用。闲聊、讨论、解释概念都不需要配图。\n2. **一次画一张。** 想要不同方向就画一张、看一眼、再决定要不要重画或改。不要一次调好几个 `image_draw` 碰运气。\n3. **描述要具体。** 主体、画风、构图、光线、色调、背景,一句到位;别只给两三个词,也别把整段聊天记录塞进去。\n4. **说人话,不念路径。** 回执里的绝对路径是给工具用的,不是给用户看的。画完就用一句自然的话告诉用户画了什么,像 `pet_say` 那样说话。不要把路径、编号、`blobs`、JSON 念出来,也不要贴 Markdown 图片语法。\n5. **发到别处要另走一步。** 图默认只在你自己的界面里。\n - 想让主人在控制台的「对话」页看到它,画完之后调桌宠的 `pet_say`,`images` 填回执里 `[blob …]` 行的句柄(就是 `[blob ` 后面那一串),`script` 给空串就只贴图不出声;想配一句话就写进 `script`(那句话会在气泡里说出来)。图只进「对话」页,不进气泡。\n - 要发到 QQ 会话:把回执里 `[blob …]` 行的句柄交给 QQ 世界的发图工具。官方 QQ 扩展用 `qq_draft`(`image` 填句柄,`to` 填 `group:<群号>` 或 `private:<QQ号>`,再用 `qq_confirm` 确认发送);旧版 QQ 扩展(`qqbot`)用 `qq_send_image`,`image` 填回执里的绝对路径。\n6. **失败就停。** 如果回执说没配密钥、接口报错、超时,不要换个说法反复重试。把情况告诉用户,让他去控制台「图片工坊 → 状态」里填密钥或改接口地址。\n7. **别凭空说画好了。** 只有工具回执真的带着图回来,才算画好了。\n"
|
|
130
138
|
}
|
|
131
139
|
]
|
|
132
140
|
}
|