@enslo/sd-metadata 2.1.0 → 2.2.0
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 +428 -0
- package/README.ja.md +9 -23
- package/README.md +10 -24
- package/dist/index.d.ts +4 -2
- package/dist/index.global.js +7 -7
- package/dist/index.js +467 -222
- package/dist/index.js.map +1 -1
- package/docs/types.ja.md +799 -0
- package/docs/types.md +799 -0
- package/package.json +11 -13
- package/LICENSE +0 -21
package/docs/types.ja.md
ADDED
|
@@ -0,0 +1,799 @@
|
|
|
1
|
+
# 型ドキュメント
|
|
2
|
+
|
|
3
|
+
`@enslo/sd-metadata` の完全な型リファレンスです。
|
|
4
|
+
|
|
5
|
+
🌐 **[English version](./types.md)**
|
|
6
|
+
|
|
7
|
+
## 目次
|
|
8
|
+
|
|
9
|
+
- [コア型](#コア型)
|
|
10
|
+
- [`ParseResult`](#parseresult)
|
|
11
|
+
- [`BaseMetadata`](#basemetadata)
|
|
12
|
+
- [`GenerationMetadata`](#generationmetadata)
|
|
13
|
+
- [`GenerationSoftware`](#generationsoftware)
|
|
14
|
+
- [`EmbedMetadata`](#embedmetadata)
|
|
15
|
+
- [`RawMetadata`](#rawmetadata)
|
|
16
|
+
- [`WriteResult`](#writeresult)
|
|
17
|
+
- [メタデータ型](#メタデータ型)
|
|
18
|
+
- [`StandardMetadata`](#standardmetadata)
|
|
19
|
+
- [`NovelAIMetadata`](#novelaimetadata)
|
|
20
|
+
- [`ComfyUIMetadata`](#comfyuimetadata)
|
|
21
|
+
- [設定型](#設定型)
|
|
22
|
+
- [`ModelSettings`](#modelsettings)
|
|
23
|
+
- [`SamplingSettings`](#samplingsettings)
|
|
24
|
+
- [`HiresSettings`](#hiressettings)
|
|
25
|
+
- [`UpscaleSettings`](#upscalesettings)
|
|
26
|
+
- [`CharacterPrompt`](#characterprompt)
|
|
27
|
+
- [ComfyUI型](#comfyui型)
|
|
28
|
+
- [`ComfyNodeGraph`](#comfynodegraph)
|
|
29
|
+
- [`ComfyNode`](#comfynode)
|
|
30
|
+
- [`ComfyNodeInputValue`](#comfynodeinputvalue)
|
|
31
|
+
- [`ComfyNodeReference`](#comfynodereference)
|
|
32
|
+
- [フォーマット固有の型](#フォーマット固有の型)
|
|
33
|
+
- [`PngTextChunk`](#pngtextchunk)
|
|
34
|
+
- [`TExtChunk`](#textchunk)
|
|
35
|
+
- [`ITXtChunk`](#itxtchunk)
|
|
36
|
+
- [`MetadataSegment`](#metadatasegment)
|
|
37
|
+
- [`MetadataSegmentSource`](#metadatasegmentsource)
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## コア型
|
|
42
|
+
|
|
43
|
+
### `ParseResult`
|
|
44
|
+
|
|
45
|
+
`read()` 関数が返す結果型。
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
type ParseResult =
|
|
49
|
+
| { status: 'success'; metadata: GenerationMetadata; raw: RawMetadata }
|
|
50
|
+
| { status: 'unrecognized'; raw: RawMetadata }
|
|
51
|
+
| { status: 'empty' }
|
|
52
|
+
| { status: 'invalid'; message?: string };
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**ステータス値:**
|
|
56
|
+
|
|
57
|
+
- **`success`**: メタデータのパースに成功
|
|
58
|
+
- `metadata`: 統一されたメタデータオブジェクト
|
|
59
|
+
- `raw`: ラウンドトリップ変換用の元のフォーマット固有データ
|
|
60
|
+
- **`unrecognized`**: 画像にメタデータがあるがフォーマットが認識できない
|
|
61
|
+
- `raw`: 元のメタデータが保持される
|
|
62
|
+
- **`empty`**: 画像にメタデータが見つからない
|
|
63
|
+
- **`invalid`**: 破損または非対応の画像フォーマット
|
|
64
|
+
- `message`: オプションのエラー説明
|
|
65
|
+
|
|
66
|
+
**例:**
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { read } from '@enslo/sd-metadata';
|
|
70
|
+
|
|
71
|
+
const result = read(imageData);
|
|
72
|
+
|
|
73
|
+
switch (result.status) {
|
|
74
|
+
case 'success':
|
|
75
|
+
console.log(`Generated by ${result.metadata.software}`);
|
|
76
|
+
console.log(`Prompt: ${result.metadata.prompt}`);
|
|
77
|
+
break;
|
|
78
|
+
|
|
79
|
+
case 'unrecognized':
|
|
80
|
+
console.log('不明なメタデータフォーマット');
|
|
81
|
+
break;
|
|
82
|
+
|
|
83
|
+
case 'empty':
|
|
84
|
+
console.log('メタデータなし');
|
|
85
|
+
break;
|
|
86
|
+
|
|
87
|
+
case 'invalid':
|
|
88
|
+
console.error(`無効な画像: ${result.message}`);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### `BaseMetadata`
|
|
96
|
+
|
|
97
|
+
全メタデータ型で共有される共通フィールド。`GenerationMetadata` の各バリアントと `EmbedMetadata` の基盤です。
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
export interface BaseMetadata {
|
|
101
|
+
/** ポジティブプロンプト */
|
|
102
|
+
prompt: string;
|
|
103
|
+
/** ネガティブプロンプト */
|
|
104
|
+
negativePrompt: string;
|
|
105
|
+
/** 画像の幅(ピクセル) */
|
|
106
|
+
width: number;
|
|
107
|
+
/** 画像の高さ(ピクセル) */
|
|
108
|
+
height: number;
|
|
109
|
+
/** モデル設定 */
|
|
110
|
+
model?: ModelSettings;
|
|
111
|
+
/** サンプリング設定 */
|
|
112
|
+
sampling?: SamplingSettings;
|
|
113
|
+
/** Hires.fix設定(適用されている場合) */
|
|
114
|
+
hires?: HiresSettings;
|
|
115
|
+
/** アップスケール設定(適用されている場合) */
|
|
116
|
+
upscale?: UpscaleSettings;
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**例:**
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import type { BaseMetadata } from '@enslo/sd-metadata';
|
|
124
|
+
|
|
125
|
+
// 共通の生成フィールドのみ必要な場合にBaseMetadataを使用
|
|
126
|
+
function displayMetadata(meta: BaseMetadata) {
|
|
127
|
+
console.log('Prompt:', meta.prompt);
|
|
128
|
+
console.log('Size:', meta.width, 'x', meta.height);
|
|
129
|
+
console.log('Model:', meta.model?.name);
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### `GenerationMetadata`
|
|
136
|
+
|
|
137
|
+
統一されたメタデータ構造。サポートされている全てのメタデータ型のユニオン型。全バリアントが `BaseMetadata` を拡張しています。
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
type GenerationMetadata =
|
|
141
|
+
| NovelAIMetadata
|
|
142
|
+
| ComfyUIMetadata
|
|
143
|
+
| StandardMetadata;
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**メタデータ型のマッピング:**
|
|
147
|
+
|
|
148
|
+
| メタデータ型 | `software` 値 |
|
|
149
|
+
| ------------- | ----------------- |
|
|
150
|
+
| `StandardMetadata` | `'sd-webui'` \| `'sd-next'` \| `'forge'` \| `'forge-classic'` \| `'forge-neo'` \| `'reforge'` \| `'easy-reforge'` \| `'invokeai'` \| `'civitai'` \| `'hf-space'` \| `'easydiffusion'` \| `'fooocus'` \| `'ruined-fooocus'` \| `'draw-things'` |
|
|
151
|
+
| `NovelAIMetadata` | `'novelai'` |
|
|
152
|
+
| `ComfyUIMetadata` | `'comfyui'` \| `'tensorart'` \| `'stability-matrix'` \| `'swarmui'` |
|
|
153
|
+
|
|
154
|
+
**型の絞り込み例:**
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
if (metadata.software === 'novelai') {
|
|
158
|
+
// TypeScriptはmetadataがNovelAIMetadataであることを認識
|
|
159
|
+
console.log(metadata.characterPrompts);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (metadata.software === 'comfyui' ||
|
|
163
|
+
metadata.software === 'tensorart' ||
|
|
164
|
+
metadata.software === 'stability-matrix' ||
|
|
165
|
+
metadata.software === 'swarmui') {
|
|
166
|
+
// TypeScriptはmetadataがComfyUIMetadataであることを認識
|
|
167
|
+
if (metadata.nodes) {
|
|
168
|
+
console.log('Has workflow:', Object.keys(metadata.nodes).length);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
### `GenerationSoftware`
|
|
176
|
+
|
|
177
|
+
サポートされている全ソフトウェア識別子の文字列リテラルユニオン型。`GenerationMetadata` の判別子として、また `softwareLabels` のキー型として使用します。
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
type GenerationSoftware =
|
|
181
|
+
| 'novelai'
|
|
182
|
+
| 'comfyui'
|
|
183
|
+
| 'swarmui'
|
|
184
|
+
| 'tensorart'
|
|
185
|
+
| 'stability-matrix'
|
|
186
|
+
| 'invokeai'
|
|
187
|
+
| 'sd-webui'
|
|
188
|
+
| 'forge'
|
|
189
|
+
| 'forge-classic'
|
|
190
|
+
| 'forge-neo'
|
|
191
|
+
| 'reforge'
|
|
192
|
+
| 'easy-reforge'
|
|
193
|
+
| 'sd-next'
|
|
194
|
+
| 'civitai'
|
|
195
|
+
| 'hf-space'
|
|
196
|
+
| 'easydiffusion'
|
|
197
|
+
| 'fooocus'
|
|
198
|
+
| 'ruined-fooocus'
|
|
199
|
+
| 'draw-things';
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**例:**
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import { softwareLabels } from '@enslo/sd-metadata';
|
|
206
|
+
import type { GenerationSoftware } from '@enslo/sd-metadata';
|
|
207
|
+
|
|
208
|
+
function displaySoftware(software: GenerationSoftware): string {
|
|
209
|
+
return softwareLabels[software];
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
### `EmbedMetadata`
|
|
216
|
+
|
|
217
|
+
`embed()` と `stringify()` で使用するユーザー作成カスタムメタデータ型。`GenerationMetadata` が既知のAIツールからのパース結果を表すのに対し、`EmbedMetadata` はユーザーが独自にメタデータを組み立てるための型です。`BaseMetadata` にオプションのNovelAIキャラクタープロンプトと設定行への任意キーバリュー(`extras`)を追加。
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
export type EmbedMetadata = BaseMetadata &
|
|
221
|
+
Pick<NovelAIMetadata, 'characterPrompts'> & {
|
|
222
|
+
extras?: Record<string, string | number>;
|
|
223
|
+
};
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**例:**
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
import { embed } from '@enslo/sd-metadata';
|
|
230
|
+
import type { EmbedMetadata } from '@enslo/sd-metadata';
|
|
231
|
+
|
|
232
|
+
const metadata: EmbedMetadata = {
|
|
233
|
+
prompt: 'masterpiece, 1girl',
|
|
234
|
+
negativePrompt: 'lowres',
|
|
235
|
+
width: 512,
|
|
236
|
+
height: 768,
|
|
237
|
+
sampling: { steps: 20, sampler: 'Euler a', cfg: 7, seed: 12345 },
|
|
238
|
+
model: { name: 'model.safetensors' },
|
|
239
|
+
extras: { Version: 'v1.0' },
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const result = embed(imageData, metadata);
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
### `RawMetadata`
|
|
248
|
+
|
|
249
|
+
ロスレスなラウンドトリップ変換のために元のメタデータ構造を保持。
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
type RawMetadata =
|
|
253
|
+
| { format: 'png'; chunks: PngTextChunk[] }
|
|
254
|
+
| { format: 'jpeg'; segments: MetadataSegment[] }
|
|
255
|
+
| { format: 'webp'; segments: MetadataSegment[] };
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**なぜこれが必要?**
|
|
259
|
+
|
|
260
|
+
画像からメタデータを読み込んで別のフォーマットに変換する場合(例:PNG → JPEG)、`RawMetadata` は元の構造を保持します。これにより、情報を失うことなく元のフォーマットに戻すことができます。
|
|
261
|
+
|
|
262
|
+
**ラウンドトリップ変換例:**
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
import { read, write } from '@enslo/sd-metadata';
|
|
266
|
+
import { convertImageFormat } from 'some-image-library';
|
|
267
|
+
|
|
268
|
+
// PNGからメタデータを読み込み
|
|
269
|
+
const pngData = readFileSync('image.png');
|
|
270
|
+
const parseResult = read(pngData);
|
|
271
|
+
|
|
272
|
+
if (parseResult.status === 'success') {
|
|
273
|
+
// 画像をJPEGに変換
|
|
274
|
+
const jpegImageData = convertImageFormat(pngData, 'jpeg');
|
|
275
|
+
|
|
276
|
+
// メタデータをJPEGに書き込み
|
|
277
|
+
const jpegWithMeta = write(jpegImageData, parseResult);
|
|
278
|
+
|
|
279
|
+
// 後で:PNGに戻す
|
|
280
|
+
const pngImageData = convertImageFormat(jpegWithMeta.value, 'png');
|
|
281
|
+
const pngWithMeta = write(pngImageData, parseResult);
|
|
282
|
+
|
|
283
|
+
// 元のPNGメタデータ構造が完全に保持される!
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
`raw` がなければ、メタデータは汎用フォーマットに変換され、元に戻す際にフォーマット固有の詳細が失われます。
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
### `WriteResult`
|
|
292
|
+
|
|
293
|
+
`write()` 関数が返す結果型。
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
export type WriteResult =
|
|
297
|
+
| { ok: true; value: Uint8Array; warning?: WriteWarning }
|
|
298
|
+
| { ok: false; error: { type: string; message?: string } };
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**成功:**
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
if (result.ok) {
|
|
305
|
+
saveFile('output.png', result.value);
|
|
306
|
+
if (result.warning) {
|
|
307
|
+
console.warn('メタデータが削除されました:', result.warning.reason);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**エラー:**
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
if (!result.ok) {
|
|
316
|
+
console.error(`書き込み失敗: ${result.error.type}`);
|
|
317
|
+
if (result.error.message) {
|
|
318
|
+
console.error(result.error.message);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**エラータイプ:**
|
|
324
|
+
|
|
325
|
+
- `unsupportedFormat`: 画像フォーマットが非対応
|
|
326
|
+
- `conversionFailed`: メタデータ変換に失敗
|
|
327
|
+
- `writeFailed`: 画像へのメタデータ書き込みに失敗
|
|
328
|
+
|
|
329
|
+
### `WriteWarning`
|
|
330
|
+
|
|
331
|
+
書き込み操作の警告型。
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
export type WriteWarning = {
|
|
335
|
+
type: 'metadataDropped';
|
|
336
|
+
reason: 'unrecognizedCrossFormat';
|
|
337
|
+
};
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
書き込み操作中にメタデータが意図的に削除された場合に返される(例:未対応メタデータのクロスフォーマット変換)。
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## メタデータ型
|
|
345
|
+
|
|
346
|
+
### `StandardMetadata`
|
|
347
|
+
|
|
348
|
+
ほとんどのSDツールで使用される標準パラメータフォーマット。
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
export interface StandardMetadata extends BaseMetadata {
|
|
352
|
+
software:
|
|
353
|
+
| 'sd-webui'
|
|
354
|
+
| 'forge'
|
|
355
|
+
| 'forge-classic'
|
|
356
|
+
| 'forge-neo'
|
|
357
|
+
| 'reforge'
|
|
358
|
+
| 'easy-reforge'
|
|
359
|
+
| 'sd-next'
|
|
360
|
+
| 'invokeai'
|
|
361
|
+
| 'civitai'
|
|
362
|
+
| 'hf-space'
|
|
363
|
+
| 'easydiffusion'
|
|
364
|
+
| 'fooocus'
|
|
365
|
+
| 'ruined-fooocus'
|
|
366
|
+
| 'draw-things';
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
`BaseMetadata` の全フィールドを継承します。最も一般的なメタデータ型で、ツール固有の拡張なしのベースライン生成メタデータを表します。SD WebUI、Forgeファミリー(Forge、Forge Classic、Forge Neo、reForge、EasyReforge)、SD.Next、InvokeAIなど多くのツールがこの構造を使用します。
|
|
371
|
+
|
|
372
|
+
**例:**
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
if (metadata.software === 'forge' || metadata.software === 'sd-webui') {
|
|
376
|
+
console.log('標準フォーマットのメタデータを使用');
|
|
377
|
+
console.log('Sampler:', metadata.sampling?.sampler);
|
|
378
|
+
console.log('Steps:', metadata.sampling?.steps);
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### `NovelAIMetadata`
|
|
385
|
+
|
|
386
|
+
NovelAI生成画像に固有のメタデータ。
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
export interface NovelAIMetadata extends BaseMetadata {
|
|
390
|
+
software: 'novelai';
|
|
391
|
+
/** V4キャラクタープロンプト(キャラクター配置使用時) */
|
|
392
|
+
characterPrompts?: CharacterPrompt[];
|
|
393
|
+
/** 配置にキャラクター座標を使用 */
|
|
394
|
+
useCoords?: boolean;
|
|
395
|
+
/** キャラクターの順序を使用 */
|
|
396
|
+
useOrder?: boolean;
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**固有の機能:**
|
|
401
|
+
|
|
402
|
+
- **キャラクター配置(V4)**: NovelAI V4は特定の座標に複数のキャラクターを配置することをサポート
|
|
403
|
+
- `characterPrompts`: オプションの位置情報付きキャラクター固有プロンプトの配列
|
|
404
|
+
- `useCoords`、`useOrder`: キャラクター配置の動作を制御
|
|
405
|
+
|
|
406
|
+
**例:**
|
|
407
|
+
|
|
408
|
+
```typescript
|
|
409
|
+
if (metadata.software === 'novelai' && metadata.characterPrompts) {
|
|
410
|
+
metadata.characterPrompts.forEach(char => {
|
|
411
|
+
console.log(`Character: ${char.prompt}`);
|
|
412
|
+
if (char.center) {
|
|
413
|
+
console.log(` Position: (${char.center.x}, ${char.center.y})`);
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
### `ComfyUIMetadata`
|
|
422
|
+
|
|
423
|
+
ComfyUIおよび互換ツール(TensorArt、Stability Matrix、SwarmUI)からのメタデータ。
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
export type ComfyUIMetadata =
|
|
427
|
+
| BasicComfyUIMetadata
|
|
428
|
+
| SwarmUIMetadata;
|
|
429
|
+
|
|
430
|
+
// 内部型:
|
|
431
|
+
interface BasicComfyUIMetadata extends BaseMetadata {
|
|
432
|
+
software: 'comfyui' | 'tensorart' | 'stability-matrix';
|
|
433
|
+
nodes: ComfyNodeGraph; // 必須
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
interface SwarmUIMetadata extends BaseMetadata {
|
|
437
|
+
software: 'swarmui';
|
|
438
|
+
nodes?: ComfyNodeGraph; // オプション
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
**固有の機能:**
|
|
443
|
+
|
|
444
|
+
- **ComfyUI/TensorArt/Stability Matrix**: `nodes` は全フォーマットで常に存在
|
|
445
|
+
- **SwarmUI**: PNGから変換された場合、全フォーマットで `nodes` が存在する可能性あり(拡張対応)
|
|
446
|
+
|
|
447
|
+
**例:**
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
if (metadata.software === 'comfyui') {
|
|
451
|
+
// ComfyUIではnodesは必ず存在
|
|
452
|
+
console.log('Node count:', Object.keys(metadata.nodes).length);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (metadata.software === 'swarmui') {
|
|
456
|
+
// ネイティブSwarmUI JPEG/WebPではnodesが存在しない可能性あり
|
|
457
|
+
// ただしPNGから変換された場合は存在
|
|
458
|
+
if (metadata.nodes) {
|
|
459
|
+
console.log('ワークフローあり(PNGまたは変換済み)');
|
|
460
|
+
} else {
|
|
461
|
+
console.log('ネイティブJPEG/WebP: パラメータのみ');
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// 型の絞り込みは全てのComfyUI互換ツールで機能
|
|
466
|
+
if (metadata.software === 'comfyui' ||
|
|
467
|
+
metadata.software === 'tensorart' ||
|
|
468
|
+
metadata.software === 'stability-matrix' ||
|
|
469
|
+
metadata.software === 'swarmui') {
|
|
470
|
+
// TypeScriptはmetadataがComfyUIMetadataであることを認識
|
|
471
|
+
// ただしmetadata.nodesは使用前にチェックが必要
|
|
472
|
+
if (metadata.nodes) {
|
|
473
|
+
// チェックポイントノードを検索
|
|
474
|
+
for (const [nodeId, node] of Object.entries(metadata.nodes)) {
|
|
475
|
+
if (node.class_type === 'CheckpointLoaderSimple') {
|
|
476
|
+
console.log('Model:', node.inputs.ckpt_name);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
## 設定型
|
|
484
|
+
|
|
485
|
+
### `ModelSettings`
|
|
486
|
+
|
|
487
|
+
画像生成に使用されるモデル設定。
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
export interface ModelSettings {
|
|
491
|
+
/** モデル名(例:"sd_xl_base_1.0.safetensors") */
|
|
492
|
+
name?: string;
|
|
493
|
+
/** 検証用モデルハッシュ */
|
|
494
|
+
hash?: string;
|
|
495
|
+
/** VAE(Variational AutoEncoder)名 */
|
|
496
|
+
vae?: string;
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
**例:**
|
|
501
|
+
|
|
502
|
+
```typescript
|
|
503
|
+
if (metadata.model) {
|
|
504
|
+
console.log('Model:', metadata.model.name);
|
|
505
|
+
console.log('Hash:', metadata.model.hash);
|
|
506
|
+
console.log('VAE:', metadata.model.vae || 'Default');
|
|
507
|
+
}
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
### `SamplingSettings`
|
|
513
|
+
|
|
514
|
+
生成時に使用されるサンプリングパラメータ。
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
export interface SamplingSettings {
|
|
518
|
+
/** サンプラーアルゴリズム(例:"Euler a"、"DPM++ 2M Karras") */
|
|
519
|
+
sampler?: string;
|
|
520
|
+
/** スケジューラータイプ(サンプラーと別の場合) */
|
|
521
|
+
scheduler?: string;
|
|
522
|
+
/** サンプリングステップ数 */
|
|
523
|
+
steps?: number;
|
|
524
|
+
/** CFG(Classifier Free Guidance)スケール */
|
|
525
|
+
cfg?: number;
|
|
526
|
+
/** 再現性のためのランダムシード */
|
|
527
|
+
seed?: number;
|
|
528
|
+
/** CLIPスキップレイヤー */
|
|
529
|
+
clipSkip?: number;
|
|
530
|
+
/** デノイズ強度(ComfyUIのみ)。1.0の場合は提供されない(txt2imgのデフォルト) */
|
|
531
|
+
denoise?: number;
|
|
532
|
+
}
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
**例:**
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
if (metadata.sampling) {
|
|
539
|
+
console.log('Sampler:', metadata.sampling.sampler);
|
|
540
|
+
console.log('Steps:', metadata.sampling.steps);
|
|
541
|
+
console.log('CFG Scale:', metadata.sampling.cfg);
|
|
542
|
+
console.log('Seed:', metadata.sampling.seed);
|
|
543
|
+
}
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
### `HiresSettings`
|
|
549
|
+
|
|
550
|
+
Hires.fix(高解像度修正)の設定。
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
export interface HiresSettings {
|
|
554
|
+
/** アップスケール倍率 */
|
|
555
|
+
scale?: number;
|
|
556
|
+
/** アップスケーラー名 */
|
|
557
|
+
upscaler?: string;
|
|
558
|
+
/** Hiresステップ数 */
|
|
559
|
+
steps?: number;
|
|
560
|
+
/** Hiresデノイズ強度 */
|
|
561
|
+
denoise?: number;
|
|
562
|
+
}
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
高解像度出力の品質を向上させるために生成時に適用されます。
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
### `UpscaleSettings`
|
|
570
|
+
|
|
571
|
+
生成後のアップスケール設定。
|
|
572
|
+
|
|
573
|
+
```typescript
|
|
574
|
+
export interface UpscaleSettings {
|
|
575
|
+
/** アップスケーラー名 */
|
|
576
|
+
upscaler?: string;
|
|
577
|
+
/** スケール倍率 */
|
|
578
|
+
scale?: number;
|
|
579
|
+
}
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
初期生成後に別のアップスケールステップとして適用されます。
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
### `CharacterPrompt`
|
|
587
|
+
|
|
588
|
+
NovelAI V4画像のキャラクター位置指定。
|
|
589
|
+
|
|
590
|
+
```typescript
|
|
591
|
+
export interface CharacterPrompt {
|
|
592
|
+
/** キャラクター固有のプロンプト */
|
|
593
|
+
prompt: string;
|
|
594
|
+
/** 画像内のキャラクター位置(正規化 0-1) */
|
|
595
|
+
center?: { x: number; y: number };
|
|
596
|
+
}
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
**例:**
|
|
600
|
+
|
|
601
|
+
```typescript
|
|
602
|
+
const character: CharacterPrompt = {
|
|
603
|
+
prompt: "1girl, long hair, blue eyes",
|
|
604
|
+
center: { x: 0.3, y: 0.5 } // 左側、垂直方向に中央
|
|
605
|
+
};
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## ComfyUI型
|
|
611
|
+
|
|
612
|
+
### `ComfyNodeGraph`
|
|
613
|
+
|
|
614
|
+
ノードIDから対応するノードデータへのマップ。
|
|
615
|
+
|
|
616
|
+
```typescript
|
|
617
|
+
export type ComfyNodeGraph = Record<string, ComfyNode>;
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
**例:**
|
|
621
|
+
|
|
622
|
+
```typescript
|
|
623
|
+
const graph: ComfyNodeGraph = {
|
|
624
|
+
"CheckpointLoader_Base": { /* ... */ },
|
|
625
|
+
"KSampler_Primary": { /* ... */ },
|
|
626
|
+
"SaveImage_Final": { /* ... */ }
|
|
627
|
+
};
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
---
|
|
631
|
+
|
|
632
|
+
### `ComfyNode`
|
|
633
|
+
|
|
634
|
+
ComfyUIワークフローグラフ内の単一ノード。
|
|
635
|
+
|
|
636
|
+
```typescript
|
|
637
|
+
export interface ComfyNode {
|
|
638
|
+
/** ノードクラスタイプ(例:"CheckpointLoaderSimple"、"KSampler") */
|
|
639
|
+
class_type: string;
|
|
640
|
+
/** ノード入力 */
|
|
641
|
+
inputs: Record<string, ComfyNodeInputValue>;
|
|
642
|
+
/** ノードメタデータ(ComfyUIのみ) */
|
|
643
|
+
_meta?: {
|
|
644
|
+
/** 表示用ノードタイトル */
|
|
645
|
+
title?: string;
|
|
646
|
+
};
|
|
647
|
+
/** 変更検出ハッシュ(まれ、キャッシュ用) */
|
|
648
|
+
is_changed?: string[] | null;
|
|
649
|
+
}
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
**例:**
|
|
653
|
+
|
|
654
|
+
```typescript
|
|
655
|
+
const ksampler: ComfyNode = {
|
|
656
|
+
class_type: "KSampler",
|
|
657
|
+
inputs: {
|
|
658
|
+
model: ["CheckpointLoader", 0],
|
|
659
|
+
seed: 12345,
|
|
660
|
+
steps: 20,
|
|
661
|
+
cfg: 7.0,
|
|
662
|
+
sampler_name: "euler_a",
|
|
663
|
+
scheduler: "normal",
|
|
664
|
+
denoise: 1.0
|
|
665
|
+
},
|
|
666
|
+
_meta: {
|
|
667
|
+
title: "Primary Sampler"
|
|
668
|
+
}
|
|
669
|
+
};
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
### `ComfyNodeInputValue`
|
|
675
|
+
|
|
676
|
+
ノード入力の可能な値。
|
|
677
|
+
|
|
678
|
+
```typescript
|
|
679
|
+
export type ComfyNodeInputValue =
|
|
680
|
+
| string
|
|
681
|
+
| number
|
|
682
|
+
| boolean
|
|
683
|
+
| ComfyNodeReference
|
|
684
|
+
| ComfyNodeInputValue[];
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
プリミティブ値、別のノードへの参照、または配列を取ることができます。
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
691
|
+
### `ComfyNodeReference`
|
|
692
|
+
|
|
693
|
+
別のノードの出力への参照。
|
|
694
|
+
|
|
695
|
+
```typescript
|
|
696
|
+
export type ComfyNodeReference = [nodeId: string, outputIndex: number];
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
**例:**
|
|
700
|
+
|
|
701
|
+
```typescript
|
|
702
|
+
const modelReference: ComfyNodeReference = ["CheckpointLoader_Base", 0];
|
|
703
|
+
|
|
704
|
+
// ノード入力で使用:
|
|
705
|
+
{
|
|
706
|
+
model: ["CheckpointLoader_Base", 0], // CheckpointLoader_Baseの出力0を参照
|
|
707
|
+
positive: ["CLIPTextEncode_Positive", 0]
|
|
708
|
+
}
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
---
|
|
712
|
+
|
|
713
|
+
## フォーマット固有の型
|
|
714
|
+
|
|
715
|
+
> **注意:** これらの型は主に高度なユースケースや内部実装の詳細用です。ほとんどのユーザーはこれらの型を直接扱う必要はありません。
|
|
716
|
+
|
|
717
|
+
### `PngTextChunk`
|
|
718
|
+
|
|
719
|
+
PNGテキストチャンク型(tEXtまたはiTXt)。
|
|
720
|
+
|
|
721
|
+
```typescript
|
|
722
|
+
export type PngTextChunk = TExtChunk | ITXtChunk;
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
---
|
|
726
|
+
|
|
727
|
+
### `TExtChunk`
|
|
728
|
+
|
|
729
|
+
PNG tEXtチャンク(Latin-1エンコード)。
|
|
730
|
+
|
|
731
|
+
```typescript
|
|
732
|
+
export interface TExtChunk {
|
|
733
|
+
type: 'tEXt';
|
|
734
|
+
/** チャンクキーワード(例:"parameters"、"Comment") */
|
|
735
|
+
keyword: string;
|
|
736
|
+
/** テキスト内容 */
|
|
737
|
+
text: string;
|
|
738
|
+
}
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
743
|
+
### `ITXtChunk`
|
|
744
|
+
|
|
745
|
+
PNG iTXtチャンク(UTF-8国際テキスト)。
|
|
746
|
+
|
|
747
|
+
```typescript
|
|
748
|
+
export interface ITXtChunk {
|
|
749
|
+
type: 'iTXt';
|
|
750
|
+
/** チャンクキーワード */
|
|
751
|
+
keyword: string;
|
|
752
|
+
/** 圧縮フラグ(0=非圧縮、1=圧縮) */
|
|
753
|
+
compressionFlag: number;
|
|
754
|
+
/** 圧縮方式(0=zlib/deflate) */
|
|
755
|
+
compressionMethod: number;
|
|
756
|
+
/** 言語タグ(BCP 47) */
|
|
757
|
+
languageTag: string;
|
|
758
|
+
/** 翻訳されたキーワード */
|
|
759
|
+
translatedKeyword: string;
|
|
760
|
+
/** テキスト内容 */
|
|
761
|
+
text: string;
|
|
762
|
+
}
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
---
|
|
766
|
+
|
|
767
|
+
### `MetadataSegment`
|
|
768
|
+
|
|
769
|
+
ソース追跡機能付きのJPEG/WebPメタデータセグメント。
|
|
770
|
+
|
|
771
|
+
```typescript
|
|
772
|
+
export interface MetadataSegment {
|
|
773
|
+
/** このセグメントのソース位置 */
|
|
774
|
+
source: MetadataSegmentSource;
|
|
775
|
+
/** 生のメタデータ文字列 */
|
|
776
|
+
data: string;
|
|
777
|
+
}
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
メタデータを正しい位置に書き戻すためのラウンドトリップ変換に使用されます。
|
|
781
|
+
|
|
782
|
+
---
|
|
783
|
+
|
|
784
|
+
### `MetadataSegmentSource`
|
|
785
|
+
|
|
786
|
+
メタデータセグメントのソース位置。
|
|
787
|
+
|
|
788
|
+
```typescript
|
|
789
|
+
export type MetadataSegmentSource =
|
|
790
|
+
| { type: 'exifUserComment' }
|
|
791
|
+
| { type: 'exifImageDescription'; prefix?: string }
|
|
792
|
+
| { type: 'exifMake'; prefix?: string }
|
|
793
|
+
| { type: 'jpegCom' }
|
|
794
|
+
| { type: 'xmpPacket' };
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
正確なラウンドトリップのために、JPEG/WebPファイル内のメタデータの出所を追跡します。
|
|
798
|
+
|
|
799
|
+
---
|