@goodandready/dsh-image-gen 0.11.37 → 0.11.39
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/lib/client.js +575 -495
- package/lib/comfy-catalog.js +433 -0
- package/lib/config-schema.js +5 -0
- package/lib/index.js +33 -0
- package/lib/live-progress.js +9 -0
- package/lib/providers/backends/custom.js +2 -2
- package/lib/providers/backends/local.js +35 -1
- package/lib/recipes.js +410 -0
- package/lib/register-tools.js +14 -1
- package/lib/tools/recipes.js +250 -0
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -59,6 +59,36 @@ window.__ModuleLoader__.load({
|
|
|
59
59
|
}
|
|
60
60
|
return (k, def) => def || k
|
|
61
61
|
}
|
|
62
|
+
|
|
63
|
+
async function fetchJson(path, options = {}) {
|
|
64
|
+
const { timeoutMs = 15000, signal, ...rest } = options
|
|
65
|
+
let timer = null
|
|
66
|
+
let sig = signal
|
|
67
|
+
|
|
68
|
+
if (!sig) {
|
|
69
|
+
if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function') {
|
|
70
|
+
sig = AbortSignal.timeout(timeoutMs)
|
|
71
|
+
} else if (typeof AbortController !== 'undefined') {
|
|
72
|
+
const ctrl = new AbortController()
|
|
73
|
+
timer = setTimeout(() => {
|
|
74
|
+
try { ctrl.abort(new Error('Request timeout')) } catch (_) {}
|
|
75
|
+
}, timeoutMs)
|
|
76
|
+
sig = ctrl.signal
|
|
77
|
+
}
|
|
78
|
+
} else if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.any === 'function') {
|
|
79
|
+
const timeoutSig = typeof AbortSignal.timeout === 'function' ? AbortSignal.timeout(timeoutMs) : null
|
|
80
|
+
if (timeoutSig) {
|
|
81
|
+
sig = AbortSignal.any([signal, timeoutSig])
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
const res = await fetch(path, { ...rest, signal: sig })
|
|
87
|
+
return res
|
|
88
|
+
} finally {
|
|
89
|
+
if (timer) clearTimeout(timer)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
62
92
|
// -------------------------------------------------------------- CSS & Design System
|
|
63
93
|
function ensureCss() {
|
|
64
94
|
if (typeof document === 'undefined') return
|
|
@@ -172,7 +202,7 @@ window.__ModuleLoader__.load({
|
|
|
172
202
|
.ig-studio-canvas{display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:12px;align-items:center;justify-content:center;position:relative}
|
|
173
203
|
|
|
174
204
|
/* Backward-compatibility alias styles for toolview */
|
|
175
|
-
.
|
|
205
|
+
.ig-card-head{font-size:13px;font-weight:600;margin-bottom:8px;color:var(--dsw-alias-label-primary)}
|
|
176
206
|
.ig-prompt{font-size:13px;padding:8px 12px;background:var(--dsw-alias-bg-layer-2);border-radius:6px;border:1px solid var(--dsw-alias-border-l2);margin-bottom:8px;word-break:break-word}
|
|
177
207
|
.ig-meta{font-size:11px;color:var(--dsw-alias-label-secondary);margin-top:6px}
|
|
178
208
|
.ig-err{padding:10px;border-radius:6px;background:var(--dsw-alias-state-error-bg, color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent));color:var(--dsw-alias-state-error-primary);font-size:12px}
|
|
@@ -366,6 +396,7 @@ window.__ModuleLoader__.load({
|
|
|
366
396
|
// Backward-compat aliases for tests
|
|
367
397
|
{ field: 'localComfyUrl', spec: textField('localComfyUrl'), kind: 'text', labelKey: 'f.localComfyUrl', hintKey: 'f.localComfyUrlHint', placeholderKey: 'p.localComfyUrl', when: ['local'], tab: 'provider' },
|
|
368
398
|
{ field: 'localA1111Url', spec: textField('localA1111Url'), kind: 'text', labelKey: 'f.localA1111Url', hintKey: 'f.localA1111UrlHint', placeholderKey: 'p.localA1111Url', when: ['local'], tab: 'provider' },
|
|
399
|
+
{ field: 'comfyTemplate', spec: selectField('comfyTemplate', ['', 'txt2img_sdxl', 'img2img_sdxl', 'face_instantid', 'upscale_esrgan']), kind: 'select', options: ['', 'txt2img_sdxl', 'img2img_sdxl', 'face_instantid', 'upscale_esrgan'], labelKey: 'f.comfyTemplate', hintKey: 'f.comfyTemplateHint', when: ['local'], tab: 'provider' },
|
|
369
400
|
{ field: 'comfyWorkflowJson', spec: jsonField('comfyWorkflowJson'), kind: 'text', labelKey: 'f.comfyWorkflowJson', hintKey: 'f.comfyWorkflowJsonHint', placeholderKey: 'p.comfyWorkflowJson', when: ['local'], tab: 'provider' },
|
|
370
401
|
|
|
371
402
|
// Provider: Codex / Grok
|
|
@@ -643,7 +674,7 @@ window.__ModuleLoader__.load({
|
|
|
643
674
|
setLoading(true)
|
|
644
675
|
setMsg(null)
|
|
645
676
|
try {
|
|
646
|
-
const res = await
|
|
677
|
+
const res = await fetchJson('/api/dsh-image-gen/update', {
|
|
647
678
|
headers: { accept: 'application/json' },
|
|
648
679
|
cache: 'no-store',
|
|
649
680
|
})
|
|
@@ -661,7 +692,7 @@ window.__ModuleLoader__.load({
|
|
|
661
692
|
setUpdating(true)
|
|
662
693
|
setMsg(null)
|
|
663
694
|
try {
|
|
664
|
-
const res = await
|
|
695
|
+
const res = await fetchJson('/api/dsh-image-gen/update', {
|
|
665
696
|
method: 'POST',
|
|
666
697
|
headers: {
|
|
667
698
|
'x-dsh-plugin-update': '1',
|
|
@@ -746,7 +777,7 @@ window.__ModuleLoader__.load({
|
|
|
746
777
|
setTesting(true)
|
|
747
778
|
setResult(null)
|
|
748
779
|
try {
|
|
749
|
-
const res = await
|
|
780
|
+
const res = await fetchJson('/dsh-image-gen/diagnostics/test?provider=' + encodeURIComponent(props.provider || 'fal'))
|
|
750
781
|
const data = await res.json()
|
|
751
782
|
setResult(data)
|
|
752
783
|
} catch (e) {
|
|
@@ -813,7 +844,7 @@ window.__ModuleLoader__.load({
|
|
|
813
844
|
|
|
814
845
|
const loadHistory = () => {
|
|
815
846
|
setLoading(true)
|
|
816
|
-
|
|
847
|
+
fetchJson('/dsh-image-gen/history')
|
|
817
848
|
.then((r) => r.json())
|
|
818
849
|
.then((data) => {
|
|
819
850
|
setItems(Array.isArray(data) ? data : [])
|
|
@@ -1263,10 +1294,10 @@ window.__ModuleLoader__.load({
|
|
|
1263
1294
|
react.createElement(
|
|
1264
1295
|
'span',
|
|
1265
1296
|
{ className: qualityGateOn ? 'ig-badge ig-badge-ok' : 'ig-badge ig-badge-warn' },
|
|
1266
|
-
qualityGateOn ? '
|
|
1297
|
+
qualityGateOn ? t('stat.gateActive') : t('stat.gateOff')
|
|
1267
1298
|
),
|
|
1268
1299
|
' ',
|
|
1269
|
-
react.createElement('span', { className: 'ig-badge ig-badge-ok' }, '
|
|
1300
|
+
react.createElement('span', { className: 'ig-badge ig-badge-ok' }, (t('stat.guard') || '{n}').replace('{n}', loopLimit))
|
|
1270
1301
|
),
|
|
1271
1302
|
react.createElement('div', { className: 'ig-stat-lbl' }, t('stat.safety_status'))
|
|
1272
1303
|
),
|
|
@@ -1279,10 +1310,10 @@ window.__ModuleLoader__.load({
|
|
|
1279
1310
|
react.createElement(
|
|
1280
1311
|
'span',
|
|
1281
1312
|
{ className: diskCacheOn ? 'ig-badge ig-badge-ok' : 'ig-badge ig-badge-warn' },
|
|
1282
|
-
diskCacheOn ? '
|
|
1313
|
+
diskCacheOn ? t('stat.cacheOn') : t('stat.cacheOff')
|
|
1283
1314
|
),
|
|
1284
1315
|
' ',
|
|
1285
|
-
budgetText !== '0' ? '$' + budgetText : '
|
|
1316
|
+
budgetText !== '0' ? '$' + budgetText : t('stat.noLimit')
|
|
1286
1317
|
),
|
|
1287
1318
|
react.createElement('div', { className: 'ig-stat-lbl' }, t('stat.budget_cache'))
|
|
1288
1319
|
)
|
|
@@ -1290,7 +1321,7 @@ window.__ModuleLoader__.load({
|
|
|
1290
1321
|
// Tab Navigation
|
|
1291
1322
|
react.createElement(
|
|
1292
1323
|
'div',
|
|
1293
|
-
{ className: 'ig-tabs', role: 'tablist', 'aria-label': '
|
|
1324
|
+
{ className: 'ig-tabs', role: 'tablist', 'aria-label': t('label.settingsSections') },
|
|
1294
1325
|
tabs.map((tab) =>
|
|
1295
1326
|
react.createElement(
|
|
1296
1327
|
'button',
|
|
@@ -1564,7 +1595,7 @@ window.__ModuleLoader__.load({
|
|
|
1564
1595
|
|
|
1565
1596
|
const head = react.createElement(
|
|
1566
1597
|
'div',
|
|
1567
|
-
{ className: '
|
|
1598
|
+
{ className: 'ig-card-head' },
|
|
1568
1599
|
running ? '⏳ ' + t('card.generating') : failed ? '❌ ' + t('card.failed') : '🖼️ ' + t('card.image')
|
|
1569
1600
|
)
|
|
1570
1601
|
|
|
@@ -2477,7 +2508,7 @@ window.__ModuleLoader__.load({
|
|
|
2477
2508
|
return react.createElement(
|
|
2478
2509
|
'div',
|
|
2479
2510
|
{ className: 'ig-page', style: { padding: '4px 0', gap: '10px' } },
|
|
2480
|
-
react.createElement('div', { className: '
|
|
2511
|
+
react.createElement('div', { className: 'ig-card-head' }, '🌓 ' + (t('themePair.title') || 'Theme Pair Graphic')),
|
|
2481
2512
|
args.prompt ? react.createElement('div', { className: 'ig-prompt' }, args.prompt) : null,
|
|
2482
2513
|
react.createElement(
|
|
2483
2514
|
'div',
|
|
@@ -2540,574 +2571,623 @@ window.__ModuleLoader__.load({
|
|
|
2540
2571
|
}
|
|
2541
2572
|
var ThemePairToolView = ThemePairView
|
|
2542
2573
|
const en = {
|
|
2543
|
-
'
|
|
2544
|
-
'settings.title': 'Image Studio',
|
|
2545
|
-
'settings.description': 'AI Image generation, inpainting, variations, upscale & vectorization.',
|
|
2546
|
-
'settings.unavailable': 'Plugin settings are unavailable: the host settings namespace is not ready.',
|
|
2547
|
-
'settings.loading': 'Loading plugin settings…',
|
|
2548
|
-
'settings.unsaved': 'Unsaved changes',
|
|
2549
|
-
'settings.saving': 'Saving…',
|
|
2550
|
-
'settings.save': 'Save settings',
|
|
2551
|
-
'settings.discard': 'Discard changes',
|
|
2552
|
-
'settings.saveFailed': 'Failed to save settings. Please check credentials and try again.',
|
|
2553
|
-
'settings.readOnly': 'Settings are read-only in this context.',
|
|
2554
|
-
'settings.overridden': 'overridden',
|
|
2555
|
-
'settings.reset': 'Reset to default',
|
|
2556
|
-
'settings.invalidNumber': 'Please enter a valid number',
|
|
2557
|
-
'settings.collapse': 'Collapse',
|
|
2558
|
-
'settings.expand': 'Expand',
|
|
2559
|
-
'settings.credentialHint': 'API keys are stored in DSH Credentials (~/.dsh/.credentials.yaml) and never leaked in config files.',
|
|
2560
|
-
|
|
2561
|
-
'tab.general': 'General',
|
|
2562
|
-
'tab.provider': 'Provider',
|
|
2563
|
-
'tab.enhancer': 'Prompt & Styles',
|
|
2564
|
-
'tab.safety': 'Safety & Budget',
|
|
2565
|
-
'tab.cache': 'Cache & Storage',
|
|
2566
|
-
|
|
2567
|
-
'stat.active_provider': 'Active Provider',
|
|
2568
|
-
'stat.format_size': 'Default Specs',
|
|
2569
|
-
'stat.safety_status': 'Safety & Loop Guard',
|
|
2570
|
-
'stat.budget_cache': 'Budget & Cache',
|
|
2571
|
-
|
|
2572
|
-
'card.generating': 'Generating image…',
|
|
2573
|
-
'card.failed': 'Generation failed',
|
|
2574
|
-
'card.image': 'Image Studio Result',
|
|
2575
|
-
'card.unknownError': 'An unknown error occurred during generation.',
|
|
2576
|
-
'card.sizePrefix': 'Size',
|
|
2577
|
-
'card.seedPrefix': 'Seed',
|
|
2574
|
+
'card.actionRemoveBg': 'Remove background',
|
|
2578
2575
|
'card.actionReroll': 'Reroll image',
|
|
2579
2576
|
'card.actionUpscale': 'Upscale image',
|
|
2580
|
-
'card.actionRemoveBg': 'Remove background',
|
|
2581
|
-
'card.inpaint': 'Inpaint',
|
|
2582
|
-
'inpaint.title': 'Inpainting Canvas (Paint white mask over region to edit)',
|
|
2583
|
-
'inpaint.brush_size': 'Size',
|
|
2584
|
-
'inpaint.brush': 'Brush',
|
|
2585
|
-
'inpaint.eraser': 'Eraser',
|
|
2586
|
-
'inpaint.invert': 'Invert Mask',
|
|
2587
|
-
'inpaint.clear': 'Clear Mask',
|
|
2588
|
-
'inpaint.undo': 'Undo',
|
|
2589
|
-
'inpaint.apply': 'Apply Inpaint',
|
|
2590
|
-
'inpaint.prompt_placeholder': 'Describe what to generate in the masked area...',
|
|
2591
|
-
'inpaint.copied': '✓ Instruction Copied!',
|
|
2592
|
-
'matrix.title': 'Style Matrix Benchmark (2×2)',
|
|
2593
|
-
'matrix.blind_on': 'Blind Mode Active',
|
|
2594
|
-
'matrix.blind_toggle': 'Reveal Styles',
|
|
2595
|
-
'matrix.use_style': 'Use Style',
|
|
2596
|
-
'matrix.copied': '✓ Selected!',
|
|
2597
|
-
'f.fallbackProviders': 'Fallback Providers Chain',
|
|
2598
|
-
'f.fallbackProvidersHint': 'Comma-separated list of fallback providers to cascade to on 429, 5xx, or quota limits (e.g. replicate, custom, gemini).',
|
|
2599
|
-
'p.fallbackProviders': 'replicate, custom, gemini',
|
|
2600
|
-
|
|
2601
|
-
'card.reroll': 'Reroll',
|
|
2602
|
-
'card.upscale': 'Upscale 2x/4x',
|
|
2603
|
-
'card.removeBg': 'Remove BG',
|
|
2604
2577
|
'card.copyPrompt': 'Copy Prompt',
|
|
2578
|
+
'card.desc': 'Configure multi-provider image generation, inpainting, upscale, and vectorization settings.',
|
|
2579
|
+
'card.dirty': 'Unsaved changes',
|
|
2580
|
+
'card.discard': 'Discard changes',
|
|
2581
|
+
'card.draftPreview': 'Draft Preview',
|
|
2582
|
+
'card.failed': 'Generation failed',
|
|
2583
|
+
'card.generating': 'Generating image…',
|
|
2584
|
+
'card.image': 'Image Studio Result',
|
|
2585
|
+
'card.inpaint': 'Inpaint',
|
|
2586
|
+
'card.nextRevision': 'Next revision',
|
|
2605
2587
|
'card.origPrompt': 'Original Prompt',
|
|
2588
|
+
'card.prevRevision': 'Previous revision',
|
|
2606
2589
|
'card.remix': 'Remix',
|
|
2590
|
+
'card.removeBg': 'Remove BG',
|
|
2591
|
+
'card.rendering': 'Rendering…',
|
|
2592
|
+
'card.reroll': 'Reroll',
|
|
2607
2593
|
'card.responsiveTabs': 'Responsive viewports',
|
|
2608
|
-
'
|
|
2609
|
-
'
|
|
2610
|
-
'
|
|
2611
|
-
'
|
|
2612
|
-
'
|
|
2613
|
-
'
|
|
2614
|
-
'
|
|
2615
|
-
|
|
2616
|
-
'
|
|
2617
|
-
'
|
|
2618
|
-
'
|
|
2619
|
-
'
|
|
2620
|
-
'
|
|
2621
|
-
'f.needFal': 'Requires FAL API key',
|
|
2622
|
-
'f.needCustom': 'Requires OpenAI-compatible endpoint',
|
|
2623
|
-
'f.needCodex': 'Built-in Codex subscription',
|
|
2624
|
-
'f.needGrok': 'Built-in Grok subscription',
|
|
2625
|
-
'f.needLocal': 'Local ComfyUI or A1111',
|
|
2626
|
-
'f.needSeedream': 'Requires SeaDream API key',
|
|
2627
|
-
'f.needGemini': 'Requires Google Gemini API key',
|
|
2628
|
-
'f.needReplicate': 'Requires Replicate API token',
|
|
2629
|
-
|
|
2630
|
-
'f.defaultSize': 'Default Aspect Ratio',
|
|
2631
|
-
'f.defaultSizeHint': 'Aspect ratio and resolution applied when image_size is omitted.',
|
|
2632
|
-
'f.defaultFormat': 'Output Format',
|
|
2633
|
-
'f.defaultFormatHint': 'Target file format (PNG, JPEG, or WEBP).',
|
|
2634
|
-
'f.deliverAs': 'Delivery Mode',
|
|
2635
|
-
'f.deliverAsHint': 'How images reach conversation: "link" (text LLM safe) or "image" (multimodal vision).',
|
|
2636
|
-
'f.outputDir': 'Output Directory',
|
|
2637
|
-
'f.outputDirHint': 'Directory path where generated images are saved on disk.',
|
|
2638
|
-
'p.outputDir': 'generated/images',
|
|
2639
|
-
'f.historyLimit': 'History Limit',
|
|
2640
|
-
'f.historyLimitHint': 'Maximum number of recent generation records kept in memory.',
|
|
2641
|
-
'f.toolsetProfile': 'Toolset Profile',
|
|
2642
|
-
'f.toolsetProfileHint': 'Select which tools to register into context: minimal (<= 3 core tools, saving ~8k prompt tokens), all (30 tools), or custom.',
|
|
2643
|
-
'f.toolsetDesign': 'Design Toolset',
|
|
2644
|
-
'f.toolsetDesignHint': 'Enable design tools: style_matrix, theme_pair, ui_asset, character_sheet, beautify_diagram, anchor.',
|
|
2645
|
-
'f.toolsetProcessing': 'Processing Toolset',
|
|
2646
|
-
'f.toolsetProcessingHint': 'Enable processing tools: remove_background, upscale, vectorize, convert, grid, smart_crop, asset_pack, replace_image_text.',
|
|
2647
|
-
'f.toolsetFrontend': 'Frontend Toolset',
|
|
2648
|
-
'f.toolsetFrontendHint': 'Enable frontend tools: extract_design_tokens, image_to_css_gradient, check_image_contrast, responsive_mockups.',
|
|
2649
|
-
'f.toolsetCreative': 'Creative Toolset',
|
|
2650
|
-
'f.toolsetCreativeHint': 'Enable creative tools: spritesheet, seamless_pattern, sketch_to_image, image_pack.',
|
|
2651
|
-
'p.historyLimit': '50',
|
|
2652
|
-
|
|
2653
|
-
'f.model': 'FAL Model ID',
|
|
2654
|
-
'f.modelHint': 'Target model on FAL endpoint (e.g. fal-ai/flux-2/klein/9b).',
|
|
2655
|
-
'p.model': 'fal-ai/flux-2/klein/9b',
|
|
2594
|
+
'card.revisions': 'Revisions',
|
|
2595
|
+
'card.save': 'Save changes',
|
|
2596
|
+
'card.saving': 'Saving…',
|
|
2597
|
+
'card.seedPrefix': 'Seed',
|
|
2598
|
+
'card.sizePrefix': 'Size',
|
|
2599
|
+
'card.title': 'AI Image Studio',
|
|
2600
|
+
'card.unknownError': 'An unknown error occurred during generation.',
|
|
2601
|
+
'card.upscale': 'Upscale 2x/4x',
|
|
2602
|
+
'diagnostics.desc': 'Instantly check connection status and latency to the selected provider API.',
|
|
2603
|
+
'diagnostics.ready': 'Ready',
|
|
2604
|
+
'diagnostics.test': 'Test connection',
|
|
2605
|
+
'diagnostics.testing': 'Testing…',
|
|
2606
|
+
'diagnostics.title': 'Provider Connectivity Diagnostics',
|
|
2656
2607
|
'f.apiKeyEnv': 'FAL Key Reference',
|
|
2657
2608
|
'f.apiKeyEnvHint': 'Credential reference holding the FAL API key.',
|
|
2658
|
-
'
|
|
2609
|
+
'f.autoEnhancePrompt': 'Auto Enhance Prompt',
|
|
2610
|
+
'f.autoEnhancePromptHint': 'Enrich prompts with photography, lighting, and composition quality tokens.',
|
|
2659
2611
|
'f.baseURL': 'FAL Base URL',
|
|
2660
2612
|
'f.baseURLHint': 'FAL queue service endpoint.',
|
|
2661
|
-
'
|
|
2662
|
-
'f.
|
|
2663
|
-
'f.
|
|
2664
|
-
'
|
|
2665
|
-
'f.
|
|
2666
|
-
'f.
|
|
2667
|
-
'
|
|
2668
|
-
|
|
2613
|
+
'f.cacheByPrompt': 'Cache by Prompt Only',
|
|
2614
|
+
'f.cacheByPromptHint': 'Reuse existing result if the prompt has already been generated.',
|
|
2615
|
+
'f.cacheBySeed': 'Cache by Seed + Prompt',
|
|
2616
|
+
'f.cacheBySeedHint': 'Reuse existing result if the exact same seed and prompt are requested.',
|
|
2617
|
+
'f.cacheTtlDays': 'Cache Retention (Legacy)',
|
|
2618
|
+
'f.cacheTtlDaysHint': 'Legacy name for retention period in days.',
|
|
2619
|
+
'f.comfyWorkflowJson': 'ComfyUI Workflow JSON',
|
|
2620
|
+
'f.comfyWorkflowJsonHint': 'Custom ComfyUI API workflow graph (JSON) with {{prompt}} placeholders.',
|
|
2669
2621
|
'f.customBaseURL': 'Custom API Base URL',
|
|
2670
2622
|
'f.customBaseURLHint': 'OpenAI-compatible image endpoint root (e.g. https://api.openai.com/v1).',
|
|
2671
|
-
'p.customBaseURL': 'https://api.openai.com/v1',
|
|
2672
|
-
'f.customModel': 'Custom Model ID',
|
|
2673
|
-
'f.customModelHint': 'Model name sent to custom images endpoint.',
|
|
2674
|
-
'p.customModel': 'dall-e-3',
|
|
2675
2623
|
'f.customKeyEnv': 'Custom Key Reference',
|
|
2676
2624
|
'f.customKeyEnvHint': 'Credential reference holding the API key for custom endpoint.',
|
|
2677
|
-
'
|
|
2625
|
+
'f.customModel': 'Custom Model ID',
|
|
2626
|
+
'f.customModelHint': 'Model name sent to custom images endpoint.',
|
|
2678
2627
|
'f.customSize': 'Custom Image Size',
|
|
2679
2628
|
'f.customSizeHint': 'Fixed dimension sent to custom endpoint (e.g. 1024x1024).',
|
|
2680
|
-
'
|
|
2681
|
-
|
|
2682
|
-
'f.
|
|
2683
|
-
'f.
|
|
2684
|
-
'
|
|
2685
|
-
'f.
|
|
2686
|
-
'f.
|
|
2687
|
-
'
|
|
2688
|
-
|
|
2689
|
-
'f.
|
|
2690
|
-
'f.
|
|
2691
|
-
'
|
|
2692
|
-
'f.
|
|
2693
|
-
'f.
|
|
2694
|
-
'
|
|
2695
|
-
'f.
|
|
2696
|
-
'f.
|
|
2697
|
-
'
|
|
2698
|
-
|
|
2699
|
-
'f.
|
|
2700
|
-
'f.
|
|
2701
|
-
'
|
|
2629
|
+
'f.dailyBudgetUsd': 'Daily Spend Budget ($ USD)',
|
|
2630
|
+
'f.dailyBudgetUsdHint': 'Hard spending cap per day across all visual generation tools (0 = no limit).',
|
|
2631
|
+
'f.defaultFormat': 'Output Format',
|
|
2632
|
+
'f.defaultFormatHint': 'Target file format (PNG, JPEG, or WEBP).',
|
|
2633
|
+
'f.defaultSize': 'Default Aspect Ratio',
|
|
2634
|
+
'f.defaultSizeHint': 'Aspect ratio and resolution applied when image_size is omitted.',
|
|
2635
|
+
'f.defaultStylePreset': 'Default Style Preset',
|
|
2636
|
+
'f.defaultStylePresetHint': 'Default style preset applied to generations (e.g. cinematic, anime, photorealistic).',
|
|
2637
|
+
'f.deliverAs': 'Delivery Mode',
|
|
2638
|
+
'f.deliverAsHint': 'How images reach conversation: "link" (text LLM safe) or "image" (multimodal vision).',
|
|
2639
|
+
'f.diskCache': 'Content-Addressed Disk Cache',
|
|
2640
|
+
'f.diskCacheHint': 'Instant <50ms retrieval and zero API cost for repeated identical generations.',
|
|
2641
|
+
'f.enableLlmEnhancer': 'Enable LLM Enhancer (Legacy)',
|
|
2642
|
+
'f.enableLlmEnhancerHint': 'Legacy toggle for LLM prompt expansion.',
|
|
2643
|
+
'f.enabled': 'Master Switch',
|
|
2644
|
+
'f.enabledHint': 'Enable or disable image generation tools across the workspace.',
|
|
2645
|
+
'f.enhanceBelowChars': 'Enhancement Threshold',
|
|
2646
|
+
'f.enhanceBelowCharsHint': 'Prompts longer than this character count will skip expansion.',
|
|
2647
|
+
'f.enhanceModel': 'Enhancement Model',
|
|
2648
|
+
'f.enhanceModelHint': 'Dedicated LLM model used to expand prompts (empty = conversation model).',
|
|
2649
|
+
'f.enhancePrompt': 'LLM Prompt Enhancer',
|
|
2650
|
+
'f.enhancePromptHint': 'Expand concise prompts with rich artistic details before generation.',
|
|
2651
|
+
'f.fallbackProviders': 'Fallback Providers Chain',
|
|
2652
|
+
'f.fallbackProvidersHint': 'Comma-separated list of fallback providers to cascade to on 429, 5xx, or quota limits (e.g. replicate, custom, gemini).',
|
|
2702
2653
|
'f.geminiKeyEnv': 'Gemini Key Reference',
|
|
2703
2654
|
'f.geminiKeyEnvHint': 'Credential reference holding Google Gemini API key.',
|
|
2704
|
-
'
|
|
2705
|
-
|
|
2706
|
-
'f.
|
|
2707
|
-
'f.
|
|
2655
|
+
'f.geminiModel': 'Gemini Model ID',
|
|
2656
|
+
'f.geminiModelHint': 'Google Gemini image generation model identifier.',
|
|
2657
|
+
'f.historyLimit': 'History Limit',
|
|
2658
|
+
'f.historyLimitHint': 'Maximum number of recent generation records kept in memory.',
|
|
2659
|
+
'f.inherit': 'Default / Inherit',
|
|
2660
|
+
'f.localA1111Url': 'Local A1111 URL (Legacy)',
|
|
2661
|
+
'f.localA1111UrlHint': 'Direct Automatic1111 endpoint URL.',
|
|
2708
2662
|
'f.localBaseURL': 'Local Server URL',
|
|
2709
2663
|
'f.localBaseURLHint': 'Server address (e.g. http://127.0.0.1:8188 for ComfyUI, http://127.0.0.1:7860 for A1111).',
|
|
2710
|
-
'p.localBaseURL': 'http://127.0.0.1:8188',
|
|
2711
|
-
'f.localModel': 'Local Model / Checkpoint',
|
|
2712
|
-
'f.localModelHint': 'Checkpoint name or ComfyUI workflow name.',
|
|
2713
|
-
'p.localModel': 'v1-5-pruned-emaonly.safetensors',
|
|
2714
|
-
'f.localSteps': 'Sampling Steps',
|
|
2715
|
-
'f.localStepsHint': 'Number of denoising sampling steps.',
|
|
2716
|
-
'p.localSteps': '20',
|
|
2717
2664
|
'f.localCfg': 'CFG Scale',
|
|
2718
2665
|
'f.localCfgHint': 'Classifier-free guidance scale.',
|
|
2719
|
-
'p.localCfg': '7',
|
|
2720
2666
|
'f.localComfyUrl': 'Local ComfyUI URL (Legacy)',
|
|
2721
2667
|
'f.localComfyUrlHint': 'Direct ComfyUI endpoint URL.',
|
|
2722
|
-
'
|
|
2723
|
-
'f.
|
|
2724
|
-
'f.
|
|
2725
|
-
'
|
|
2726
|
-
'f.
|
|
2727
|
-
'f.
|
|
2728
|
-
'p.comfyWorkflowJson': '{"3": {"class_type": "KSampler", ...}}',
|
|
2729
|
-
|
|
2730
|
-
'f.subscriptionQuality': 'Subscription Quality',
|
|
2731
|
-
'f.subscriptionQualityHint': 'Target quality profile when using Codex or Grok subscriptions.',
|
|
2732
|
-
|
|
2733
|
-
'f.autoEnhancePrompt': 'Auto Enhance Prompt',
|
|
2734
|
-
'f.autoEnhancePromptHint': 'Enrich prompts with photography, lighting, and composition quality tokens.',
|
|
2735
|
-
'f.defaultStylePreset': 'Default Style Preset',
|
|
2736
|
-
'f.defaultStylePresetHint': 'Default style preset applied to generations (e.g. cinematic, anime, photorealistic).',
|
|
2737
|
-
'p.defaultStylePreset': 'none',
|
|
2738
|
-
|
|
2739
|
-
'updater.title': 'Plugin Updates',
|
|
2740
|
-
'updater.check': 'Check updates',
|
|
2741
|
-
'updater.checking': 'Checking…',
|
|
2742
|
-
'updater.current': 'Current version',
|
|
2743
|
-
'updater.latest': 'Latest version',
|
|
2744
|
-
'updater.upToDate': 'Up to date',
|
|
2745
|
-
'updater.updateNow': 'Update to v{version}',
|
|
2746
|
-
'updater.updating': 'Updating…',
|
|
2747
|
-
'updater.success': 'Plugin updated successfully! Please restart DSH service.',
|
|
2748
|
-
'updater.failed': 'Update check failed: ',
|
|
2749
|
-
|
|
2750
|
-
'f.enhancePrompt': 'LLM Prompt Enhancer',
|
|
2751
|
-
'f.enhancePromptHint': 'Expand concise prompts with rich artistic details before generation.',
|
|
2752
|
-
'f.enableLlmEnhancer': 'Enable LLM Enhancer (Legacy)',
|
|
2753
|
-
'f.enableLlmEnhancerHint': 'Legacy toggle for LLM prompt expansion.',
|
|
2754
|
-
'f.enhanceModel': 'Enhancement Model',
|
|
2755
|
-
'f.enhanceModelHint': 'Dedicated LLM model used to expand prompts (empty = conversation model).',
|
|
2756
|
-
'p.enhanceModel': 'Leave empty for default chat model',
|
|
2757
|
-
'f.enhanceBelowChars': 'Enhancement Threshold',
|
|
2758
|
-
'f.enhanceBelowCharsHint': 'Prompts longer than this character count will skip expansion.',
|
|
2759
|
-
'p.enhanceBelowChars': '200',
|
|
2760
|
-
'f.stylePreset': 'Artistic Style Preset',
|
|
2761
|
-
'f.stylePresetHint': 'Automatic visual style suffix added to all generated prompts.',
|
|
2762
|
-
|
|
2763
|
-
'f.qualityGate': 'Silent Quality Gate',
|
|
2764
|
-
'f.qualityGateHint': 'Automatically inspects generated frames and silently re-rolls blank or broken outputs.',
|
|
2765
|
-
'f.dailyBudgetUsd': 'Daily Spend Budget ($ USD)',
|
|
2766
|
-
'f.dailyBudgetUsdHint': 'Hard spending cap per day across all visual generation tools (0 = no limit).',
|
|
2767
|
-
'p.dailyBudgetUsd': '0.00',
|
|
2668
|
+
'f.localKind': 'Local Engine Architecture',
|
|
2669
|
+
'f.localKindHint': 'Select between ComfyUI API or Automatic1111 WebUI backend.',
|
|
2670
|
+
'f.localModel': 'Local Model / Checkpoint',
|
|
2671
|
+
'f.localModelHint': 'Checkpoint name or ComfyUI workflow name.',
|
|
2672
|
+
'f.localSteps': 'Sampling Steps',
|
|
2673
|
+
'f.localStepsHint': 'Number of denoising sampling steps.',
|
|
2768
2674
|
'f.loopGuardLimit': 'Session Loop Guard Limit',
|
|
2769
2675
|
'f.loopGuardLimitHint': 'Maximum consecutive image generations allowed before requiring user input (0 = off).',
|
|
2770
|
-
'
|
|
2771
|
-
|
|
2772
|
-
'f.
|
|
2773
|
-
'f.
|
|
2774
|
-
'f.
|
|
2775
|
-
'f.
|
|
2776
|
-
'f.
|
|
2777
|
-
'f.
|
|
2676
|
+
'f.model': 'FAL Model ID',
|
|
2677
|
+
'f.modelHint': 'Target model on FAL endpoint (e.g. fal-ai/flux-2/klein/9b).',
|
|
2678
|
+
'f.needCodex': 'Built-in Codex subscription',
|
|
2679
|
+
'f.needCustom': 'Requires OpenAI-compatible endpoint',
|
|
2680
|
+
'f.needFal': 'Requires FAL API key',
|
|
2681
|
+
'f.needGemini': 'Requires Google Gemini API key',
|
|
2682
|
+
'f.needGrok': 'Built-in Grok subscription',
|
|
2683
|
+
'f.needLocal': 'Local ComfyUI or A1111',
|
|
2684
|
+
'f.needReplicate': 'Requires Replicate API token',
|
|
2685
|
+
'f.needSeedream': 'Requires SeaDream API key',
|
|
2686
|
+
'f.outputDir': 'Output Directory',
|
|
2687
|
+
'f.outputDirHint': 'Directory path where generated images are saved on disk.',
|
|
2688
|
+
'f.pollIntervalMs': 'Poll Interval (ms)',
|
|
2689
|
+
'f.pollIntervalMsHint': 'Frequency of checking task progress on asynchronous queues.',
|
|
2690
|
+
'f.provider': 'Image Provider',
|
|
2691
|
+
'f.providerHint': 'Backend service used for image generation.',
|
|
2778
2692
|
'f.pruneDays': 'Retention Period (Days)',
|
|
2779
2693
|
'f.pruneDaysHint': 'Automatically delete image files and cache older than this many days (0 = keep forever).',
|
|
2780
|
-
'
|
|
2781
|
-
'f.
|
|
2782
|
-
'f.
|
|
2694
|
+
'f.qualityGate': 'Silent Quality Gate',
|
|
2695
|
+
'f.qualityGateHint': 'Automatically inspects generated frames and silently re-rolls blank or broken outputs.',
|
|
2696
|
+
'f.replicateKeyEnv': 'Replicate Key Reference',
|
|
2697
|
+
'f.replicateKeyEnvHint': 'Credential reference holding the Replicate API token.',
|
|
2698
|
+
'f.replicateModel': 'Replicate Model ID',
|
|
2699
|
+
'f.replicateModelHint': 'Target model identifier on Replicate.',
|
|
2700
|
+
'f.seedreamBaseURL': 'SeaDream Base URL',
|
|
2701
|
+
'f.seedreamBaseURLHint': 'SeaDream API endpoint URL (ByteDance/Volcengine Ark).',
|
|
2702
|
+
'f.seedreamKeyEnv': 'SeaDream Key Reference',
|
|
2703
|
+
'f.seedreamKeyEnvHint': 'Credential reference holding the SeaDream API key.',
|
|
2704
|
+
'f.seedreamModel': 'SeaDream Model ID',
|
|
2705
|
+
'f.seedreamModelHint': 'ByteDance SeaDream model identifier.',
|
|
2706
|
+
'f.stylePreset': 'Artistic Style Preset',
|
|
2707
|
+
'f.stylePresetHint': 'Automatic visual style suffix added to all generated prompts.',
|
|
2708
|
+
'f.subscriptionQuality': 'Subscription Quality',
|
|
2709
|
+
'f.subscriptionQualityHint': 'Target quality profile when using Codex or Grok subscriptions.',
|
|
2710
|
+
'f.timeoutMs': 'Timeout (ms)',
|
|
2711
|
+
'f.timeoutMsHint': 'Maximum overall timeout before failing a generation request.',
|
|
2712
|
+
'f.toolsetCreative': 'Creative Toolset',
|
|
2713
|
+
'f.toolsetCreativeHint': 'Enable creative tools: spritesheet, seamless_pattern, sketch_to_image, image_pack.',
|
|
2714
|
+
'f.toolsetDesign': 'Design Toolset',
|
|
2715
|
+
'f.toolsetDesignHint': 'Enable design tools: style_matrix, theme_pair, ui_asset, character_sheet, beautify_diagram, anchor.',
|
|
2716
|
+
'f.toolsetFrontend': 'Frontend Toolset',
|
|
2717
|
+
'f.toolsetFrontendHint': 'Enable frontend tools: extract_design_tokens, image_to_css_gradient, check_image_contrast, responsive_mockups.',
|
|
2718
|
+
'f.toolsetProcessing': 'Processing Toolset',
|
|
2719
|
+
'f.toolsetProcessingHint': 'Enable processing tools: remove_background, upscale, vectorize, convert, grid, smart_crop, asset_pack, replace_image_text.',
|
|
2720
|
+
'f.toolsetProfile': 'Toolset Profile',
|
|
2721
|
+
'f.toolsetProfileHint': 'Select which tools to register into context: minimal (<= 3 core tools, saving ~8k prompt tokens), all (30 tools), or custom.',
|
|
2722
|
+
'gallery.copy_link': 'Copy Markdown Link',
|
|
2723
|
+
'gallery.copy_prompt': 'Copy Prompt',
|
|
2724
|
+
'gallery.empty': 'No generations yet. Generated images will appear here.',
|
|
2725
|
+
'gallery.inspector': 'Generation Details',
|
|
2726
|
+
'gallery.title': 'Recent Generations',
|
|
2727
|
+
'inpaint.apply': 'Apply Inpaint',
|
|
2728
|
+
'inpaint.brush': 'Brush',
|
|
2729
|
+
'inpaint.brush_size': 'Size',
|
|
2730
|
+
'inpaint.clear': 'Clear Mask',
|
|
2731
|
+
'inpaint.copied': '✓ Instruction Copied!',
|
|
2732
|
+
'inpaint.eraser': 'Eraser',
|
|
2733
|
+
'inpaint.invert': 'Invert Mask',
|
|
2734
|
+
'inpaint.prompt_placeholder': 'Describe what to generate in the masked area...',
|
|
2735
|
+
'inpaint.title': 'Inpainting Canvas (Paint white mask over region to edit)',
|
|
2736
|
+
'inpaint.undo': 'Undo',
|
|
2737
|
+
'label.settingsSections': 'Settings Sections',
|
|
2738
|
+
'matrix.blind_on': 'Blind Mode Active',
|
|
2739
|
+
'matrix.blind_toggle': 'Reveal Styles',
|
|
2740
|
+
'matrix.copied': '✓ Selected!',
|
|
2741
|
+
'matrix.title': 'Style Matrix Benchmark (2×2)',
|
|
2742
|
+
'matrix.use_style': 'Use Style',
|
|
2743
|
+
'p.apiKeyEnv': 'FAL_API_KEY',
|
|
2744
|
+
'p.baseURL': 'https://queue.fal.run',
|
|
2783
2745
|
'p.cacheTtlDays': '0',
|
|
2784
|
-
|
|
2785
|
-
'
|
|
2746
|
+
'p.comfyWorkflowJson': '{"3": {"class_type": "KSampler", ...}}',
|
|
2747
|
+
'p.customBaseURL': 'https://api.openai.com/v1',
|
|
2748
|
+
'p.customKeyEnv': 'OPENAI_API_KEY',
|
|
2749
|
+
'p.customModel': 'dall-e-3',
|
|
2750
|
+
'p.customSize': '1024x1024',
|
|
2751
|
+
'p.dailyBudgetUsd': '0.00',
|
|
2752
|
+
'p.defaultStylePreset': 'none',
|
|
2753
|
+
'p.enhanceBelowChars': '200',
|
|
2754
|
+
'p.enhanceModel': 'Leave empty for default chat model',
|
|
2755
|
+
'p.fallbackProviders': 'replicate, custom, gemini',
|
|
2756
|
+
'p.geminiKeyEnv': 'GEMINI_API_KEY',
|
|
2757
|
+
'p.geminiModel': 'gemini-3.1-flash-image',
|
|
2758
|
+
'p.historyLimit': '50',
|
|
2759
|
+
'p.localA1111Url': 'http://127.0.0.1:7860',
|
|
2760
|
+
'p.localBaseURL': 'http://127.0.0.1:8188',
|
|
2761
|
+
'p.localCfg': '7',
|
|
2762
|
+
'p.localComfyUrl': 'http://127.0.0.1:8188',
|
|
2763
|
+
'p.localModel': 'v1-5-pruned-emaonly.safetensors',
|
|
2764
|
+
'p.localSteps': '20',
|
|
2765
|
+
'p.loopGuardLimit': '3',
|
|
2766
|
+
'p.model': 'fal-ai/flux-2/klein/9b',
|
|
2767
|
+
'p.outputDir': 'generated/images',
|
|
2768
|
+
'p.pollIntervalMs': '2000',
|
|
2769
|
+
'p.pruneDays': '0',
|
|
2770
|
+
'p.replicateKeyEnv': 'REPLICATE_API_TOKEN',
|
|
2771
|
+
'p.replicateModel': 'black-forest-labs/flux-schnell',
|
|
2772
|
+
'p.seedreamBaseURL': 'https://api.bytedanceapi.com/v1',
|
|
2773
|
+
'p.seedreamKeyEnv': 'SEEDREAM_API_KEY',
|
|
2774
|
+
'p.seedreamModel': 'seedream-4.0',
|
|
2775
|
+
'p.timeoutMs': '180000',
|
|
2776
|
+
'remix.copied': '✓ Copied!',
|
|
2777
|
+
'remix.copy_instruction': 'Copy Instruction',
|
|
2778
|
+
'remix.creative_btn': 'Creative (0.65)',
|
|
2779
|
+
'remix.creativity_label': 'Creativity / Denoising Strength',
|
|
2780
|
+
'remix.drawer_title': 'Variations & Style Remix Workbench',
|
|
2781
|
+
'remix.prompt_placeholder': 'Describe stylistic adjustments, new background, or variations...',
|
|
2782
|
+
'remix.subtle_btn': 'Subtle (0.25)',
|
|
2783
|
+
'settings.collapse': 'Collapse',
|
|
2784
|
+
'settings.credentialHint': 'API keys are stored in DSH Credentials (~/.dsh/.credentials.yaml) and never leaked in config files.',
|
|
2785
|
+
'settings.description': 'AI Image generation, inpainting, variations, upscale & vectorization.',
|
|
2786
|
+
'settings.discard': 'Discard changes',
|
|
2787
|
+
'settings.expand': 'Expand',
|
|
2788
|
+
'settings.invalidNumber': 'Please enter a valid number',
|
|
2789
|
+
'settings.loading': 'Loading plugin settings…',
|
|
2790
|
+
'settings.navLabel': 'Image Studio',
|
|
2791
|
+
'settings.overridden': 'overridden',
|
|
2792
|
+
'settings.readOnly': 'Settings are read-only in this context.',
|
|
2793
|
+
'settings.reset': 'Reset to default',
|
|
2794
|
+
'settings.save': 'Save settings',
|
|
2795
|
+
'settings.saveFailed': 'Failed to save settings. Please check credentials and try again.',
|
|
2796
|
+
'settings.saving': 'Saving…',
|
|
2797
|
+
'settings.title': 'Image Studio',
|
|
2798
|
+
'settings.unavailable': 'Plugin settings are unavailable: the host settings namespace is not ready.',
|
|
2799
|
+
'settings.unsaved': 'Unsaved changes',
|
|
2800
|
+
'stat.active_provider': 'Active Provider',
|
|
2801
|
+
'stat.budget_cache': 'Budget & Cache',
|
|
2802
|
+
'stat.cacheOff': 'Off',
|
|
2803
|
+
'stat.cacheOn': 'Cache ON',
|
|
2804
|
+
'stat.format_size': 'Default Specs',
|
|
2805
|
+
'stat.gateActive': 'Gate Active',
|
|
2806
|
+
'stat.gateOff': 'Off',
|
|
2807
|
+
'stat.guard': 'Guard {n}',
|
|
2808
|
+
'stat.noLimit': 'No limit',
|
|
2809
|
+
'stat.safety_status': 'Safety & Loop Guard',
|
|
2810
|
+
'studio.aspectRatio': 'Aspect Ratio:',
|
|
2786
2811
|
'studio.canvas': 'Studio Canvas',
|
|
2787
|
-
'studio.
|
|
2788
|
-
'studio.
|
|
2812
|
+
'studio.copiedCommand': 'Copied generation command to clipboard!',
|
|
2813
|
+
'studio.copiedSnippet': 'Copied snippet to clipboard!',
|
|
2814
|
+
'studio.copyHtml': 'Copy HTML',
|
|
2815
|
+
'studio.copyMarkdown': 'Copy Markdown',
|
|
2816
|
+
'studio.download': 'Download',
|
|
2817
|
+
'studio.emptyCanvas': 'Select an image from the recent strip below or click Generate.',
|
|
2818
|
+
'studio.exitFullscreen': 'Exit Fullscreen',
|
|
2819
|
+
'studio.fullscreen': 'Fullscreen',
|
|
2789
2820
|
'studio.generate': 'Generate in Chat',
|
|
2790
|
-
'studio.
|
|
2821
|
+
'studio.parameters': 'Generation Parameters',
|
|
2791
2822
|
'studio.prompt': 'Prompt:',
|
|
2792
2823
|
'studio.promptPlaceholder': 'Describe your vision...',
|
|
2793
|
-
'studio.stylePreset': 'Style Preset:',
|
|
2794
|
-
'studio.aspectRatio': 'Aspect Ratio:',
|
|
2795
2824
|
'studio.provider': 'Provider:',
|
|
2796
|
-
'studio.seed': 'Seed (optional):',
|
|
2797
2825
|
'studio.random': 'Random',
|
|
2798
2826
|
'studio.randomizeSeed': 'Randomize seed',
|
|
2799
|
-
'studio.
|
|
2800
|
-
'studio.
|
|
2801
|
-
'studio.
|
|
2802
|
-
'studio.
|
|
2803
|
-
'studio.
|
|
2804
|
-
'
|
|
2805
|
-
'
|
|
2806
|
-
'
|
|
2807
|
-
|
|
2808
|
-
'
|
|
2809
|
-
'
|
|
2810
|
-
'
|
|
2811
|
-
'
|
|
2812
|
-
'
|
|
2813
|
-
'
|
|
2814
|
-
'
|
|
2815
|
-
'
|
|
2816
|
-
'
|
|
2827
|
+
'studio.recent': 'Recent Generations',
|
|
2828
|
+
'studio.seed': 'Seed (optional):',
|
|
2829
|
+
'studio.stylePreset': 'Style Preset:',
|
|
2830
|
+
'studio.title': 'Image Studio',
|
|
2831
|
+
'studio.vault': 'Asset Vault',
|
|
2832
|
+
'subtitle': 'Multi-provider AI image generation, editing, upscale & vectorization.',
|
|
2833
|
+
'tab.cache': 'Cache & Storage',
|
|
2834
|
+
'tab.enhancer': 'Prompt & Styles',
|
|
2835
|
+
'tab.gallery': 'Gallery',
|
|
2836
|
+
'tab.general': 'General',
|
|
2837
|
+
'tab.provider': 'Provider',
|
|
2838
|
+
'tab.safety': 'Safety & Budget',
|
|
2839
|
+
'themePair.copiedCss': 'Copied CSS!',
|
|
2840
|
+
'themePair.copiedHtml': 'Copied HTML!',
|
|
2841
|
+
'themePair.copyCss': 'Copy CSS',
|
|
2842
|
+
'themePair.copyHtml': 'Copy HTML',
|
|
2843
|
+
'themePair.dark': 'Dark',
|
|
2844
|
+
'themePair.light': 'Light',
|
|
2845
|
+
'themePair.title': 'Theme Pair Graphic',
|
|
2846
|
+
'title': 'AI Image Studio',
|
|
2847
|
+
'updater.check': 'Check updates',
|
|
2848
|
+
'updater.checking': 'Checking…',
|
|
2849
|
+
'updater.current': 'Current version',
|
|
2850
|
+
'updater.failed': 'Update check failed: ',
|
|
2851
|
+
'updater.latest': 'Latest version',
|
|
2852
|
+
'updater.success': 'Plugin updated successfully! Please restart DSH service.',
|
|
2853
|
+
'updater.title': 'Plugin Updates',
|
|
2854
|
+
'updater.upToDate': 'Up to date',
|
|
2855
|
+
'updater.updateNow': 'Update to v{version}',
|
|
2856
|
+
'updater.updating': 'Updating…',
|
|
2817
2857
|
'vault.allProviders': 'All Providers',
|
|
2818
2858
|
'vault.allRatios': 'All Ratios',
|
|
2819
|
-
'vault.newest': 'Newest',
|
|
2820
|
-
'vault.oldest': 'Oldest',
|
|
2821
|
-
'vault.loading': 'Loading...',
|
|
2822
2859
|
'vault.confirmDelete': 'Are you sure you want to delete this asset?',
|
|
2823
|
-
'vault.deleted': 'Asset deleted',
|
|
2824
|
-
'vault.deleteFailed': 'Failed to delete asset',
|
|
2825
2860
|
'vault.copiedMarkdown': 'Markdown snippet copied to clipboard!',
|
|
2826
2861
|
'vault.copiedPrompt': 'Prompt & seed copied to clipboard!',
|
|
2862
|
+
'vault.delete': 'Delete',
|
|
2863
|
+
'vault.deleteFailed': 'Failed to delete asset',
|
|
2864
|
+
'vault.deleted': 'Asset deleted',
|
|
2865
|
+
'vault.download': 'Download',
|
|
2866
|
+
'vault.empty': 'No assets found in vault.',
|
|
2867
|
+
'vault.insert': 'Insert in Chat',
|
|
2868
|
+
'vault.inspector': 'Asset Inspector',
|
|
2869
|
+
'vault.loadMore': 'Load more assets',
|
|
2870
|
+
'vault.loading': 'Loading...',
|
|
2871
|
+
'vault.newest': 'Newest',
|
|
2827
2872
|
'vault.noPrompt': 'No prompt',
|
|
2828
|
-
'vault.
|
|
2873
|
+
'vault.oldest': 'Oldest',
|
|
2829
2874
|
'vault.provider': 'Provider',
|
|
2875
|
+
'vault.reroll': 'Re-roll with seed',
|
|
2876
|
+
'vault.search': 'Search prompt or tags...',
|
|
2877
|
+
'vault.seed': 'Seed',
|
|
2878
|
+
'vault.title': 'Asset Browser & Vault',
|
|
2879
|
+
'f.comfyTemplate': 'ComfyUI Workflow Template',
|
|
2880
|
+
'f.comfyTemplateHint': 'Pre-vetted workflow template (e.g. SDXL txt2img, img2img, InstantID face transfer, RealESRGAN upscaler).',
|
|
2830
2881
|
}
|
|
2831
|
-
|
|
2832
2882
|
const zh = {
|
|
2833
|
-
'
|
|
2834
|
-
'
|
|
2835
|
-
'
|
|
2836
|
-
'
|
|
2837
|
-
'tab.safety': '安全与预算',
|
|
2838
|
-
'tab.cache': '缓存与性能',
|
|
2839
|
-
|
|
2840
|
-
'diagnostics.title': '提供商连接诊断',
|
|
2841
|
-
'diagnostics.desc': '即时检查与所选生成服务 API 的连接状态和延迟。',
|
|
2842
|
-
'diagnostics.test': '测试连接',
|
|
2843
|
-
'diagnostics.testing': '测试中...',
|
|
2844
|
-
'diagnostics.ready': '正常',
|
|
2845
|
-
|
|
2846
|
-
'gallery.title': '最近生成记录',
|
|
2847
|
-
'gallery.empty': '暂无生成记录。生成一张图片后将显示在此处。',
|
|
2848
|
-
'gallery.inspector': '生成记录详情',
|
|
2849
|
-
'gallery.copy_prompt': '复制提示词',
|
|
2850
|
-
'gallery.copy_link': '复制 Markdown 链接',
|
|
2851
|
-
|
|
2852
|
-
'title': 'AI 图像工坊',
|
|
2853
|
-
'subtitle': '多提供商支持的图像生成、编辑、局部重绘与矢量化。',
|
|
2854
|
-
'card.title': 'AI 图像工坊',
|
|
2883
|
+
'card.actionRemoveBg': '移除背景',
|
|
2884
|
+
'card.actionReroll': '重新生成图像',
|
|
2885
|
+
'card.actionUpscale': '放大图像',
|
|
2886
|
+
'card.copyPrompt': '复制提示词',
|
|
2855
2887
|
'card.desc': '配置多提供商图像生成、局部重绘、放大及矢量化设置。',
|
|
2856
2888
|
'card.dirty': '有未保存的修改',
|
|
2857
|
-
'card.saving': '保存中...',
|
|
2858
|
-
'card.save': '保存修改',
|
|
2859
2889
|
'card.discard': '放弃修改',
|
|
2890
|
+
'card.draftPreview': '草稿预览',
|
|
2860
2891
|
'card.failed': '保存失败,请检查填写内容。',
|
|
2861
|
-
'card.
|
|
2862
|
-
'card.
|
|
2863
|
-
'card.actionRemoveBg': '移除背景',
|
|
2892
|
+
'card.generating': '正在生成图片…',
|
|
2893
|
+
'card.image': 'AI 图像工坊生成结果',
|
|
2864
2894
|
'card.inpaint': '局部重绘',
|
|
2865
|
-
'
|
|
2866
|
-
'inpaint.brush_size': '大小',
|
|
2867
|
-
'inpaint.brush': '画笔',
|
|
2868
|
-
'inpaint.eraser': '橡皮擦',
|
|
2869
|
-
'inpaint.invert': '反转蒙版',
|
|
2870
|
-
'inpaint.clear': '清空蒙版',
|
|
2871
|
-
'inpaint.undo': '撤销',
|
|
2872
|
-
'inpaint.apply': '生成局部重绘',
|
|
2873
|
-
'inpaint.prompt_placeholder': '描述在涂抹区域生成的内容...',
|
|
2874
|
-
'inpaint.copied': '✓ 已复制重绘指令!',
|
|
2875
|
-
'matrix.title': '2×2 风格探索矩阵',
|
|
2876
|
-
'matrix.blind_on': '盲测模式进行中',
|
|
2877
|
-
'matrix.blind_toggle': '显示风格标签',
|
|
2878
|
-
'matrix.use_style': '使用此风格',
|
|
2879
|
-
'matrix.copied': '✓ 风格已选定!',
|
|
2880
|
-
'f.fallbackProviders': '备用提供商级联',
|
|
2881
|
-
'f.fallbackProvidersHint': '当主提供商遇到 429 限流、5xx 故障或余额不足时依次自动切换的备用服务商列表(如 replicate, custom, gemini)。',
|
|
2882
|
-
'p.fallbackProviders': 'replicate, custom, gemini',
|
|
2883
|
-
|
|
2884
|
-
'card.reroll': '重绘',
|
|
2885
|
-
'card.upscale': '放大 2x/4x',
|
|
2886
|
-
'card.removeBg': '抠图背景',
|
|
2887
|
-
'card.copyPrompt': '复制提示词',
|
|
2895
|
+
'card.nextRevision': '下一版本',
|
|
2888
2896
|
'card.origPrompt': '原始提示词',
|
|
2897
|
+
'card.prevRevision': '上一版本',
|
|
2889
2898
|
'card.remix': '重混变体',
|
|
2899
|
+
'card.removeBg': '抠图背景',
|
|
2900
|
+
'card.rendering': '渲染中…',
|
|
2901
|
+
'card.reroll': '重绘',
|
|
2890
2902
|
'card.responsiveTabs': '响应式视口',
|
|
2891
|
-
'
|
|
2892
|
-
'
|
|
2893
|
-
'
|
|
2894
|
-
'
|
|
2895
|
-
'
|
|
2896
|
-
'
|
|
2897
|
-
'
|
|
2898
|
-
|
|
2899
|
-
'
|
|
2900
|
-
'
|
|
2901
|
-
'
|
|
2902
|
-
'
|
|
2903
|
-
'
|
|
2904
|
-
|
|
2905
|
-
'f.enabled': '启用图像生成',
|
|
2906
|
-
'f.enabledHint': '关闭后将禁用所有图像生成及处理工具。',
|
|
2907
|
-
'f.provider': '默认图像提供商',
|
|
2908
|
-
'f.providerHint': '用于图像生成的默认引擎(fal, custom, replicate, seedream, gemini, local, codex, grok)。',
|
|
2909
|
-
'f.defaultSize': '默认图像尺寸',
|
|
2910
|
-
'f.defaultSizeHint': '未指定尺寸时的默认生成分辨率。',
|
|
2911
|
-
'f.defaultFormat': '输出格式',
|
|
2912
|
-
'f.defaultFormatHint': '生成图像的默认文件格式(png 或 webp)。',
|
|
2913
|
-
'f.deliverAs': '输出投递方式',
|
|
2914
|
-
'f.deliverAsHint': 'link 模式仅返回链接;image 模式同时返回图像自身数据。',
|
|
2915
|
-
'f.outputDir': '存储目录',
|
|
2916
|
-
'f.outputDirHint': '已生成图像在会话工作空间内的保存目录。',
|
|
2917
|
-
'p.outputDir': 'generated/images',
|
|
2918
|
-
'f.historyLimit': '历史记录数量',
|
|
2919
|
-
'f.historyLimitHint': '保存在内存历史列表中的最大条目数。',
|
|
2920
|
-
'f.toolsetProfile': '工具集配置档',
|
|
2921
|
-
'f.toolsetProfileHint': '选择注册到对话上下文的工具集:minimal(<= 3个核心工具,节省~8k提示词tokens),all(所有30个工具),或custom。',
|
|
2922
|
-
'f.toolsetDesign': '设计工具集',
|
|
2923
|
-
'f.toolsetDesignHint': '启用设计工具:style_matrix, theme_pair, ui_asset, character_sheet, beautify_diagram, anchor。',
|
|
2924
|
-
'f.toolsetProcessing': '图像处理工具集',
|
|
2925
|
-
'f.toolsetProcessingHint': '启用处理工具:remove_background, upscale, vectorize, convert, grid, smart_crop, asset_pack, replace_image_text。',
|
|
2926
|
-
'f.toolsetFrontend': '前端工具集',
|
|
2927
|
-
'f.toolsetFrontendHint': '启用前端工具:extract_design_tokens, image_to_css_gradient, check_image_contrast, responsive_mockups。',
|
|
2928
|
-
'f.toolsetCreative': '创意工具集',
|
|
2929
|
-
'f.toolsetCreativeHint': '启用创意工具:spritesheet, seamless_pattern, sketch_to_image, image_pack。',
|
|
2930
|
-
'p.historyLimit': '50',
|
|
2931
|
-
|
|
2932
|
-
'f.model': 'FAL 模型 ID',
|
|
2933
|
-
'f.modelHint': '调用的 FAL 队列模型标识符。',
|
|
2934
|
-
'p.model': 'fal-ai/flux-2/klein/9b',
|
|
2903
|
+
'card.revisions': '历史版本',
|
|
2904
|
+
'card.save': '保存修改',
|
|
2905
|
+
'card.saving': '保存中...',
|
|
2906
|
+
'card.seedPrefix': '随机种子',
|
|
2907
|
+
'card.sizePrefix': '尺寸',
|
|
2908
|
+
'card.title': 'AI 图像工坊',
|
|
2909
|
+
'card.unknownError': '生成过程中发生未知错误。',
|
|
2910
|
+
'card.upscale': '放大 2x/4x',
|
|
2911
|
+
'diagnostics.desc': '即时检查与所选生成服务 API 的连接状态和延迟。',
|
|
2912
|
+
'diagnostics.ready': '正常',
|
|
2913
|
+
'diagnostics.test': '测试连接',
|
|
2914
|
+
'diagnostics.testing': '测试中...',
|
|
2915
|
+
'diagnostics.title': '提供商连接诊断',
|
|
2935
2916
|
'f.apiKeyEnv': 'FAL 凭证名称',
|
|
2936
2917
|
'f.apiKeyEnvHint': '存储 FAL API 密钥的环境变量或凭证名称。',
|
|
2937
|
-
'
|
|
2918
|
+
'f.autoEnhancePrompt': '智能自动增强提示词',
|
|
2919
|
+
'f.autoEnhancePromptHint': '自动为提示词补充最佳摄影、光影与构图词汇。',
|
|
2938
2920
|
'f.baseURL': 'FAL 基础地址',
|
|
2939
2921
|
'f.baseURLHint': 'FAL 队列服务基础 URL。',
|
|
2940
|
-
'
|
|
2941
|
-
'f.
|
|
2942
|
-
'f.
|
|
2943
|
-
'
|
|
2944
|
-
'f.
|
|
2945
|
-
'f.
|
|
2946
|
-
'
|
|
2947
|
-
|
|
2922
|
+
'f.cacheByPrompt': '按提示词命中缓存',
|
|
2923
|
+
'f.cacheByPromptHint': '当提示词文本一致时直接命中缓存。',
|
|
2924
|
+
'f.cacheBySeed': '按 Seed 与提示词命中缓存',
|
|
2925
|
+
'f.cacheBySeedHint': '当 Seed 和提示词均完全一致时直接命中缓存。',
|
|
2926
|
+
'f.cacheTtlDays': '缓存生命周期 (Legacy)',
|
|
2927
|
+
'f.cacheTtlDaysHint': '已废弃的缓存保留时长参数。',
|
|
2928
|
+
'f.comfyWorkflowJson': 'ComfyUI 工作流 JSON',
|
|
2929
|
+
'f.comfyWorkflowJsonHint': '包含 {{prompt}} 等占位符的自定义 ComfyUI API 工作流 JSON。',
|
|
2948
2930
|
'f.customBaseURL': 'Custom API 地址',
|
|
2949
2931
|
'f.customBaseURLHint': '兼容 OpenAI 图像接口的基础地址。',
|
|
2950
|
-
'p.customBaseURL': 'https://api.openai.com/v1',
|
|
2951
|
-
'f.customModel': 'Custom 模型 ID',
|
|
2952
|
-
'f.customModelHint': '自定义接口的模型标识符。',
|
|
2953
|
-
'p.customModel': 'gpt-image-1',
|
|
2954
2932
|
'f.customKeyEnv': 'Custom 凭证名称',
|
|
2955
2933
|
'f.customKeyEnvHint': '存储自定义接口 API 密钥的凭证名称。',
|
|
2956
|
-
'
|
|
2934
|
+
'f.customModel': 'Custom 模型 ID',
|
|
2935
|
+
'f.customModelHint': '自定义接口的模型标识符。',
|
|
2957
2936
|
'f.customSize': 'Custom 固定尺寸',
|
|
2958
2937
|
'f.customSizeHint': '发送至自定义接口的指定分辨率(如 1024x1024)。',
|
|
2959
|
-
'
|
|
2960
|
-
|
|
2961
|
-
'f.
|
|
2962
|
-
'f.
|
|
2963
|
-
'
|
|
2964
|
-
'f.
|
|
2965
|
-
'f.
|
|
2966
|
-
'
|
|
2967
|
-
|
|
2968
|
-
'f.
|
|
2969
|
-
'f.
|
|
2970
|
-
'
|
|
2971
|
-
'f.
|
|
2972
|
-
'f.
|
|
2973
|
-
'
|
|
2974
|
-
'f.
|
|
2975
|
-
'f.
|
|
2976
|
-
'
|
|
2977
|
-
|
|
2978
|
-
'f.
|
|
2979
|
-
'f.
|
|
2980
|
-
'
|
|
2938
|
+
'f.dailyBudgetUsd': '每日开销预算 ($ USD)',
|
|
2939
|
+
'f.dailyBudgetUsdHint': '所有图像工具每 24 小时的支出预算上限(0 为不限制)。',
|
|
2940
|
+
'f.defaultFormat': '输出格式',
|
|
2941
|
+
'f.defaultFormatHint': '生成图像的默认文件格式(png 或 webp)。',
|
|
2942
|
+
'f.defaultSize': '默认图像尺寸',
|
|
2943
|
+
'f.defaultSizeHint': '未指定尺寸时的默认生成分辨率。',
|
|
2944
|
+
'f.defaultStylePreset': '默认风格预设',
|
|
2945
|
+
'f.defaultStylePresetHint': '生成图像时应用的默认艺术或摄影风格(如 cinematic, anime 等)。',
|
|
2946
|
+
'f.deliverAs': '输出投递方式',
|
|
2947
|
+
'f.deliverAsHint': 'link 模式仅返回链接;image 模式同时返回图像自身数据。',
|
|
2948
|
+
'f.diskCache': '按内容哈希的磁盘缓存',
|
|
2949
|
+
'f.diskCacheHint': '重复生成完全相同的请求时实现毫秒级瞬间返回与零支出。',
|
|
2950
|
+
'f.enableLlmEnhancer': '启用 LLM 提示词增强 (Legacy)',
|
|
2951
|
+
'f.enableLlmEnhancerHint': '提示词扩展的历史遗留开关。',
|
|
2952
|
+
'f.enabled': '启用图像生成',
|
|
2953
|
+
'f.enabledHint': '关闭后将禁用所有图像生成及处理工具。',
|
|
2954
|
+
'f.enhanceBelowChars': '扩展长度阈值',
|
|
2955
|
+
'f.enhanceBelowCharsHint': '长于此字数的提示词将直接生成,不予额外扩展。',
|
|
2956
|
+
'f.enhanceModel': '增强模型',
|
|
2957
|
+
'f.enhanceModelHint': '用于扩展提示词的独立大语言模型(留空使用会话模型)。',
|
|
2958
|
+
'f.enhancePrompt': 'LLM 提示词扩展',
|
|
2959
|
+
'f.enhancePromptHint': '在生成前由会话模型自动丰富短提示词细节。',
|
|
2960
|
+
'f.fallbackProviders': '备用提供商级联',
|
|
2961
|
+
'f.fallbackProvidersHint': '当主提供商遇到 429 限流、5xx 故障或余额不足时依次自动切换的备用服务商列表(如 replicate, custom, gemini)。',
|
|
2981
2962
|
'f.geminiKeyEnv': 'Gemini 凭证名称',
|
|
2982
|
-
'f.geminiKeyEnvHint': '存储 Google Gemini 密钥的凭证名称。',
|
|
2983
|
-
'
|
|
2984
|
-
|
|
2985
|
-
'f.
|
|
2986
|
-
'f.
|
|
2963
|
+
'f.geminiKeyEnvHint': '存储 Google Gemini 密钥的凭证名称。',
|
|
2964
|
+
'f.geminiModel': 'Gemini 模型 ID',
|
|
2965
|
+
'f.geminiModelHint': 'Google Gemini 图像生成模型标识符。',
|
|
2966
|
+
'f.historyLimit': '历史记录数量',
|
|
2967
|
+
'f.historyLimitHint': '保存在内存历史列表中的最大条目数。',
|
|
2968
|
+
'f.inherit': '默认 / 继承',
|
|
2969
|
+
'f.localA1111Url': '本地 A1111 地址 (Legacy)',
|
|
2970
|
+
'f.localA1111UrlHint': '直接指向 Automatic1111 的服务地址。',
|
|
2987
2971
|
'f.localBaseURL': '本地服务地址',
|
|
2988
2972
|
'f.localBaseURLHint': '服务网络地址(如 http://127.0.0.1:8188)。',
|
|
2989
|
-
'p.localBaseURL': 'http://127.0.0.1:8188',
|
|
2990
|
-
'f.localModel': '本地模型 / Checkpoint',
|
|
2991
|
-
'f.localModelHint': '本地模型文件名或 ComfyUI 工作流名称。',
|
|
2992
|
-
'p.localModel': 'v1-5-pruned-emaonly.safetensors',
|
|
2993
|
-
'f.localSteps': '采样步数',
|
|
2994
|
-
'f.localStepsHint': '去噪采样的计算步数。',
|
|
2995
|
-
'p.localSteps': '20',
|
|
2996
2973
|
'f.localCfg': 'CFG Scale',
|
|
2997
2974
|
'f.localCfgHint': '无分类器引导系数。',
|
|
2998
|
-
'p.localCfg': '7',
|
|
2999
2975
|
'f.localComfyUrl': '本地 ComfyUI 地址 (Legacy)',
|
|
3000
2976
|
'f.localComfyUrlHint': '直接指向 ComfyUI 的服务地址。',
|
|
3001
|
-
'
|
|
3002
|
-
'f.
|
|
3003
|
-
'f.
|
|
3004
|
-
'
|
|
3005
|
-
'f.
|
|
3006
|
-
'f.
|
|
3007
|
-
'
|
|
3008
|
-
|
|
2977
|
+
'f.localKind': '本地引擎架构',
|
|
2978
|
+
'f.localKindHint': '在 ComfyUI API 或 Automatic1111 WebUI 架构间选择。',
|
|
2979
|
+
'f.localModel': '本地模型 / Checkpoint',
|
|
2980
|
+
'f.localModelHint': '本地模型文件名或 ComfyUI 工作流名称。',
|
|
2981
|
+
'f.localSteps': '采样步数',
|
|
2982
|
+
'f.localStepsHint': '去噪采样的计算步数。',
|
|
2983
|
+
'f.loopGuardLimit': '防死循环守卫 (Loop Guard)',
|
|
2984
|
+
'f.loopGuardLimitHint': '无需用户交互的连续生成操作上限(0 为禁用)。',
|
|
2985
|
+
'f.model': 'FAL 模型 ID',
|
|
2986
|
+
'f.modelHint': '调用的 FAL 队列模型标识符。',
|
|
2987
|
+
'f.needCodex': '内置 Codex 订阅',
|
|
2988
|
+
'f.needCustom': '需要兼容 OpenAI 的端点',
|
|
2989
|
+
'f.needFal': '需要 FAL API 密钥',
|
|
2990
|
+
'f.needGemini': '需要 Google Gemini API 密钥',
|
|
2991
|
+
'f.needGrok': '内置 Grok 订阅',
|
|
2992
|
+
'f.needLocal': '本地 ComfyUI 或 A1111',
|
|
2993
|
+
'f.needReplicate': '需要 Replicate API 令牌',
|
|
2994
|
+
'f.needSeedream': '需要 SeaDream API 密钥',
|
|
2995
|
+
'f.outputDir': '存储目录',
|
|
2996
|
+
'f.outputDirHint': '已生成图像在会话工作空间内的保存目录。',
|
|
2997
|
+
'f.pollIntervalMs': '轮询间隔(毫秒)',
|
|
2998
|
+
'f.pollIntervalMsHint': '异步队列状态检查的时间间隔。',
|
|
2999
|
+
'f.provider': '默认图像提供商',
|
|
3000
|
+
'f.providerHint': '用于图像生成的默认引擎(fal, custom, replicate, seedream, gemini, local, codex, grok)。',
|
|
3001
|
+
'f.pruneDays': '文件保留天数',
|
|
3002
|
+
'f.pruneDaysHint': '自动清理超过该天数的已生成图像(0 表示永久保留)。',
|
|
3003
|
+
'f.qualityGate': '静默质量门禁',
|
|
3004
|
+
'f.qualityGateHint': '自动检测破损或空白输出,并在后台静默重新生成。',
|
|
3005
|
+
'f.replicateKeyEnv': 'Replicate 凭证名称',
|
|
3006
|
+
'f.replicateKeyEnvHint': '存储 Replicate API Token 的凭证名称。',
|
|
3007
|
+
'f.replicateModel': 'Replicate 模型 ID',
|
|
3008
|
+
'f.replicateModelHint': 'Replicate 平台上的目标模型。',
|
|
3009
|
+
'f.seedreamBaseURL': 'SeaDream 接口地址',
|
|
3010
|
+
'f.seedreamBaseURLHint': 'SeaDream API 基础地址(火山引擎 Ark)。',
|
|
3011
|
+
'f.seedreamKeyEnv': 'SeaDream 凭证名称',
|
|
3012
|
+
'f.seedreamKeyEnvHint': '存储 SeaDream 接口密钥的凭证名称。',
|
|
3013
|
+
'f.seedreamModel': 'SeaDream 模型 ID',
|
|
3014
|
+
'f.seedreamModelHint': '字节跳动 SeaDream 图像模型标识符。',
|
|
3015
|
+
'f.stylePreset': '艺术风格后缀',
|
|
3016
|
+
'f.stylePresetHint': '自动追加到所有生成提示词末尾的风格后缀。',
|
|
3009
3017
|
'f.subscriptionQuality': '订阅质量',
|
|
3010
3018
|
'f.subscriptionQualityHint': 'Codex 或 Grok 订阅通道的质量档位。',
|
|
3011
|
-
|
|
3012
|
-
'f.
|
|
3013
|
-
'f.
|
|
3014
|
-
'f.
|
|
3015
|
-
'f.
|
|
3019
|
+
'f.timeoutMs': '超时上限(毫秒)',
|
|
3020
|
+
'f.timeoutMsHint': '单次生成作业的总执行时限。',
|
|
3021
|
+
'f.toolsetCreative': '创意工具集',
|
|
3022
|
+
'f.toolsetCreativeHint': '启用创意工具:spritesheet, seamless_pattern, sketch_to_image, image_pack。',
|
|
3023
|
+
'f.toolsetDesign': '设计工具集',
|
|
3024
|
+
'f.toolsetDesignHint': '启用设计工具:style_matrix, theme_pair, ui_asset, character_sheet, beautify_diagram, anchor。',
|
|
3025
|
+
'f.toolsetFrontend': '前端工具集',
|
|
3026
|
+
'f.toolsetFrontendHint': '启用前端工具:extract_design_tokens, image_to_css_gradient, check_image_contrast, responsive_mockups。',
|
|
3027
|
+
'f.toolsetProcessing': '图像处理工具集',
|
|
3028
|
+
'f.toolsetProcessingHint': '启用处理工具:remove_background, upscale, vectorize, convert, grid, smart_crop, asset_pack, replace_image_text。',
|
|
3029
|
+
'f.toolsetProfile': '工具集配置档',
|
|
3030
|
+
'f.toolsetProfileHint': '选择注册到对话上下文的工具集:minimal(<= 3个核心工具,节省~8k提示词tokens),all(所有30个工具),或custom。',
|
|
3031
|
+
'gallery.copy_link': '复制 Markdown 链接',
|
|
3032
|
+
'gallery.copy_prompt': '复制提示词',
|
|
3033
|
+
'gallery.empty': '暂无生成记录。生成一张图片后将显示在此处。',
|
|
3034
|
+
'gallery.inspector': '生成记录详情',
|
|
3035
|
+
'gallery.title': '最近生成记录',
|
|
3036
|
+
'inpaint.apply': '生成局部重绘',
|
|
3037
|
+
'inpaint.brush': '画笔',
|
|
3038
|
+
'inpaint.brush_size': '大小',
|
|
3039
|
+
'inpaint.clear': '清空蒙版',
|
|
3040
|
+
'inpaint.copied': '✓ 已复制重绘指令!',
|
|
3041
|
+
'inpaint.eraser': '橡皮擦',
|
|
3042
|
+
'inpaint.invert': '反转蒙版',
|
|
3043
|
+
'inpaint.prompt_placeholder': '描述在涂抹区域生成的内容...',
|
|
3044
|
+
'inpaint.title': '画布局部重绘(涂抹白色蒙版标记区域)',
|
|
3045
|
+
'inpaint.undo': '撤销',
|
|
3046
|
+
'label.settingsSections': '设置分区',
|
|
3047
|
+
'matrix.blind_on': '盲测模式进行中',
|
|
3048
|
+
'matrix.blind_toggle': '显示风格标签',
|
|
3049
|
+
'matrix.copied': '✓ 风格已选定!',
|
|
3050
|
+
'matrix.title': '2×2 风格探索矩阵',
|
|
3051
|
+
'matrix.use_style': '使用此风格',
|
|
3052
|
+
'p.apiKeyEnv': 'FAL_API_KEY',
|
|
3053
|
+
'p.baseURL': 'https://queue.fal.run',
|
|
3054
|
+
'p.cacheTtlDays': '0',
|
|
3055
|
+
'p.comfyWorkflowJson': '{"3": {"class_type": "KSampler", ...}}',
|
|
3056
|
+
'p.customBaseURL': 'https://api.openai.com/v1',
|
|
3057
|
+
'p.customKeyEnv': 'OPENAI_API_KEY',
|
|
3058
|
+
'p.customModel': 'gpt-image-1',
|
|
3059
|
+
'p.customSize': '1024x1024',
|
|
3060
|
+
'p.dailyBudgetUsd': '0.00',
|
|
3016
3061
|
'p.defaultStylePreset': 'none',
|
|
3017
|
-
|
|
3018
|
-
'updater.title': '插件更新',
|
|
3019
|
-
'updater.check': '检查更新',
|
|
3020
|
-
'updater.checking': '正在检查…',
|
|
3021
|
-
'updater.current': '当前版本',
|
|
3022
|
-
'updater.latest': '最新版本',
|
|
3023
|
-
'updater.upToDate': '已是最新',
|
|
3024
|
-
'updater.updateNow': '一键更新至 v{version}',
|
|
3025
|
-
'updater.updating': '正在更新…',
|
|
3026
|
-
'updater.success': '插件更新成功!请重启 DSH 服务以生效。',
|
|
3027
|
-
'updater.failed': '更新检查失败:',
|
|
3028
|
-
'f.enhancePrompt': 'LLM 提示词扩展',
|
|
3029
|
-
'f.enhancePromptHint': '在生成前由会话模型自动丰富短提示词细节。',
|
|
3030
|
-
'f.enableLlmEnhancer': '启用 LLM 提示词增强 (Legacy)',
|
|
3031
|
-
'f.enableLlmEnhancerHint': '提示词扩展的历史遗留开关。',
|
|
3032
|
-
'f.enhanceModel': '增强模型',
|
|
3033
|
-
'f.enhanceModelHint': '用于扩展提示词的独立大语言模型(留空使用会话模型)。',
|
|
3034
|
-
'p.enhanceModel': '留空表示使用当前会话模型',
|
|
3035
|
-
'f.enhanceBelowChars': '扩展长度阈值',
|
|
3036
|
-
'f.enhanceBelowCharsHint': '长于此字数的提示词将直接生成,不予额外扩展。',
|
|
3037
3062
|
'p.enhanceBelowChars': '200',
|
|
3038
|
-
'
|
|
3039
|
-
'
|
|
3040
|
-
|
|
3041
|
-
'
|
|
3042
|
-
'
|
|
3043
|
-
'
|
|
3044
|
-
'
|
|
3045
|
-
'p.
|
|
3046
|
-
'
|
|
3047
|
-
'
|
|
3063
|
+
'p.enhanceModel': '留空表示使用当前会话模型',
|
|
3064
|
+
'p.fallbackProviders': 'replicate, custom, gemini',
|
|
3065
|
+
'p.geminiKeyEnv': 'GEMINI_API_KEY',
|
|
3066
|
+
'p.geminiModel': 'gemini-3.1-flash-image',
|
|
3067
|
+
'p.historyLimit': '50',
|
|
3068
|
+
'p.localA1111Url': 'http://127.0.0.1:7860',
|
|
3069
|
+
'p.localBaseURL': 'http://127.0.0.1:8188',
|
|
3070
|
+
'p.localCfg': '7',
|
|
3071
|
+
'p.localComfyUrl': 'http://127.0.0.1:8188',
|
|
3072
|
+
'p.localModel': 'v1-5-pruned-emaonly.safetensors',
|
|
3073
|
+
'p.localSteps': '20',
|
|
3048
3074
|
'p.loopGuardLimit': '3',
|
|
3049
|
-
|
|
3050
|
-
'
|
|
3051
|
-
'
|
|
3052
|
-
'f.cacheBySeed': '按 Seed 与提示词命中缓存',
|
|
3053
|
-
'f.cacheBySeedHint': '当 Seed 和提示词均完全一致时直接命中缓存。',
|
|
3054
|
-
'f.cacheByPrompt': '按提示词命中缓存',
|
|
3055
|
-
'f.cacheByPromptHint': '当提示词文本一致时直接命中缓存。',
|
|
3056
|
-
'f.pruneDays': '文件保留天数',
|
|
3057
|
-
'f.pruneDaysHint': '自动清理超过该天数的已生成图像(0 表示永久保留)。',
|
|
3075
|
+
'p.model': 'fal-ai/flux-2/klein/9b',
|
|
3076
|
+
'p.outputDir': 'generated/images',
|
|
3077
|
+
'p.pollIntervalMs': '2000',
|
|
3058
3078
|
'p.pruneDays': '0',
|
|
3059
|
-
'
|
|
3060
|
-
'
|
|
3061
|
-
'p.
|
|
3062
|
-
|
|
3063
|
-
'
|
|
3079
|
+
'p.replicateKeyEnv': 'REPLICATE_API_TOKEN',
|
|
3080
|
+
'p.replicateModel': 'black-forest-labs/flux-schnell',
|
|
3081
|
+
'p.seedreamBaseURL': 'https://api.bytedanceapi.com/v1',
|
|
3082
|
+
'p.seedreamKeyEnv': 'SEEDREAM_API_KEY',
|
|
3083
|
+
'p.seedreamModel': 'seedream-4.0',
|
|
3084
|
+
'p.timeoutMs': '180000',
|
|
3085
|
+
'remix.copied': '✓ 已复制!',
|
|
3086
|
+
'remix.copy_instruction': '复制指令',
|
|
3087
|
+
'remix.creative_btn': '强创意 (0.65)',
|
|
3088
|
+
'remix.creativity_label': '创意度 / 去噪强度',
|
|
3089
|
+
'remix.drawer_title': '变体与风格重混工作台',
|
|
3090
|
+
'remix.prompt_placeholder': '描述风格调整、新背景或变体细节...',
|
|
3091
|
+
'remix.subtle_btn': '微调 (0.25)',
|
|
3092
|
+
'settings.collapse': '折叠',
|
|
3093
|
+
'settings.credentialHint': 'API 密钥存储在 DSH Credentials (~/.dsh/.credentials.yaml) 中,绝不会泄露在配置文件中。',
|
|
3094
|
+
'settings.description': '多提供商 AI 图像生成、局部重绘、变体、放大及矢量化。',
|
|
3095
|
+
'settings.discard': '放弃修改',
|
|
3096
|
+
'settings.expand': '展开',
|
|
3097
|
+
'settings.invalidNumber': '请输入有效数值',
|
|
3098
|
+
'settings.loading': '正在加载插件设置…',
|
|
3099
|
+
'settings.navLabel': 'AI 图像工坊',
|
|
3100
|
+
'settings.overridden': '已自定义',
|
|
3101
|
+
'settings.readOnly': '在此上下文中设置只读。',
|
|
3102
|
+
'settings.reset': '重置',
|
|
3103
|
+
'settings.save': '保存设置',
|
|
3104
|
+
'settings.saveFailed': '保存设置失败。请检查凭据后重试。',
|
|
3105
|
+
'settings.saving': '保存中…',
|
|
3106
|
+
'settings.title': 'AI 图像工坊',
|
|
3107
|
+
'settings.unavailable': '设置命名空间当前不可用。',
|
|
3108
|
+
'settings.unsaved': '未保存的修改',
|
|
3109
|
+
'stat.active_provider': '当前提供商',
|
|
3110
|
+
'stat.budget_cache': '预算与缓存',
|
|
3111
|
+
'stat.cacheOff': '关闭',
|
|
3112
|
+
'stat.cacheOn': '缓存已开启',
|
|
3113
|
+
'stat.format_size': '默认规格',
|
|
3114
|
+
'stat.gateActive': '门禁已启用',
|
|
3115
|
+
'stat.gateOff': '关闭',
|
|
3116
|
+
'stat.guard': '防护 {n}',
|
|
3117
|
+
'stat.noLimit': '无限制',
|
|
3118
|
+
'stat.safety_status': '安全与防循环保护',
|
|
3119
|
+
'studio.aspectRatio': '宽高比:',
|
|
3064
3120
|
'studio.canvas': '创作画布',
|
|
3065
|
-
'studio.
|
|
3066
|
-
'studio.
|
|
3121
|
+
'studio.copiedCommand': '已将生成指令复制到剪贴板!',
|
|
3122
|
+
'studio.copiedSnippet': '代码片段已复制到剪贴板!',
|
|
3123
|
+
'studio.copyHtml': '复制 HTML',
|
|
3124
|
+
'studio.copyMarkdown': '复制 Markdown',
|
|
3125
|
+
'studio.download': '下载图像',
|
|
3126
|
+
'studio.emptyCanvas': '从下方最近生成列表中选择图像,或点击生成。',
|
|
3127
|
+
'studio.exitFullscreen': '退出全屏',
|
|
3128
|
+
'studio.fullscreen': '全屏',
|
|
3067
3129
|
'studio.generate': '在对话中生成',
|
|
3068
|
-
'studio.
|
|
3130
|
+
'studio.parameters': '生成参数配置',
|
|
3069
3131
|
'studio.prompt': '提示词:',
|
|
3070
3132
|
'studio.promptPlaceholder': '描述你想创作的画面...',
|
|
3071
|
-
'studio.stylePreset': '风格预设:',
|
|
3072
|
-
'studio.aspectRatio': '宽高比:',
|
|
3073
3133
|
'studio.provider': '生成引擎:',
|
|
3074
|
-
'studio.seed': '随机种子 (可选):',
|
|
3075
3134
|
'studio.random': '随机',
|
|
3076
3135
|
'studio.randomizeSeed': '随机生成种子',
|
|
3077
|
-
'studio.
|
|
3078
|
-
'studio.
|
|
3079
|
-
'studio.
|
|
3080
|
-
'studio.
|
|
3081
|
-
'studio.
|
|
3082
|
-
'
|
|
3083
|
-
'
|
|
3084
|
-
'
|
|
3085
|
-
|
|
3086
|
-
'
|
|
3087
|
-
'
|
|
3088
|
-
'
|
|
3089
|
-
'
|
|
3090
|
-
'
|
|
3091
|
-
'
|
|
3092
|
-
'
|
|
3093
|
-
'
|
|
3094
|
-
'
|
|
3136
|
+
'studio.recent': '最近生成历史',
|
|
3137
|
+
'studio.seed': '随机种子 (可选):',
|
|
3138
|
+
'studio.stylePreset': '风格预设:',
|
|
3139
|
+
'studio.title': '图像创作工作台',
|
|
3140
|
+
'studio.vault': '素材资产库',
|
|
3141
|
+
'subtitle': '多提供商支持的图像生成、编辑、局部重绘与矢量化。',
|
|
3142
|
+
'tab.cache': '缓存与性能',
|
|
3143
|
+
'tab.enhancer': '提示词增强',
|
|
3144
|
+
'tab.gallery': '图库',
|
|
3145
|
+
'tab.general': '常规',
|
|
3146
|
+
'tab.provider': '提供商',
|
|
3147
|
+
'tab.safety': '安全与预算',
|
|
3148
|
+
'themePair.copiedCss': '已复制 CSS!',
|
|
3149
|
+
'themePair.copiedHtml': '已复制 HTML!',
|
|
3150
|
+
'themePair.copyCss': '复制 CSS',
|
|
3151
|
+
'themePair.copyHtml': '复制 HTML',
|
|
3152
|
+
'themePair.dark': '深色模式',
|
|
3153
|
+
'themePair.light': '浅色模式',
|
|
3154
|
+
'themePair.title': '主题双色图形',
|
|
3155
|
+
'title': 'AI 图像工坊',
|
|
3156
|
+
'updater.check': '检查更新',
|
|
3157
|
+
'updater.checking': '正在检查…',
|
|
3158
|
+
'updater.current': '当前版本',
|
|
3159
|
+
'updater.failed': '更新检查失败:',
|
|
3160
|
+
'updater.latest': '最新版本',
|
|
3161
|
+
'updater.success': '插件更新成功!请重启 DSH 服务以生效。',
|
|
3162
|
+
'updater.title': '插件更新',
|
|
3163
|
+
'updater.upToDate': '已是最新',
|
|
3164
|
+
'updater.updateNow': '一键更新至 v{version}',
|
|
3165
|
+
'updater.updating': '正在更新…',
|
|
3095
3166
|
'vault.allProviders': '所有引擎',
|
|
3096
3167
|
'vault.allRatios': '所有比例',
|
|
3097
|
-
'vault.newest': '最新',
|
|
3098
|
-
'vault.oldest': '最早',
|
|
3099
|
-
'vault.loading': '加载中...',
|
|
3100
3168
|
'vault.confirmDelete': '确定要删除此素材吗?',
|
|
3101
|
-
'vault.deleted': '素材已删除',
|
|
3102
|
-
'vault.deleteFailed': '删除素材失败',
|
|
3103
3169
|
'vault.copiedMarkdown': 'Markdown 片段已复制到剪贴板!',
|
|
3104
3170
|
'vault.copiedPrompt': '提示词与种子已复制到剪贴板!',
|
|
3171
|
+
'vault.delete': '删除',
|
|
3172
|
+
'vault.deleteFailed': '删除素材失败',
|
|
3173
|
+
'vault.deleted': '素材已删除',
|
|
3174
|
+
'vault.download': '下载图像',
|
|
3175
|
+
'vault.empty': '素材库中暂无图像。',
|
|
3176
|
+
'vault.insert': '插入到当前对话',
|
|
3177
|
+
'vault.inspector': '素材检查器',
|
|
3178
|
+
'vault.loadMore': '加载更多素材',
|
|
3179
|
+
'vault.loading': '加载中...',
|
|
3180
|
+
'vault.newest': '最新',
|
|
3105
3181
|
'vault.noPrompt': '无提示词',
|
|
3106
|
-
'vault.
|
|
3182
|
+
'vault.oldest': '最早',
|
|
3107
3183
|
'vault.provider': '引擎',
|
|
3184
|
+
'vault.reroll': '使用此种子重新生成',
|
|
3185
|
+
'vault.search': '搜索提示词或标签...',
|
|
3186
|
+
'vault.seed': '种子',
|
|
3187
|
+
'vault.title': '图像素材库与浏览器',
|
|
3188
|
+
'f.comfyTemplate': 'ComfyUI 工作流模板',
|
|
3189
|
+
'f.comfyTemplateHint': '经过验证的预设工作流模板(例如 SDXL 文生图、图生图、InstantID 人脸迁移、RealESRGAN 放大器)。',
|
|
3108
3190
|
}
|
|
3109
|
-
|
|
3110
|
-
// -------------------------------------------------------------- Registration & Apply
|
|
3111
3191
|
// Dual compatibility with DSH 0.1.5-rc.3 (settingsScope) and 0.1.6+ (configForms) (#291, #295)
|
|
3112
3192
|
const inject = ['slots', 'locale', 'sessions']
|
|
3113
3193
|
|
|
@@ -3134,7 +3214,7 @@ window.__ModuleLoader__.load({
|
|
|
3134
3214
|
|
|
3135
3215
|
const syncHttpConfig = () => {
|
|
3136
3216
|
if (typeof fetch !== 'function') return
|
|
3137
|
-
|
|
3217
|
+
fetchJson('/dsh-image-gen/config', { cache: 'no-store' })
|
|
3138
3218
|
.then((r) => r.json())
|
|
3139
3219
|
.then((data) => {
|
|
3140
3220
|
if (data && data.ok && data.config) {
|
|
@@ -3194,7 +3274,7 @@ window.__ModuleLoader__.load({
|
|
|
3194
3274
|
httpSnapshot = { ...httpSnapshot, value: { ...httpSnapshot.value, [key]: val } }
|
|
3195
3275
|
notify()
|
|
3196
3276
|
try {
|
|
3197
|
-
const res = await
|
|
3277
|
+
const res = await fetchJson('/dsh-image-gen/config', {
|
|
3198
3278
|
method: 'PUT',
|
|
3199
3279
|
headers: { 'Content-Type': 'application/json' },
|
|
3200
3280
|
body: JSON.stringify({ [key]: val }),
|
|
@@ -3239,7 +3319,7 @@ window.__ModuleLoader__.load({
|
|
|
3239
3319
|
httpSnapshot = { ...httpSnapshot, value: nextVal }
|
|
3240
3320
|
notify()
|
|
3241
3321
|
try {
|
|
3242
|
-
const res = await
|
|
3322
|
+
const res = await fetchJson('/dsh-image-gen/config', {
|
|
3243
3323
|
method: 'PUT',
|
|
3244
3324
|
headers: { 'Content-Type': 'application/json' },
|
|
3245
3325
|
body: JSON.stringify({ resetFields: [key] }),
|
|
@@ -3512,7 +3592,7 @@ window.__ModuleLoader__.load({
|
|
|
3512
3592
|
offset: String(newOffset),
|
|
3513
3593
|
limit: '24',
|
|
3514
3594
|
})
|
|
3515
|
-
|
|
3595
|
+
fetchJson('/dsh-image-gen/vault?' + params.toString())
|
|
3516
3596
|
.then((r) => r.json())
|
|
3517
3597
|
.then((data) => {
|
|
3518
3598
|
setLoading(false)
|
|
@@ -3531,7 +3611,7 @@ window.__ModuleLoader__.load({
|
|
|
3531
3611
|
|
|
3532
3612
|
const handleDelete = (id) => {
|
|
3533
3613
|
if (!window.confirm(t('vault.confirmDelete') || 'Are you sure you want to delete this asset?')) return
|
|
3534
|
-
|
|
3614
|
+
fetchJson('/dsh-image-gen/vault?id=' + encodeURIComponent(id), { method: 'DELETE' })
|
|
3535
3615
|
.then((r) => r.json())
|
|
3536
3616
|
.then((res) => {
|
|
3537
3617
|
if (res.ok) {
|
|
@@ -3747,7 +3827,7 @@ window.__ModuleLoader__.load({
|
|
|
3747
3827
|
]
|
|
3748
3828
|
|
|
3749
3829
|
const refreshRecent = () => {
|
|
3750
|
-
|
|
3830
|
+
fetchJson('/dsh-image-gen/vault?limit=12')
|
|
3751
3831
|
.then((r) => r.json())
|
|
3752
3832
|
.then((data) => {
|
|
3753
3833
|
if (data && data.ok && Array.isArray(data.items)) {
|