preppergpt 0.1.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.
Files changed (37) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/bin/preppergpt.js +8 -0
  4. package/compose/preppergpt.yaml +232 -0
  5. package/docs/hardware.md +15 -0
  6. package/docs/model-sources.md +12 -0
  7. package/docs/preppergpt-local-parity-map.md +16 -0
  8. package/docs/publishing.md +24 -0
  9. package/installer/cli.mjs +225 -0
  10. package/installer/install.sh +18 -0
  11. package/installer/lib/detect.mjs +128 -0
  12. package/installer/lib/paths.mjs +26 -0
  13. package/installer/lib/planner.mjs +175 -0
  14. package/installer/lib/render.mjs +76 -0
  15. package/installer/lib/util.mjs +84 -0
  16. package/package.json +48 -0
  17. package/profiles/models.json +277 -0
  18. package/services/comfyui/flux-kontext-edit-openwebui-nodes.json +46 -0
  19. package/services/comfyui/flux-kontext-edit-openwebui-workflow.json +245 -0
  20. package/services/comfyui/flux-kontext-mask-edit-openwebui-nodes.json +51 -0
  21. package/services/comfyui/flux-kontext-mask-edit-openwebui-workflow.json +322 -0
  22. package/services/comfyui/flux2-klein-9b-openwebui-nodes.json +58 -0
  23. package/services/comfyui/flux2-klein-9b-openwebui-workflow.json +141 -0
  24. package/services/comfyui/image-invert-edit-openwebui-nodes.json +23 -0
  25. package/services/comfyui/image-invert-edit-openwebui-workflow.json +52 -0
  26. package/services/deep-research/Dockerfile +7 -0
  27. package/services/deep-research/app.py +1913 -0
  28. package/services/local-agent/Dockerfile +17 -0
  29. package/services/local-agent/app.py +2311 -0
  30. package/services/local-scheduler/Dockerfile +8 -0
  31. package/services/local-scheduler/app.py +15774 -0
  32. package/services/local-vision/Dockerfile +11 -0
  33. package/services/local-vision/app.py +888 -0
  34. package/services/searxng/settings.yml +16 -0
  35. package/themes/preppergpt/custom.css +15 -0
  36. package/themes/preppergpt/static/favicon.svg +5 -0
  37. package/themes/preppergpt/static/logo.svg +6 -0
