@careob/llm-gateway 1.0.1 → 1.1.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 CHANGED
@@ -4,12 +4,15 @@ Lightweight LLM gateway for Node.js with multi-key rotation, rate-limit handling
4
4
 
5
5
  ## Features
6
6
 
7
- - **11+ providers** — OpenAI, Anthropic, Gemini, DeepSeek, Groq, Mistral, Together, Qwen, Zhipu, Moonshot, Yi
7
+ - **12+ providers** — OpenAI, Anthropic, Gemini, OpenRouter, DeepSeek, Groq, Mistral, Together, Qwen, Zhipu, Moonshot, Yi
8
8
  - **Key rotation** — round-robin across multiple API keys per provider
9
- - **Rate-limit handling** — automatic cooldown and retry on 429s
10
- - **Provider failover** — falls back to alternate providers when one is exhausted
9
+ - **Rate-limit handling** — automatic cooldown, exponential backoff with jitter on 429s
10
+ - **Retry classification** — 400s fail fast, 401/403 quarantine keys, 429/5xx retry with backoff
11
+ - **Provider failover** — capability-aware fallback to alternate providers
12
+ - **Safe errors** — API keys and raw provider bodies are never exposed in error messages
13
+ - **AbortSignal** — cancel requests with a caller-provided `AbortSignal`
11
14
  - **Spend tracking** — per-request cost estimation and usage logging
12
- - **Streaming** — SSE streaming support for OpenAI-compatible providers
15
+ - **Streaming** — SSE streaming with stream-idle timeout detection
13
16
  - **Express middleware** — drop-in proxy for Express apps
14
17
  - **Auto-discovery** — detects API keys from environment variables
15
18
  - **Zero dependencies** — only uses `express` as an optional peer dependency
