@relayplane/proxy 1.8.5 → 1.8.7
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/dist/config.d.ts +92 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -1
- package/dist/cross-provider-cascade.d.ts +137 -0
- package/dist/cross-provider-cascade.d.ts.map +1 -0
- package/dist/cross-provider-cascade.js +258 -0
- package/dist/cross-provider-cascade.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/ollama.d.ts +264 -0
- package/dist/ollama.d.ts.map +1 -0
- package/dist/ollama.js +510 -0
- package/dist/ollama.js.map +1 -0
- package/dist/rate-limiter.d.ts +87 -9
- package/dist/rate-limiter.d.ts.map +1 -1
- package/dist/rate-limiter.js +262 -28
- package/dist/rate-limiter.js.map +1 -1
- package/dist/standalone-proxy.d.ts +1 -1
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +334 -28
- package/dist/standalone-proxy.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
|
package/dist/rate-limiter.js
CHANGED
|
@@ -2,20 +2,77 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Rate Limiter - In-memory rate limiting for RelayPlane Proxy
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Limits are configurable via ~/.relayplane/config.json under `rateLimit.models`.
|
|
6
|
+
* When a limit is hit, requests are queued (up to maxQueueDepth) instead of
|
|
7
|
+
* immediately returning 429. Queue overflow or timeout results in a 429.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Defaults:
|
|
10
|
+
* - Sonnet models: 60 RPM
|
|
11
|
+
* - Opus models: 30 RPM
|
|
12
|
+
* - Haiku models: 60 RPM
|
|
13
|
+
* - Other models: 60 RPM
|
|
14
|
+
*
|
|
15
|
+
* Auto-expires old entries every 5 minutes.
|
|
10
16
|
*/
|
|
11
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.resetLimit = exports.getUsage = exports.checkLimit = exports.rateLimiter = exports.DEFAULT_LIMITS = void 0;
|
|
13
|
-
|
|
18
|
+
exports.resetLimit = exports.getUsage = exports.acquireSlot = exports.checkLimit = exports.rateLimiter = exports.RateLimiter = exports.DEFAULT_LIMITS = exports.RateLimitError = void 0;
|
|
19
|
+
exports.configureRateLimiter = configureRateLimiter;
|
|
20
|
+
// ── Sanitizers (defence against Infinity / NaN / negative values) ────────────
|
|
21
|
+
/** Maximum configurable RPM — prevents Infinity from bypassing the limiter. */
|
|
22
|
+
const MAX_RPM = 10_000;
|
|
23
|
+
/** Maximum configurable queue depth. */
|
|
24
|
+
const MAX_QUEUE_DEPTH = 10_000;
|
|
25
|
+
/** Maximum configurable queue timeout (10 minutes). */
|
|
26
|
+
const MAX_QUEUE_TIMEOUT_MS = 10 * 60 * 1_000;
|
|
27
|
+
/**
|
|
28
|
+
* Clamp an RPM value to a safe finite integer in [1, MAX_RPM].
|
|
29
|
+
* Returns the safe default (60) when the input is 0, negative, NaN, or Infinity.
|
|
30
|
+
*/
|
|
31
|
+
function sanitizeRpm(value, safeDefault = 60) {
|
|
32
|
+
const num = Number(value);
|
|
33
|
+
if (!Number.isFinite(num) || num < 1)
|
|
34
|
+
return safeDefault;
|
|
35
|
+
return Math.min(MAX_RPM, Math.floor(num));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Clamp a maxQueueDepth value to a safe finite integer in [0, MAX_QUEUE_DEPTH].
|
|
39
|
+
*/
|
|
40
|
+
function sanitizeQueueDepth(value, safeDefault = 50) {
|
|
41
|
+
const num = Number(value);
|
|
42
|
+
if (!Number.isFinite(num) || num < 0)
|
|
43
|
+
return safeDefault;
|
|
44
|
+
return Math.min(MAX_QUEUE_DEPTH, Math.floor(num));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Clamp a queueTimeoutMs value to a safe finite integer in [100, MAX_QUEUE_TIMEOUT_MS].
|
|
48
|
+
*/
|
|
49
|
+
function sanitizeTimeoutMs(value, safeDefault = 30_000) {
|
|
50
|
+
const num = Number(value);
|
|
51
|
+
if (!Number.isFinite(num) || num < 100)
|
|
52
|
+
return safeDefault;
|
|
53
|
+
return Math.min(MAX_QUEUE_TIMEOUT_MS, Math.floor(num));
|
|
54
|
+
}
|
|
55
|
+
class RateLimitError extends Error {
|
|
56
|
+
code;
|
|
57
|
+
retryAfter;
|
|
58
|
+
limit;
|
|
59
|
+
resetAt;
|
|
60
|
+
constructor(message, opts) {
|
|
61
|
+
super(message);
|
|
62
|
+
this.name = 'RateLimitError';
|
|
63
|
+
this.code = opts.code;
|
|
64
|
+
this.retryAfter = opts.retryAfter;
|
|
65
|
+
this.limit = opts.limit;
|
|
66
|
+
this.resetAt = opts.resetAt;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.RateLimitError = RateLimitError;
|
|
70
|
+
// Default limits. Sonnet bumped to 60 RPM, Opus bumped to 30 RPM (GH #39).
|
|
14
71
|
exports.DEFAULT_LIMITS = {
|
|
15
72
|
// Anthropic models
|
|
16
|
-
'claude-opus-4-6': { rpm:
|
|
17
|
-
'claude-opus': { rpm:
|
|
18
|
-
'claude-sonnet-4-6': { rpm:
|
|
73
|
+
'claude-opus-4-6': { rpm: 30, maxTokens: 4096 },
|
|
74
|
+
'claude-opus': { rpm: 30, maxTokens: 4096 },
|
|
75
|
+
'claude-sonnet-4-6': { rpm: 60 },
|
|
19
76
|
'claude-haiku-4-5': { rpm: 60 },
|
|
20
77
|
// OpenAI models
|
|
21
78
|
'gpt-4o': { rpm: 30 },
|
|
@@ -23,28 +80,85 @@ exports.DEFAULT_LIMITS = {
|
|
|
23
80
|
'o1': { rpm: 10, maxTokens: 4096 },
|
|
24
81
|
'o3-mini': { rpm: 30 },
|
|
25
82
|
// Default for unknown models
|
|
26
|
-
'default': { rpm: 60 }
|
|
83
|
+
'default': { rpm: 60 },
|
|
27
84
|
};
|
|
28
85
|
class RateLimiter {
|
|
29
86
|
buckets = new Map();
|
|
87
|
+
queues = new Map();
|
|
88
|
+
drainTimers = new Map();
|
|
30
89
|
lastCleanup = Date.now();
|
|
31
90
|
CLEANUP_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
|
91
|
+
modelOverrides = {};
|
|
92
|
+
/**
|
|
93
|
+
* Provider-level overrides. Key is provider name (e.g. "anthropic").
|
|
94
|
+
* Applied when no model-specific override exists.
|
|
95
|
+
* Set via config.json `providers.{name}.rateLimit.rpm`.
|
|
96
|
+
*/
|
|
97
|
+
providerOverrides = {};
|
|
98
|
+
maxQueueDepth;
|
|
99
|
+
queueTimeoutMs;
|
|
100
|
+
constructor(opts) {
|
|
101
|
+
this.maxQueueDepth = opts?.maxQueueDepth ?? 50;
|
|
102
|
+
this.queueTimeoutMs = opts?.queueTimeoutMs ?? 30_000;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Apply configuration from ~/.relayplane/config.json rateLimit section.
|
|
106
|
+
* Call once at proxy startup.
|
|
107
|
+
*/
|
|
108
|
+
configure(cfg) {
|
|
109
|
+
if (cfg.models) {
|
|
110
|
+
for (const [model, modelCfg] of Object.entries(cfg.models)) {
|
|
111
|
+
this.modelOverrides[model.toLowerCase()] = { rpm: sanitizeRpm(modelCfg.rpm) };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (cfg.maxQueueDepth !== undefined) {
|
|
115
|
+
this.maxQueueDepth = sanitizeQueueDepth(cfg.maxQueueDepth);
|
|
116
|
+
}
|
|
117
|
+
if (cfg.queueTimeoutMs !== undefined) {
|
|
118
|
+
this.queueTimeoutMs = sanitizeTimeoutMs(cfg.queueTimeoutMs);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Apply per-provider configuration from ~/.relayplane/config.json `providers` section.
|
|
123
|
+
* Call once at proxy startup, after configure().
|
|
124
|
+
*
|
|
125
|
+
* Each provider's rateLimit.rpm becomes the fallback for ALL models from that provider
|
|
126
|
+
* when no model-specific override exists.
|
|
127
|
+
*
|
|
128
|
+
* Example config.json:
|
|
129
|
+
* ```json
|
|
130
|
+
* { "providers": { "anthropic": { "rateLimit": { "rpm": 100 } } } }
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
configureProviders(providers) {
|
|
134
|
+
for (const [provider, cfg] of Object.entries(providers)) {
|
|
135
|
+
if (cfg.rateLimit?.rpm !== undefined) {
|
|
136
|
+
this.providerOverrides[provider.toLowerCase()] = { rpm: sanitizeRpm(cfg.rateLimit.rpm) };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
32
140
|
/**
|
|
33
|
-
*
|
|
141
|
+
* Synchronous check — returns immediately without queuing.
|
|
142
|
+
* Increments counter if allowed.
|
|
143
|
+
*
|
|
144
|
+
* @param provider Optional provider name (e.g. "anthropic"). Used to look up
|
|
145
|
+
* provider-level RPM limits when no model-specific override exists.
|
|
146
|
+
* Limits are isolated per-provider — one provider hitting its cap
|
|
147
|
+
* does NOT affect other providers.
|
|
34
148
|
*/
|
|
35
|
-
checkLimit(workspaceId, model) {
|
|
149
|
+
checkLimit(workspaceId, model, provider) {
|
|
36
150
|
this.maybeCleanup();
|
|
37
|
-
const config = this.getConfig(model);
|
|
38
|
-
const
|
|
151
|
+
const config = this.getConfig(model, provider);
|
|
152
|
+
const providerSeg = provider ? `:${provider.toLowerCase()}` : '';
|
|
153
|
+
const key = `${workspaceId}${providerSeg}:${this.getModelKey(model)}:${this.getCurrentMinute()}`;
|
|
39
154
|
const now = Date.now();
|
|
40
|
-
const windowMs = 60 * 1000;
|
|
155
|
+
const windowMs = 60 * 1000;
|
|
41
156
|
const resetAt = this.getCurrentMinute() + windowMs;
|
|
42
157
|
let entry = this.buckets.get(key);
|
|
43
158
|
if (!entry) {
|
|
44
159
|
entry = { count: 0, resetAt };
|
|
45
160
|
this.buckets.set(key, entry);
|
|
46
161
|
}
|
|
47
|
-
// Check if window expired and reset
|
|
48
162
|
if (now > entry.resetAt) {
|
|
49
163
|
entry.count = 0;
|
|
50
164
|
entry.resetAt = resetAt;
|
|
@@ -59,9 +173,91 @@ class RateLimiter {
|
|
|
59
173
|
remaining,
|
|
60
174
|
resetAt,
|
|
61
175
|
limit: config.rpm,
|
|
62
|
-
retryAfter: allowed ? undefined : Math.ceil((resetAt - now) / 1000)
|
|
176
|
+
retryAfter: allowed ? undefined : Math.ceil((resetAt - now) / 1000),
|
|
63
177
|
};
|
|
64
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Async slot acquisition with queuing.
|
|
181
|
+
*
|
|
182
|
+
* - Resolves immediately if a slot is available.
|
|
183
|
+
* - Queues the request if the limit is hit (up to maxQueueDepth).
|
|
184
|
+
* - Throws RateLimitError with code QUEUE_FULL if the queue is full.
|
|
185
|
+
* - Throws RateLimitError with code QUEUE_TIMEOUT if the request waits too long.
|
|
186
|
+
*/
|
|
187
|
+
async acquireSlot(workspaceId, model, provider) {
|
|
188
|
+
const check = this.checkLimit(workspaceId, model, provider);
|
|
189
|
+
if (check.allowed)
|
|
190
|
+
return;
|
|
191
|
+
const providerSeg = provider ? `:${provider.toLowerCase()}` : '';
|
|
192
|
+
const queueKey = `${workspaceId}${providerSeg}:${this.getModelKey(model)}`;
|
|
193
|
+
if (!this.queues.has(queueKey)) {
|
|
194
|
+
this.queues.set(queueKey, []);
|
|
195
|
+
}
|
|
196
|
+
const queue = this.queues.get(queueKey);
|
|
197
|
+
if (queue.length >= this.maxQueueDepth) {
|
|
198
|
+
throw new RateLimitError(`Rate limit queue full for ${model}. Max queue depth (${this.maxQueueDepth}) reached. ` +
|
|
199
|
+
`Retry after ${check.retryAfter ?? 60}s.`, {
|
|
200
|
+
code: 'QUEUE_FULL',
|
|
201
|
+
retryAfter: check.retryAfter ?? 60,
|
|
202
|
+
limit: check.limit,
|
|
203
|
+
resetAt: check.resetAt,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// Schedule drain at window reset (only one timer per queue key)
|
|
207
|
+
this.scheduleDrain(queueKey, workspaceId, model, check.resetAt, provider);
|
|
208
|
+
return new Promise((resolve, reject) => {
|
|
209
|
+
const timeoutId = setTimeout(() => {
|
|
210
|
+
const idx = queue.indexOf(entry);
|
|
211
|
+
if (idx >= 0)
|
|
212
|
+
queue.splice(idx, 1);
|
|
213
|
+
reject(new RateLimitError(`Rate limit queue timeout for ${model} after ${this.queueTimeoutMs}ms. ` +
|
|
214
|
+
`Retry after ${entry.check.retryAfter ?? 60}s.`, {
|
|
215
|
+
code: 'QUEUE_TIMEOUT',
|
|
216
|
+
retryAfter: entry.check.retryAfter ?? 60,
|
|
217
|
+
limit: entry.check.limit,
|
|
218
|
+
resetAt: entry.check.resetAt,
|
|
219
|
+
}));
|
|
220
|
+
}, this.queueTimeoutMs);
|
|
221
|
+
const entry = {
|
|
222
|
+
resolve: () => {
|
|
223
|
+
clearTimeout(timeoutId);
|
|
224
|
+
resolve();
|
|
225
|
+
},
|
|
226
|
+
reject: (err) => {
|
|
227
|
+
clearTimeout(timeoutId);
|
|
228
|
+
reject(err);
|
|
229
|
+
},
|
|
230
|
+
timeoutId,
|
|
231
|
+
check,
|
|
232
|
+
};
|
|
233
|
+
queue.push(entry);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
scheduleDrain(queueKey, workspaceId, model, resetAt, provider) {
|
|
237
|
+
if (this.drainTimers.has(queueKey))
|
|
238
|
+
return; // already scheduled
|
|
239
|
+
const delay = Math.max(0, resetAt - Date.now());
|
|
240
|
+
const timer = setTimeout(() => {
|
|
241
|
+
this.drainTimers.delete(queueKey);
|
|
242
|
+
this.drainQueue(queueKey, workspaceId, model, provider);
|
|
243
|
+
}, delay);
|
|
244
|
+
this.drainTimers.set(queueKey, timer);
|
|
245
|
+
}
|
|
246
|
+
drainQueue(queueKey, workspaceId, model, provider) {
|
|
247
|
+
const queue = this.queues.get(queueKey);
|
|
248
|
+
if (!queue || queue.length === 0)
|
|
249
|
+
return;
|
|
250
|
+
while (queue.length > 0) {
|
|
251
|
+
const check = this.checkLimit(workspaceId, model, provider);
|
|
252
|
+
if (!check.allowed) {
|
|
253
|
+
// Window filled up — schedule next drain at next window reset
|
|
254
|
+
this.scheduleDrain(queueKey, workspaceId, model, check.resetAt, provider);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const entry = queue.shift();
|
|
258
|
+
entry.resolve();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
65
261
|
/**
|
|
66
262
|
* Get current usage for a workspace/model
|
|
67
263
|
*/
|
|
@@ -72,7 +268,7 @@ class RateLimiter {
|
|
|
72
268
|
return {
|
|
73
269
|
used: entry?.count || 0,
|
|
74
270
|
limit: config.rpm,
|
|
75
|
-
resetAt: entry?.resetAt || this.getCurrentMinute() + 60 * 1000
|
|
271
|
+
resetAt: entry?.resetAt || this.getCurrentMinute() + 60 * 1000,
|
|
76
272
|
};
|
|
77
273
|
}
|
|
78
274
|
/**
|
|
@@ -88,6 +284,13 @@ class RateLimiter {
|
|
|
88
284
|
}
|
|
89
285
|
}
|
|
90
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Get current queue depth for a workspace/model
|
|
289
|
+
*/
|
|
290
|
+
getQueueDepth(workspaceId, model) {
|
|
291
|
+
const queueKey = `${workspaceId}:${this.getModelKey(model)}`;
|
|
292
|
+
return this.queues.get(queueKey)?.length ?? 0;
|
|
293
|
+
}
|
|
91
294
|
/**
|
|
92
295
|
* Get all active limits (for debugging)
|
|
93
296
|
*/
|
|
@@ -95,18 +298,32 @@ class RateLimiter {
|
|
|
95
298
|
return Array.from(this.buckets.entries()).map(([key, entry]) => ({
|
|
96
299
|
key,
|
|
97
300
|
count: entry.count,
|
|
98
|
-
resetAt: entry.resetAt
|
|
301
|
+
resetAt: entry.resetAt,
|
|
99
302
|
}));
|
|
100
303
|
}
|
|
101
|
-
getConfig(model) {
|
|
102
|
-
// Normalize model name
|
|
304
|
+
getConfig(model, provider) {
|
|
103
305
|
const normalized = model.toLowerCase().replace(/[^a-z0-9-]/g, '');
|
|
104
|
-
//
|
|
306
|
+
// 1. Model-specific override takes highest priority
|
|
307
|
+
if (this.modelOverrides[normalized]) {
|
|
308
|
+
return this.modelOverrides[normalized];
|
|
309
|
+
}
|
|
310
|
+
// 2. Provider-level override (e.g. providers.anthropic.rateLimit.rpm)
|
|
311
|
+
// Applies to ALL models from this provider when no model-specific override exists.
|
|
312
|
+
// Each provider maintains its own isolated bucket — limits don't cascade across providers.
|
|
313
|
+
if (provider) {
|
|
314
|
+
const providerNorm = provider.toLowerCase();
|
|
315
|
+
if (this.providerOverrides[providerNorm]) {
|
|
316
|
+
return this.providerOverrides[providerNorm];
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// 3. Check exact match in built-in defaults
|
|
105
320
|
if (exports.DEFAULT_LIMITS[normalized]) {
|
|
106
321
|
return exports.DEFAULT_LIMITS[normalized];
|
|
107
322
|
}
|
|
108
|
-
//
|
|
323
|
+
// 4. Partial match (e.g. "claude-sonnet" matches "claude-sonnet-4-6")
|
|
109
324
|
for (const [key, config] of Object.entries(exports.DEFAULT_LIMITS)) {
|
|
325
|
+
if (key === 'default')
|
|
326
|
+
continue;
|
|
110
327
|
if (normalized.includes(key) || key.includes(normalized)) {
|
|
111
328
|
return config;
|
|
112
329
|
}
|
|
@@ -135,23 +352,40 @@ class RateLimiter {
|
|
|
135
352
|
}
|
|
136
353
|
maybeCleanup() {
|
|
137
354
|
const now = Date.now();
|
|
138
|
-
if (now - this.lastCleanup < this.CLEANUP_INTERVAL)
|
|
355
|
+
if (now - this.lastCleanup < this.CLEANUP_INTERVAL)
|
|
139
356
|
return;
|
|
140
|
-
}
|
|
141
|
-
// Remove expired entries
|
|
142
357
|
for (const [key, entry] of this.buckets) {
|
|
143
|
-
if (now > entry.resetAt + 60000) {
|
|
358
|
+
if (now > entry.resetAt + 60000) {
|
|
144
359
|
this.buckets.delete(key);
|
|
145
360
|
}
|
|
146
361
|
}
|
|
147
362
|
this.lastCleanup = now;
|
|
148
363
|
}
|
|
149
364
|
}
|
|
365
|
+
exports.RateLimiter = RateLimiter;
|
|
150
366
|
// Singleton instance
|
|
151
367
|
exports.rateLimiter = new RateLimiter();
|
|
368
|
+
/**
|
|
369
|
+
* Load rateLimit + providers config from ~/.relayplane/config.json and apply to the singleton.
|
|
370
|
+
* Call once at proxy startup.
|
|
371
|
+
*/
|
|
372
|
+
function configureRateLimiter() {
|
|
373
|
+
try {
|
|
374
|
+
// Dynamic require to avoid circular deps at module init time
|
|
375
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
376
|
+
const cfg = require('./config.js');
|
|
377
|
+
exports.rateLimiter.configure(cfg.getRateLimitConfig());
|
|
378
|
+
exports.rateLimiter.configureProviders(cfg.getProviderConfigs());
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
// Ignore — use defaults
|
|
382
|
+
}
|
|
383
|
+
}
|
|
152
384
|
// Convenience exports
|
|
153
|
-
const checkLimit = (workspaceId, model) => exports.rateLimiter.checkLimit(workspaceId, model);
|
|
385
|
+
const checkLimit = (workspaceId, model, provider) => exports.rateLimiter.checkLimit(workspaceId, model, provider);
|
|
154
386
|
exports.checkLimit = checkLimit;
|
|
387
|
+
const acquireSlot = (workspaceId, model, provider) => exports.rateLimiter.acquireSlot(workspaceId, model, provider);
|
|
388
|
+
exports.acquireSlot = acquireSlot;
|
|
155
389
|
const getUsage = (workspaceId, model) => exports.rateLimiter.getUsage(workspaceId, model);
|
|
156
390
|
exports.getUsage = getUsage;
|
|
157
391
|
const resetLimit = (workspaceId, model) => exports.rateLimiter.resetLimit(workspaceId, model);
|
package/dist/rate-limiter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import * as http from 'node:http';
|
|
22
22
|
import type { Provider as CoreProvider } from '@relayplane/core';
|
|
23
|
-
type Provider = CoreProvider | 'openrouter' | 'deepseek' | 'groq' | 'mistral' | 'together' | 'fireworks' | 'perplexity';
|
|
23
|
+
type Provider = CoreProvider | 'openrouter' | 'deepseek' | 'groq' | 'mistral' | 'together' | 'fireworks' | 'perplexity' | 'ollama';
|
|
24
24
|
import { StatsCollector } from './stats.js';
|
|
25
25
|
/** Shared stats collector instance for the proxy server */
|
|
26
26
|
export declare const proxyStatsCollector: StatsCollector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE3E,KAAK,QAAQ,GAAG,YAAY,GACxB,YAAY,GACZ,UAAU,GACV,MAAM,GACN,SAAS,GACT,UAAU,GACV,WAAW,GACX,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"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"}
|