genai-lite 0.4.3 → 0.5.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 (49) hide show
  1. package/README.md +377 -16
  2. package/dist/adapters/image/ElectronDiffusionAdapter.d.ts +10 -0
  3. package/dist/adapters/image/ElectronDiffusionAdapter.js +11 -0
  4. package/dist/adapters/image/GenaiElectronImageAdapter.d.ts +69 -0
  5. package/dist/adapters/image/GenaiElectronImageAdapter.js +273 -0
  6. package/dist/adapters/image/MockImageAdapter.d.ts +23 -0
  7. package/dist/adapters/image/MockImageAdapter.js +55 -0
  8. package/dist/adapters/image/OpenAIImageAdapter.d.ts +62 -0
  9. package/dist/adapters/image/OpenAIImageAdapter.js +303 -0
  10. package/dist/config/image-presets.json +194 -0
  11. package/dist/config/llm-presets.json +326 -0
  12. package/dist/image/ImageService.d.ts +53 -0
  13. package/dist/image/ImageService.js +199 -0
  14. package/dist/image/config.d.ts +48 -0
  15. package/dist/image/config.js +221 -0
  16. package/dist/image/services/ImageAdapterRegistry.d.ts +61 -0
  17. package/dist/image/services/ImageAdapterRegistry.js +95 -0
  18. package/dist/image/services/ImageModelResolver.d.ts +26 -0
  19. package/dist/image/services/ImageModelResolver.js +98 -0
  20. package/dist/image/services/ImagePresetManager.d.ts +27 -0
  21. package/dist/image/services/ImagePresetManager.js +52 -0
  22. package/dist/image/services/ImageRequestValidator.d.ts +37 -0
  23. package/dist/image/services/ImageRequestValidator.js +133 -0
  24. package/dist/image/services/ImageSettingsResolver.d.ts +25 -0
  25. package/dist/image/services/ImageSettingsResolver.js +76 -0
  26. package/dist/index.d.ts +4 -2
  27. package/dist/index.js +5 -1
  28. package/dist/llm/LLMService.d.ts +3 -4
  29. package/dist/llm/LLMService.js +14 -4
  30. package/dist/llm/clients/AnthropicClientAdapter.js +2 -2
  31. package/dist/llm/clients/GeminiClientAdapter.js +2 -2
  32. package/dist/llm/clients/LlamaCppClientAdapter.d.ts +1 -1
  33. package/dist/llm/clients/LlamaCppClientAdapter.js +3 -3
  34. package/dist/llm/clients/OpenAIClientAdapter.js +2 -2
  35. package/dist/llm/config.js +4 -28
  36. package/dist/llm/services/ModelResolver.d.ts +6 -4
  37. package/dist/providers/fromEnvironment.d.ts +5 -1
  38. package/dist/providers/fromEnvironment.js +29 -4
  39. package/dist/shared/adapters/errorUtils.d.ts +26 -0
  40. package/dist/shared/adapters/errorUtils.js +107 -0
  41. package/dist/shared/services/AdapterRegistry.d.ts +89 -0
  42. package/dist/shared/services/AdapterRegistry.js +144 -0
  43. package/dist/shared/services/PresetManager.d.ts +33 -0
  44. package/dist/shared/services/PresetManager.js +56 -0
  45. package/dist/types/image.d.ts +399 -0
  46. package/dist/types/image.js +8 -0
  47. package/dist/types.d.ts +6 -0
  48. package/package.json +1 -1
  49. package/src/config/presets.json +0 -327
