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.
Files changed (50) 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 +212 -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 +3 -2
  49. package/src/config/image-presets.json +212 -0
  50. /package/src/config/{presets.json → llm-presets.json} +0 -0
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ // AI Summary: Centralized error mapping utility for LLM client adapters.
3
+ // Maps common HTTP status codes and network errors to standardized AdapterErrorCode and errorType.
4
+ // Reduces duplication across OpenAI, Anthropic and other provider adapters.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getCommonMappedErrorDetails = getCommonMappedErrorDetails;
7
+ const types_1 = require("../../llm/clients/types");
8
+ /**
9
+ * Maps common error patterns to standardized error codes and types
10
+ *
11
+ * This utility handles:
12
+ * - Common HTTP status codes (401, 402, 404, 429, 4xx, 5xx)
13
+ * - Network connection errors (ENOTFOUND, ECONNREFUSED, timeouts)
14
+ * - Generic JavaScript errors
15
+ *
16
+ * Individual adapters can further refine the mappings for provider-specific cases,
17
+ * particularly for 400 errors where message content determines the specific error type.
18
+ *
19
+ * @param error - The error object from the provider SDK or network layer
20
+ * @param providerMessageOverride - Optional override for the error message (e.g., from provider SDK)
21
+ * @returns Mapped error details with standardized codes and types
22
+ */
23
+ function getCommonMappedErrorDetails(error, providerMessageOverride) {
24
+ let errorCode = types_1.ADAPTER_ERROR_CODES.UNKNOWN_ERROR;
25
+ let errorMessage = providerMessageOverride || error?.message || 'Unknown error occurred';
26
+ let errorType = 'server_error';
27
+ let status;
28
+ // Handle API errors with HTTP status codes
29
+ if (error && typeof error.status === 'number') {
30
+ const httpStatus = error.status;
31
+ status = httpStatus;
32
+ errorMessage = providerMessageOverride || error.message || `HTTP ${httpStatus} error`;
33
+ // Map common HTTP status codes
34
+ // TypeScript knows httpStatus is defined here due to the typeof check above
35
+ switch (httpStatus) {
36
+ case 400:
37
+ // Default mapping for 400 errors - adapters should refine based on message content
38
+ errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
39
+ errorType = 'invalid_request_error';
40
+ break;
41
+ case 401:
42
+ errorCode = types_1.ADAPTER_ERROR_CODES.INVALID_API_KEY;
43
+ errorType = 'authentication_error';
44
+ break;
45
+ case 402:
46
+ errorCode = types_1.ADAPTER_ERROR_CODES.INSUFFICIENT_CREDITS;
47
+ errorType = 'rate_limit_error';
48
+ break;
49
+ case 404:
50
+ errorCode = types_1.ADAPTER_ERROR_CODES.MODEL_NOT_FOUND;
51
+ errorType = 'invalid_request_error';
52
+ break;
53
+ case 429:
54
+ errorCode = types_1.ADAPTER_ERROR_CODES.RATE_LIMIT_EXCEEDED;
55
+ errorType = 'rate_limit_error';
56
+ break;
57
+ case 500:
58
+ case 502:
59
+ case 503:
60
+ case 504:
61
+ errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
62
+ errorType = 'server_error';
63
+ break;
64
+ default:
65
+ if (httpStatus >= 400 && httpStatus < 500) {
66
+ errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
67
+ errorType = 'invalid_request_error';
68
+ }
69
+ else if (httpStatus >= 500) {
70
+ errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
71
+ errorType = 'server_error';
72
+ }
73
+ else {
74
+ errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
75
+ errorType = 'server_error';
76
+ }
77
+ }
78
+ }
79
+ // Handle network connection errors
80
+ else if (error && (error.code === 'ENOTFOUND' ||
81
+ error.code === 'ECONNREFUSED' ||
82
+ error.code === 'ETIMEDOUT' ||
83
+ error.name === 'ConnectTimeoutError' ||
84
+ (error.type && error.type.includes('timeout')))) {
85
+ errorCode = types_1.ADAPTER_ERROR_CODES.NETWORK_ERROR;
86
+ errorType = 'connection_error';
87
+ errorMessage = providerMessageOverride || error.message || 'Network connection failed';
88
+ }
89
+ // Handle generic JavaScript errors
90
+ else if (error instanceof Error) {
91
+ errorMessage = providerMessageOverride || error.message || 'Client error occurred';
92
+ errorCode = types_1.ADAPTER_ERROR_CODES.UNKNOWN_ERROR;
93
+ errorType = 'client_error';
94
+ }
95
+ // Handle unknown error types
96
+ else {
97
+ errorMessage = providerMessageOverride || 'Unknown error occurred';
98
+ errorCode = types_1.ADAPTER_ERROR_CODES.UNKNOWN_ERROR;
99
+ errorType = 'server_error';
100
+ }
101
+ return {
102
+ errorCode,
103
+ errorMessage,
104
+ errorType,
105
+ status
106
+ };
107
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Information about a registered adapter
3
+ */
4
+ export interface AdapterInfo<TProviderId extends string> {
5
+ providerId: TProviderId;
6
+ hasAdapter: boolean;
7
+ adapterInfo?: {
8
+ name: string;
9
+ };
10
+ }
11
+ /**
12
+ * Summary of provider availability
13
+ */
14
+ export interface ProviderSummary {
15
+ totalProviders: number;
16
+ providersWithAdapters: number;
17
+ availableProviders: string[];
18
+ unavailableProviders: string[];
19
+ }
20
+ /**
21
+ * Minimal provider information interface
22
+ */
23
+ export interface MinimalProviderInfo<TProviderId extends string> {
24
+ id: TProviderId;
25
+ [key: string]: any;
26
+ }
27
+ /**
28
+ * Configuration for adapter initialization
29
+ */
30
+ export interface AdapterRegistryConfig<TAdapter, TProviderId extends string> {
31
+ /** List of supported providers */
32
+ supportedProviders: readonly MinimalProviderInfo<TProviderId>[];
33
+ /** Map of provider IDs to adapter constructors */
34
+ adapterConstructors?: Partial<Record<string, new (config?: any) => TAdapter>>;
35
+ /** Map of provider IDs to adapter configurations */
36
+ adapterConfigs?: Record<string, any>;
37
+ /** Fallback adapter to use when no specific adapter is registered */
38
+ fallbackAdapter: TAdapter;
39
+ /** Optional custom adapters to register at initialization */
40
+ customAdapters?: Record<string, TAdapter>;
41
+ }
42
+ /**
43
+ * Generic registry for managing service adapters across different providers.
44
+ * Handles adapter initialization, registration, and retrieval.
45
+ *
46
+ * @template TAdapter - The adapter interface type
47
+ * @template TProviderId - The provider ID type (string union)
48
+ */
49
+ export declare class AdapterRegistry<TAdapter, TProviderId extends string> {
50
+ private adapters;
51
+ private fallbackAdapter;
52
+ private supportedProviders;
53
+ /**
54
+ * Creates a new AdapterRegistry
55
+ *
56
+ * @param config - Configuration for the registry
57
+ */
58
+ constructor(config: AdapterRegistryConfig<TAdapter, TProviderId>);
59
+ /**
60
+ * Initializes adapters for all supported providers using constructors
61
+ */
62
+ private initializeAdapters;
63
+ /**
64
+ * Registers an adapter for a specific provider
65
+ *
66
+ * @param providerId - The provider ID
67
+ * @param adapter - The adapter implementation
68
+ */
69
+ registerAdapter(providerId: TProviderId, adapter: TAdapter): void;
70
+ /**
71
+ * Gets the appropriate adapter for a provider
72
+ *
73
+ * @param providerId - The provider ID
74
+ * @returns The adapter to use
75
+ */
76
+ getAdapter(providerId: TProviderId): TAdapter;
77
+ /**
78
+ * Gets information about registered adapters
79
+ *
80
+ * @returns Map of provider IDs to adapter info
81
+ */
82
+ getRegisteredAdapters(): Map<TProviderId, AdapterInfo<TProviderId>>;
83
+ /**
84
+ * Gets a summary of available providers and their adapter status
85
+ *
86
+ * @returns Summary of provider availability
87
+ */
88
+ getProviderSummary(): ProviderSummary;
89
+ }
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdapterRegistry = void 0;
4
+ /**
5
+ * Generic registry for managing service adapters across different providers.
6
+ * Handles adapter initialization, registration, and retrieval.
7
+ *
8
+ * @template TAdapter - The adapter interface type
9
+ * @template TProviderId - The provider ID type (string union)
10
+ */
11
+ class AdapterRegistry {
12
+ /**
13
+ * Creates a new AdapterRegistry
14
+ *
15
+ * @param config - Configuration for the registry
16
+ */
17
+ constructor(config) {
18
+ this.adapters = new Map();
19
+ this.fallbackAdapter = config.fallbackAdapter;
20
+ this.supportedProviders = config.supportedProviders;
21
+ // Register custom adapters first if provided
22
+ if (config.customAdapters) {
23
+ for (const [providerId, adapter] of Object.entries(config.customAdapters)) {
24
+ this.registerAdapter(providerId, adapter);
25
+ }
26
+ }
27
+ // Initialize adapters from constructors
28
+ if (config.adapterConstructors) {
29
+ this.initializeAdapters(config.adapterConstructors, config.adapterConfigs || {});
30
+ }
31
+ }
32
+ /**
33
+ * Initializes adapters for all supported providers using constructors
34
+ */
35
+ initializeAdapters(adapterConstructors, adapterConfigs) {
36
+ let registeredCount = 0;
37
+ const successfullyRegisteredProviders = [];
38
+ for (const provider of this.supportedProviders) {
39
+ const providerId = provider.id;
40
+ // Skip if adapter is already registered (from custom adapters)
41
+ if (this.adapters.has(providerId)) {
42
+ console.log(`AdapterRegistry: Skipping constructor initialization for '${provider.id}' ` +
43
+ `(custom adapter already registered)`);
44
+ continue;
45
+ }
46
+ const AdapterClass = adapterConstructors[provider.id];
47
+ if (AdapterClass) {
48
+ try {
49
+ const adapterConfig = adapterConfigs[provider.id];
50
+ const adapterInstance = new AdapterClass(adapterConfig);
51
+ this.registerAdapter(providerId, adapterInstance);
52
+ registeredCount++;
53
+ successfullyRegisteredProviders.push(provider.id);
54
+ }
55
+ catch (error) {
56
+ console.error(`AdapterRegistry: Failed to instantiate adapter for provider '${provider.id}'. ` +
57
+ `This provider will use the fallback adapter. Error:`, error);
58
+ }
59
+ }
60
+ else {
61
+ console.warn(`AdapterRegistry: No adapter constructor found for supported provider '${provider.id}'. ` +
62
+ `This provider will use the fallback adapter.`);
63
+ }
64
+ }
65
+ if (registeredCount > 0) {
66
+ console.log(`AdapterRegistry: Initialized with ${registeredCount} dynamically registered adapter(s) ` +
67
+ `for: ${successfullyRegisteredProviders.join(', ')}.`);
68
+ }
69
+ else {
70
+ console.log(`AdapterRegistry: No real adapters were dynamically registered. ` +
71
+ `All providers will use the fallback adapter.`);
72
+ }
73
+ }
74
+ /**
75
+ * Registers an adapter for a specific provider
76
+ *
77
+ * @param providerId - The provider ID
78
+ * @param adapter - The adapter implementation
79
+ */
80
+ registerAdapter(providerId, adapter) {
81
+ this.adapters.set(providerId, adapter);
82
+ console.log(`AdapterRegistry: Registered adapter for provider: ${providerId}`);
83
+ }
84
+ /**
85
+ * Gets the appropriate adapter for a provider
86
+ *
87
+ * @param providerId - The provider ID
88
+ * @returns The adapter to use
89
+ */
90
+ getAdapter(providerId) {
91
+ // Check for registered real adapters first
92
+ const registeredAdapter = this.adapters.get(providerId);
93
+ if (registeredAdapter) {
94
+ console.log(`AdapterRegistry: Using registered adapter for provider: ${providerId}`);
95
+ return registeredAdapter;
96
+ }
97
+ // Fall back to fallback adapter for unsupported providers
98
+ console.log(`AdapterRegistry: No real adapter found for ${providerId}, using fallback adapter`);
99
+ return this.fallbackAdapter;
100
+ }
101
+ /**
102
+ * Gets information about registered adapters
103
+ *
104
+ * @returns Map of provider IDs to adapter info
105
+ */
106
+ getRegisteredAdapters() {
107
+ const adapterInfo = new Map();
108
+ for (const [providerId, adapter] of this.adapters.entries()) {
109
+ // Try to get adapter info if the adapter has a getAdapterInfo method
110
+ const adapterInfoData = adapter.getAdapterInfo?.() ||
111
+ { name: adapter.id || 'Unknown Adapter' };
112
+ adapterInfo.set(providerId, {
113
+ providerId,
114
+ hasAdapter: true,
115
+ adapterInfo: adapterInfoData,
116
+ });
117
+ }
118
+ return adapterInfo;
119
+ }
120
+ /**
121
+ * Gets a summary of available providers and their adapter status
122
+ *
123
+ * @returns Summary of provider availability
124
+ */
125
+ getProviderSummary() {
126
+ const availableProviders = [];
127
+ const unavailableProviders = [];
128
+ for (const provider of this.supportedProviders) {
129
+ if (this.adapters.has(provider.id)) {
130
+ availableProviders.push(provider.id);
131
+ }
132
+ else {
133
+ unavailableProviders.push(provider.id);
134
+ }
135
+ }
136
+ return {
137
+ totalProviders: this.supportedProviders.length,
138
+ providersWithAdapters: availableProviders.length,
139
+ availableProviders,
140
+ unavailableProviders,
141
+ };
142
+ }
143
+ }
144
+ exports.AdapterRegistry = AdapterRegistry;
@@ -0,0 +1,33 @@
1
+ import type { PresetMode } from "../../types";
2
+ /**
3
+ * Generic preset manager for managing presets across different services.
4
+ * Handles loading, merging, and resolution of presets.
5
+ *
6
+ * @template TPreset - The preset type, must have an 'id' property
7
+ */
8
+ export declare class PresetManager<TPreset extends {
9
+ id: string;
10
+ }> {
11
+ private presets;
12
+ /**
13
+ * Creates a new PresetManager
14
+ *
15
+ * @param defaultPresets - The default presets to load
16
+ * @param customPresets - Optional custom presets to add or override
17
+ * @param mode - How to handle custom presets ('extend' or 'replace')
18
+ */
19
+ constructor(defaultPresets: TPreset[], customPresets?: TPreset[], mode?: PresetMode);
20
+ /**
21
+ * Gets all configured presets
22
+ *
23
+ * @returns Array of presets
24
+ */
25
+ getPresets(): TPreset[];
26
+ /**
27
+ * Resolves a preset by ID
28
+ *
29
+ * @param presetId - The preset ID to resolve
30
+ * @returns The preset if found, null otherwise
31
+ */
32
+ resolvePreset(presetId: string): TPreset | null;
33
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PresetManager = void 0;
4
+ /**
5
+ * Generic preset manager for managing presets across different services.
6
+ * Handles loading, merging, and resolution of presets.
7
+ *
8
+ * @template TPreset - The preset type, must have an 'id' property
9
+ */
10
+ class PresetManager {
11
+ /**
12
+ * Creates a new PresetManager
13
+ *
14
+ * @param defaultPresets - The default presets to load
15
+ * @param customPresets - Optional custom presets to add or override
16
+ * @param mode - How to handle custom presets ('extend' or 'replace')
17
+ */
18
+ constructor(defaultPresets, customPresets = [], mode = 'extend') {
19
+ // Initialize presets based on mode
20
+ const finalPresets = new Map();
21
+ if (mode === 'replace') {
22
+ // Replace Mode: Only use custom presets.
23
+ for (const preset of customPresets) {
24
+ finalPresets.set(preset.id, preset);
25
+ }
26
+ }
27
+ else {
28
+ // Extend Mode: Load defaults first, then add/override.
29
+ for (const preset of defaultPresets) {
30
+ finalPresets.set(preset.id, preset);
31
+ }
32
+ for (const preset of customPresets) {
33
+ finalPresets.set(preset.id, preset);
34
+ }
35
+ }
36
+ this.presets = Array.from(finalPresets.values());
37
+ }
38
+ /**
39
+ * Gets all configured presets
40
+ *
41
+ * @returns Array of presets
42
+ */
43
+ getPresets() {
44
+ return [...this.presets]; // Return a copy to prevent external modification
45
+ }
46
+ /**
47
+ * Resolves a preset by ID
48
+ *
49
+ * @param presetId - The preset ID to resolve
50
+ * @returns The preset if found, null otherwise
51
+ */
52
+ resolvePreset(presetId) {
53
+ return this.presets.find(p => p.id === presetId) || null;
54
+ }
55
+ }
56
+ exports.PresetManager = PresetManager;