llm-relay 0.0.10 → 0.0.12
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 +15 -15
- package/dist/benchmarks.d.ts +13 -0
- package/dist/benchmarks.js +79 -0
- package/dist/benchmarks.js.map +1 -0
- package/dist/circuit-breaker.d.ts +22 -0
- package/dist/circuit-breaker.js +58 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +136 -22
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +10 -7
- package/dist/config.js +64 -25
- package/dist/config.js.map +1 -1
- package/dist/key-checker.d.ts +13 -0
- package/dist/key-checker.js +101 -0
- package/dist/key-checker.js.map +1 -0
- package/dist/metadata.d.ts +10 -0
- package/dist/metadata.js +74 -0
- package/dist/metadata.js.map +1 -0
- package/dist/ping/cadence.d.ts +52 -0
- package/dist/ping/cadence.js +165 -0
- package/dist/ping/cadence.js.map +1 -0
- package/dist/ping/metrics.d.ts +23 -0
- package/dist/ping/metrics.js +88 -0
- package/dist/ping/metrics.js.map +1 -0
- package/dist/ping/ping.d.ts +40 -0
- package/dist/ping/ping.js +231 -0
- package/dist/ping/ping.js.map +1 -0
- package/dist/ping/probe-cache.d.ts +40 -0
- package/dist/ping/probe-cache.js +96 -0
- package/dist/ping/probe-cache.js.map +1 -0
- package/dist/ping/quota.d.ts +15 -0
- package/dist/ping/quota.js +42 -0
- package/dist/ping/quota.js.map +1 -0
- package/dist/ping/runtime-telemetry.d.ts +42 -0
- package/dist/ping/runtime-telemetry.js +86 -0
- package/dist/ping/runtime-telemetry.js.map +1 -0
- package/dist/registry.d.ts +6 -2
- package/dist/registry.js +7 -1
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.js +105 -45
- package/dist/server.js.map +1 -1
- package/docs/tier-data.json +2137 -2060
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,7 +56,7 @@ Or inline, if you'd rather not use the wrapper:
|
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
env -u CLAUDECODE -u ANTHROPIC_API_KEY \
|
|
59
|
-
CLAUDE_CONFIG_DIR="$HOME/.
|
|
59
|
+
CLAUDE_CONFIG_DIR="$HOME/.llm-relay-claude" \
|
|
60
60
|
ANTHROPIC_BASE_URL=http://127.0.0.1:8791 \
|
|
61
61
|
ANTHROPIC_AUTH_TOKEN=dummy \
|
|
62
62
|
CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 CLAUDE_CODE_ATTRIBUTION_HEADER=0 \
|
|
@@ -117,18 +117,18 @@ routing from the CLI (wins over the file):
|
|
|
117
117
|
node dist/cli.js --config config.json --default openrouter/openai/gpt-5.2-codex --mode repair
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
`
|
|
120
|
+
`llm-relay --help` lists every override.
|
|
121
121
|
|
|
122
122
|
### Model discovery (dynamic + cached)
|
|
123
123
|
|
|
124
124
|
Model ids are **discovered live** from each provider's `/models` endpoint — never
|
|
125
|
-
hand-maintained. The catalog is cached in `~/.
|
|
125
|
+
hand-maintained. The catalog is cached in `~/.llm-relay/models-cache.json`
|
|
126
126
|
(10-min TTL, fail-open: a fetch failure serves the last-known list).
|
|
127
127
|
|
|
128
128
|
```bash
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
llm-relay models # list live models for every provider
|
|
130
|
+
llm-relay models --provider nim # one provider
|
|
131
|
+
llm-relay models --provider nim --refresh # force a re-fetch
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
On startup the proxy warms the cache and **warns about any routing target its
|
|
@@ -155,7 +155,7 @@ coherent JSON view:
|
|
|
155
155
|
|
|
156
156
|
The consumer then dispatches by pointing its OpenAI-compatible pool at :8791 and
|
|
157
157
|
setting each packet's model to a **namespaced** `provider/model` (it picked the exact
|
|
158
|
-
backend).
|
|
158
|
+
backend). llm-relay exposes an **OpenAI-compatible front** for exactly this —
|
|
159
159
|
`POST /v1/chat/completions` (and `/chat/completions`): the request's `model` is routed
|
|
160
160
|
by namespace/tier, rewritten to the backend id, and the upstream OpenAI response is
|
|
161
161
|
returned verbatim (OpenAI in, OpenAI out — the Anthropic `/v1/messages` front with
|
|
@@ -195,23 +195,23 @@ This is the dataset for deciding which backend models are *format-broken* (resha
|
|
|
195
195
|
## Composing with headroom (optional)
|
|
196
196
|
|
|
197
197
|
[headroom](../headroom) is a separate loopback proxy that **optimizes/compresses**
|
|
198
|
-
context on the way to the model. Both it and
|
|
198
|
+
context on the way to the model. Both it and llm-relay are transparent
|
|
199
199
|
Anthropic-Messages proxies, so they chain — but only in one order, because
|
|
200
|
-
|
|
200
|
+
llm-relay's backend speaks OpenAI/NIM while headroom only forwards Anthropic:
|
|
201
201
|
|
|
202
202
|
```
|
|
203
|
-
claude → headroom (:8787, context optimization, OUTER) →
|
|
203
|
+
claude → headroom (:8787, context optimization, OUTER) → llm-relay (:8791, validate/repair + translate, INNER) → NIM/…
|
|
204
204
|
```
|
|
205
205
|
|
|
206
|
-
|
|
207
|
-
|
|
206
|
+
llm-relay must be **innermost**. To chain them, point headroom's upstream at
|
|
207
|
+
llm-relay — headroom exposes this as a launch flag, so its own code is untouched:
|
|
208
208
|
|
|
209
209
|
```bash
|
|
210
|
-
ANTHROPIC_TARGET_API_URL=http://127.0.0.1:8791 # headroom →
|
|
210
|
+
ANTHROPIC_TARGET_API_URL=http://127.0.0.1:8791 # headroom → llm-relay
|
|
211
211
|
```
|
|
212
212
|
|
|
213
213
|
**Caveat:** that env var repoints *all* of headroom's Anthropic traffic — including
|
|
214
|
-
your real (paid) Claude sessions — at
|
|
214
|
+
your real (paid) Claude sessions — at llm-relay. So run a **second, scoped
|
|
215
215
|
headroom instance** for the multiplexed lane and leave your main one pointed at
|
|
216
216
|
Anthropic:
|
|
217
217
|
|
|
@@ -224,7 +224,7 @@ HEADROOM_PORT=8788 ANTHROPIC_TARGET_API_URL=http://127.0.0.1:8791 headroom proxy
|
|
|
224
224
|
Note the `claude-proxied` wrappers set `ANTHROPIC_BASE_URL` straight to :8791 and use
|
|
225
225
|
an isolated `CLAUDE_CONFIG_DIR`, so **by default they bypass headroom entirely** — you
|
|
226
226
|
only get the chain if you deliberately point the client at a headroom instance whose
|
|
227
|
-
upstream is
|
|
227
|
+
upstream is llm-relay.
|
|
228
228
|
|
|
229
229
|
**Is it worth it?** headroom's headline win is $/token savings vs *paid* Anthropic —
|
|
230
230
|
**moot on the free NIM pool**. What still pays off through the chain: context
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ResolvedTarget } from "./config.js";
|
|
2
|
+
export interface BenchmarkScores {
|
|
3
|
+
sweBench?: number;
|
|
4
|
+
humanEval?: number;
|
|
5
|
+
liveCodeBench?: number;
|
|
6
|
+
arenaElo?: number;
|
|
7
|
+
}
|
|
8
|
+
/** Find benchmark scores for a model ID or provider/model spec. */
|
|
9
|
+
export declare function getBenchmarkScores(modelId: string): BenchmarkScores;
|
|
10
|
+
/** Calculate a single composite quality score (0-100) for ranking targets. */
|
|
11
|
+
export declare function calculateQualityScore(scores: BenchmarkScores): number;
|
|
12
|
+
/** Rank an array of resolved targets by coding benchmark quality (descending). */
|
|
13
|
+
export declare function rankTargetsByBenchmark(targets: ResolvedTarget[]): ResolvedTarget[];
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** Built-in coding benchmark database for popular coding models. */
|
|
2
|
+
const BENCHMARK_DB = [
|
|
3
|
+
// Anthropic / Claude models
|
|
4
|
+
{ pattern: "claude-3-7-sonnet", scores: { sweBench: 70.3, humanEval: 92.0, liveCodeBench: 64.5, arenaElo: 1320 } },
|
|
5
|
+
{ pattern: "claude-3-5-sonnet", scores: { sweBench: 49.0, humanEval: 93.7, liveCodeBench: 58.2, arenaElo: 1280 } },
|
|
6
|
+
{ pattern: "claude-3-opus", scores: { sweBench: 38.0, humanEval: 84.9, liveCodeBench: 45.0, arenaElo: 1250 } },
|
|
7
|
+
{ pattern: "claude-3-5-haiku", scores: { sweBench: 40.6, humanEval: 88.1, liveCodeBench: 48.0, arenaElo: 1220 } },
|
|
8
|
+
// OpenAI / GPT models
|
|
9
|
+
{ pattern: "o3-mini", scores: { sweBench: 71.0, humanEval: 94.5, liveCodeBench: 66.0, arenaElo: 1330 } },
|
|
10
|
+
{ pattern: "o1", scores: { sweBench: 48.9, humanEval: 92.4, liveCodeBench: 61.5, arenaElo: 1310 } },
|
|
11
|
+
{ pattern: "gpt-4o", scores: { sweBench: 38.8, humanEval: 90.2, liveCodeBench: 52.1, arenaElo: 1286 } },
|
|
12
|
+
{ pattern: "gpt-4o-mini", scores: { sweBench: 29.0, humanEval: 87.2, liveCodeBench: 41.5, arenaElo: 1200 } },
|
|
13
|
+
// DeepSeek models
|
|
14
|
+
{ pattern: "deepseek-r1", scores: { sweBench: 49.2, humanEval: 96.1, liveCodeBench: 65.9, arenaElo: 1350 } },
|
|
15
|
+
{ pattern: "deepseek-v3", scores: { sweBench: 42.0, humanEval: 90.0, liveCodeBench: 58.0, arenaElo: 1310 } },
|
|
16
|
+
{ pattern: "deepseek-coder", scores: { sweBench: 38.5, humanEval: 90.2, liveCodeBench: 53.0, arenaElo: 1240 } },
|
|
17
|
+
// Qwen models
|
|
18
|
+
{ pattern: "qwen-2.5-coder-32b", scores: { sweBench: 41.2, humanEval: 92.7, liveCodeBench: 56.4, arenaElo: 1250 } },
|
|
19
|
+
{ pattern: "qwen-2.5-72b", scores: { sweBench: 37.0, humanEval: 86.6, liveCodeBench: 51.0, arenaElo: 1240 } },
|
|
20
|
+
{ pattern: "qwq-32b", scores: { sweBench: 44.0, humanEval: 93.0, liveCodeBench: 59.0, arenaElo: 1270 } },
|
|
21
|
+
// GLM / Z-AI / Nemotron / Llama / Mistral models
|
|
22
|
+
{ pattern: "glm-4", scores: { sweBench: 35.0, humanEval: 85.0, liveCodeBench: 47.0, arenaElo: 1200 } },
|
|
23
|
+
{ pattern: "glm-5", scores: { sweBench: 42.0, humanEval: 89.0, liveCodeBench: 53.0, arenaElo: 1240 } },
|
|
24
|
+
{ pattern: "nemotron", scores: { sweBench: 36.5, humanEval: 86.0, liveCodeBench: 48.0, arenaElo: 1210 } },
|
|
25
|
+
{ pattern: "llama-3.3-70b", scores: { sweBench: 36.0, humanEval: 88.6, liveCodeBench: 49.2, arenaElo: 1230 } },
|
|
26
|
+
{ pattern: "mistral-large", scores: { sweBench: 34.0, humanEval: 84.0, liveCodeBench: 45.0, arenaElo: 1210 } },
|
|
27
|
+
{ pattern: "codestral", scores: { sweBench: 33.5, humanEval: 81.1, liveCodeBench: 46.0, arenaElo: 1200 } },
|
|
28
|
+
];
|
|
29
|
+
/** Find benchmark scores for a model ID or provider/model spec. */
|
|
30
|
+
export function getBenchmarkScores(modelId) {
|
|
31
|
+
const norm = modelId.toLowerCase();
|
|
32
|
+
for (const entry of BENCHMARK_DB) {
|
|
33
|
+
if (typeof entry.pattern === "string") {
|
|
34
|
+
if (norm.includes(entry.pattern))
|
|
35
|
+
return entry.scores;
|
|
36
|
+
}
|
|
37
|
+
else if (entry.pattern.test(norm)) {
|
|
38
|
+
return entry.scores;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
/** Calculate a single composite quality score (0-100) for ranking targets. */
|
|
44
|
+
export function calculateQualityScore(scores) {
|
|
45
|
+
let totalWeight = 0;
|
|
46
|
+
let weightedSum = 0;
|
|
47
|
+
if (scores.sweBench !== undefined) {
|
|
48
|
+
weightedSum += scores.sweBench * 3.0; // Primary coding agent benchmark
|
|
49
|
+
totalWeight += 3.0;
|
|
50
|
+
}
|
|
51
|
+
if (scores.liveCodeBench !== undefined) {
|
|
52
|
+
weightedSum += scores.liveCodeBench * 2.0;
|
|
53
|
+
totalWeight += 2.0;
|
|
54
|
+
}
|
|
55
|
+
if (scores.humanEval !== undefined) {
|
|
56
|
+
weightedSum += scores.humanEval * 1.0;
|
|
57
|
+
totalWeight += 1.0;
|
|
58
|
+
}
|
|
59
|
+
if (totalWeight > 0) {
|
|
60
|
+
return Math.round((weightedSum / totalWeight) * 10) / 10;
|
|
61
|
+
}
|
|
62
|
+
if (scores.arenaElo !== undefined) {
|
|
63
|
+
return Math.max(0, Math.min(100, Math.round((scores.arenaElo - 1000) / 4)));
|
|
64
|
+
}
|
|
65
|
+
return 50.0; // Default baseline score for unlisted models
|
|
66
|
+
}
|
|
67
|
+
/** Rank an array of resolved targets by coding benchmark quality (descending). */
|
|
68
|
+
export function rankTargetsByBenchmark(targets) {
|
|
69
|
+
if (targets.length <= 1)
|
|
70
|
+
return [...targets];
|
|
71
|
+
return [...targets].sort((a, b) => {
|
|
72
|
+
const specA = a.model ? `${a.provider}/${a.model}` : a.provider;
|
|
73
|
+
const specB = b.model ? `${b.provider}/${b.model}` : b.provider;
|
|
74
|
+
const scoreA = calculateQualityScore(getBenchmarkScores(specA));
|
|
75
|
+
const scoreB = calculateQualityScore(getBenchmarkScores(specB));
|
|
76
|
+
return scoreB - scoreA; // Highest score first
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=benchmarks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmarks.js","sourceRoot":"","sources":["../src/benchmarks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ResolvedTarget } from "./config.js";
|
|
2
|
+
export interface CircuitState {
|
|
3
|
+
consecutiveFailures: number;
|
|
4
|
+
lastFailureTime: number;
|
|
5
|
+
cooldownUntil: number;
|
|
6
|
+
lastStatus?: number | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare class CircuitBreaker {
|
|
9
|
+
private states;
|
|
10
|
+
private getKey;
|
|
11
|
+
/** Check if a target spec or ResolvedTarget is healthy to receive traffic. */
|
|
12
|
+
isHealthy(target: ResolvedTarget | string, now?: number): boolean;
|
|
13
|
+
/** Record a successful completion for a target, resetting its circuit. */
|
|
14
|
+
recordSuccess(target: ResolvedTarget | string): void;
|
|
15
|
+
/** Record a failure (e.g. 429 rate limit, 5xx error, timeout) for a target. */
|
|
16
|
+
recordFailure(target: ResolvedTarget | string, status?: number, now?: number): void;
|
|
17
|
+
/** Filter an array of targets to only healthy candidates. Fall back to all if all are open. */
|
|
18
|
+
getHealthyTargets(targets: ResolvedTarget[], now?: number): ResolvedTarget[];
|
|
19
|
+
/** Reset all circuit states. */
|
|
20
|
+
reset(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const globalCircuitBreaker: CircuitBreaker;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const DEFAULT_COOLDOWN_MS = 60000; // 1 minute cooldown after consecutive failures
|
|
2
|
+
const RATE_LIMIT_COOLDOWN_MS = 120000; // 2 minutes cooldown on 429
|
|
3
|
+
const MAX_FAILURES_BEFORE_TRIP = 2;
|
|
4
|
+
export class CircuitBreaker {
|
|
5
|
+
states = new Map();
|
|
6
|
+
getKey(target) {
|
|
7
|
+
if (typeof target === "string")
|
|
8
|
+
return target;
|
|
9
|
+
return target.model ? `${target.provider}/${target.model}` : target.provider;
|
|
10
|
+
}
|
|
11
|
+
/** Check if a target spec or ResolvedTarget is healthy to receive traffic. */
|
|
12
|
+
isHealthy(target, now = Date.now()) {
|
|
13
|
+
const key = this.getKey(target);
|
|
14
|
+
const state = this.states.get(key);
|
|
15
|
+
if (!state)
|
|
16
|
+
return true;
|
|
17
|
+
if (state.cooldownUntil > now) {
|
|
18
|
+
return false; // Circuit open (cooling down)
|
|
19
|
+
}
|
|
20
|
+
return true; // Healthy or cooldown expired
|
|
21
|
+
}
|
|
22
|
+
/** Record a successful completion for a target, resetting its circuit. */
|
|
23
|
+
recordSuccess(target) {
|
|
24
|
+
const key = this.getKey(target);
|
|
25
|
+
this.states.delete(key);
|
|
26
|
+
}
|
|
27
|
+
/** Record a failure (e.g. 429 rate limit, 5xx error, timeout) for a target. */
|
|
28
|
+
recordFailure(target, status, now = Date.now()) {
|
|
29
|
+
const key = this.getKey(target);
|
|
30
|
+
const existing = this.states.get(key) ?? {
|
|
31
|
+
consecutiveFailures: 0,
|
|
32
|
+
lastFailureTime: now,
|
|
33
|
+
cooldownUntil: 0,
|
|
34
|
+
};
|
|
35
|
+
existing.consecutiveFailures += 1;
|
|
36
|
+
existing.lastFailureTime = now;
|
|
37
|
+
existing.lastStatus = status;
|
|
38
|
+
// HTTP 429 (Rate Limit) trips immediately for 2 minutes
|
|
39
|
+
if (status === 429) {
|
|
40
|
+
existing.cooldownUntil = now + RATE_LIMIT_COOLDOWN_MS;
|
|
41
|
+
}
|
|
42
|
+
else if (existing.consecutiveFailures >= MAX_FAILURES_BEFORE_TRIP) {
|
|
43
|
+
existing.cooldownUntil = now + DEFAULT_COOLDOWN_MS;
|
|
44
|
+
}
|
|
45
|
+
this.states.set(key, existing);
|
|
46
|
+
}
|
|
47
|
+
/** Filter an array of targets to only healthy candidates. Fall back to all if all are open. */
|
|
48
|
+
getHealthyTargets(targets, now = Date.now()) {
|
|
49
|
+
const healthy = targets.filter((t) => this.isHealthy(t, now));
|
|
50
|
+
return healthy.length > 0 ? healthy : targets; // Fallback to all if all in cooldown
|
|
51
|
+
}
|
|
52
|
+
/** Reset all circuit states. */
|
|
53
|
+
reset() {
|
|
54
|
+
this.states.clear();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export const globalCircuitBreaker = new CircuitBreaker();
|
|
58
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AASA,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,+CAA+C;AAClF,MAAM,sBAAsB,GAAG,MAAM,CAAC,CAAC,4BAA4B;AACnE,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,MAAM,OAAO,cAAc;IACjB,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEzC,MAAM,CAAC,MAA+B;QAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC9C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC/E,CAAC;IAED,8EAA8E;IAC9E,SAAS,CAAC,MAA+B,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,CAAC,8BAA8B;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,8BAA8B;IAC7C,CAAC;IAED,0EAA0E;IAC1E,aAAa,CAAC,MAA+B;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,+EAA+E;IAC/E,aAAa,CAAC,MAA+B,EAAE,MAAe,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YACvC,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,GAAG;YACpB,aAAa,EAAE,CAAC;SACjB,CAAC;QAEF,QAAQ,CAAC,mBAAmB,IAAI,CAAC,CAAC;QAClC,QAAQ,CAAC,eAAe,GAAG,GAAG,CAAC;QAC/B,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC;QAE7B,wDAAwD;QACxD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,QAAQ,CAAC,aAAa,GAAG,GAAG,GAAG,sBAAsB,CAAC;QACxD,CAAC;aAAM,IAAI,QAAQ,CAAC,mBAAmB,IAAI,wBAAwB,EAAE,CAAC;YACpE,QAAQ,CAAC,aAAa,GAAG,GAAG,GAAG,mBAAmB,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,+FAA+F;IAC/F,iBAAiB,CAAC,OAAyB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9D,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,qCAAqC;IACtF,CAAC;IAED,gCAAgC;IAChC,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -18,4 +18,8 @@ export declare function runModels(): Promise<void>;
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function warmAndValidate(cfg: Config, catalog: ModelCatalog): Promise<void>;
|
|
20
20
|
export declare function runProxy(): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
|
|
21
|
+
/** `llm-relay ping` — probe and output model stability, latency, and quota across providers. */
|
|
22
|
+
export declare function runPingCommand(): Promise<void>;
|
|
23
|
+
/** `llm-relay check-keys` — pre-flight verification of provider environment keys. */
|
|
24
|
+
export declare function runCheckKeys(): Promise<void>;
|
|
21
25
|
export declare function main(): void;
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { join } from "node:path";
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join, dirname } from "node:path";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
5
6
|
import { loadConfig } from "./config.js";
|
|
6
7
|
import { createProxy } from "./server.js";
|
|
7
8
|
import { ModelCatalog } from "./catalog.js";
|
|
@@ -54,23 +55,43 @@ Multi-provider: config declares a providers{} registry; a request's model routes
|
|
|
54
55
|
to one provider by namespace ("nim/z-ai/glm-5.2") or by Claude tier (routing.tiers).
|
|
55
56
|
|
|
56
57
|
Usage:
|
|
57
|
-
llm-relay [
|
|
58
|
-
llm-relay models [
|
|
58
|
+
llm-relay [options] Start the proxy server (default)
|
|
59
|
+
llm-relay models [-p <name>] [-r] List live models per provider
|
|
60
|
+
llm-relay help | --help | -h Show this help documentation
|
|
61
|
+
llm-relay version | --version | -v Show version number
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
Commands:
|
|
64
|
+
(default) Start loopback HTTP proxy server
|
|
65
|
+
models Query live /models catalog across providers
|
|
66
|
+
help Show help documentation
|
|
67
|
+
version Print package version
|
|
61
68
|
|
|
62
|
-
|
|
63
|
-
--
|
|
64
|
-
--mode <detect|repair> mode
|
|
65
|
-
--listen <host:port> listen address (loopback only)
|
|
69
|
+
Options:
|
|
70
|
+
-c, --config <path> Config file (default: ~/.llm-relay/config.json)
|
|
66
71
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
Proxy Startup Overrides (win over config file values):
|
|
73
|
+
-d, --default <provider/model> Override routing.default fallback spec
|
|
74
|
+
-m, --mode <detect|repair|strict> Override mode (detect | repair | strict)
|
|
75
|
+
-l, --listen <host:port> Override listen address (loopback only)
|
|
71
76
|
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
Models Command Options:
|
|
78
|
+
-p, --provider <name> Filter model list to a specific provider
|
|
79
|
+
-r, --refresh Force re-fetch from backend /models endpoints
|
|
80
|
+
|
|
81
|
+
Proxy Server Endpoints:
|
|
82
|
+
POST /v1/messages Anthropic Messages proxy with tool repair
|
|
83
|
+
POST /v1/chat/completions OpenAI-compatible front
|
|
84
|
+
GET /registry Full JSON view of providers, routing & capabilities
|
|
85
|
+
|
|
86
|
+
Model Discovery & Caching:
|
|
87
|
+
Model IDs are discovered dynamically from each provider's /models endpoint and
|
|
88
|
+
cached in ~/.llm-relay/models-cache.json (10-min TTL). "llm-relay models" lists
|
|
89
|
+
them; --refresh forces a re-fetch. On startup, the proxy warms the cache and warns
|
|
90
|
+
about any routing target its provider does not serve.
|
|
91
|
+
|
|
92
|
+
Config Environment Variables:
|
|
93
|
+
Config string values may reference environment variables as \${NAME}
|
|
94
|
+
(e.g. "base": "\${LLM_BACKEND_BASE_URL}"); an unset variable is a startup error.
|
|
74
95
|
`;
|
|
75
96
|
const DEFAULT_CONFIG_TEMPLATE = JSON.stringify({
|
|
76
97
|
listen: "127.0.0.1:8791",
|
|
@@ -185,8 +206,12 @@ export async function runModels() {
|
|
|
185
206
|
continue;
|
|
186
207
|
}
|
|
187
208
|
process.stdout.write(`\n${name} — ${models.length} models:\n`);
|
|
188
|
-
for (const m of models)
|
|
189
|
-
|
|
209
|
+
for (const m of models) {
|
|
210
|
+
const scores = getBenchmarkScores(m);
|
|
211
|
+
const quality = calculateQualityScore(scores);
|
|
212
|
+
const benchStr = scores.sweBench ? ` (SWE-bench: ${scores.sweBench}%, quality: ${quality})` : "";
|
|
213
|
+
process.stdout.write(` ${m.padEnd(50)}${benchStr}\n`);
|
|
214
|
+
}
|
|
190
215
|
}
|
|
191
216
|
}
|
|
192
217
|
/**
|
|
@@ -194,7 +219,14 @@ export async function runModels() {
|
|
|
194
219
|
* does not serve — non-blocking (fire-and-forget) so it never delays listen().
|
|
195
220
|
*/
|
|
196
221
|
export async function warmAndValidate(cfg, catalog) {
|
|
197
|
-
const
|
|
222
|
+
const rawSpecs = [cfg.routing.default, ...Object.values(cfg.routing.tiers)];
|
|
223
|
+
const specs = [];
|
|
224
|
+
for (const s of rawSpecs) {
|
|
225
|
+
if (Array.isArray(s))
|
|
226
|
+
specs.push(...s);
|
|
227
|
+
else if (typeof s === "string")
|
|
228
|
+
specs.push(s);
|
|
229
|
+
}
|
|
198
230
|
const seen = new Set();
|
|
199
231
|
for (const spec of specs) {
|
|
200
232
|
if (seen.has(spec))
|
|
@@ -217,7 +249,9 @@ export function runProxy() {
|
|
|
217
249
|
const server = createProxy(cfg, { catalog });
|
|
218
250
|
server.listen(cfg.port, cfg.host, () => {
|
|
219
251
|
const providers = Object.keys(cfg.providers).join(",");
|
|
220
|
-
|
|
252
|
+
const addr = server.address();
|
|
253
|
+
const boundPort = typeof addr === "object" && addr !== null ? addr.port : cfg.port;
|
|
254
|
+
process.stderr.write(`llm-relay listening on http://${cfg.host}:${boundPort} ` +
|
|
221
255
|
`(mode=${cfg.mode}, providers=[${providers}], default=${cfg.routing.default})\n`);
|
|
222
256
|
void warmAndValidate(cfg, catalog);
|
|
223
257
|
});
|
|
@@ -232,14 +266,94 @@ export function runProxy() {
|
|
|
232
266
|
}
|
|
233
267
|
return server;
|
|
234
268
|
}
|
|
269
|
+
import { PingLoop } from "./ping/cadence.js";
|
|
270
|
+
/** `llm-relay ping` — probe and output model stability, latency, and quota across providers. */
|
|
271
|
+
export async function runPingCommand() {
|
|
272
|
+
const cfg = loadOrExit();
|
|
273
|
+
const catalog = new ModelCatalog();
|
|
274
|
+
const pingLoop = new PingLoop(cfg, catalog);
|
|
275
|
+
const only = argValue("--provider", "-p");
|
|
276
|
+
process.stdout.write("⚡ Probing models across providers for latency and stability...\n");
|
|
277
|
+
await pingLoop.tickOnce();
|
|
278
|
+
const names = Object.keys(cfg.providers).filter((n) => !only || n === only);
|
|
279
|
+
for (const name of names) {
|
|
280
|
+
const p = cfg.providers[name];
|
|
281
|
+
let models = [];
|
|
282
|
+
if (p.kind === "openai") {
|
|
283
|
+
try {
|
|
284
|
+
models = await catalog.list(name, p);
|
|
285
|
+
}
|
|
286
|
+
catch { }
|
|
287
|
+
}
|
|
288
|
+
const quota = pingLoop.getProviderQuota(name);
|
|
289
|
+
const quotaStr = quota !== null ? `${quota}% remaining` : "N/A";
|
|
290
|
+
process.stdout.write(`\nProvider: ${name} (quota: ${quotaStr})\n`);
|
|
291
|
+
if (models.length === 0) {
|
|
292
|
+
process.stdout.write(" (no models listed or reachable)\n");
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
for (const mId of models.slice(0, 10)) {
|
|
296
|
+
const summary = pingLoop.getModelSummary(name, mId);
|
|
297
|
+
const avgStr = summary.avgMs >= 0 ? `${summary.avgMs}ms` : "pending";
|
|
298
|
+
const p95Str = summary.p95Ms >= 0 ? `${summary.p95Ms}ms` : "pending";
|
|
299
|
+
const scoreStr = summary.stabilityScore >= 0 ? `${summary.stabilityScore}/100` : "N/A";
|
|
300
|
+
process.stdout.write(` ${mId.padEnd(45)} | verdict: ${summary.verdict.padEnd(10)} | avg: ${avgStr.padEnd(8)} | p95: ${p95Str.padEnd(8)} | stability: ${scoreStr}\n`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
import { validateProviderKeys } from "./key-checker.js";
|
|
305
|
+
import { getBenchmarkScores, calculateQualityScore } from "./benchmarks.js";
|
|
306
|
+
/** `llm-relay check-keys` — pre-flight verification of provider environment keys. */
|
|
307
|
+
export async function runCheckKeys() {
|
|
308
|
+
const cfg = loadOrExit();
|
|
309
|
+
process.stdout.write("🔑 Validating configured provider API keys...\n\n");
|
|
310
|
+
const results = await validateProviderKeys(cfg);
|
|
311
|
+
process.stdout.write(`Provider`.padEnd(16) +
|
|
312
|
+
`Env Var`.padEnd(24) +
|
|
313
|
+
`Status`.padEnd(16) +
|
|
314
|
+
`Details\n`);
|
|
315
|
+
process.stdout.write("-".repeat(80) + "\n");
|
|
316
|
+
for (const r of results) {
|
|
317
|
+
const envStr = r.authEnv ? `\${${r.authEnv}}` : "(none)";
|
|
318
|
+
const quotaStr = r.quotaPercent !== undefined && r.quotaPercent !== null ? ` | Quota: ${r.quotaPercent}%` : "";
|
|
319
|
+
const modelsStr = r.modelsFound !== undefined ? ` | Models: ${r.modelsFound}` : "";
|
|
320
|
+
process.stdout.write(`${r.provider.padEnd(16)}${envStr.padEnd(24)}${r.status.toUpperCase().padEnd(16)}${r.message}${quotaStr}${modelsStr}\n`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
235
323
|
export function main() {
|
|
236
|
-
|
|
324
|
+
const arg2 = process.argv[2];
|
|
325
|
+
if (hasFlag("--help", "-h") || arg2 === "help") {
|
|
237
326
|
process.stdout.write(HELP);
|
|
238
327
|
process.exit(0);
|
|
239
328
|
}
|
|
240
|
-
if (
|
|
329
|
+
if (hasFlag("--version", "-v") || arg2 === "version") {
|
|
330
|
+
try {
|
|
331
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "../package.json");
|
|
332
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
333
|
+
process.stdout.write(`${pkg.version ?? "0.0.11"}\n`);
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
process.stdout.write("0.0.11\n");
|
|
337
|
+
}
|
|
338
|
+
process.exit(0);
|
|
339
|
+
}
|
|
340
|
+
if (arg2 === "check-keys") {
|
|
341
|
+
runCheckKeys().catch((e) => {
|
|
342
|
+
process.stderr.write(`llm-relay check-keys: ${e.message}\n`);
|
|
343
|
+
process.exit(1);
|
|
344
|
+
});
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (arg2 === "models") {
|
|
241
348
|
runModels().catch((e) => {
|
|
242
|
-
process.stderr.write(`
|
|
349
|
+
process.stderr.write(`llm-relay: ${e.message}\n`);
|
|
350
|
+
process.exit(1);
|
|
351
|
+
});
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (arg2 === "ping" || hasFlag("--ping")) {
|
|
355
|
+
runPingCommand().catch((e) => {
|
|
356
|
+
process.stderr.write(`llm-relay ping: ${e.message}\n`);
|
|
243
357
|
process.exit(1);
|
|
244
358
|
});
|
|
245
359
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -27,14 +27,15 @@ export interface ProviderConfig {
|
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* How an inbound request's `model` maps to a provider + backend model.
|
|
30
|
-
* - `default`: fallback "provider/model" spec when nothing else matches.
|
|
31
|
-
* - `tiers`: Claude tier name ("opus"/"sonnet"/"haiku"/"fable") → "provider/model".
|
|
30
|
+
* - `default`: fallback "provider/model" spec (string or array of target specs) when nothing else matches.
|
|
31
|
+
* - `tiers`: Claude tier name ("opus"/"sonnet"/"haiku"/"fable") → "provider/model" spec or array.
|
|
32
32
|
* A request may also address a provider directly with a namespaced model id
|
|
33
33
|
* ("nim/z-ai/glm-5.2") — the prefix picks the provider, the rest is the model.
|
|
34
34
|
*/
|
|
35
35
|
export interface Routing {
|
|
36
|
-
default: string;
|
|
37
|
-
tiers: Record<string, string>;
|
|
36
|
+
default: string | string[];
|
|
37
|
+
tiers: Record<string, string | string[]>;
|
|
38
|
+
benchmarkSort?: boolean;
|
|
38
39
|
}
|
|
39
40
|
/** A request routed to a concrete provider + backend model. */
|
|
40
41
|
export interface ResolvedTarget {
|
|
@@ -70,9 +71,11 @@ export { DEFAULT_ANTHROPIC_VERSION };
|
|
|
70
71
|
export declare class RoutingError extends Error {
|
|
71
72
|
}
|
|
72
73
|
/**
|
|
73
|
-
* Resolve an inbound `model` to
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
* Resolve an inbound `model` to an array of concrete targets (primary + fallbacks).
|
|
75
|
+
*/
|
|
76
|
+
export declare function resolveTargets(model: string | null, cfg: Config): ResolvedTarget[];
|
|
77
|
+
/**
|
|
78
|
+
* Resolve an inbound `model` to the primary concrete target.
|
|
76
79
|
*/
|
|
77
80
|
export declare function resolveTarget(model: string | null, cfg: Config): ResolvedTarget;
|
|
78
81
|
/** The reshaper for a resolved target when no explicit global reshaper is set. */
|