genai-lite 0.4.3 → 0.5.1
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/README.md +377 -16
- package/dist/adapters/image/ElectronDiffusionAdapter.d.ts +10 -0
- package/dist/adapters/image/ElectronDiffusionAdapter.js +11 -0
- package/dist/adapters/image/GenaiElectronImageAdapter.d.ts +69 -0
- package/dist/adapters/image/GenaiElectronImageAdapter.js +273 -0
- package/dist/adapters/image/MockImageAdapter.d.ts +23 -0
- package/dist/adapters/image/MockImageAdapter.js +55 -0
- package/dist/adapters/image/OpenAIImageAdapter.d.ts +62 -0
- package/dist/adapters/image/OpenAIImageAdapter.js +303 -0
- package/dist/config/image-presets.json +212 -0
- package/dist/config/llm-presets.json +326 -0
- package/dist/image/ImageService.d.ts +53 -0
- package/dist/image/ImageService.js +199 -0
- package/dist/image/config.d.ts +48 -0
- package/dist/image/config.js +221 -0
- package/dist/image/services/ImageAdapterRegistry.d.ts +61 -0
- package/dist/image/services/ImageAdapterRegistry.js +95 -0
- package/dist/image/services/ImageModelResolver.d.ts +26 -0
- package/dist/image/services/ImageModelResolver.js +98 -0
- package/dist/image/services/ImagePresetManager.d.ts +27 -0
- package/dist/image/services/ImagePresetManager.js +52 -0
- package/dist/image/services/ImageRequestValidator.d.ts +37 -0
- package/dist/image/services/ImageRequestValidator.js +133 -0
- package/dist/image/services/ImageSettingsResolver.d.ts +25 -0
- package/dist/image/services/ImageSettingsResolver.js +76 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +5 -1
- package/dist/llm/LLMService.d.ts +3 -4
- package/dist/llm/LLMService.js +14 -4
- package/dist/llm/clients/AnthropicClientAdapter.js +2 -2
- package/dist/llm/clients/GeminiClientAdapter.js +2 -2
- package/dist/llm/clients/LlamaCppClientAdapter.d.ts +1 -1
- package/dist/llm/clients/LlamaCppClientAdapter.js +3 -3
- package/dist/llm/clients/OpenAIClientAdapter.js +2 -2
- package/dist/llm/config.js +4 -28
- package/dist/llm/services/ModelResolver.d.ts +6 -4
- package/dist/providers/fromEnvironment.d.ts +5 -1
- package/dist/providers/fromEnvironment.js +29 -4
- package/dist/shared/adapters/errorUtils.d.ts +26 -0
- package/dist/shared/adapters/errorUtils.js +107 -0
- package/dist/shared/services/AdapterRegistry.d.ts +89 -0
- package/dist/shared/services/AdapterRegistry.js +144 -0
- package/dist/shared/services/PresetManager.d.ts +33 -0
- package/dist/shared/services/PresetManager.js +56 -0
- package/dist/types/image.d.ts +399 -0
- package/dist/types/image.js +8 -0
- package/dist/types.d.ts +6 -0
- package/package.json +3 -2
- package/src/config/image-presets.json +212 -0
- /package/src/config/{presets.json → llm-presets.json} +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for image generation providers and models
|
|
4
|
+
*
|
|
5
|
+
* This file defines:
|
|
6
|
+
* - Supported image providers
|
|
7
|
+
* - Default models for each provider
|
|
8
|
+
* - Provider capabilities
|
|
9
|
+
* - Adapter configurations (base URLs, timeouts, etc.)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.IMAGE_ADAPTER_CONFIGS = exports.SUPPORTED_IMAGE_PROVIDERS = void 0;
|
|
13
|
+
exports.getImageProviderById = getImageProviderById;
|
|
14
|
+
exports.getImageModelsByProvider = getImageModelsByProvider;
|
|
15
|
+
exports.getImageModelInfo = getImageModelInfo;
|
|
16
|
+
exports.getImageProviderCapabilities = getImageProviderCapabilities;
|
|
17
|
+
/**
|
|
18
|
+
* Supported image generation providers
|
|
19
|
+
*/
|
|
20
|
+
exports.SUPPORTED_IMAGE_PROVIDERS = [
|
|
21
|
+
{
|
|
22
|
+
id: 'openai-images',
|
|
23
|
+
displayName: 'OpenAI Images',
|
|
24
|
+
description: 'DALL-E and GPT-Image models from OpenAI',
|
|
25
|
+
capabilities: {
|
|
26
|
+
supportsMultipleImages: true,
|
|
27
|
+
supportsB64Json: true,
|
|
28
|
+
supportsHostedUrls: true,
|
|
29
|
+
supportsProgressEvents: false,
|
|
30
|
+
supportsNegativePrompt: false,
|
|
31
|
+
defaultModelId: 'gpt-image-1-mini',
|
|
32
|
+
},
|
|
33
|
+
models: [
|
|
34
|
+
{
|
|
35
|
+
id: 'gpt-image-1-mini',
|
|
36
|
+
providerId: 'openai-images',
|
|
37
|
+
displayName: 'GPT-Image 1 Mini',
|
|
38
|
+
description: 'Fast and efficient image generation with GPT-Image (32K char prompts, supports transparency, webp/jpeg output)',
|
|
39
|
+
capabilities: {
|
|
40
|
+
supportsMultipleImages: true,
|
|
41
|
+
supportsB64Json: true,
|
|
42
|
+
supportsHostedUrls: false, // gpt-image-1 always returns base64
|
|
43
|
+
supportsProgressEvents: false,
|
|
44
|
+
supportsNegativePrompt: false,
|
|
45
|
+
defaultModelId: 'gpt-image-1-mini',
|
|
46
|
+
},
|
|
47
|
+
defaultSettings: {
|
|
48
|
+
width: 1024,
|
|
49
|
+
height: 1024,
|
|
50
|
+
quality: 'auto',
|
|
51
|
+
responseFormat: 'buffer',
|
|
52
|
+
openai: {
|
|
53
|
+
outputFormat: 'png',
|
|
54
|
+
background: 'auto',
|
|
55
|
+
moderation: 'auto',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'gpt-image-1',
|
|
61
|
+
providerId: 'openai-images',
|
|
62
|
+
displayName: 'GPT-Image 1',
|
|
63
|
+
description: 'Most advanced OpenAI image model with highest quality (32K char prompts, supports transparency, compression control)',
|
|
64
|
+
capabilities: {
|
|
65
|
+
supportsMultipleImages: true,
|
|
66
|
+
supportsB64Json: true,
|
|
67
|
+
supportsHostedUrls: false, // gpt-image-1 always returns base64
|
|
68
|
+
supportsProgressEvents: false,
|
|
69
|
+
supportsNegativePrompt: false,
|
|
70
|
+
defaultModelId: 'gpt-image-1',
|
|
71
|
+
},
|
|
72
|
+
defaultSettings: {
|
|
73
|
+
width: 1024,
|
|
74
|
+
height: 1024,
|
|
75
|
+
quality: 'auto',
|
|
76
|
+
responseFormat: 'buffer',
|
|
77
|
+
openai: {
|
|
78
|
+
outputFormat: 'png',
|
|
79
|
+
background: 'auto',
|
|
80
|
+
moderation: 'auto',
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'dall-e-3',
|
|
86
|
+
providerId: 'openai-images',
|
|
87
|
+
displayName: 'DALL-E 3',
|
|
88
|
+
description: 'High-quality DALL-E model with improved prompt adherence (4K char prompts, only n=1)',
|
|
89
|
+
capabilities: {
|
|
90
|
+
supportsMultipleImages: false, // dall-e-3 only supports n=1
|
|
91
|
+
supportsB64Json: true,
|
|
92
|
+
supportsHostedUrls: true,
|
|
93
|
+
supportsProgressEvents: false,
|
|
94
|
+
supportsNegativePrompt: false,
|
|
95
|
+
defaultModelId: 'dall-e-3',
|
|
96
|
+
},
|
|
97
|
+
defaultSettings: {
|
|
98
|
+
width: 1024,
|
|
99
|
+
height: 1024,
|
|
100
|
+
quality: 'standard',
|
|
101
|
+
style: 'vivid',
|
|
102
|
+
responseFormat: 'buffer',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: 'dall-e-2',
|
|
107
|
+
providerId: 'openai-images',
|
|
108
|
+
displayName: 'DALL-E 2',
|
|
109
|
+
description: 'Previous generation DALL-E model (1K char prompts)',
|
|
110
|
+
capabilities: {
|
|
111
|
+
supportsMultipleImages: true,
|
|
112
|
+
supportsB64Json: true,
|
|
113
|
+
supportsHostedUrls: true,
|
|
114
|
+
supportsProgressEvents: false,
|
|
115
|
+
supportsNegativePrompt: false,
|
|
116
|
+
defaultModelId: 'dall-e-2',
|
|
117
|
+
},
|
|
118
|
+
defaultSettings: {
|
|
119
|
+
width: 1024,
|
|
120
|
+
height: 1024,
|
|
121
|
+
quality: 'standard',
|
|
122
|
+
responseFormat: 'buffer',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'genai-electron-images',
|
|
129
|
+
displayName: 'Local Diffusion (genai-electron)',
|
|
130
|
+
description: 'Local stable-diffusion models via genai-electron wrapper',
|
|
131
|
+
capabilities: {
|
|
132
|
+
supportsMultipleImages: true,
|
|
133
|
+
supportsB64Json: true,
|
|
134
|
+
supportsHostedUrls: false,
|
|
135
|
+
supportsProgressEvents: true,
|
|
136
|
+
supportsNegativePrompt: true,
|
|
137
|
+
defaultModelId: 'stable-diffusion',
|
|
138
|
+
},
|
|
139
|
+
models: [
|
|
140
|
+
{
|
|
141
|
+
id: 'stable-diffusion',
|
|
142
|
+
providerId: 'genai-electron-images',
|
|
143
|
+
displayName: 'Stable Diffusion',
|
|
144
|
+
description: 'High-quality local diffusion model',
|
|
145
|
+
capabilities: {
|
|
146
|
+
supportsMultipleImages: true,
|
|
147
|
+
supportsB64Json: true,
|
|
148
|
+
supportsHostedUrls: false,
|
|
149
|
+
supportsProgressEvents: true,
|
|
150
|
+
supportsNegativePrompt: true,
|
|
151
|
+
defaultModelId: 'stable-diffusion',
|
|
152
|
+
},
|
|
153
|
+
defaultSettings: {
|
|
154
|
+
width: 512,
|
|
155
|
+
height: 512,
|
|
156
|
+
responseFormat: 'buffer',
|
|
157
|
+
diffusion: {
|
|
158
|
+
steps: 20,
|
|
159
|
+
cfgScale: 7.5,
|
|
160
|
+
sampler: 'dpm++2m',
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
/**
|
|
168
|
+
* Adapter configurations for each provider
|
|
169
|
+
* These define base URLs and other adapter-specific settings
|
|
170
|
+
*/
|
|
171
|
+
exports.IMAGE_ADAPTER_CONFIGS = {
|
|
172
|
+
'openai-images': {
|
|
173
|
+
baseURL: process.env.OPENAI_API_BASE_URL || 'https://api.openai.com/v1',
|
|
174
|
+
timeout: 60000, // 60 seconds for image generation
|
|
175
|
+
},
|
|
176
|
+
'genai-electron-images': {
|
|
177
|
+
baseURL: process.env.GENAI_ELECTRON_IMAGE_BASE_URL || 'http://localhost:8081',
|
|
178
|
+
timeout: 120000, // 120 seconds for local diffusion
|
|
179
|
+
checkHealth: false, // Optional health checks
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Gets provider information by ID
|
|
184
|
+
*
|
|
185
|
+
* @param providerId - The provider ID to look up
|
|
186
|
+
* @returns Provider information or null if not found
|
|
187
|
+
*/
|
|
188
|
+
function getImageProviderById(providerId) {
|
|
189
|
+
return exports.SUPPORTED_IMAGE_PROVIDERS.find(p => p.id === providerId) || null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Gets all models for a specific provider
|
|
193
|
+
*
|
|
194
|
+
* @param providerId - The provider ID
|
|
195
|
+
* @returns Array of model information
|
|
196
|
+
*/
|
|
197
|
+
function getImageModelsByProvider(providerId) {
|
|
198
|
+
const provider = getImageProviderById(providerId);
|
|
199
|
+
return provider?.models || [];
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Gets model information by provider and model ID
|
|
203
|
+
*
|
|
204
|
+
* @param providerId - The provider ID
|
|
205
|
+
* @param modelId - The model ID
|
|
206
|
+
* @returns Model information or null if not found
|
|
207
|
+
*/
|
|
208
|
+
function getImageModelInfo(providerId, modelId) {
|
|
209
|
+
const models = getImageModelsByProvider(providerId);
|
|
210
|
+
return models.find(m => m.id === modelId) || null;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Gets default capabilities for a provider
|
|
214
|
+
*
|
|
215
|
+
* @param providerId - The provider ID
|
|
216
|
+
* @returns Provider capabilities or null if not found
|
|
217
|
+
*/
|
|
218
|
+
function getImageProviderCapabilities(providerId) {
|
|
219
|
+
const provider = getImageProviderById(providerId);
|
|
220
|
+
return provider?.capabilities || null;
|
|
221
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ImageProviderId } from '../../types/image';
|
|
2
|
+
import type { ImageProviderAdapter } from '../../types/image';
|
|
3
|
+
/**
|
|
4
|
+
* Information about a registered adapter
|
|
5
|
+
*/
|
|
6
|
+
export interface AdapterInfo {
|
|
7
|
+
providerId: ImageProviderId;
|
|
8
|
+
hasAdapter: boolean;
|
|
9
|
+
adapterInfo?: {
|
|
10
|
+
name: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Summary of provider availability
|
|
15
|
+
*/
|
|
16
|
+
export interface ProviderSummary {
|
|
17
|
+
totalProviders: number;
|
|
18
|
+
providersWithAdapters: number;
|
|
19
|
+
availableProviders: string[];
|
|
20
|
+
unavailableProviders: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Registry for managing image provider adapters
|
|
24
|
+
*/
|
|
25
|
+
export declare class ImageAdapterRegistry {
|
|
26
|
+
private imageAdapters;
|
|
27
|
+
private mockImageAdapter;
|
|
28
|
+
constructor();
|
|
29
|
+
/**
|
|
30
|
+
* Initializes adapters for all supported providers
|
|
31
|
+
* Note: In Phase 3, we're only setting up the registry structure.
|
|
32
|
+
* Real adapters (OpenAI, Electron) will be added in Phases 4-5.
|
|
33
|
+
*/
|
|
34
|
+
private initializeAdapters;
|
|
35
|
+
/**
|
|
36
|
+
* Registers an image adapter for a specific provider
|
|
37
|
+
*
|
|
38
|
+
* @param providerId - The provider ID
|
|
39
|
+
* @param adapter - The adapter implementation
|
|
40
|
+
*/
|
|
41
|
+
registerAdapter(providerId: ImageProviderId, adapter: ImageProviderAdapter): void;
|
|
42
|
+
/**
|
|
43
|
+
* Gets the appropriate adapter for a provider
|
|
44
|
+
*
|
|
45
|
+
* @param providerId - The provider ID
|
|
46
|
+
* @returns The adapter to use
|
|
47
|
+
*/
|
|
48
|
+
getAdapter(providerId: ImageProviderId): ImageProviderAdapter;
|
|
49
|
+
/**
|
|
50
|
+
* Gets information about registered adapters
|
|
51
|
+
*
|
|
52
|
+
* @returns Map of provider IDs to adapter info
|
|
53
|
+
*/
|
|
54
|
+
getRegisteredAdapters(): Map<ImageProviderId, AdapterInfo>;
|
|
55
|
+
/**
|
|
56
|
+
* Gets a summary of available providers and their adapter status
|
|
57
|
+
*
|
|
58
|
+
* @returns Summary of provider availability
|
|
59
|
+
*/
|
|
60
|
+
getProviderSummary(): ProviderSummary;
|
|
61
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ImageAdapterRegistry = void 0;
|
|
4
|
+
const MockImageAdapter_1 = require("../../adapters/image/MockImageAdapter");
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
/**
|
|
7
|
+
* Registry for managing image provider adapters
|
|
8
|
+
*/
|
|
9
|
+
class ImageAdapterRegistry {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.imageAdapters = new Map();
|
|
12
|
+
this.mockImageAdapter = new MockImageAdapter_1.MockImageAdapter();
|
|
13
|
+
this.initializeAdapters();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Initializes adapters for all supported providers
|
|
17
|
+
* Note: In Phase 3, we're only setting up the registry structure.
|
|
18
|
+
* Real adapters (OpenAI, Electron) will be added in Phases 4-5.
|
|
19
|
+
*/
|
|
20
|
+
initializeAdapters() {
|
|
21
|
+
console.log('ImageAdapterRegistry: Initializing image adapters');
|
|
22
|
+
// For Phase 3, we don't have real adapter implementations yet
|
|
23
|
+
// They will be added in Phase 4 (OpenAI) and Phase 5 (Electron)
|
|
24
|
+
// For now, all providers will use the mock adapter as fallback
|
|
25
|
+
console.log(`ImageAdapterRegistry: Registry initialized. Real adapters will be added in Phases 4-5. ` +
|
|
26
|
+
`Currently using mock adapter as fallback for all providers.`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Registers an image adapter for a specific provider
|
|
30
|
+
*
|
|
31
|
+
* @param providerId - The provider ID
|
|
32
|
+
* @param adapter - The adapter implementation
|
|
33
|
+
*/
|
|
34
|
+
registerAdapter(providerId, adapter) {
|
|
35
|
+
this.imageAdapters.set(providerId, adapter);
|
|
36
|
+
console.log(`ImageAdapterRegistry: Registered adapter for provider: ${providerId}`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Gets the appropriate adapter for a provider
|
|
40
|
+
*
|
|
41
|
+
* @param providerId - The provider ID
|
|
42
|
+
* @returns The adapter to use
|
|
43
|
+
*/
|
|
44
|
+
getAdapter(providerId) {
|
|
45
|
+
// Check for registered real adapters first
|
|
46
|
+
const registeredAdapter = this.imageAdapters.get(providerId);
|
|
47
|
+
if (registeredAdapter) {
|
|
48
|
+
console.log(`ImageAdapterRegistry: Using registered adapter for provider: ${providerId}`);
|
|
49
|
+
return registeredAdapter;
|
|
50
|
+
}
|
|
51
|
+
// Fall back to mock adapter for unsupported providers
|
|
52
|
+
console.log(`ImageAdapterRegistry: No real adapter found for ${providerId}, using mock adapter`);
|
|
53
|
+
return this.mockImageAdapter;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Gets information about registered adapters
|
|
57
|
+
*
|
|
58
|
+
* @returns Map of provider IDs to adapter info
|
|
59
|
+
*/
|
|
60
|
+
getRegisteredAdapters() {
|
|
61
|
+
const adapterInfo = new Map();
|
|
62
|
+
for (const [providerId, adapter] of this.imageAdapters.entries()) {
|
|
63
|
+
adapterInfo.set(providerId, {
|
|
64
|
+
providerId,
|
|
65
|
+
hasAdapter: true,
|
|
66
|
+
adapterInfo: { name: adapter.id },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return adapterInfo;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Gets a summary of available providers and their adapter status
|
|
73
|
+
*
|
|
74
|
+
* @returns Summary of provider availability
|
|
75
|
+
*/
|
|
76
|
+
getProviderSummary() {
|
|
77
|
+
const availableProviders = [];
|
|
78
|
+
const unavailableProviders = [];
|
|
79
|
+
for (const provider of config_1.SUPPORTED_IMAGE_PROVIDERS) {
|
|
80
|
+
if (this.imageAdapters.has(provider.id)) {
|
|
81
|
+
availableProviders.push(provider.id);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
unavailableProviders.push(provider.id);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
totalProviders: config_1.SUPPORTED_IMAGE_PROVIDERS.length,
|
|
89
|
+
providersWithAdapters: availableProviders.length,
|
|
90
|
+
availableProviders,
|
|
91
|
+
unavailableProviders,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.ImageAdapterRegistry = ImageAdapterRegistry;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ImageProviderId, ImageGenerationRequest, ImageGenerationRequestWithPreset, ImageModelInfo, ImageGenerationSettings, ImageFailureResponse, ImagePreset } from '../../types/image';
|
|
2
|
+
import { PresetManager } from '../../shared/services/PresetManager';
|
|
3
|
+
/**
|
|
4
|
+
* Result of model resolution
|
|
5
|
+
*/
|
|
6
|
+
export interface ModelResolutionResult {
|
|
7
|
+
providerId?: ImageProviderId;
|
|
8
|
+
modelId?: string;
|
|
9
|
+
modelInfo?: ImageModelInfo;
|
|
10
|
+
settings?: ImageGenerationSettings;
|
|
11
|
+
error?: ImageFailureResponse;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolves model information from presets or direct IDs
|
|
15
|
+
*/
|
|
16
|
+
export declare class ImageModelResolver {
|
|
17
|
+
private presetManager;
|
|
18
|
+
constructor(presetManager: PresetManager<ImagePreset>);
|
|
19
|
+
/**
|
|
20
|
+
* Resolves model information from a request
|
|
21
|
+
*
|
|
22
|
+
* @param request - The request (with preset or direct IDs)
|
|
23
|
+
* @returns Resolution result
|
|
24
|
+
*/
|
|
25
|
+
resolve(request: ImageGenerationRequest | ImageGenerationRequestWithPreset): ModelResolutionResult;
|
|
26
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ImageModelResolver = void 0;
|
|
4
|
+
const config_1 = require("../config");
|
|
5
|
+
/**
|
|
6
|
+
* Resolves model information from presets or direct IDs
|
|
7
|
+
*/
|
|
8
|
+
class ImageModelResolver {
|
|
9
|
+
constructor(presetManager) {
|
|
10
|
+
this.presetManager = presetManager;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolves model information from a request
|
|
14
|
+
*
|
|
15
|
+
* @param request - The request (with preset or direct IDs)
|
|
16
|
+
* @returns Resolution result
|
|
17
|
+
*/
|
|
18
|
+
resolve(request) {
|
|
19
|
+
const reqWithPreset = request;
|
|
20
|
+
// Check if using preset
|
|
21
|
+
if (reqWithPreset.presetId) {
|
|
22
|
+
const preset = this.presetManager.resolvePreset(reqWithPreset.presetId);
|
|
23
|
+
if (!preset) {
|
|
24
|
+
return {
|
|
25
|
+
error: {
|
|
26
|
+
object: 'error',
|
|
27
|
+
providerId: 'unknown',
|
|
28
|
+
error: {
|
|
29
|
+
message: `Preset not found: ${reqWithPreset.presetId}`,
|
|
30
|
+
code: 'PRESET_NOT_FOUND',
|
|
31
|
+
type: 'validation_error',
|
|
32
|
+
param: 'presetId',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Get model info
|
|
38
|
+
const modelInfo = (0, config_1.getImageModelInfo)(preset.providerId, preset.modelId);
|
|
39
|
+
if (!modelInfo) {
|
|
40
|
+
return {
|
|
41
|
+
error: {
|
|
42
|
+
object: 'error',
|
|
43
|
+
providerId: preset.providerId,
|
|
44
|
+
modelId: preset.modelId,
|
|
45
|
+
error: {
|
|
46
|
+
message: `Model not found: ${preset.modelId} for provider ${preset.providerId}`,
|
|
47
|
+
code: 'MODEL_NOT_FOUND',
|
|
48
|
+
type: 'validation_error',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
providerId: preset.providerId,
|
|
55
|
+
modelId: preset.modelId,
|
|
56
|
+
modelInfo,
|
|
57
|
+
settings: preset.settings,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Using direct provider ID and model ID
|
|
61
|
+
const reqDirect = request;
|
|
62
|
+
if (!reqDirect.providerId || !reqDirect.modelId) {
|
|
63
|
+
return {
|
|
64
|
+
error: {
|
|
65
|
+
object: 'error',
|
|
66
|
+
providerId: reqDirect.providerId || 'unknown',
|
|
67
|
+
modelId: reqDirect.modelId,
|
|
68
|
+
error: {
|
|
69
|
+
message: 'Either presetId or both providerId and modelId must be specified',
|
|
70
|
+
code: 'MISSING_MODEL_INFO',
|
|
71
|
+
type: 'validation_error',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const modelInfo = (0, config_1.getImageModelInfo)(reqDirect.providerId, reqDirect.modelId);
|
|
77
|
+
if (!modelInfo) {
|
|
78
|
+
return {
|
|
79
|
+
error: {
|
|
80
|
+
object: 'error',
|
|
81
|
+
providerId: reqDirect.providerId,
|
|
82
|
+
modelId: reqDirect.modelId,
|
|
83
|
+
error: {
|
|
84
|
+
message: `Model not found: ${reqDirect.modelId} for provider ${reqDirect.providerId}`,
|
|
85
|
+
code: 'MODEL_NOT_FOUND',
|
|
86
|
+
type: 'validation_error',
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
providerId: reqDirect.providerId,
|
|
93
|
+
modelId: reqDirect.modelId,
|
|
94
|
+
modelInfo,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.ImageModelResolver = ImageModelResolver;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ImagePreset } from "../../types/image";
|
|
2
|
+
/**
|
|
3
|
+
* Defines how custom image presets interact with the default presets.
|
|
4
|
+
* 'replace': Use only the custom presets provided. The default set is ignored.
|
|
5
|
+
* 'extend': Use the default presets, and add/override them with the custom presets. This is the default behavior.
|
|
6
|
+
*/
|
|
7
|
+
export type PresetMode = 'replace' | 'extend';
|
|
8
|
+
/**
|
|
9
|
+
* Manages image generation presets including loading, merging, and resolution
|
|
10
|
+
*/
|
|
11
|
+
export declare class ImagePresetManager {
|
|
12
|
+
private presets;
|
|
13
|
+
constructor(customPresets?: ImagePreset[], mode?: PresetMode);
|
|
14
|
+
/**
|
|
15
|
+
* Gets all configured image presets
|
|
16
|
+
*
|
|
17
|
+
* @returns Array of image presets
|
|
18
|
+
*/
|
|
19
|
+
getPresets(): ImagePreset[];
|
|
20
|
+
/**
|
|
21
|
+
* Resolves a preset by ID
|
|
22
|
+
*
|
|
23
|
+
* @param presetId - The preset ID to resolve
|
|
24
|
+
* @returns The preset if found, null otherwise
|
|
25
|
+
*/
|
|
26
|
+
resolvePreset(presetId: string): ImagePreset | null;
|
|
27
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ImagePresetManager = void 0;
|
|
7
|
+
const image_presets_json_1 = __importDefault(require("../../config/image-presets.json"));
|
|
8
|
+
// Type assertion for the imported JSON
|
|
9
|
+
const defaultImagePresets = image_presets_json_1.default;
|
|
10
|
+
/**
|
|
11
|
+
* Manages image generation presets including loading, merging, and resolution
|
|
12
|
+
*/
|
|
13
|
+
class ImagePresetManager {
|
|
14
|
+
constructor(customPresets = [], mode = 'extend') {
|
|
15
|
+
// Initialize presets based on mode
|
|
16
|
+
const finalPresets = new Map();
|
|
17
|
+
if (mode === 'replace') {
|
|
18
|
+
// Replace Mode: Only use custom presets.
|
|
19
|
+
for (const preset of customPresets) {
|
|
20
|
+
finalPresets.set(preset.id, preset);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Extend Mode: Load defaults first, then add/override.
|
|
25
|
+
for (const preset of defaultImagePresets) {
|
|
26
|
+
finalPresets.set(preset.id, preset);
|
|
27
|
+
}
|
|
28
|
+
for (const preset of customPresets) {
|
|
29
|
+
finalPresets.set(preset.id, preset);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
this.presets = Array.from(finalPresets.values());
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Gets all configured image presets
|
|
36
|
+
*
|
|
37
|
+
* @returns Array of image presets
|
|
38
|
+
*/
|
|
39
|
+
getPresets() {
|
|
40
|
+
return [...this.presets]; // Return a copy to prevent external modification
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolves a preset by ID
|
|
44
|
+
*
|
|
45
|
+
* @param presetId - The preset ID to resolve
|
|
46
|
+
* @returns The preset if found, null otherwise
|
|
47
|
+
*/
|
|
48
|
+
resolvePreset(presetId) {
|
|
49
|
+
return this.presets.find(p => p.id === presetId) || null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.ImagePresetManager = ImagePresetManager;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ImageGenerationRequest, ImageFailureResponse } from '../../types/image';
|
|
2
|
+
/**
|
|
3
|
+
* Validates image generation requests
|
|
4
|
+
*/
|
|
5
|
+
export declare class ImageRequestValidator {
|
|
6
|
+
/**
|
|
7
|
+
* Validates the basic structure of an image generation request
|
|
8
|
+
*
|
|
9
|
+
* @param request - The request to validate
|
|
10
|
+
* @returns null if valid, ImageFailureResponse if invalid
|
|
11
|
+
*/
|
|
12
|
+
validateRequestStructure(request: ImageGenerationRequest): ImageFailureResponse | null;
|
|
13
|
+
/**
|
|
14
|
+
* Validates the count parameter
|
|
15
|
+
*
|
|
16
|
+
* @param request - The request containing the count
|
|
17
|
+
* @returns null if valid, ImageFailureResponse if invalid
|
|
18
|
+
*/
|
|
19
|
+
private validateCount;
|
|
20
|
+
/**
|
|
21
|
+
* Validates settings
|
|
22
|
+
*
|
|
23
|
+
* @param request - The request containing the settings
|
|
24
|
+
* @returns null if valid, ImageFailureResponse if invalid
|
|
25
|
+
*/
|
|
26
|
+
private validateSettings;
|
|
27
|
+
/**
|
|
28
|
+
* Creates a validation error response
|
|
29
|
+
*
|
|
30
|
+
* @param request - The original request
|
|
31
|
+
* @param message - Error message
|
|
32
|
+
* @param code - Error code
|
|
33
|
+
* @param param - Parameter that caused the error
|
|
34
|
+
* @returns ImageFailureResponse
|
|
35
|
+
*/
|
|
36
|
+
private createValidationError;
|
|
37
|
+
}
|