@@ -0,0 +1,326 @@
1
+ [
2
+ {
3
+ "id": "anthropic-claude-sonnet-4-20250514-default",
4
+ "displayName": "Anthropic - Claude Sonnet 4",
5
+ "description": "Default preset for Claude Sonnet 4.",
6
+ "providerId": "anthropic",
7
+ "modelId": "claude-sonnet-4-20250514",
8
+ "settings": {
9
+ "temperature": 0.7,
10
+ "reasoning": {
11
+ "enabled": false
12
+ }
13
+ }
14
+ },
15
+ {
16
+ "id": "anthropic-claude-sonnet-4-20250514-thinking",
17
+ "displayName": "Anthropic - Claude Sonnet 4 (Thinking)",
18
+ "description": "Claude Sonnet 4 with reasoning enabled for step-by-step thinking.",
19
+ "providerId": "anthropic",
20
+ "modelId": "claude-sonnet-4-20250514",
21
+ "settings": {
22
+ "temperature": 0.7,
23
+ "reasoning": {
24
+ "enabled": true
25
+ }
26
+ }
27
+ },
28
+ {
29
+ "id": "anthropic-claude-opus-4-20250514-default",
30
+ "displayName": "Anthropic - Claude Opus 4",
31
+ "description": "Default preset for Claude Opus 4.",
32
+ "providerId": "anthropic",
33
+ "modelId": "claude-opus-4-20250514",
34
+ "settings": {
35
+ "temperature": 0.7,
36
+ "reasoning": {
37
+ "enabled": false
38
+ }
39
+ }
40
+ },
41
+ {
42
+ "id": "anthropic-claude-opus-4-20250514-thinking",
43
+ "displayName": "Anthropic - Claude Opus 4 (Thinking)",
44
+ "description": "Claude Opus 4 with reasoning enabled for complex problem solving.",
45
+ "providerId": "anthropic",
46
+ "modelId": "claude-opus-4-20250514",
47
+ "settings": {
48
+ "temperature": 0.7,
49
+ "reasoning": {
50
+ "enabled": true
51
+ }
52
+ }
53
+ },
54
+ {
55
+ "id": "anthropic-claude-3-7-sonnet-20250219-default",
56
+ "displayName": "Anthropic - Claude 3.7 Sonnet",
57
+ "description": "Default preset for Claude 3.7 Sonnet.",
58
+ "providerId": "anthropic",
59
+ "modelId": "claude-3-7-sonnet-20250219",
60
+ "settings": {
61
+ "temperature": 0.7,
62
+ "reasoning": {
63
+ "enabled": false
64
+ }
65
+ }
66
+ },
67
+ {
68
+ "id": "anthropic-claude-3-7-sonnet-20250219-thinking",
69
+ "displayName": "Anthropic - Claude 3.7 Sonnet (Thinking)",
70
+ "description": "Claude 3.7 Sonnet with full reasoning output for detailed analysis.",
71
+ "providerId": "anthropic",
72
+ "modelId": "claude-3-7-sonnet-20250219",
73
+ "settings": {
74
+ "temperature": 0.7,
75
+ "reasoning": {
76
+ "enabled": true
77
+ }
78
+ }
79
+ },
80
+ {
81
+ "id": "anthropic-claude-3-5-sonnet-20241022-default",
82
+ "displayName": "Anthropic - Claude 3.5 Sonnet",
83
+ "description": "Default preset for Claude 3.5 Sonnet.",
84
+ "providerId": "anthropic",
85
+ "modelId": "claude-3-5-sonnet-20241022",
86
+ "settings": {
87
+ "temperature": 0.7
88
+ }
89
+ },
90
+ {
91
+ "id": "anthropic-claude-3-5-haiku-20241022-default",
92
+ "displayName": "Anthropic - Claude 3.5 Haiku",
93
+ "description": "Default preset for Claude 3.5 Haiku.",
94
+ "providerId": "anthropic",
95
+ "modelId": "claude-3-5-haiku-20241022",
96
+ "settings": {
97
+ "temperature": 0.7
98
+ }
99
+ },
100
+ {
101
+ "id": "google-gemini-2.5-pro",
102
+ "displayName": "Google - Gemini 2.5 Pro",
103
+ "description": "Default preset for Gemini 2.5 Pro.",
104
+ "providerId": "gemini",
105
+ "modelId": "gemini-2.5-pro",
106
+ "settings": {
107
+ "temperature": 0.7,
108
+ "geminiSafetySettings": [
109
+ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
110
+ {
111
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
112
+ "threshold": "BLOCK_NONE"
113
+ },
114
+ {
115
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
116
+ "threshold": "BLOCK_NONE"
117
+ },
118
+ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }
119
+ ]
120
+ }
121
+ },
122
+ {
123
+ "id": "google-gemini-2.5-flash",
124
+ "displayName": "Google - Gemini 2.5 Flash",
125
+ "description": "Default preset for Gemini 2.5 Flash.",
126
+ "providerId": "gemini",
127
+ "modelId": "gemini-2.5-flash",
128
+ "settings": {
129
+ "temperature": 0.7,
130
+ "geminiSafetySettings": [
131
+ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
132
+ {
133
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
134
+ "threshold": "BLOCK_NONE"
135
+ },
136
+ {
137
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
138
+ "threshold": "BLOCK_NONE"
139
+ },
140
+ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }
141
+ ],
142
+ "reasoning": {
143
+ "enabled": false
144
+ }
145
+ }
146
+ },
147
+ {
148
+ "id": "google-gemini-2.5-flash-thinking",
149
+ "displayName": "Google - Gemini 2.5 Flash (Thinking)",
150
+ "description": "Gemini 2.5 Flash with dynamic reasoning for adaptive problem solving.",
151
+ "providerId": "gemini",
152
+ "modelId": "gemini-2.5-flash",
153
+ "settings": {
154
+ "temperature": 0.7,
155
+ "geminiSafetySettings": [
156
+ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
157
+ {
158
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
159
+ "threshold": "BLOCK_NONE"
160
+ },
161
+ {
162
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
163
+ "threshold": "BLOCK_NONE"
164
+ },
165
+ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }
166
+ ],
167
+ "reasoning": {
168
+ "enabled": true
169
+ }
170
+ }
171
+ },
172
+ {
173
+ "id": "google-gemini-2.5-flash-lite-preview",
174
+ "displayName": "Google - Gemini 2.5 Flash-Lite Preview",
175
+ "description": "Default preset for Gemini 2.5 Flash-Lite.",
176
+ "providerId": "gemini",
177
+ "modelId": "gemini-2.5-flash-lite-preview-06-17",
178
+ "settings": {
179
+ "temperature": 0.7,
180
+ "geminiSafetySettings": [
181
+ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
182
+ {
183
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
184
+ "threshold": "BLOCK_NONE"
185
+ },
186
+ {
187
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
188
+ "threshold": "BLOCK_NONE"
189
+ },
190
+ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }
191
+ ],
192
+ "reasoning": {
193
+ "enabled": false
194
+ }
195
+ }
196
+ },
197
+ {
198
+ "id": "google-gemini-2.5-flash-lite-preview-thinking",
199
+ "displayName": "Google - Gemini 2.5 Flash-Lite Preview (Thinking)",
200
+ "description": "Gemini 2.5 Flash-Lite with dynamic reasoning for efficient thinking.",
201
+ "providerId": "gemini",
202
+ "modelId": "gemini-2.5-flash-lite-preview-06-17",
203
+ "settings": {
204
+ "temperature": 0.7,
205
+ "geminiSafetySettings": [
206
+ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
207
+ {
208
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
209
+ "threshold": "BLOCK_NONE"
210
+ },
211
+ {
212
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
213
+ "threshold": "BLOCK_NONE"
214
+ },
215
+ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }
216
+ ],
217
+ "reasoning": {
218
+ "enabled": true
219
+ }
220
+ }
221
+ },
222
+ {
223
+ "id": "google-gemini-2.0-flash-default",
224
+ "displayName": "Google - Gemini 2.0 Flash",
225
+ "description": "Default preset for Gemini 2.0 Flash.",
226
+ "providerId": "gemini",
227
+ "modelId": "gemini-2.0-flash",
228
+ "settings": {
229
+ "temperature": 0.7,
230
+ "geminiSafetySettings": [
231
+ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
232
+ {
233
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
234
+ "threshold": "BLOCK_NONE"
235
+ },
236
+ {
237
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
238
+ "threshold": "BLOCK_NONE"
239
+ },
240
+ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }
241
+ ]
242
+ }
243
+ },
244
+ {
245
+ "id": "google-gemini-2.0-flash-lite-default",
246
+ "displayName": "Google - Gemini 2.0 Flash Lite",
247
+ "description": "Default preset for Gemini 2.0 Flash Lite.",
248
+ "providerId": "gemini",
249
+ "modelId": "gemini-2.0-flash-lite",
250
+ "settings": {
251
+ "temperature": 0.7,
252
+ "geminiSafetySettings": [
253
+ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
254
+ {
255
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
256
+ "threshold": "BLOCK_NONE"
257
+ },
258
+ {
259
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
260
+ "threshold": "BLOCK_NONE"
261
+ },
262
+ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }
263
+ ]
264
+ }
265
+ },
266
+ {
267
+ "id": "openai-o4-mini-default",
268
+ "displayName": "OpenAI - o4-mini",
269
+ "description": "Default preset for o4-mini.",
270
+ "providerId": "openai",
271
+ "modelId": "o4-mini",
272
+ "settings": {
273
+ "temperature": 1.0
274
+ }
275
+ },
276
+ {
277
+ "id": "openai-gpt-4.1-default",
278
+ "displayName": "OpenAI - GPT-4.1",
279
+ "description": "Default preset for GPT-4.1.",
280
+ "providerId": "openai",
281
+ "modelId": "gpt-4.1",
282
+ "settings": {
283
+ "temperature": 0.7
284
+ }
285
+ },
286
+ {
287
+ "id": "openai-gpt-4.1-mini-default",
288
+ "displayName": "OpenAI - GPT-4.1 Mini",
289
+ "description": "Default preset for GPT-4.1 Mini.",
290
+ "providerId": "openai",
291
+ "modelId": "gpt-4.1-mini",
292
+ "settings": {
293
+ "temperature": 0.7
294
+ }
295
+ },
296
+ {
297
+ "id": "openai-gpt-4.1-nano-default",
298
+ "displayName": "OpenAI - GPT-4.1 Nano",
299
+ "description": "Default preset for GPT-4.1 Nano.",
300
+ "providerId": "openai",
301
+ "modelId": "gpt-4.1-nano",
302
+ "settings": {
303
+ "temperature": 0.7
304
+ }
305
+ },
306
+ {
307
+ "id": "mistral-codestral-2501-default",
308
+ "displayName": "Mistral AI - Codestral",
309
+ "description": "Default preset for Codestral.",
310
+ "providerId": "mistral",
311
+ "modelId": "codestral-2501",
312
+ "settings": {
313
+ "temperature": 0.7
314
+ }
315
+ },
316
+ {
317
+ "id": "mistral-devstral-small-2505-default",
318
+ "displayName": "Mistral AI - Devstral Small",
319
+ "description": "Default preset for Devstral Small.",
320
+ "providerId": "mistral",
321
+ "modelId": "devstral-small-2505",
322
+ "settings": {
323
+ "temperature": 0.7
324
+ }
325
+ }
326
+ ]
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Main service for image generation operations
3
+ *
4
+ * This service orchestrates image generation requests through provider adapters,
5
+ * manages presets, validates requests, and handles settings resolution.
6
+ */
7
+ import type { ApiKeyProvider } from '../types';
8
+ import type { ImageGenerationRequest, ImageGenerationRequestWithPreset, ImageGenerationResponse, ImageFailureResponse, ImageProviderInfo, ImageModelInfo, ImageProviderId, ImagePreset, ImageServiceOptions } from '../types/image';
9
+ /**
10
+ * Main service for image generation operations
11
+ */
12
+ export declare class ImageService {
13
+ private getApiKey;
14
+ private presetManager;
15
+ private adapterRegistry;
16
+ private requestValidator;
17
+ private settingsResolver;
18
+ private modelResolver;
19
+ constructor(getApiKey: ApiKeyProvider, options?: ImageServiceOptions);
20
+ /**
21
+ * Generates images based on the request
22
+ *
23
+ * @param request - Image generation request
24
+ * @returns Promise resolving to response or error
25
+ */
26
+ generateImage(request: ImageGenerationRequest | ImageGenerationRequestWithPreset): Promise<ImageGenerationResponse | ImageFailureResponse>;
27
+ /**
28
+ * Gets list of supported image providers
29
+ *
30
+ * @returns Promise resolving to array of provider information
31
+ */
32
+ getProviders(): Promise<ImageProviderInfo[]>;
33
+ /**
34
+ * Gets list of supported models for a specific provider
35
+ *
36
+ * @param providerId - The provider ID to get models for
37
+ * @returns Promise resolving to array of model information
38
+ */
39
+ getModels(providerId: ImageProviderId): Promise<ImageModelInfo[]>;
40
+ /**
41
+ * Gets all configured image presets
42
+ *
43
+ * @returns Array of image presets
44
+ */
45
+ getPresets(): ImagePreset[];
46
+ /**
47
+ * Registers a custom image adapter
48
+ *
49
+ * @param providerId - The provider ID
50
+ * @param adapter - The adapter instance
51
+ */
52
+ registerAdapter(providerId: ImageProviderId, adapter: any): void;
53
+ }
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ /**
3
+ * Main service for image generation operations
4
+ *
5
+ * This service orchestrates image generation requests through provider adapters,
6
+ * manages presets, validates requests, and handles settings resolution.
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ImageService = void 0;
13
+ const config_1 = require("./config");
14
+ const image_presets_json_1 = __importDefault(require("../config/image-presets.json"));
15
+ const PresetManager_1 = require("../shared/services/PresetManager");
16
+ const AdapterRegistry_1 = require("../shared/services/AdapterRegistry");
17
+ const MockImageAdapter_1 = require("../adapters/image/MockImageAdapter");
18
+ const OpenAIImageAdapter_1 = require("../adapters/image/OpenAIImageAdapter");
19
+ const GenaiElectronImageAdapter_1 = require("../adapters/image/GenaiElectronImageAdapter");
20
+ const ImageRequestValidator_1 = require("./services/ImageRequestValidator");
21
+ const ImageSettingsResolver_1 = require("./services/ImageSettingsResolver");
22
+ const ImageModelResolver_1 = require("./services/ImageModelResolver");
23
+ // Type assertion for the imported JSON
24
+ const defaultImagePresets = image_presets_json_1.default;
25
+ /**
26
+ * Main service for image generation operations
27
+ */
28
+ class ImageService {
29
+ constructor(getApiKey, options = {}) {
30
+ this.getApiKey = getApiKey;
31
+ // Initialize helper services
32
+ this.presetManager = new PresetManager_1.PresetManager(defaultImagePresets, options.presets, options.presetMode);
33
+ // Initialize adapter registry with fallback
34
+ this.adapterRegistry = new AdapterRegistry_1.AdapterRegistry({
35
+ supportedProviders: config_1.SUPPORTED_IMAGE_PROVIDERS,
36
+ fallbackAdapter: new MockImageAdapter_1.MockImageAdapter(),
37
+ });
38
+ // Register OpenAI adapter
39
+ const openaiConfig = config_1.IMAGE_ADAPTER_CONFIGS['openai-images'];
40
+ const openaiBaseURL = options.baseUrls?.['openai-images'] || openaiConfig.baseURL;
41
+ this.adapterRegistry.registerAdapter('openai-images', new OpenAIImageAdapter_1.OpenAIImageAdapter({
42
+ baseURL: openaiBaseURL,
43
+ timeout: openaiConfig.timeout,
44
+ }));
45
+ // Register genai-electron-images adapter
46
+ const electronConfig = config_1.IMAGE_ADAPTER_CONFIGS['genai-electron-images'];
47
+ const electronBaseURL = options.baseUrls?.['genai-electron-images'] || electronConfig.baseURL;
48
+ this.adapterRegistry.registerAdapter('genai-electron-images', new GenaiElectronImageAdapter_1.GenaiElectronImageAdapter({
49
+ baseURL: electronBaseURL,
50
+ timeout: electronConfig.timeout,
51
+ }));
52
+ // Register custom adapters if provided
53
+ if (options.adapters) {
54
+ for (const [providerId, adapter] of Object.entries(options.adapters)) {
55
+ this.adapterRegistry.registerAdapter(providerId, adapter);
56
+ }
57
+ }
58
+ this.requestValidator = new ImageRequestValidator_1.ImageRequestValidator();
59
+ this.settingsResolver = new ImageSettingsResolver_1.ImageSettingsResolver();
60
+ this.modelResolver = new ImageModelResolver_1.ImageModelResolver(this.presetManager);
61
+ console.log('ImageService: Initialized with OpenAI Images and genai-electron adapters');
62
+ }
63
+ /**
64
+ * Generates images based on the request
65
+ *
66
+ * @param request - Image generation request
67
+ * @returns Promise resolving to response or error
68
+ */
69
+ async generateImage(request) {
70
+ console.log('ImageService.generateImage called');
71
+ try {
72
+ // Resolve model information
73
+ const resolved = this.modelResolver.resolve(request);
74
+ if (resolved.error) {
75
+ return resolved.error;
76
+ }
77
+ const { providerId, modelId, modelInfo, settings: presetSettings } = resolved;
78
+ // Create full request with resolved IDs
79
+ const fullRequest = {
80
+ ...request,
81
+ providerId: providerId,
82
+ modelId: modelId,
83
+ };
84
+ // Validate request structure
85
+ const validationError = this.requestValidator.validateRequestStructure(fullRequest);
86
+ if (validationError) {
87
+ return validationError;
88
+ }
89
+ // Resolve settings (defaults < preset < request)
90
+ const resolvedSettings = this.settingsResolver.resolveSettings(modelInfo, presetSettings, fullRequest.settings);
91
+ // Resolve prompt (apply prefix if from preset)
92
+ const preset = request.presetId
93
+ ? this.presetManager.resolvePreset(request.presetId)
94
+ : null;
95
+ const resolvedPrompt = preset?.promptPrefix
96
+ ? `${preset.promptPrefix} ${fullRequest.prompt}`
97
+ : fullRequest.prompt;
98
+ // Get adapter for provider
99
+ const adapter = this.adapterRegistry.getAdapter(providerId);
100
+ // Get API key
101
+ try {
102
+ const apiKey = await this.getApiKey(providerId);
103
+ // Validate API key if adapter supports it
104
+ if (apiKey && adapter.validateApiKey && !adapter.validateApiKey(apiKey)) {
105
+ return {
106
+ object: 'error',
107
+ providerId: providerId,
108
+ modelId: modelId,
109
+ error: {
110
+ message: `Invalid API key format for provider '${providerId}'`,
111
+ code: 'INVALID_API_KEY',
112
+ type: 'authentication_error',
113
+ },
114
+ };
115
+ }
116
+ // Generate images
117
+ console.log(`ImageService: Calling adapter for provider: ${providerId}`);
118
+ const response = await adapter.generate({
119
+ request: fullRequest,
120
+ resolvedPrompt,
121
+ settings: resolvedSettings,
122
+ apiKey,
123
+ });
124
+ console.log('ImageService: Image generation completed successfully');
125
+ return response;
126
+ }
127
+ catch (error) {
128
+ console.error('ImageService: Error during image generation:', error);
129
+ return {
130
+ object: 'error',
131
+ providerId: providerId,
132
+ modelId: modelId,
133
+ error: {
134
+ message: error instanceof Error
135
+ ? error.message
136
+ : 'An unknown error occurred during image generation',
137
+ code: 'PROVIDER_ERROR',
138
+ type: 'server_error',
139
+ providerError: error,
140
+ },
141
+ };
142
+ }
143
+ }
144
+ catch (error) {
145
+ console.error('ImageService: Unexpected error:', error);
146
+ const req = request;
147
+ return {
148
+ object: 'error',
149
+ providerId: req.providerId || req.presetId || 'unknown',
150
+ modelId: req.modelId,
151
+ error: {
152
+ message: error instanceof Error ? error.message : 'An unexpected error occurred',
153
+ code: 'UNEXPECTED_ERROR',
154
+ type: 'server_error',
155
+ providerError: error,
156
+ },
157
+ };
158
+ }
159
+ }
160
+ /**
161
+ * Gets list of supported image providers
162
+ *
163
+ * @returns Promise resolving to array of provider information
164
+ */
165
+ async getProviders() {
166
+ console.log('ImageService.getProviders called');
167
+ return [...config_1.SUPPORTED_IMAGE_PROVIDERS];
168
+ }
169
+ /**
170
+ * Gets list of supported models for a specific provider
171
+ *
172
+ * @param providerId - The provider ID to get models for
173
+ * @returns Promise resolving to array of model information
174
+ */
175
+ async getModels(providerId) {
176
+ console.log(`ImageService.getModels called for provider: ${providerId}`);
177
+ const models = (0, config_1.getImageModelsByProvider)(providerId);
178
+ console.log(`ImageService: Found ${models.length} models for provider: ${providerId}`);
179
+ return [...models];
180
+ }
181
+ /**
182
+ * Gets all configured image presets
183
+ *
184
+ * @returns Array of image presets
185
+ */
186
+ getPresets() {
187
+ return this.presetManager.getPresets();
188
+ }
189
+ /**
190
+ * Registers a custom image adapter
191
+ *
192
+ * @param providerId - The provider ID
193
+ * @param adapter - The adapter instance
194
+ */
195
+ registerAdapter(providerId, adapter) {
196
+ this.adapterRegistry.registerAdapter(providerId, adapter);
197
+ }
198
+ }
199
+ exports.ImageService = ImageService;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Configuration for image generation providers and models
3
+ *
4
+ * This file defines:
5
+ * - Supported image providers
6
+ * - Default models for each provider
7
+ * - Provider capabilities
8
+ * - Adapter configurations (base URLs, timeouts, etc.)
9
+ */
10
+ import type { ImageProviderId, ImageProviderInfo, ImageModelInfo, ImageProviderAdapterConfig, ImageProviderCapabilities } from '../types/image';
11
+ /**
12
+ * Supported image generation providers
13
+ */
14
+ export declare const SUPPORTED_IMAGE_PROVIDERS: ImageProviderInfo[];
15
+ /**
16
+ * Adapter configurations for each provider
17
+ * These define base URLs and other adapter-specific settings
18
+ */
19
+ export declare const IMAGE_ADAPTER_CONFIGS: Record<ImageProviderId, ImageProviderAdapterConfig>;
20
+ /**
21
+ * Gets provider information by ID
22
+ *
23
+ * @param providerId - The provider ID to look up
24
+ * @returns Provider information or null if not found
25
+ */
26
+ export declare function getImageProviderById(providerId: ImageProviderId): ImageProviderInfo | null;
27
+ /**
28
+ * Gets all models for a specific provider
29
+ *
30
+ * @param providerId - The provider ID
31
+ * @returns Array of model information
32
+ */
33
+ export declare function getImageModelsByProvider(providerId: ImageProviderId): ImageModelInfo[];
34
+ /**
35
+ * Gets model information by provider and model ID
36
+ *
37
+ * @param providerId - The provider ID
38
+ * @param modelId - The model ID
39
+ * @returns Model information or null if not found
40
+ */
41
+ export declare function getImageModelInfo(providerId: ImageProviderId, modelId: string): ImageModelInfo | null;
42
+ /**
43
+ * Gets default capabilities for a provider
44
+ *
45
+ * @param providerId - The provider ID
46
+ * @returns Provider capabilities or null if not found
47
+ */
48
+ export declare function getImageProviderCapabilities(providerId: ImageProviderId): ImageProviderCapabilities | null;