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.
- 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 +194 -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 +1 -1
- 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;
|