@x12i/ai-gateway 7.9.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 +4259 -0
- package/config.defaults.json +31 -0
- package/dist/activity-manager.d.ts +206 -0
- package/dist/activity-manager.js +1051 -0
- package/dist/config/activity-tracking-config.d.ts +11 -0
- package/dist/config/activity-tracking-config.js +15 -0
- package/dist/config.defaults.json +31 -0
- package/dist/content-normalizer/content-normalizer.d.ts +46 -0
- package/dist/content-normalizer/content-normalizer.js +393 -0
- package/dist/content-normalizer/index.d.ts +7 -0
- package/dist/content-normalizer/index.js +6 -0
- package/dist/content-normalizer/types.d.ts +33 -0
- package/dist/content-normalizer/types.js +4 -0
- package/dist/defaults/instructions-blocks.json +61 -0
- package/dist/defaults/model-config.json +16 -0
- package/dist/defaults/template-rendering.json +6 -0
- package/dist/flex-md-loader.d.ts +109 -0
- package/dist/flex-md-loader.js +940 -0
- package/dist/gateway-config.d.ts +49 -0
- package/dist/gateway-config.js +292 -0
- package/dist/gateway-conversion.d.ts +29 -0
- package/dist/gateway-conversion.js +174 -0
- package/dist/gateway-instructions.d.ts +30 -0
- package/dist/gateway-instructions.js +62 -0
- package/dist/gateway-memory.d.ts +51 -0
- package/dist/gateway-memory.js +207 -0
- package/dist/gateway-messages.d.ts +23 -0
- package/dist/gateway-messages.js +83 -0
- package/dist/gateway-meta.d.ts +25 -0
- package/dist/gateway-meta.js +87 -0
- package/dist/gateway-provider-auto-register.d.ts +17 -0
- package/dist/gateway-provider-auto-register.js +159 -0
- package/dist/gateway-provider.d.ts +54 -0
- package/dist/gateway-provider.js +202 -0
- package/dist/gateway-rate-limiter-constants.d.ts +16 -0
- package/dist/gateway-rate-limiter-constants.js +16 -0
- package/dist/gateway-rate-limiter.d.ts +56 -0
- package/dist/gateway-rate-limiter.js +107 -0
- package/dist/gateway-retry.d.ts +49 -0
- package/dist/gateway-retry.js +204 -0
- package/dist/gateway-utils.d.ts +21 -0
- package/dist/gateway-utils.js +181 -0
- package/dist/gateway-validation.d.ts +13 -0
- package/dist/gateway-validation.js +50 -0
- package/dist/gateway.d.ts +39 -0
- package/dist/gateway.js +430 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +55 -0
- package/dist/instruction-errors.d.ts +16 -0
- package/dist/instruction-errors.js +29 -0
- package/dist/instruction-optimizer.d.ts +113 -0
- package/dist/instruction-optimizer.js +293 -0
- package/dist/instructions-parser.d.ts +31 -0
- package/dist/instructions-parser.js +56 -0
- package/dist/logger-factory.d.ts +17 -0
- package/dist/logger-factory.js +42 -0
- package/dist/message-builder.d.ts +41 -0
- package/dist/message-builder.js +522 -0
- package/dist/object-types-library-integration.d.ts +22 -0
- package/dist/object-types-library-integration.js +27 -0
- package/dist/object-types-library.d.ts +351 -0
- package/dist/object-types-library.js +210 -0
- package/dist/output-auditor.d.ts +44 -0
- package/dist/output-auditor.js +49 -0
- package/dist/request-report-generator.d.ts +60 -0
- package/dist/request-report-generator.js +169 -0
- package/dist/response-analyzer/format-type-detector.d.ts +35 -0
- package/dist/response-analyzer/format-type-detector.js +115 -0
- package/dist/response-analyzer/index.d.ts +9 -0
- package/dist/response-analyzer/index.js +8 -0
- package/dist/response-analyzer/object-type-detector.d.ts +42 -0
- package/dist/response-analyzer/object-type-detector.js +95 -0
- package/dist/response-analyzer/response-analyzer.d.ts +38 -0
- package/dist/response-analyzer/response-analyzer.js +97 -0
- package/dist/response-analyzer/types.d.ts +97 -0
- package/dist/response-analyzer/types.js +4 -0
- package/dist/response-fallback-fixer.d.ts +11 -0
- package/dist/response-fallback-fixer.js +123 -0
- package/dist/runtime-objects.d.ts +52 -0
- package/dist/runtime-objects.js +46 -0
- package/dist/template-parser.d.ts +58 -0
- package/dist/template-parser.js +99 -0
- package/dist/template-render-merge.d.ts +9 -0
- package/dist/template-render-merge.js +40 -0
- package/dist/troubleshooting-helper.d.ts +123 -0
- package/dist/troubleshooting-helper.js +596 -0
- package/dist/types.d.ts +1173 -0
- package/dist/types.js +6 -0
- package/dist/usage-tracker.d.ts +78 -0
- package/dist/usage-tracker.js +79 -0
- package/dist-cjs/activity-manager.cjs +1056 -0
- package/dist-cjs/activity-manager.d.ts +206 -0
- package/dist-cjs/config/activity-tracking-config.cjs +18 -0
- package/dist-cjs/config/activity-tracking-config.d.ts +11 -0
- package/dist-cjs/config.defaults.json +31 -0
- package/dist-cjs/content-normalizer/content-normalizer.cjs +398 -0
- package/dist-cjs/content-normalizer/content-normalizer.d.ts +46 -0
- package/dist-cjs/content-normalizer/index.cjs +12 -0
- package/dist-cjs/content-normalizer/index.d.ts +7 -0
- package/dist-cjs/content-normalizer/types.cjs +5 -0
- package/dist-cjs/content-normalizer/types.d.ts +33 -0
- package/dist-cjs/defaults/instructions-blocks.json +61 -0
- package/dist-cjs/defaults/model-config.json +16 -0
- package/dist-cjs/defaults/template-rendering.json +6 -0
- package/dist-cjs/flex-md-loader.cjs +986 -0
- package/dist-cjs/flex-md-loader.d.ts +109 -0
- package/dist-cjs/gateway-config.cjs +331 -0
- package/dist-cjs/gateway-config.d.ts +49 -0
- package/dist-cjs/gateway-conversion.cjs +212 -0
- package/dist-cjs/gateway-conversion.d.ts +29 -0
- package/dist-cjs/gateway-instructions.cjs +67 -0
- package/dist-cjs/gateway-instructions.d.ts +30 -0
- package/dist-cjs/gateway-memory.cjs +211 -0
- package/dist-cjs/gateway-memory.d.ts +51 -0
- package/dist-cjs/gateway-messages.cjs +86 -0
- package/dist-cjs/gateway-messages.d.ts +23 -0
- package/dist-cjs/gateway-meta.cjs +90 -0
- package/dist-cjs/gateway-meta.d.ts +25 -0
- package/dist-cjs/gateway-provider-auto-register.cjs +195 -0
- package/dist-cjs/gateway-provider-auto-register.d.ts +17 -0
- package/dist-cjs/gateway-provider.cjs +214 -0
- package/dist-cjs/gateway-provider.d.ts +54 -0
- package/dist-cjs/gateway-rate-limiter-constants.cjs +19 -0
- package/dist-cjs/gateway-rate-limiter-constants.d.ts +16 -0
- package/dist-cjs/gateway-rate-limiter.cjs +111 -0
- package/dist-cjs/gateway-rate-limiter.d.ts +56 -0
- package/dist-cjs/gateway-retry.cjs +212 -0
- package/dist-cjs/gateway-retry.d.ts +49 -0
- package/dist-cjs/gateway-utils.cjs +219 -0
- package/dist-cjs/gateway-utils.d.ts +21 -0
- package/dist-cjs/gateway-validation.cjs +54 -0
- package/dist-cjs/gateway-validation.d.ts +13 -0
- package/dist-cjs/gateway.cjs +434 -0
- package/dist-cjs/gateway.d.ts +39 -0
- package/dist-cjs/index.cjs +108 -0
- package/dist-cjs/index.d.ts +36 -0
- package/dist-cjs/instruction-errors.cjs +34 -0
- package/dist-cjs/instruction-errors.d.ts +16 -0
- package/dist-cjs/instruction-optimizer.cjs +299 -0
- package/dist-cjs/instruction-optimizer.d.ts +113 -0
- package/dist-cjs/instructions-parser.cjs +61 -0
- package/dist-cjs/instructions-parser.d.ts +31 -0
- package/dist-cjs/logger-factory.cjs +45 -0
- package/dist-cjs/logger-factory.d.ts +17 -0
- package/dist-cjs/message-builder.cjs +558 -0
- package/dist-cjs/message-builder.d.ts +41 -0
- package/dist-cjs/object-types-library-integration.cjs +32 -0
- package/dist-cjs/object-types-library-integration.d.ts +22 -0
- package/dist-cjs/object-types-library.cjs +215 -0
- package/dist-cjs/object-types-library.d.ts +351 -0
- package/dist-cjs/output-auditor.cjs +52 -0
- package/dist-cjs/output-auditor.d.ts +44 -0
- package/dist-cjs/request-report-generator.cjs +172 -0
- package/dist-cjs/request-report-generator.d.ts +60 -0
- package/dist-cjs/response-analyzer/format-type-detector.cjs +119 -0
- package/dist-cjs/response-analyzer/format-type-detector.d.ts +35 -0
- package/dist-cjs/response-analyzer/index.cjs +14 -0
- package/dist-cjs/response-analyzer/index.d.ts +9 -0
- package/dist-cjs/response-analyzer/object-type-detector.cjs +99 -0
- package/dist-cjs/response-analyzer/object-type-detector.d.ts +42 -0
- package/dist-cjs/response-analyzer/response-analyzer.cjs +101 -0
- package/dist-cjs/response-analyzer/response-analyzer.d.ts +38 -0
- package/dist-cjs/response-analyzer/types.cjs +5 -0
- package/dist-cjs/response-analyzer/types.d.ts +97 -0
- package/dist-cjs/response-fallback-fixer.cjs +126 -0
- package/dist-cjs/response-fallback-fixer.d.ts +11 -0
- package/dist-cjs/runtime-objects.cjs +52 -0
- package/dist-cjs/runtime-objects.d.ts +52 -0
- package/dist-cjs/template-parser.cjs +136 -0
- package/dist-cjs/template-parser.d.ts +58 -0
- package/dist-cjs/template-render-merge.cjs +43 -0
- package/dist-cjs/template-render-merge.d.ts +9 -0
- package/dist-cjs/troubleshooting-helper.cjs +611 -0
- package/dist-cjs/troubleshooting-helper.d.ts +123 -0
- package/dist-cjs/types.cjs +7 -0
- package/dist-cjs/types.d.ts +1173 -0
- package/dist-cjs/usage-tracker.cjs +83 -0
- package/dist-cjs/usage-tracker.d.ts +78 -0
- package/package.json +91 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Provider Module
|
|
3
|
+
* Handles provider management
|
|
4
|
+
*/
|
|
5
|
+
import type { LLMProviderRouter } from '@x12i/ai-providers-router';
|
|
6
|
+
import type { Logxer } from '@x12i/logxer';
|
|
7
|
+
/**
|
|
8
|
+
* Register a provider with the router
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerProvider(provider: any, router: LLMProviderRouter, logger: Logxer): void;
|
|
11
|
+
/**
|
|
12
|
+
* Unregister a provider
|
|
13
|
+
*/
|
|
14
|
+
export declare function unregisterProvider(providerName: string, router: LLMProviderRouter, logger: Logxer): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get a provider module
|
|
17
|
+
*/
|
|
18
|
+
export declare function getProvider(providerName: string, router: LLMProviderRouter): any;
|
|
19
|
+
/**
|
|
20
|
+
* List all registered providers
|
|
21
|
+
*/
|
|
22
|
+
export declare function listProviders(router: LLMProviderRouter): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Set default provider
|
|
25
|
+
*
|
|
26
|
+
* NOTE: Router doesn't support changing default provider after initialization.
|
|
27
|
+
* This method is kept for API compatibility but does nothing.
|
|
28
|
+
* Default provider must be set in router config during initialization.
|
|
29
|
+
*/
|
|
30
|
+
export declare function setDefaultProvider(provider: string, router: LLMProviderRouter, logger: Logxer): void;
|
|
31
|
+
/**
|
|
32
|
+
* Set fallback chain
|
|
33
|
+
*
|
|
34
|
+
* NOTE: Router doesn't support changing fallback chain after initialization.
|
|
35
|
+
* This method is kept for API compatibility but does nothing.
|
|
36
|
+
* Fallback chain must be set in router config during initialization.
|
|
37
|
+
*/
|
|
38
|
+
export declare function setFallbackChain(chain: string[], router: LLMProviderRouter, logger: Logxer): void;
|
|
39
|
+
/**
|
|
40
|
+
* Add request interceptor
|
|
41
|
+
*/
|
|
42
|
+
export declare function addRequestInterceptor(interceptor: any, router: LLMProviderRouter): void;
|
|
43
|
+
/**
|
|
44
|
+
* Add response interceptor
|
|
45
|
+
*/
|
|
46
|
+
export declare function addResponseInterceptor(interceptor: any, router: LLMProviderRouter): void;
|
|
47
|
+
/**
|
|
48
|
+
* Check health of a provider
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkHealth(provider: string, router: LLMProviderRouter): Promise<import("@x12i/ai-providers-router").HealthCheckResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Check health of all providers
|
|
53
|
+
*/
|
|
54
|
+
export declare function checkAllHealth(router: LLMProviderRouter): Promise<Record<string, any>>;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Provider Module
|
|
3
|
+
* Handles provider management
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Register a provider with the router
|
|
7
|
+
*/
|
|
8
|
+
export function registerProvider(provider, router, logger) {
|
|
9
|
+
// Get provider name - try multiple methods
|
|
10
|
+
let providerName = 'unknown';
|
|
11
|
+
if (typeof provider.getProviderName === 'function') {
|
|
12
|
+
providerName = provider.getProviderName();
|
|
13
|
+
}
|
|
14
|
+
else if (provider.name) {
|
|
15
|
+
providerName = provider.name;
|
|
16
|
+
}
|
|
17
|
+
else if (provider.constructor?.name) {
|
|
18
|
+
providerName = provider.constructor.name.replace('Provider', '').toLowerCase();
|
|
19
|
+
}
|
|
20
|
+
logger.debug('Registering provider', { provider: providerName });
|
|
21
|
+
// Check if provider has required methods
|
|
22
|
+
if (!provider || (typeof provider.invoke !== 'function' && typeof provider.aiCall !== 'function')) {
|
|
23
|
+
logger.error('Provider registration failed: must implement invoke() or aiCall()', {
|
|
24
|
+
provider: providerName,
|
|
25
|
+
hasInvoke: typeof provider.invoke === 'function',
|
|
26
|
+
hasAiCall: typeof provider.aiCall === 'function'
|
|
27
|
+
});
|
|
28
|
+
throw new Error('Provider must implement LLMProviderInterface (invoke) or AIProviderInterface (aiCall)');
|
|
29
|
+
}
|
|
30
|
+
// Create a ProviderModule wrapper for the provider instance
|
|
31
|
+
logger.debug('Creating ProviderModule wrapper for provider instance', { provider: providerName });
|
|
32
|
+
// Ensure provider has invoke method
|
|
33
|
+
let providerWithInvoke = provider;
|
|
34
|
+
if (typeof provider.aiCall === 'function' && typeof provider.invoke !== 'function') {
|
|
35
|
+
logger.debug('Provider uses aiCall, creating invoke wrapper', { provider: providerName });
|
|
36
|
+
providerWithInvoke = {
|
|
37
|
+
...provider,
|
|
38
|
+
invoke: async (request) => {
|
|
39
|
+
// Convert LLMRequest to format expected by aiCall
|
|
40
|
+
return await provider.aiCall(request);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Create ProviderModule wrapper
|
|
45
|
+
const providerModule = {
|
|
46
|
+
name: providerName,
|
|
47
|
+
capabilities: {
|
|
48
|
+
modes: {
|
|
49
|
+
sync: true,
|
|
50
|
+
stream: false,
|
|
51
|
+
batch: false
|
|
52
|
+
},
|
|
53
|
+
operations: ['invoke'],
|
|
54
|
+
maxConcurrency: 10
|
|
55
|
+
},
|
|
56
|
+
execute: async (request) => {
|
|
57
|
+
return await providerWithInvoke.invoke(request);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
// Register with router using registerProvider
|
|
61
|
+
try {
|
|
62
|
+
router.registerProvider(providerModule);
|
|
63
|
+
logger.info('Provider registered as ProviderModule', {
|
|
64
|
+
provider: providerName,
|
|
65
|
+
totalProviders: router.listProviders().length
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
logger.error('Failed to register provider with router.registerProvider, trying registry directly', {
|
|
70
|
+
provider: providerName,
|
|
71
|
+
error: error instanceof Error ? error.message : String(error)
|
|
72
|
+
});
|
|
73
|
+
// Fallback: try to access registry directly
|
|
74
|
+
try {
|
|
75
|
+
const registry = router.getProviderRegistry();
|
|
76
|
+
registry.register(providerModule);
|
|
77
|
+
logger.info('Provider registered via registry fallback', {
|
|
78
|
+
provider: providerName,
|
|
79
|
+
totalProviders: router.listProviders().length
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (registryError) {
|
|
83
|
+
logger.error('Failed to register provider via registry', {
|
|
84
|
+
provider: providerName,
|
|
85
|
+
error: registryError instanceof Error ? registryError.message : String(registryError)
|
|
86
|
+
});
|
|
87
|
+
throw registryError;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Unregister a provider
|
|
93
|
+
*/
|
|
94
|
+
export function unregisterProvider(providerName, router, logger) {
|
|
95
|
+
try {
|
|
96
|
+
// Try to access registry directly to remove the provider
|
|
97
|
+
const registry = router.getProviderRegistry();
|
|
98
|
+
// Since registry doesn't have an unregister method, we'll need to manipulate the map directly
|
|
99
|
+
// This is a bit hacky but necessary since the API doesn't provide unregister
|
|
100
|
+
const map = registry.map;
|
|
101
|
+
if (map && map instanceof Map) {
|
|
102
|
+
map.delete(providerName);
|
|
103
|
+
logger.info('Provider unregistered from registry', { provider: providerName });
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
logger.warn('Could not access provider registry map for unregistration', { provider: providerName });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger.error('Failed to unregister provider', {
|
|
111
|
+
provider: providerName,
|
|
112
|
+
error: error instanceof Error ? error.message : String(error)
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get a provider module
|
|
118
|
+
*/
|
|
119
|
+
export function getProvider(providerName, router) {
|
|
120
|
+
try {
|
|
121
|
+
const registry = router.getProviderRegistry();
|
|
122
|
+
return registry.get(providerName);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
// Fallback to any access if registry access fails
|
|
126
|
+
return router.getProvider?.(providerName);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* List all registered providers
|
|
131
|
+
*/
|
|
132
|
+
export function listProviders(router) {
|
|
133
|
+
return router.listProviders();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Set default provider
|
|
137
|
+
*
|
|
138
|
+
* NOTE: Router doesn't support changing default provider after initialization.
|
|
139
|
+
* This method is kept for API compatibility but does nothing.
|
|
140
|
+
* Default provider must be set in router config during initialization.
|
|
141
|
+
*/
|
|
142
|
+
export function setDefaultProvider(provider, router, logger) {
|
|
143
|
+
// Router doesn't support changing default provider after initialization
|
|
144
|
+
// Default provider must be set in router config during initialization
|
|
145
|
+
logger.warn('setDefaultProvider called but router does not support changing default provider after initialization', {
|
|
146
|
+
provider,
|
|
147
|
+
note: 'Default provider must be set in router config during initialization'
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Set fallback chain
|
|
152
|
+
*
|
|
153
|
+
* NOTE: Router doesn't support changing fallback chain after initialization.
|
|
154
|
+
* This method is kept for API compatibility but does nothing.
|
|
155
|
+
* Fallback chain must be set in router config during initialization.
|
|
156
|
+
*/
|
|
157
|
+
export function setFallbackChain(chain, router, logger) {
|
|
158
|
+
// Router doesn't support changing fallback chain after initialization
|
|
159
|
+
// Fallback chain must be set in router config during initialization
|
|
160
|
+
logger.warn('setFallbackChain called but router does not support changing fallback chain after initialization', {
|
|
161
|
+
chain,
|
|
162
|
+
note: 'Fallback chain must be set in router config during initialization'
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Add request interceptor
|
|
167
|
+
*/
|
|
168
|
+
export function addRequestInterceptor(interceptor, router) {
|
|
169
|
+
router.addRequestInterceptor(interceptor);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Add response interceptor
|
|
173
|
+
*/
|
|
174
|
+
export function addResponseInterceptor(interceptor, router) {
|
|
175
|
+
router.addResponseInterceptor(interceptor);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check health of a provider
|
|
179
|
+
*/
|
|
180
|
+
export async function checkHealth(provider, router) {
|
|
181
|
+
return router.checkHealth(provider);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check health of all providers
|
|
185
|
+
*/
|
|
186
|
+
export async function checkAllHealth(router) {
|
|
187
|
+
const providers = listProviders(router);
|
|
188
|
+
const results = {};
|
|
189
|
+
for (const provider of providers) {
|
|
190
|
+
try {
|
|
191
|
+
results[provider] = await router.checkHealth(provider);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
results[provider] = {
|
|
195
|
+
provider,
|
|
196
|
+
healthy: false,
|
|
197
|
+
error: error instanceof Error ? error.message : String(error)
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return results;
|
|
202
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter Constants
|
|
3
|
+
*
|
|
4
|
+
* Default values for rate limiting configuration.
|
|
5
|
+
* These defaults ensure the system works safely even if config is missing.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default minimum interval between API calls (in milliseconds)
|
|
9
|
+
* Used when rateLimit.defaultMinIntervalMs is not specified
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS = 500;
|
|
12
|
+
/**
|
|
13
|
+
* Default enabled state for rate limiting
|
|
14
|
+
* Used when rateLimit.enabled is not specified
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_RATE_LIMIT_ENABLED = true;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter Constants
|
|
3
|
+
*
|
|
4
|
+
* Default values for rate limiting configuration.
|
|
5
|
+
* These defaults ensure the system works safely even if config is missing.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default minimum interval between API calls (in milliseconds)
|
|
9
|
+
* Used when rateLimit.defaultMinIntervalMs is not specified
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS = 500;
|
|
12
|
+
/**
|
|
13
|
+
* Default enabled state for rate limiting
|
|
14
|
+
* Used when rateLimit.enabled is not specified
|
|
15
|
+
*/
|
|
16
|
+
export const DEFAULT_RATE_LIMIT_ENABLED = true;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Rate Limiter
|
|
3
|
+
*
|
|
4
|
+
* Smart rate limiting for BETWEEN-CALLS (not retries).
|
|
5
|
+
*
|
|
6
|
+
* Two types of rate limiting in the system:
|
|
7
|
+
* 1. RETRY delays (in gateway-retry.ts) - Simple sleep, not smart. Used when retrying after errors.
|
|
8
|
+
* 2. BETWEEN-CALLS rate limiting (this class) - Smart, tracks last call time and only waits if needed.
|
|
9
|
+
*
|
|
10
|
+
* This class handles #2: it tracks when the last API call was made per provider
|
|
11
|
+
* and only waits if necessary to maintain minimum intervals between separate API calls.
|
|
12
|
+
* This prevents unnecessary delays when enough time has already passed.
|
|
13
|
+
*/
|
|
14
|
+
import type { Logxer } from '@x12i/logxer';
|
|
15
|
+
/**
|
|
16
|
+
* Smart Rate Limiter (Between-Calls Only)
|
|
17
|
+
*
|
|
18
|
+
* Tracks the last API call time per provider and only waits if necessary.
|
|
19
|
+
* Supports per-provider rate limits with safe defaults.
|
|
20
|
+
*
|
|
21
|
+
* NOTE: This is for BETWEEN-CALLS rate limiting (smart).
|
|
22
|
+
* Retry delays are handled separately in gateway-retry.ts (simple sleep).
|
|
23
|
+
*
|
|
24
|
+
* This ensures minimum intervals between separate API calls regardless of what happens between them.
|
|
25
|
+
*/
|
|
26
|
+
export declare class GatewayRateLimiter {
|
|
27
|
+
private lastCallTimes;
|
|
28
|
+
private defaultMinIntervalMs;
|
|
29
|
+
private providerIntervals;
|
|
30
|
+
private logger?;
|
|
31
|
+
constructor(defaultMinIntervalMs?: number, providerIntervals?: Record<string, number>, logger?: Logxer);
|
|
32
|
+
/**
|
|
33
|
+
* Gets the minimum interval for a specific provider
|
|
34
|
+
* Falls back to default if provider-specific interval not set
|
|
35
|
+
*/
|
|
36
|
+
private getMinIntervalForProvider;
|
|
37
|
+
/**
|
|
38
|
+
* Waits only if necessary to maintain the minimum interval between calls for a provider
|
|
39
|
+
* @param provider - Provider name (e.g., 'openai', 'grok')
|
|
40
|
+
* @returns Promise that resolves when it's safe to make the next call
|
|
41
|
+
*/
|
|
42
|
+
waitIfNeeded(provider?: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Records that an API call was made (call this after the API call completes)
|
|
45
|
+
* This ensures we track the actual call time, accounting for call duration
|
|
46
|
+
*/
|
|
47
|
+
recordCall(provider?: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Gets the time since the last call for a provider
|
|
50
|
+
*/
|
|
51
|
+
getTimeSinceLastCall(provider?: string): number;
|
|
52
|
+
/**
|
|
53
|
+
* Resets the rate limiter for a provider (useful for testing or reset scenarios)
|
|
54
|
+
*/
|
|
55
|
+
reset(provider?: string): void;
|
|
56
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Rate Limiter
|
|
3
|
+
*
|
|
4
|
+
* Smart rate limiting for BETWEEN-CALLS (not retries).
|
|
5
|
+
*
|
|
6
|
+
* Two types of rate limiting in the system:
|
|
7
|
+
* 1. RETRY delays (in gateway-retry.ts) - Simple sleep, not smart. Used when retrying after errors.
|
|
8
|
+
* 2. BETWEEN-CALLS rate limiting (this class) - Smart, tracks last call time and only waits if needed.
|
|
9
|
+
*
|
|
10
|
+
* This class handles #2: it tracks when the last API call was made per provider
|
|
11
|
+
* and only waits if necessary to maintain minimum intervals between separate API calls.
|
|
12
|
+
* This prevents unnecessary delays when enough time has already passed.
|
|
13
|
+
*/
|
|
14
|
+
import { sleep } from './gateway-retry.js';
|
|
15
|
+
import { DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS } from './gateway-rate-limiter-constants.js';
|
|
16
|
+
/**
|
|
17
|
+
* Smart Rate Limiter (Between-Calls Only)
|
|
18
|
+
*
|
|
19
|
+
* Tracks the last API call time per provider and only waits if necessary.
|
|
20
|
+
* Supports per-provider rate limits with safe defaults.
|
|
21
|
+
*
|
|
22
|
+
* NOTE: This is for BETWEEN-CALLS rate limiting (smart).
|
|
23
|
+
* Retry delays are handled separately in gateway-retry.ts (simple sleep).
|
|
24
|
+
*
|
|
25
|
+
* This ensures minimum intervals between separate API calls regardless of what happens between them.
|
|
26
|
+
*/
|
|
27
|
+
export class GatewayRateLimiter {
|
|
28
|
+
lastCallTimes = new Map(); // provider -> last call timestamp
|
|
29
|
+
defaultMinIntervalMs;
|
|
30
|
+
providerIntervals = new Map(); // provider -> min interval
|
|
31
|
+
logger;
|
|
32
|
+
constructor(defaultMinIntervalMs = DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS, providerIntervals, logger) {
|
|
33
|
+
this.defaultMinIntervalMs = defaultMinIntervalMs;
|
|
34
|
+
this.logger = logger;
|
|
35
|
+
// Store per-provider intervals
|
|
36
|
+
if (providerIntervals) {
|
|
37
|
+
for (const [provider, interval] of Object.entries(providerIntervals)) {
|
|
38
|
+
this.providerIntervals.set(provider.toLowerCase(), interval);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Gets the minimum interval for a specific provider
|
|
44
|
+
* Falls back to default if provider-specific interval not set
|
|
45
|
+
*/
|
|
46
|
+
getMinIntervalForProvider(provider) {
|
|
47
|
+
const providerKey = provider.toLowerCase();
|
|
48
|
+
return this.providerIntervals.get(providerKey) ?? this.defaultMinIntervalMs;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Waits only if necessary to maintain the minimum interval between calls for a provider
|
|
52
|
+
* @param provider - Provider name (e.g., 'openai', 'grok')
|
|
53
|
+
* @returns Promise that resolves when it's safe to make the next call
|
|
54
|
+
*/
|
|
55
|
+
async waitIfNeeded(provider = 'global') {
|
|
56
|
+
const minIntervalMs = this.getMinIntervalForProvider(provider);
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
const lastCallTime = this.lastCallTimes.get(provider) || 0;
|
|
59
|
+
const timeSinceLastCall = now - lastCallTime;
|
|
60
|
+
if (timeSinceLastCall < minIntervalMs) {
|
|
61
|
+
const waitTime = minIntervalMs - timeSinceLastCall;
|
|
62
|
+
this.logger?.debug('Rate limiting: waiting before API call', {
|
|
63
|
+
provider,
|
|
64
|
+
waitTimeMs: waitTime,
|
|
65
|
+
timeSinceLastCallMs: timeSinceLastCall,
|
|
66
|
+
minIntervalMs,
|
|
67
|
+
usingProviderSpecific: this.providerIntervals.has(provider.toLowerCase())
|
|
68
|
+
});
|
|
69
|
+
await sleep(waitTime);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
this.logger?.verbose('Rate limit OK: enough time has passed', {
|
|
73
|
+
provider,
|
|
74
|
+
timeSinceLastCallMs: timeSinceLastCall,
|
|
75
|
+
minIntervalMs,
|
|
76
|
+
usingProviderSpecific: this.providerIntervals.has(provider.toLowerCase())
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Record the call time (after waiting if needed)
|
|
80
|
+
this.lastCallTimes.set(provider, Date.now());
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Records that an API call was made (call this after the API call completes)
|
|
84
|
+
* This ensures we track the actual call time, accounting for call duration
|
|
85
|
+
*/
|
|
86
|
+
recordCall(provider = 'global') {
|
|
87
|
+
this.lastCallTimes.set(provider, Date.now());
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Gets the time since the last call for a provider
|
|
91
|
+
*/
|
|
92
|
+
getTimeSinceLastCall(provider = 'global') {
|
|
93
|
+
const lastCallTime = this.lastCallTimes.get(provider) || 0;
|
|
94
|
+
return Date.now() - lastCallTime;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resets the rate limiter for a provider (useful for testing or reset scenarios)
|
|
98
|
+
*/
|
|
99
|
+
reset(provider) {
|
|
100
|
+
if (provider) {
|
|
101
|
+
this.lastCallTimes.delete(provider);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.lastCallTimes.clear();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Retry Module
|
|
3
|
+
* Handles retry logic for network and server errors
|
|
4
|
+
*
|
|
5
|
+
* NOTE: Retry delays use SIMPLE SLEEP (not smart rate limiting).
|
|
6
|
+
* Between-calls rate limiting is handled separately in gateway-rate-limiter.ts (smart).
|
|
7
|
+
*/
|
|
8
|
+
import type { RetryConfig } from './types.js';
|
|
9
|
+
import type { LLMProviderRouter } from '@x12i/ai-providers-router';
|
|
10
|
+
import type { Logxer } from '@x12i/logxer';
|
|
11
|
+
/**
|
|
12
|
+
* Determines if an error is a network error (fetch failed, DNS, connectivity)
|
|
13
|
+
*/
|
|
14
|
+
export declare function isNetworkError(error: Error): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Extracts HTTP status code from error message or error object properties
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractHttpStatusCode(error: Error): number | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Determines if an HTTP error should be retried
|
|
21
|
+
* Retryable: 429 (throttling), 5xx (server errors)
|
|
22
|
+
* Non-retryable: 4xx except 429 (client errors)
|
|
23
|
+
*/
|
|
24
|
+
export declare function isRetryableHttpError(error: Error, statusCode: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Determines if an error should be retried
|
|
27
|
+
*/
|
|
28
|
+
export declare function isRetryableError(error: Error): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Sleep helper for retry delays
|
|
31
|
+
*/
|
|
32
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Invokes router with retry logic for network and server errors
|
|
35
|
+
* Returns response and retry metadata
|
|
36
|
+
*/
|
|
37
|
+
export declare function invokeWithRetry(routerRequest: any, retryConfig: RetryConfig, jobId: string, router: LLMProviderRouter, logger: Logxer): Promise<{
|
|
38
|
+
response: any;
|
|
39
|
+
retryMetadata?: {
|
|
40
|
+
retryCount: number;
|
|
41
|
+
retryAttempts: Array<{
|
|
42
|
+
attempt: number;
|
|
43
|
+
timestamp: number;
|
|
44
|
+
error: string;
|
|
45
|
+
errorType: string;
|
|
46
|
+
delayMs: number;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
49
|
+
}>;
|