@@ -75,6 +78,27 @@ for await (const chunk of gateway.chatStream({
75
78
  }
76
79
  ```
77
80
 
81
+ ## OpenRouter
82
+
83
+ Access 200+ models through a single API key via [OpenRouter](https://openrouter.ai):
84
+
85
+ ```typescript
86
+ const gateway = new LLMGateway({
87
+ keys: ['sk-or-v1-your-openrouter-key'],
88
+ defaultModel: 'openai/gpt-4o',
89
+ openRouterReferer: 'https://your-app.com',
90
+ openRouterTitle: 'Your App Name',
91
+ });
92
+
93
+ // Use namespaced model identifiers
94
+ const response = await gateway.chat({
95
+ model: 'anthropic/claude-sonnet-4',
96
+ messages: [{ role: 'user', content: 'Hello!' }],
97
+ });
98
+ ```
99
+
100
+ OpenRouter keys (`sk-or-*`) are auto-detected. Models use namespaced identifiers like `openai/gpt-4o`, `anthropic/claude-sonnet-4`, `google/gemini-2.5-flash`, etc.
101
+
78
102
  ## Express Proxy
79
103
 
80
104
  Mount the gateway as an API endpoint in your Express app:
@@ -122,9 +146,12 @@ const gateway = new LLMGateway({
122
146
  | `defaultModel` | — | Model to use when not specified in request |
123
147
  | `maxRetries` | `3` | Retries across keys before failing |
124
148
  | `cooldownMs` | `60000` | Cooldown duration for rate-limited keys (ms) |
125
- | `timeoutMs` | `30000` | Request timeout (ms) |
149
+ | `timeoutMs` | `30000` | Connection timeout (ms) |
150
+ | `streamTimeoutMs` | `15000` | Stream idle timeout — no data received (ms) |
126
151
  | `onUsage` | — | Callback for usage/spend logging |
127
152
  | `onAllKeysExhausted` | — | Callback when all keys for a provider are exhausted |
153
+ | `openRouterReferer` | — | Your site URL for OpenRouter rankings (sent as `HTTP-Referer`) |
154
+ | `openRouterTitle` | — | Your app name for OpenRouter rankings (sent as `X-Title`) |
128
155
 
129
156
  ### KeyInput
130
157
 
@@ -145,6 +172,7 @@ const gateway = new LLMGateway({
145
172
  | OpenAI | openai | gpt-4o, gpt-4o-mini, o1, o3-mini, o4-mini, ... |
146
173
  | Anthropic | anthropic | claude-opus-4, claude-sonnet-4, claude-haiku-3.5 |
147
174
  | Google Gemini | gemini | gemini-2.5-pro, gemini-2.5-flash, ... |
175
+ | OpenRouter | openai | openai/gpt-4o, anthropic/claude-sonnet-4, google/gemini-2.5-flash, ... |
148
176
  | DeepSeek | openai | deepseek-chat, deepseek-coder, deepseek-reasoner |
149
177
  | Groq | openai | llama-3.3-70b, mixtral-8x7b, ... |
150
178
  | Mistral | openai | mistral-large, mistral-small, codestral |
@@ -161,6 +189,14 @@ const stats = gateway.getStats();
161
189
  // [{ provider: 'openai', label: 'prod-1', healthy: true, requestsThisMinute: 12, ... }]
162
190
  ```
163
191
 
192
+ ## Development
193
+
194
+ ```bash
195
+ npm test # run tests
196
+ npm run test:coverage # run tests with coverage report
197
+ npm run ci # typecheck + build + test
198
+ ```
199
+
164
200
  ## License
165
201
 
166
202
  MIT
package/dist/gateway.d.ts CHANGED
@@ -3,15 +3,11 @@ export declare class LLMGateway {
3
3
  private pool;
4
4
  private config;
5
5
  private providersByKey;
6
+ private openRouterDef;
6
7
  constructor(config: GatewayConfig);
7
- /**
8
- * Auto-discover keys from environment variables.
9
- * Scans for OPENAI_API_KEY, ANTHROPIC_KEY, GEMINI_API_KEY_1, DEEPSEEK_KEY, etc.
10
- */
11
8
  static fromEnv(overrides?: Omit<GatewayConfig, 'keys'>, env?: Record<string, string | undefined>): LLMGateway;
12
9
  chat(request: ChatRequest): Promise<ChatResponse>;
13
10
  chatStream(request: ChatRequest): AsyncGenerator<StreamChunk, void, unknown>;
14
- /** Get health/stats for all registered keys */
15
11
  getStats(): {
16
12
  provider: string;
17
13
  label: string;
@@ -21,10 +17,10 @@ export declare class LLMGateway {
21
17
  totalErrors: number;
22
18
  cooldownUntil: number;
23
19
  }[];
24
- /** List all registered providers */
25
20
  getProviders(): string[];
26
21
  private registerKeys;
27
- private resolveProviders;
22
+ private getProviderDef;
23
+ private resolveTargets;
28
24
  private logUsage;
29
25
  }
30
26
  export type GatewayErrorCode = 'CONFIG_ERROR' | 'PROVIDER_ERROR' | 'NETWORK_ERROR' | 'TIMEOUT' | 'ALL_EXHAUSTED' | 'UNSUPPORTED';
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EACX,YAAY,EACZ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAgF;IAC9F,OAAO,CAAC,cAAc,CAAkC;gBAE5C,MAAM,EAAE,aAAa;IAWjC;;;OAGG;IACH,MAAM,CAAC,OAAO,CACZ,SAAS,GAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAM,EAC3C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACvC,UAAU;IAWP,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwEhD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IAwFnF,+CAA+C;IAC/C,QAAQ;;;;;;;;;IAIR,oCAAoC;IACpC,YAAY;IAMZ,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,QAAQ;CAoCjB;AAED,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,eAAe,GACf,aAAa,CAAC;AAElB,qBAAa,YAAa,SAAQ,KAAK;IAG5B,IAAI,EAAE,gBAAgB;IACtB,UAAU,CAAC,EAAE,MAAM;gBAF1B,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,gBAAgB,EACtB,UAAU,CAAC,EAAE,MAAM,YAAA;CAK7B"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EACX,YAAY,EACZ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAyG;IACvH,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAA4B;gBAErC,MAAM,EAAE,aAAa;IAYjC,MAAM,CAAC,OAAO,CACZ,SAAS,GAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAM,EAC3C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACvC,UAAU;IAWP,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAkGhD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IAuInF,QAAQ;;;;;;;;;IAIR,YAAY;IAMZ,OAAO,CAAC,YAAY;IAqCpB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,QAAQ;CAoCjB;AA6FD,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,eAAe,GACf,aAAa,CAAC;AAElB,qBAAa,YAAa,SAAQ,KAAK;IAG5B,IAAI,EAAE,gBAAgB;IACtB,UAAU,CAAC,EAAE,MAAM;gBAF1B,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,gBAAgB,EACtB,UAAU,CAAC,EAAE,MAAM,YAAA;CAK7B"}
package/dist/gateway.js CHANGED
@@ -1,23 +1,21 @@
1
1
  import { KeyPool } from './key-pool.js';
2
- import { PROVIDERS, detectProvider, discoverKeysFromEnv, findProviderForModel, buildRequest, parseResponse, parseStreamChunk, estimateCost, } from './registry.js';
2
+ import { PROVIDERS, detectProvider, discoverKeysFromEnv, findProviderForModel, buildRequest, parseResponse, createStreamParser, estimateCost, checkCapabilities, inferRequiredCapabilities, } from './registry.js';
3
3
  export class LLMGateway {
4
4
  pool;
5
5
  config;
6
6
  providersByKey = new Map();
7
+ openRouterDef = null;
7
8
  constructor(config) {
8
9
  this.config = {
9
10
  ...config,
10
11
  maxRetries: config.maxRetries ?? 3,
11
12
  cooldownMs: config.cooldownMs ?? 60_000,
12
13
  timeoutMs: config.timeoutMs ?? 30_000,
14
+ streamTimeoutMs: config.streamTimeoutMs ?? 15_000,
13
15
  };
14
16
  this.pool = new KeyPool(this.config.cooldownMs);
15
17
  this.registerKeys(config.keys);
16
18
  }
17
- /**
18
- * Auto-discover keys from environment variables.
19
- * Scans for OPENAI_API_KEY, ANTHROPIC_KEY, GEMINI_API_KEY_1, DEEPSEEK_KEY, etc.
20
- */
21
19
  static fromEnv(overrides = {}, env) {
22
20
  const discovered = discoverKeysFromEnv(env);
23
21
  if (discovered.length === 0) {
@@ -32,11 +30,12 @@ export class LLMGateway {
32
30
  const model = request.model ?? this.config.defaultModel;
33
31
  if (!model)
34
32
  throw new GatewayError('No model specified and no defaultModel configured', 'CONFIG_ERROR');
35
- const fullRequest = { ...request, model, stream: false };
36
- const providers = this.resolveProviders(fullRequest);
33
+ const targets = this.resolveTargets({ ...request, model });
37
34
  let lastError = null;
38
35
  let attempt = 0;
39
- for (const providerDef of providers) {
36
+ for (const target of targets) {
37
+ const providerDef = target.provider;
38
+ const targetRequest = { ...request, model: target.model, stream: false };
40
39
  for (let retry = 0; retry < this.config.maxRetries; retry++) {
41
40
  const key = this.pool.getNextKey(providerDef.id);
42
41
  if (!key)
@@ -45,22 +44,35 @@ export class LLMGateway {
45
44
  const requestId = `req_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
46
45
  const start = Date.now();
47
46
  try {
48
- const { url, init } = buildRequest(providerDef, fullRequest, key.key);
47
+ const { url, init } = buildRequest(providerDef, targetRequest, key.key);
49
48
  const controller = new AbortController();
50
49
  const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);
51
- init.signal = controller.signal;
50
+ init.signal = linkSignals(controller, request.signal);
52
51
  const res = await fetch(url, init);
53
52
  clearTimeout(timeout);
54
- if (res.status === 429) {
55
- this.pool.recordRateLimit(key);
56
- this.logUsage(requestId, providerDef.id, key, model, start, 'rate_limited', undefined, 'Rate limited');
53
+ const classification = classifyStatus(res.status);
54
+ if (classification === 'rate_limited') {
55
+ this.pool.recordRateLimit(key, parseRetryAfterMs(res));
56
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'rate_limited', undefined, 'Rate limited');
57
+ await backoff(retry);
57
58
  continue;
58
59
  }
59
- if (!res.ok) {
60
- const errorText = await res.text().catch(() => `HTTP ${res.status}`);
60
+ if (classification === 'auth_error') {
61
+ this.pool.quarantineKey(key);
62
+ lastError = new GatewayError(safeErrorMessage(providerDef, res.status), 'PROVIDER_ERROR', res.status);
63
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'error', undefined, `HTTP ${res.status}`);
64
+ continue;
65
+ }
66
+ if (classification === 'bad_request') {
67
+ const errorText = await res.text().catch(() => '');
68
+ this.pool.recordError(key);
69
+ throw new GatewayError(safeErrorMessage(providerDef, res.status, errorText), 'PROVIDER_ERROR', res.status);
70
+ }
71
+ if (classification === 'server_error') {
61
72
  this.pool.recordError(key);
62
- lastError = new GatewayError(`${providerDef.label}: ${errorText}`, 'PROVIDER_ERROR', res.status);
63
- this.logUsage(requestId, providerDef.id, key, model, start, 'error', undefined, errorText);
73
+ lastError = new GatewayError(safeErrorMessage(providerDef, res.status), 'PROVIDER_ERROR', res.status);
74
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'error', undefined, `HTTP ${res.status}`);
75
+ await backoff(retry);
64
76
  continue;
65
77
  }
66
78
  const data = await res.json();
@@ -72,19 +84,29 @@ export class LLMGateway {
72
84
  attempt,
73
85
  };
74
86
  this.pool.recordSuccess(key, parsed.usage.total_tokens);
75
- this.logUsage(requestId, providerDef.id, key, model, start, 'success', parsed.usage, undefined, request.metadata);
87
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'success', parsed.usage, undefined, request.metadata);
76
88
  return parsed;
77
89
  }
78
90
  catch (err) {
79
- const msg = err instanceof Error ? err.message : String(err);
80
- this.pool.recordError(key);
81
- if (msg.includes('abort')) {
82
- lastError = new GatewayError(`${providerDef.label}: timeout`, 'TIMEOUT');
91
+ if (err instanceof GatewayError) {
92
+ if (err.code === 'PROVIDER_ERROR' && !isRetryableCode(err.statusCode))
93
+ throw err;
94
+ lastError = err;
83
95
  }
84
96
  else {
85
- lastError = err instanceof GatewayError ? err : new GatewayError(`${providerDef.label}: ${msg}`, 'NETWORK_ERROR');
97
+ const msg = err instanceof Error ? err.message : String(err);
98
+ this.pool.recordError(key);
99
+ if (request.signal?.aborted) {
100
+ throw new GatewayError('Request cancelled', 'TIMEOUT');
101
+ }
102
+ if (msg.includes('abort')) {
103
+ lastError = new GatewayError(`${providerDef.label}: timeout`, 'TIMEOUT');
104
+ }
105
+ else {
106
+ lastError = new GatewayError(`${providerDef.label}: network error`, 'NETWORK_ERROR');
107
+ }
86
108
  }
87
- this.logUsage(requestId, providerDef.id, key, model, start, 'error', undefined, msg);
109
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'error', undefined, lastError.message);
88
110
  }
89
111
  }
90
112
  this.config.onAllKeysExhausted?.(providerDef.id);
@@ -95,83 +117,123 @@ export class LLMGateway {
95
117
  const model = request.model ?? this.config.defaultModel;
96
118
  if (!model)
97
119
  throw new GatewayError('No model specified and no defaultModel configured', 'CONFIG_ERROR');
98
- const fullRequest = { ...request, model, stream: true };
99
- const providers = this.resolveProviders(fullRequest);
120
+ const targets = this.resolveTargets({ ...request, model });
100
121
  let lastError = null;
101
- for (const providerDef of providers) {
102
- if (providerDef.format !== 'openai') {
103
- continue;
104
- }
122
+ for (const target of targets) {
123
+ const providerDef = target.provider;
124
+ const targetRequest = { ...request, model: target.model, stream: true };
105
125
  for (let retry = 0; retry < this.config.maxRetries; retry++) {
106
126
  const key = this.pool.getNextKey(providerDef.id);
107
127
  if (!key)
108
128
  break;
109
129
  const requestId = `req_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
110
130
  const start = Date.now();
131
+ let yieldedAny = false;
111
132
  try {
112
- const { url, init } = buildRequest(providerDef, fullRequest, key.key);
133
+ const { url, init } = buildRequest(providerDef, targetRequest, key.key);
113
134
  const controller = new AbortController();
114
- const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs * 3);
115
- init.signal = controller.signal;
135
+ const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);
136
+ init.signal = linkSignals(controller, request.signal);
116
137
  const res = await fetch(url, init);
117
138
  clearTimeout(timeout);
118
- if (res.status === 429) {
119
- this.pool.recordRateLimit(key);
139
+ const classification = classifyStatus(res.status);
140
+ if (classification === 'rate_limited') {
141
+ this.pool.recordRateLimit(key, parseRetryAfterMs(res));
142
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'rate_limited', undefined, 'Rate limited');
143
+ await backoff(retry);
120
144
  continue;
121
145
  }
122
- if (!res.ok) {
146
+ if (classification === 'auth_error') {
147
+ this.pool.quarantineKey(key);
148
+ lastError = new GatewayError(safeErrorMessage(providerDef, res.status), 'PROVIDER_ERROR', res.status);
149
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'error', undefined, `HTTP ${res.status}`);
150
+ continue;
151
+ }
152
+ if (classification === 'bad_request') {
153
+ this.pool.recordError(key);
154
+ throw new GatewayError(safeErrorMessage(providerDef, res.status), 'PROVIDER_ERROR', res.status);
155
+ }
156
+ if (classification === 'server_error') {
123
157
  this.pool.recordError(key);
124
- lastError = new GatewayError(`${providerDef.label}: HTTP ${res.status}`, 'PROVIDER_ERROR', res.status);
158
+ lastError = new GatewayError(safeErrorMessage(providerDef, res.status), 'PROVIDER_ERROR', res.status);
159
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'error', undefined, `HTTP ${res.status}`);
160
+ await backoff(retry);
125
161
  continue;
126
162
  }
127
163
  if (!res.body)
128
164
  throw new GatewayError('No response body for stream', 'PROVIDER_ERROR');
165
+ const parseLine = createStreamParser(providerDef);
129
166
  const reader = res.body.getReader();
130
167
  const decoder = new TextDecoder();
131
168
  let buffer = '';
132
- let totalTokens = 0;
169
+ let usage = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
133
170
  try {
134
171
  while (true) {
135
- const { done, value } = await reader.read();
172
+ const readPromise = reader.read();
173
+ const idleTimeout = this.config.streamTimeoutMs;
174
+ const { done, value } = await (idleTimeout > 0
175
+ ? Promise.race([
176
+ readPromise,
177
+ new Promise((_, reject) => setTimeout(() => reject(new GatewayError(`${providerDef.label}: stream idle timeout`, 'TIMEOUT')), idleTimeout)),
178
+ ])
179
+ : readPromise);
136
180
  if (done)
137
181
  break;
138
182
  buffer += decoder.decode(value, { stream: true });
139
183
  const lines = buffer.split('\n');
140
184
  buffer = lines.pop() ?? '';
141
185
  for (const line of lines) {
142
- const chunk = parseStreamChunk(line);
186
+ const chunk = parseLine(line);
143
187
  if (chunk) {
144
188
  if (chunk.usage)
145
- totalTokens = chunk.usage.total_tokens;
189
+ usage = chunk.usage;
190
+ yieldedAny = true;
146
191
  yield chunk;
147
192
  }
148
193
  }
149
194
  }
195
+ if (buffer.trim()) {
196
+ const chunk = parseLine(buffer);
197
+ if (chunk) {
198
+ if (chunk.usage)
199
+ usage = chunk.usage;
200
+ yieldedAny = true;
201
+ yield chunk;
202
+ }
203
+ }
150
204
  }
151
205
  finally {
152
206
  reader.releaseLock();
153
207
  }
154
- this.pool.recordSuccess(key, totalTokens);
155
- this.logUsage(requestId, providerDef.id, key, model, start, 'success', {
156
- prompt_tokens: 0, completion_tokens: 0, total_tokens: totalTokens,
157
- }, undefined, request.metadata);
208
+ this.pool.recordSuccess(key, usage.total_tokens);
209
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'success', usage, undefined, request.metadata);
158
210
  return;
159
211
  }
160
212
  catch (err) {
161
- if (err instanceof GatewayError)
162
- throw err;
163
- this.pool.recordError(key);
164
- lastError = new GatewayError(`${providerDef.label}: ${err instanceof Error ? err.message : String(err)}`, 'NETWORK_ERROR');
213
+ if (err instanceof GatewayError) {
214
+ if (yieldedAny)
215
+ throw err;
216
+ lastError = err;
217
+ }
218
+ else {
219
+ this.pool.recordError(key);
220
+ if (request.signal?.aborted) {
221
+ throw new GatewayError('Request cancelled', 'TIMEOUT');
222
+ }
223
+ lastError = new GatewayError(`${providerDef.label}: ${err instanceof Error && err.message.includes('abort') ? 'timeout' : 'network error'}`, err instanceof Error && err.message.includes('abort') ? 'TIMEOUT' : 'NETWORK_ERROR');
224
+ if (yieldedAny)
225
+ throw lastError;
226
+ }
227
+ this.logUsage(requestId, providerDef.id, key, target.model, start, 'error', undefined, lastError.message);
165
228
  }
166
229
  }
230
+ this.config.onAllKeysExhausted?.(providerDef.id);
167
231
  }
168
232
  throw lastError ?? new GatewayError('All providers exhausted for streaming', 'ALL_EXHAUSTED');
169
233
  }
170
- /** Get health/stats for all registered keys */
171
234
  getStats() {
172
235
  return this.pool.getStats();
173
236
  }
174
- /** List all registered providers */
175
237
  getProviders() {
176
238
  return this.pool.getProviders();
177
239
  }
@@ -193,27 +255,59 @@ export class LLMGateway {
193
255
  const label = normalized.label ?? `${providerId}-${autoIndex}`;
194
256
  const rpm = normalized.rpm ?? providerDef.defaultRpm;
195
257
  const tpm = normalized.tpm ?? 0;
258
+ if (providerId === 'openrouter' && !this.openRouterDef) {
259
+ const extra = { ...(providerDef.extraHeaders ?? {}) };
260
+ if (this.config.openRouterReferer)
261
+ extra['HTTP-Referer'] = this.config.openRouterReferer;
262
+ if (this.config.openRouterTitle)
263
+ extra['X-Title'] = this.config.openRouterTitle;
264
+ this.openRouterDef = { ...providerDef, extraHeaders: extra };
265
+ }
196
266
  this.pool.addKey(normalized.key, providerId, label, rpm, tpm);
197
- this.providersByKey.set(normalized.key, providerDef);
267
+ this.providersByKey.set(normalized.key, providerId === 'openrouter' && this.openRouterDef ? this.openRouterDef : providerDef);
198
268
  }
199
269
  }
200
- resolveProviders(request) {
270
+ getProviderDef(id) {
271
+ if (id === 'openrouter' && this.openRouterDef)
272
+ return this.openRouterDef;
273
+ return PROVIDERS[id];
274
+ }
275
+ resolveTargets(request) {
276
+ const model = request.model;
277
+ const requiredCaps = inferRequiredCapabilities(request);
201
278
  if (request.provider) {
202
- const def = PROVIDERS[request.provider];
279
+ const def = this.getProviderDef(request.provider);
203
280
  if (!def)
204
281
  throw new GatewayError(`Provider "${request.provider}" not found`, 'CONFIG_ERROR');
205
- return [def];
282
+ const missing = checkCapabilities(def, requiredCaps);
283
+ if (missing) {
284
+ throw new GatewayError(`Provider "${request.provider}" does not support "${missing}" required by this request`, 'UNSUPPORTED');
285
+ }
286
+ return [{ provider: def, model }];
206
287
  }
207
- const registeredProviders = this.pool.getProviders();
208
- const modelProvider = findProviderForModel(request.model);
209
- if (modelProvider && registeredProviders.includes(modelProvider.id)) {
210
- const others = registeredProviders
211
- .filter((id) => id !== modelProvider.id)
212
- .map((id) => PROVIDERS[id])
213
- .filter(Boolean);
214
- return [modelProvider, ...others];
288
+ const registered = new Set(this.pool.getProviders());
289
+ const modelChain = [model, ...(request.fallbackModels ?? this.config.fallbackModels?.[model] ?? [])];
290
+ const targets = [];
291
+ const seen = new Set();
292
+ for (const m of modelChain) {
293
+ const def = findProviderForModel(m);
294
+ if (def && registered.has(def.id) && !seen.has(`${def.id}:${m}`)) {
295
+ const resolved = this.getProviderDef(def.id) ?? def;
296
+ if (checkCapabilities(resolved, requiredCaps))
297
+ continue;
298
+ seen.add(`${def.id}:${m}`);
299
+ targets.push({ provider: resolved, model: m });
300
+ }
215
301
  }
216
- return registeredProviders.map((id) => PROVIDERS[id]).filter(Boolean);
302
+ if (targets.length === 0) {
303
+ for (const id of registered) {
304
+ const def = this.getProviderDef(id);
305
+ if (def && !checkCapabilities(def, requiredCaps)) {
306
+ targets.push({ provider: def, model });
307
+ }
308
+ }
309
+ }
310
+ return targets;
217
311
  }
218
312
  logUsage(requestId, provider, key, model, startMs, status, usage, error, metadata) {
219
313
  if (!this.config.onUsage)
@@ -243,6 +337,90 @@ export class LLMGateway {
243
337
  }
244
338
  }
245
339
  }
340
+ function classifyStatus(status) {
341
+ if (status >= 200 && status < 300)
342
+ return 'ok';
343
+ if (status === 401 || status === 403)
344
+ return 'auth_error';
345
+ if (status === 429 || status === 408)
346
+ return 'rate_limited';
347
+ if (status >= 400 && status < 500)
348
+ return 'bad_request';
349
+ return 'server_error';
350
+ }
351
+ function isRetryableCode(statusCode) {
352
+ if (!statusCode)
353
+ return false;
354
+ return statusCode === 408 || statusCode === 429 || statusCode >= 500;
355
+ }
356
+ // ── Safe Error Messages ──────────────────────────────────────
357
+ function safeErrorMessage(provider, status, rawBody) {
358
+ const base = `${provider.label} returned HTTP ${status}`;
359
+ if (!rawBody)
360
+ return base;
361
+ const safe = extractSafeDetail(rawBody);
362
+ return safe ? `${base}: ${safe}` : base;
363
+ }
364
+ function extractSafeDetail(raw) {
365
+ try {
366
+ const parsed = JSON.parse(raw);
367
+ const msg = parsed?.error?.message ?? parsed?.error?.msg ?? parsed?.message;
368
+ if (typeof msg === 'string')
369
+ return sanitizeMessage(msg);
370
+ }
371
+ catch {
372
+ // not JSON
373
+ }
374
+ return null;
375
+ }
376
+ function sanitizeMessage(msg) {
377
+ return msg
378
+ .replace(/sk-[a-zA-Z0-9_-]{8,}/g, 'sk-****')
379
+ .replace(/AIza[a-zA-Z0-9_-]{8,}/g, 'AIza****')
380
+ .replace(/gsk_[a-zA-Z0-9_-]{8,}/g, 'gsk_****')
381
+ .slice(0, 200);
382
+ }
383
+ // ── Backoff ──────────────────────────────────────────────────
384
+ function backoff(attempt) {
385
+ const base = Math.min(1000 * 2 ** attempt, 10_000);
386
+ const jitter = Math.random() * base * 0.5;
387
+ return new Promise((r) => setTimeout(r, base + jitter));
388
+ }
389
+ // ── AbortSignal Linking ──────────────────────────────────────
390
+ function linkSignals(controller, callerSignal) {
391
+ if (!callerSignal)
392
+ return controller.signal;
393
+ if (callerSignal.aborted) {
394
+ controller.abort();
395
+ return controller.signal;
396
+ }
397
+ const onAbort = () => controller.abort();
398
+ callerSignal.addEventListener('abort', onAbort, { once: true });
399
+ controller.signal.addEventListener('abort', () => {
400
+ callerSignal.removeEventListener('abort', onAbort);
401
+ }, { once: true });
402
+ return controller.signal;
403
+ }
404
+ // ── Retry-After Parsing ──────────────────────────────────────
405
+ function parseRetryAfterMs(res) {
406
+ const header = res.headers.get('retry-after');
407
+ if (!header)
408
+ return undefined;
409
+ const seconds = Number(header);
410
+ let ms;
411
+ if (Number.isFinite(seconds)) {
412
+ ms = seconds * 1000;
413
+ }
414
+ else {
415
+ const date = Date.parse(header);
416
+ if (Number.isNaN(date))
417
+ return undefined;
418
+ ms = date - Date.now();
419
+ }
420
+ if (ms <= 0)
421
+ return undefined;
422
+ return Math.min(ms, 5 * 60_000);
423
+ }
246
424
  export class GatewayError extends Error {
247
425
  code;
248
426
  statusCode;
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,MAAM,eAAe,CAAC;AAavB,MAAM,OAAO,UAAU;IACb,IAAI,CAAU;IACd,MAAM,CAAgF;IACtF,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IAExD,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM;YACvC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;SACtC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,CACZ,YAAyC,EAAE,EAC3C,GAAwC;QAExC,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CAAC,8GAA8G,EAAE,cAAc,CAAC,CAAC;QACzJ,CAAC;QACD,OAAO,IAAI,UAAU,CAAC;YACpB,GAAG,SAAS;YACZ,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;SACpF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACxD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,YAAY,CAAC,mDAAmD,EAAE,cAAc,CAAC,CAAC;QAExG,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,WAAW,IAAI,SAAS,EAAE,CAAC;YACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACjD,IAAI,CAAC,GAAG;oBAAE,MAAM;gBAEhB,OAAO,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAChF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAEzB,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;oBACtE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC5E,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;oBAEhC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACnC,YAAY,CAAC,OAAO,CAAC,CAAC;oBAEtB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBACvB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;wBAC/B,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;wBACvG,SAAS;oBACX,CAAC;oBAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;wBACZ,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;wBACrE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;wBAC3B,SAAS,GAAG,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;wBACjG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;wBAC3F,SAAS;oBACX,CAAC;oBAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBAChD,MAAM,CAAC,QAAQ,GAAG;wBAChB,QAAQ,EAAE,WAAW,CAAC,EAAE;wBACxB,QAAQ,EAAE,GAAG,CAAC,KAAK;wBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC7B,OAAO;qBACR,CAAC;oBAEF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBACxD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAElH,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC7D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC3B,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC1B,SAAS,GAAG,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,WAAW,EAAE,SAAS,CAAC,CAAC;oBAC3E,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,GAAG,YAAY,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,KAAK,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;oBACpH,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,YAAY,CAAC,kCAAkC,EAAE,eAAe,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CAAC,OAAoB;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACxD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,YAAY,CAAC,mDAAmD,EAAE,cAAc,CAAC,CAAC;QAExG,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,SAAS,GAAiB,IAAI,CAAC;QAEnC,KAAK,MAAM,WAAW,IAAI,SAAS,EAAE,CAAC;YACpC,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACpC,SAAS;YACX,CAAC;YAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACjD,IAAI,CAAC,GAAG;oBAAE,MAAM;gBAEhB,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAChF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAEzB,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;oBACtE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;oBAChF,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;oBAEhC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACnC,YAAY,CAAC,OAAO,CAAC,CAAC;oBAEtB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBACvB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;wBAC/B,SAAS;oBACX,CAAC;oBAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;wBACZ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;wBAC3B,SAAS,GAAG,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;wBACvG,SAAS;oBACX,CAAC;oBAED,IAAI,CAAC,GAAG,CAAC,IAAI;wBAAE,MAAM,IAAI,YAAY,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAAC;oBAEvF,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;oBAClC,IAAI,MAAM,GAAG,EAAE,CAAC;oBAChB,IAAI,WAAW,GAAG,CAAC,CAAC;oBAEpB,IAAI,CAAC;wBACH,OAAO,IAAI,EAAE,CAAC;4BACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;4BAC5C,IAAI,IAAI;gCAAE,MAAM;4BAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;4BAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;4BAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gCACzB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;gCACrC,IAAI,KAAK,EAAE,CAAC;oCACV,IAAI,KAAK,CAAC,KAAK;wCAAE,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;oCACxD,MAAM,KAAK,CAAC;gCACd,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;4BAAS,CAAC;wBACT,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvB,CAAC;oBAED,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBAC1C,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;wBACrE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,WAAW;qBAClE,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAEhC,OAAO;gBACT,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,GAAG,YAAY,YAAY;wBAAE,MAAM,GAAG,CAAC;oBAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC3B,SAAS,GAAG,IAAI,YAAY,CAC1B,GAAG,WAAW,CAAC,KAAK,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3E,eAAe,CAChB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,YAAY,CAAC,uCAAuC,EAAE,eAAe,CAAC,CAAC;IAChG,CAAC;IAED,+CAA+C;IAC/C,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,oCAAoC;IACpC,YAAY;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,gEAAgE;IAExD,YAAY,CAAC,IAA8B;QACjD,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,UAAU,GAAa,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAChF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAEzE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,YAAY,CACpB,wCAAwC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS;oBAC3E,gDAAgD,EAChD,cAAc,CACf,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,YAAY,CAAC,qBAAqB,UAAU,aAAa,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YAC1H,CAAC;YAED,SAAS,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC;YAC/D,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC;YACrD,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;YAEhC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAoB;QAC3C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,YAAY,CAAC,aAAa,OAAO,CAAC,QAAQ,aAAa,EAAE,cAAc,CAAC,CAAC;YAC7F,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QAE3D,IAAI,aAAa,IAAI,mBAAmB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;YACpE,MAAM,MAAM,GAAG,mBAAmB;iBAC/B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC;iBACvC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;iBAC1B,MAAM,CAAC,OAAO,CAAkB,CAAC;YACpC,OAAO,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAkB,CAAC;IACzF,CAAC;IAEO,QAAQ,CACd,SAAiB,EACjB,QAAgB,EAChB,GAAa,EACb,KAAa,EACb,OAAe,EACf,MAA4C,EAC5C,KAAkB,EAClB,KAAc,EACd,QAAiC;QAEjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAEjC,MAAM,GAAG,GAAa;YACpB,SAAS;YACT,QAAQ;YACR,QAAQ,EAAE,GAAG,CAAC,KAAK;YACnB,KAAK;YACL,YAAY,EAAE,KAAK,EAAE,aAAa,IAAI,CAAC;YACvC,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,IAAI,CAAC;YAC/C,WAAW,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC;YACrC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAC/B,MAAM;YACN,KAAK;YACL,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,MAAM,YAAY,OAAO;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;IACH,CAAC;CACF;AAUD,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG5B;IACA;IAHT,YACE,OAAe,EACR,IAAsB,EACtB,UAAmB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAkB;QACtB,eAAU,GAAV,UAAU,CAAS;QAG1B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export type { GatewayErrorCode } from './gateway.js';
3
3
  export { KeyPool } from './key-pool.js';
4
4
  export { createExpressProxy } from './middleware.js';
5
5
  export type { ProxyOptions } from './middleware.js';
6
- export { PROVIDERS, detectProvider, discoverKeysFromEnv, findProviderForModel, estimateCost, } from './registry.js';
7
- export type { ProviderDef, ApiFormat, AuthStyle } from './registry.js';
6
+ export { PROVIDERS, detectProvider, discoverKeysFromEnv, findProviderForModel, estimateCost, createStreamParser, checkCapabilities, inferRequiredCapabilities, } from './registry.js';
7
+ export type { ProviderDef, ProviderCapabilities, ApiFormat, AuthStyle, StreamChunkResult, RequiredCapability } from './registry.js';
8
8
  export type { KeyInput, GatewayConfig, ChatMessage, ChatRequest, ChatResponse, StreamChunk, TokenUsage, UsageLog, KeyState, } from './types.js';
9
9
  //# sourceMappingURL=index.d.ts.map