@@ -0,0 +1,322 @@
1
+ {
2
+ "6": {
3
+ "inputs": {
4
+ "text": "Prompt",
5
+ "clip": [
6
+ "11",
7
+ 0
8
+ ]
9
+ },
10
+ "class_type": "CLIPTextEncode",
11
+ "_meta": {
12
+ "title": "Positive edit prompt"
13
+ }
14
+ },
15
+ "8": {
16
+ "inputs": {
17
+ "samples": [
18
+ "13",
19
+ 0
20
+ ],
21
+ "vae": [
22
+ "10",
23
+ 0
24
+ ]
25
+ },
26
+ "class_type": "VAEDecode",
27
+ "_meta": {
28
+ "title": "VAE decode"
29
+ }
30
+ },
31
+ "9": {
32
+ "inputs": {
33
+ "filename_prefix": "OpenWebUI/flux-kontext-mask-edit",
34
+ "images": [
35
+ "48",
36
+ 0
37
+ ]
38
+ },
39
+ "class_type": "SaveImage",
40
+ "_meta": {
41
+ "title": "Save masked edit"
42
+ }
43
+ },
44
+ "10": {
45
+ "inputs": {
46
+ "vae_name": "ae.safetensors"
47
+ },
48
+ "class_type": "VAELoader",
49
+ "_meta": {
50
+ "title": "Load Flux VAE"
51
+ }
52
+ },
53
+ "11": {
54
+ "inputs": {
55
+ "clip_name1": "t5xxl_fp8_e4m3fn_scaled.safetensors",
56
+ "clip_name2": "clip_l.safetensors",
57
+ "type": "flux",
58
+ "device": "cpu"
59
+ },
60
+ "class_type": "DualCLIPLoader",
61
+ "_meta": {
62
+ "title": "Load Flux text encoders"
63
+ }
64
+ },
65
+ "12": {
66
+ "inputs": {
67
+ "unet_name": "flux1-dev-kontext_fp8_scaled.safetensors",
68
+ "weight_dtype": "default"
69
+ },
70
+ "class_type": "UNETLoader",
71
+ "_meta": {
72
+ "title": "Load Flux Kontext model"
73
+ }
74
+ },
75
+ "13": {
76
+ "inputs": {
77
+ "noise": [
78
+ "25",
79
+ 0
80
+ ],
81
+ "guider": [
82
+ "22",
83
+ 0
84
+ ],
85
+ "sampler": [
86
+ "16",
87
+ 0
88
+ ],
89
+ "sigmas": [
90
+ "17",
91
+ 0
92
+ ],
93
+ "latent_image": [
94
+ "27",
95
+ 0
96
+ ]
97
+ },
98
+ "class_type": "SamplerCustomAdvanced",
99
+ "_meta": {
100
+ "title": "Kontext sampler"
101
+ }
102
+ },
103
+ "16": {
104
+ "inputs": {
105
+ "sampler_name": "euler"
106
+ },
107
+ "class_type": "KSamplerSelect",
108
+ "_meta": {
109
+ "title": "Sampler select"
110
+ }
111
+ },
112
+ "17": {
113
+ "inputs": {
114
+ "scheduler": "simple",
115
+ "steps": 12,
116
+ "denoise": 1.0,
117
+ "model": [
118
+ "30",
119
+ 0
120
+ ]
121
+ },
122
+ "class_type": "BasicScheduler",
123
+ "_meta": {
124
+ "title": "Scheduler"
125
+ }
126
+ },
127
+ "22": {
128
+ "inputs": {
129
+ "model": [
130
+ "30",
131
+ 0
132
+ ],
133
+ "conditioning": [
134
+ "42",
135
+ 0
136
+ ]
137
+ },
138
+ "class_type": "BasicGuider",
139
+ "_meta": {
140
+ "title": "Guided edit"
141
+ }
142
+ },
143
+ "25": {
144
+ "inputs": {
145
+ "noise_seed": 0
146
+ },
147
+ "class_type": "RandomNoise",
148
+ "_meta": {
149
+ "title": "Seed"
150
+ }
151
+ },
152
+ "26": {
153
+ "inputs": {
154
+ "guidance": 2.5,
155
+ "conditioning": [
156
+ "6",
157
+ 0
158
+ ]
159
+ },
160
+ "class_type": "FluxGuidance",
161
+ "_meta": {
162
+ "title": "Flux guidance"
163
+ }
164
+ },
165
+ "27": {
166
+ "inputs": {
167
+ "width": 512,
168
+ "height": 512,
169
+ "batch_size": 1
170
+ },
171
+ "class_type": "EmptySD3LatentImage",
172
+ "_meta": {
173
+ "title": "Edit latent"
174
+ }
175
+ },
176
+ "30": {
177
+ "inputs": {
178
+ "max_shift": 1.15,
179
+ "base_shift": 0.5,
180
+ "width": 512,
181
+ "height": 512,
182
+ "model": [
183
+ "12",
184
+ 0
185
+ ]
186
+ },
187
+ "class_type": "ModelSamplingFlux",
188
+ "_meta": {
189
+ "title": "Flux sampling"
190
+ }
191
+ },
192
+ "39": {
193
+ "inputs": {
194
+ "pixels": [
195
+ "40",
196
+ 0
197
+ ],
198
+ "vae": [
199
+ "10",
200
+ 0
201
+ ]
202
+ },
203
+ "class_type": "VAEEncode",
204
+ "_meta": {
205
+ "title": "Encode reference image"
206
+ }
207
+ },
208
+ "40": {
209
+ "inputs": {
210
+ "image": [
211
+ "41",
212
+ 0
213
+ ]
214
+ },
215
+ "class_type": "FluxKontextImageScale",
216
+ "_meta": {
217
+ "title": "Scale reference image"
218
+ }
219
+ },
220
+ "41": {
221
+ "inputs": {
222
+ "image": "example.png"
223
+ },
224
+ "class_type": "LoadImage",
225
+ "_meta": {
226
+ "title": "Load uploaded image"
227
+ }
228
+ },
229
+ "42": {
230
+ "inputs": {
231
+ "conditioning": [
232
+ "26",
233
+ 0
234
+ ],
235
+ "latent": [
236
+ "39",
237
+ 0
238
+ ]
239
+ },
240
+ "class_type": "ReferenceLatent",
241
+ "_meta": {
242
+ "title": "Attach reference latent"
243
+ }
244
+ },
245
+ "43": {
246
+ "inputs": {
247
+ "image": "mask.png"
248
+ },
249
+ "class_type": "LoadImage",
250
+ "_meta": {
251
+ "title": "Load mask image"
252
+ }
253
+ },
254
+ "44": {
255
+ "inputs": {
256
+ "image": [
257
+ "41",
258
+ 0
259
+ ],
260
+ "upscale_method": "nearest-exact",
261
+ "width": 512,
262
+ "height": 512,
263
+ "crop": "disabled"
264
+ },
265
+ "class_type": "ImageScale",
266
+ "_meta": {
267
+ "title": "Scale original image"
268
+ }
269
+ },
270
+ "45": {
271
+ "inputs": {
272
+ "image": [
273
+ "43",
274
+ 0
275
+ ],
276
+ "upscale_method": "nearest-exact",
277
+ "width": 512,
278
+ "height": 512,
279
+ "crop": "disabled"
280
+ },
281
+ "class_type": "ImageScale",
282
+ "_meta": {
283
+ "title": "Scale mask image"
284
+ }
285
+ },
286
+ "46": {
287
+ "inputs": {
288
+ "image": [
289
+ "45",
290
+ 0
291
+ ],
292
+ "channel": "red"
293
+ },
294
+ "class_type": "ImageToMask",
295
+ "_meta": {
296
+ "title": "Read white mask area"
297
+ }
298
+ },
299
+ "48": {
300
+ "inputs": {
301
+ "destination": [
302
+ "44",
303
+ 0
304
+ ],
305
+ "source": [
306
+ "8",
307
+ 0
308
+ ],
309
+ "x": 0,
310
+ "y": 0,
311
+ "resize_source": false,
312
+ "mask": [
313
+ "46",
314
+ 0
315
+ ]
316
+ },
317
+ "class_type": "ImageCompositeMasked",
318
+ "_meta": {
319
+ "title": "Composite masked edit over original"
320
+ }
321
+ }
322
+ }
@@ -0,0 +1,58 @@
1
+ [
2
+ {
3
+ "type": "model",
4
+ "node_ids": [
5
+ "1"
6
+ ],
7
+ "key": "unet_name"
8
+ },
9
+ {
10
+ "type": "prompt",
11
+ "node_ids": [
12
+ "4"
13
+ ],
14
+ "key": "text"
15
+ },
16
+ {
17
+ "type": "negative_prompt",
18
+ "node_ids": [
19
+ "5"
20
+ ],
21
+ "key": "text"
22
+ },
23
+ {
24
+ "type": "width",
25
+ "node_ids": [
26
+ "7"
27
+ ],
28
+ "key": "width"
29
+ },
30
+ {
31
+ "type": "height",
32
+ "node_ids": [
33
+ "7"
34
+ ],
35
+ "key": "height"
36
+ },
37
+ {
38
+ "type": "n",
39
+ "node_ids": [
40
+ "7"
41
+ ],
42
+ "key": "batch_size"
43
+ },
44
+ {
45
+ "type": "steps",
46
+ "node_ids": [
47
+ "8"
48
+ ],
49
+ "key": "steps"
50
+ },
51
+ {
52
+ "type": "seed",
53
+ "node_ids": [
54
+ "8"
55
+ ],
56
+ "key": "seed"
57
+ }
58
+ ]
@@ -0,0 +1,141 @@
1
+ {
2
+ "1": {
3
+ "inputs": {
4
+ "unet_name": "flux-2-klein-9b-fp8.safetensors",
5
+ "weight_dtype": "default"
6
+ },
7
+ "class_type": "UNETLoader",
8
+ "_meta": {
9
+ "title": "Load Flux 2 diffusion model"
10
+ }
11
+ },
12
+ "2": {
13
+ "inputs": {
14
+ "clip_name": "qwen_3_8b_fp8mixed.safetensors",
15
+ "type": "flux2",
16
+ "device": "cpu"
17
+ },
18
+ "class_type": "CLIPLoader",
19
+ "_meta": {
20
+ "title": "Load Flux 2 text encoder on CPU"
21
+ }
22
+ },
23
+ "3": {
24
+ "inputs": {
25
+ "vae_name": "flux2-vae.safetensors"
26
+ },
27
+ "class_type": "VAELoader",
28
+ "_meta": {
29
+ "title": "Load Flux 2 VAE"
30
+ }
31
+ },
32
+ "4": {
33
+ "inputs": {
34
+ "text": "Prompt",
35
+ "clip": [
36
+ "2",
37
+ 0
38
+ ]
39
+ },
40
+ "class_type": "CLIPTextEncode",
41
+ "_meta": {
42
+ "title": "Positive prompt"
43
+ }
44
+ },
45
+ "5": {
46
+ "inputs": {
47
+ "text": "",
48
+ "clip": [
49
+ "2",
50
+ 0
51
+ ]
52
+ },
53
+ "class_type": "CLIPTextEncode",
54
+ "_meta": {
55
+ "title": "Negative prompt"
56
+ }
57
+ },
58
+ "6": {
59
+ "inputs": {
60
+ "conditioning": [
61
+ "4",
62
+ 0
63
+ ],
64
+ "guidance": 4.0
65
+ },
66
+ "class_type": "FluxGuidance",
67
+ "_meta": {
68
+ "title": "Flux guidance"
69
+ }
70
+ },
71
+ "7": {
72
+ "inputs": {
73
+ "width": 1024,
74
+ "height": 1024,
75
+ "batch_size": 1
76
+ },
77
+ "class_type": "EmptyFlux2LatentImage",
78
+ "_meta": {
79
+ "title": "Flux 2 latent image"
80
+ }
81
+ },
82
+ "8": {
83
+ "inputs": {
84
+ "seed": 0,
85
+ "steps": 20,
86
+ "cfg": 4.0,
87
+ "sampler_name": "euler",
88
+ "scheduler": "simple",
89
+ "denoise": 1.0,
90
+ "model": [
91
+ "1",
92
+ 0
93
+ ],
94
+ "positive": [
95
+ "6",
96
+ 0
97
+ ],
98
+ "negative": [
99
+ "5",
100
+ 0
101
+ ],
102
+ "latent_image": [
103
+ "7",
104
+ 0
105
+ ]
106
+ },
107
+ "class_type": "KSampler",
108
+ "_meta": {
109
+ "title": "Sampler"
110
+ }
111
+ },
112
+ "9": {
113
+ "inputs": {
114
+ "samples": [
115
+ "8",
116
+ 0
117
+ ],
118
+ "vae": [
119
+ "3",
120
+ 0
121
+ ]
122
+ },
123
+ "class_type": "VAEDecode",
124
+ "_meta": {
125
+ "title": "VAE decode"
126
+ }
127
+ },
128
+ "10": {
129
+ "inputs": {
130
+ "filename_prefix": "OpenWebUI/flux2-klein-9b",
131
+ "images": [
132
+ "9",
133
+ 0
134
+ ]
135
+ },
136
+ "class_type": "SaveImage",
137
+ "_meta": {
138
+ "title": "Save image"
139
+ }
140
+ }
141
+ }
@@ -0,0 +1,23 @@
1
+ [
2
+ {
3
+ "type": "image",
4
+ "node_ids": [
5
+ "1"
6
+ ],
7
+ "key": "image"
8
+ },
9
+ {
10
+ "type": "width",
11
+ "node_ids": [
12
+ "3"
13
+ ],
14
+ "key": "width"
15
+ },
16
+ {
17
+ "type": "height",
18
+ "node_ids": [
19
+ "3"
20
+ ],
21
+ "key": "height"
22
+ }
23
+ ]
@@ -0,0 +1,52 @@
1
+ {
2
+ "1": {
3
+ "inputs": {
4
+ "image": "example.png"
5
+ },
6
+ "class_type": "LoadImage",
7
+ "_meta": {
8
+ "title": "Load uploaded image"
9
+ }
10
+ },
11
+ "2": {
12
+ "inputs": {
13
+ "image": [
14
+ "1",
15
+ 0
16
+ ]
17
+ },
18
+ "class_type": "ImageInvert",
19
+ "_meta": {
20
+ "title": "Invert image colors"
21
+ }
22
+ },
23
+ "3": {
24
+ "inputs": {
25
+ "image": [
26
+ "2",
27
+ 0
28
+ ],
29
+ "upscale_method": "nearest-exact",
30
+ "width": 128,
31
+ "height": 128,
32
+ "crop": "disabled"
33
+ },
34
+ "class_type": "ImageScale",
35
+ "_meta": {
36
+ "title": "Normalize edited image size"
37
+ }
38
+ },
39
+ "4": {
40
+ "inputs": {
41
+ "filename_prefix": "OpenWebUI/edit-invert",
42
+ "images": [
43
+ "3",
44
+ 0
45
+ ]
46
+ },
47
+ "class_type": "SaveImage",
48
+ "_meta": {
49
+ "title": "Save edited image"
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,7 @@
1
+ FROM python:3.12-slim
2
+
3
+ WORKDIR /app
4
+ COPY app.py /app/app.py
5
+
6
+ ENV PYTHONUNBUFFERED=1
7
+ CMD ["python", "/app/app.py"]