llm-relay 0.0.11 → 0.0.13
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 +78 -5
- 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 +32 -0
- package/dist/circuit-breaker.js +98 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +134 -21
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +14 -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/onboarding.d.ts +14 -0
- package/dist/onboarding.js +100 -0
- package/dist/onboarding.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/presets.d.ts +23 -0
- package/dist/presets.js +167 -0
- package/dist/presets.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 +113 -45
- package/dist/server.js.map +1 -1
- package/dist/setup-claude.d.ts +16 -0
- package/dist/setup-claude.js +78 -0
- package/dist/setup-claude.js.map +1 -0
- package/dist/telemetry.d.ts +26 -0
- package/dist/telemetry.js +43 -0
- package/dist/telemetry.js.map +1 -0
- package/docs/tier-data.json +2137 -2060
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,22 +19,95 @@ npm run build && node scripts/live-demo.mjs
|
|
|
19
19
|
```
|
|
20
20
|
Runs the compiled CLI as a real process against a local flaky-model backend + stub reshaper, showing detect (logs the failure) then repair (delivers the fixed call).
|
|
21
21
|
|
|
22
|
+
## Quick Start & Free Model Onboarding
|
|
23
|
+
|
|
24
|
+
`llm-relay` comes pre-configured with **100%-free model presets** (NVIDIA NIM, Groq, Gemini Free, OpenRouter Free, Cerebras, SambaNova) and supports **pooling your existing subscriptions** (ChatGPT / OpenAI API, AGY, Anthropic).
|
|
25
|
+
|
|
26
|
+
### Step 1: Run Guided Free Key Setup
|
|
27
|
+
```bash
|
|
28
|
+
npx llm-relay onboard
|
|
29
|
+
```
|
|
30
|
+
Scans your environment for active keys and provides direct links to acquire 100%-free API keys from NVIDIA, Groq, Google Gemini, OpenRouter, Cerebras, and SambaNova.
|
|
31
|
+
|
|
32
|
+
### Step 2: Configure Claude CLI or Claude Desktop
|
|
33
|
+
|
|
34
|
+
**For Claude Desktop:**
|
|
35
|
+
```bash
|
|
36
|
+
llm-relay setup claude-desktop
|
|
37
|
+
```
|
|
38
|
+
Auto-patches `%APPDATA%\Claude\claude_desktop_config.json` (Windows) or `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) to route Claude Desktop through `llm-relay` (`http://127.0.0.1:8791`).
|
|
39
|
+
|
|
40
|
+
**For Claude CLI (`claude`):**
|
|
41
|
+
```bash
|
|
42
|
+
llm-relay setup claude-cli
|
|
43
|
+
```
|
|
44
|
+
Verifies wrapper scripts (`scripts/claude-proxied.ps1` and `scripts/claude-proxied.sh`) that use an isolated `CLAUDE_CONFIG_DIR` so your proxy setup never conflicts with local login tokens.
|
|
45
|
+
|
|
46
|
+
### Step 3: Start the Proxy
|
|
47
|
+
```bash
|
|
48
|
+
llm-relay
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Key Capabilities
|
|
54
|
+
|
|
55
|
+
### 1. 100%-Free Presets & Subscription Pooling
|
|
56
|
+
- **100%-Free Tier**: NVIDIA NIM (`build.nvidia.com`), Groq (`console.groq.com/keys`), Gemini Free (`aistudio.google.com/app/apikey`), OpenRouter Free (`openrouter.ai/keys`), Cerebras, SambaNova.
|
|
57
|
+
- **Subscription Tier**: Mapped as `subscription` in config (e.g. OpenAI `OPENAI_API_KEY`, Anthropic `ANTHROPIC_API_KEY`).
|
|
58
|
+
- **Priority Cascade**: `llm-relay` prioritizes high-capability subscriptions first, automatically falling back to high-stability free tier targets if 429 rate limits occur.
|
|
59
|
+
|
|
60
|
+
### 2. Stability-Aware Dynamic Routing & Auto-Failover
|
|
61
|
+
- `CircuitBreaker` tracks latency, jitter, spike rates, and remaining rate-limit quota headers (`x-ratelimit-remaining`), computing a live **Stability Score (0–100)** for every provider target.
|
|
62
|
+
- Target selection dynamically sorts candidates by Stability Score and automatically cascades on 429 rate limits or timeouts.
|
|
63
|
+
- **Multi-Candidate Tier Failover**: `routing.tiers` supports mapping a tier to an array of target specs (e.g. `["nim/z-ai/glm-5.2", "groq/llama-3.3-70b"]`) for continuous fallback.
|
|
64
|
+
|
|
65
|
+
### 3. Prompt Token & Context Length Guardrails
|
|
66
|
+
- Automatically estimates request prompt token count (`estimateRequestTokens`) against target model context limits (`getModelMetadata`).
|
|
67
|
+
- Rejects oversized requests before network transmission with an HTTP 400 error (`request prompt estimated tokens exceeds model context limit`), protecting backends from context window overflow.
|
|
68
|
+
|
|
69
|
+
### 4. Background Adaptive Health Monitoring & Persistent Caching
|
|
70
|
+
- **Adaptive Cadence Loop**: Background `PingLoop` dynamically adjusts probe frequency across 4 operational modes: `speed` (2s interval at startup/activity), `normal` (10s), `slow` (30s after 5m idle), and `forced` (4s).
|
|
71
|
+
- **Persistent State**: Background probes, real-world proxy calls, dynamic catalogs, and local keys persist under `~/.llm-relay/` (`models-cache.json`, `probe-cache.json`, `runtime-telemetry.json`, `.env`).
|
|
72
|
+
|
|
73
|
+
### 5. Programmatic Telemetry & Quota Access for Claude
|
|
74
|
+
- **HTTP Endpoints**: `GET /telemetry` (live JSON metrics), `GET /registry` (full provider/routing/model catalog with quality scores), `GET /ping` (trigger health probe pass & mode summary), `GET /health` (diagnostic status).
|
|
75
|
+
- **CLI Commands**: `llm-relay telemetry` outputs live telemetry metrics; `llm-relay models` lists live model catalogs with SWE-bench & quality scores; `llm-relay ping` performs live health & latency probes.
|
|
76
|
+
- **Response Headers**: Proxy responses include `x-llm-relay-quota-percent`, `x-llm-relay-stability-score`, and `x-llm-relay-target`.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## CLI Command Reference
|
|
81
|
+
|
|
82
|
+
| Command | Description |
|
|
83
|
+
| :--- | :--- |
|
|
84
|
+
| `llm-relay` | Start loopback HTTP proxy server on `127.0.0.1:8791` |
|
|
85
|
+
| `llm-relay onboard` | Run guided setup wizard for 100%-free providers & subscription keys |
|
|
86
|
+
| `llm-relay setup claude-desktop` (or `desktop`) | Auto-patch `claude_desktop_config.json` for Claude Desktop |
|
|
87
|
+
| `llm-relay setup claude-cli` | Display & verify Claude CLI wrapper configuration |
|
|
88
|
+
| `llm-relay keys` (or `check-keys`) | Validate provider API keys and display signup URLs & quota |
|
|
89
|
+
| `llm-relay telemetry` | Output live JSON telemetry, stability scores, and quota metrics |
|
|
90
|
+
| `llm-relay models [-p <name>] [-r]` | Query live `/models` catalog per provider (`-p` filter, `-r` force refresh) |
|
|
91
|
+
| `llm-relay ping [-p <name>]` | Perform live health, latency & quota probe across providers |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
22
95
|
## Install & run
|
|
23
96
|
|
|
24
97
|
### Option 1: Instant run (no installation required)
|
|
25
98
|
```bash
|
|
26
|
-
NVIDIA_API_KEY=nvapi-... npx llm-relay
|
|
99
|
+
NVIDIA_API_KEY=nvapi-... npx llm-relay
|
|
27
100
|
```
|
|
28
101
|
|
|
29
102
|
### Option 2: Global installation
|
|
30
103
|
```bash
|
|
31
104
|
npm install -g llm-relay
|
|
32
105
|
|
|
33
|
-
# Start
|
|
34
|
-
|
|
106
|
+
# Start proxy:
|
|
107
|
+
llm-relay
|
|
35
108
|
|
|
36
|
-
#
|
|
37
|
-
llm-relay
|
|
109
|
+
# Check key status & signup URLs:
|
|
110
|
+
llm-relay keys
|
|
38
111
|
```
|
|
39
112
|
|
|
40
113
|
## Use it from your projects
|
|
@@ -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,32 @@
|
|
|
1
|
+
import type { ResolvedTarget } from "./config.js";
|
|
2
|
+
import { type PingRecord } from "./ping/metrics.js";
|
|
3
|
+
export interface CircuitState {
|
|
4
|
+
consecutiveFailures: number;
|
|
5
|
+
lastFailureTime: number;
|
|
6
|
+
cooldownUntil: number;
|
|
7
|
+
lastStatus?: number | undefined;
|
|
8
|
+
pings: PingRecord[];
|
|
9
|
+
quotaPercent?: number | null | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare class CircuitBreaker {
|
|
12
|
+
private states;
|
|
13
|
+
private getKey;
|
|
14
|
+
private getOrCreate;
|
|
15
|
+
/** Check if a target spec or ResolvedTarget is healthy to receive traffic. */
|
|
16
|
+
isHealthy(target: ResolvedTarget | string, now?: number): boolean;
|
|
17
|
+
/** Record a successful completion for a target, resetting its circuit. */
|
|
18
|
+
recordSuccess(target: ResolvedTarget | string, ms?: number, quotaPercent?: number | null, now?: number): void;
|
|
19
|
+
/** Record a failure (e.g. 429 rate limit, 5xx error, timeout) for a target. */
|
|
20
|
+
recordFailure(target: ResolvedTarget | string, status?: number, now?: number, ms?: number): void;
|
|
21
|
+
/** Get computed stability score (0–100) for a target (returns 100 if untracked). */
|
|
22
|
+
getStabilityScore(target: ResolvedTarget | string): number;
|
|
23
|
+
/** Get full state for a target. */
|
|
24
|
+
getState(target: ResolvedTarget | string): CircuitState | undefined;
|
|
25
|
+
/** Get all tracked circuit states. */
|
|
26
|
+
getAllStates(): Map<string, CircuitState>;
|
|
27
|
+
/** Filter an array of targets to healthy candidates, sorted by Stability Score (highest first). */
|
|
28
|
+
getHealthyTargets(targets: ResolvedTarget[], now?: number): ResolvedTarget[];
|
|
29
|
+
/** Reset all circuit states. */
|
|
30
|
+
reset(): void;
|
|
31
|
+
}
|
|
32
|
+
export declare const globalCircuitBreaker: CircuitBreaker;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getStabilityScore } from "./ping/metrics.js";
|
|
2
|
+
const DEFAULT_COOLDOWN_MS = 60000; // 1 minute cooldown after consecutive failures
|
|
3
|
+
const RATE_LIMIT_COOLDOWN_MS = 120000; // 2 minutes cooldown on 429
|
|
4
|
+
const MAX_FAILURES_BEFORE_TRIP = 2;
|
|
5
|
+
const MAX_PING_HISTORY = 10;
|
|
6
|
+
export class CircuitBreaker {
|
|
7
|
+
states = new Map();
|
|
8
|
+
getKey(target) {
|
|
9
|
+
if (typeof target === "string")
|
|
10
|
+
return target;
|
|
11
|
+
return target.model ? `${target.provider}/${target.model}` : target.provider;
|
|
12
|
+
}
|
|
13
|
+
getOrCreate(key, now = Date.now()) {
|
|
14
|
+
const existing = this.states.get(key);
|
|
15
|
+
if (existing)
|
|
16
|
+
return existing;
|
|
17
|
+
const fresh = {
|
|
18
|
+
consecutiveFailures: 0,
|
|
19
|
+
lastFailureTime: 0,
|
|
20
|
+
cooldownUntil: 0,
|
|
21
|
+
pings: [],
|
|
22
|
+
};
|
|
23
|
+
this.states.set(key, fresh);
|
|
24
|
+
return fresh;
|
|
25
|
+
}
|
|
26
|
+
/** Check if a target spec or ResolvedTarget is healthy to receive traffic. */
|
|
27
|
+
isHealthy(target, now = Date.now()) {
|
|
28
|
+
const key = this.getKey(target);
|
|
29
|
+
const state = this.states.get(key);
|
|
30
|
+
if (!state)
|
|
31
|
+
return true;
|
|
32
|
+
if (state.cooldownUntil > now) {
|
|
33
|
+
return false; // Circuit open (cooling down)
|
|
34
|
+
}
|
|
35
|
+
return true; // Healthy or cooldown expired
|
|
36
|
+
}
|
|
37
|
+
/** Record a successful completion for a target, resetting its circuit. */
|
|
38
|
+
recordSuccess(target, ms = 500, quotaPercent, now = Date.now()) {
|
|
39
|
+
const key = this.getKey(target);
|
|
40
|
+
const state = this.getOrCreate(key, now);
|
|
41
|
+
state.consecutiveFailures = 0;
|
|
42
|
+
state.cooldownUntil = 0;
|
|
43
|
+
state.lastStatus = 200;
|
|
44
|
+
if (quotaPercent !== undefined)
|
|
45
|
+
state.quotaPercent = quotaPercent;
|
|
46
|
+
state.pings.push({ ms, code: "200", timestamp: now });
|
|
47
|
+
if (state.pings.length > MAX_PING_HISTORY)
|
|
48
|
+
state.pings.shift();
|
|
49
|
+
}
|
|
50
|
+
/** Record a failure (e.g. 429 rate limit, 5xx error, timeout) for a target. */
|
|
51
|
+
recordFailure(target, status, now = Date.now(), ms = 1000) {
|
|
52
|
+
const key = this.getKey(target);
|
|
53
|
+
const state = this.getOrCreate(key, now);
|
|
54
|
+
state.consecutiveFailures += 1;
|
|
55
|
+
state.lastFailureTime = now;
|
|
56
|
+
state.lastStatus = status;
|
|
57
|
+
const statusCode = status ? String(status) : "500";
|
|
58
|
+
state.pings.push({ ms, code: statusCode, timestamp: now });
|
|
59
|
+
if (state.pings.length > MAX_PING_HISTORY)
|
|
60
|
+
state.pings.shift();
|
|
61
|
+
// HTTP 429 (Rate Limit) trips immediately for 2 minutes
|
|
62
|
+
if (status === 429) {
|
|
63
|
+
state.cooldownUntil = now + RATE_LIMIT_COOLDOWN_MS;
|
|
64
|
+
}
|
|
65
|
+
else if (state.consecutiveFailures >= MAX_FAILURES_BEFORE_TRIP) {
|
|
66
|
+
state.cooldownUntil = now + DEFAULT_COOLDOWN_MS;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Get computed stability score (0–100) for a target (returns 100 if untracked). */
|
|
70
|
+
getStabilityScore(target) {
|
|
71
|
+
const key = this.getKey(target);
|
|
72
|
+
const state = this.states.get(key);
|
|
73
|
+
if (!state || state.pings.length === 0)
|
|
74
|
+
return 100;
|
|
75
|
+
const score = getStabilityScore(state.pings);
|
|
76
|
+
return score >= 0 ? score : 100;
|
|
77
|
+
}
|
|
78
|
+
/** Get full state for a target. */
|
|
79
|
+
getState(target) {
|
|
80
|
+
return this.states.get(this.getKey(target));
|
|
81
|
+
}
|
|
82
|
+
/** Get all tracked circuit states. */
|
|
83
|
+
getAllStates() {
|
|
84
|
+
return this.states;
|
|
85
|
+
}
|
|
86
|
+
/** Filter an array of targets to healthy candidates, sorted by Stability Score (highest first). */
|
|
87
|
+
getHealthyTargets(targets, now = Date.now()) {
|
|
88
|
+
const healthy = targets.filter((t) => this.isHealthy(t, now));
|
|
89
|
+
const candidates = healthy.length > 0 ? healthy : targets;
|
|
90
|
+
return [...candidates].sort((a, b) => this.getStabilityScore(b) - this.getStabilityScore(a));
|
|
91
|
+
}
|
|
92
|
+
/** Reset all circuit states. */
|
|
93
|
+
reset() {
|
|
94
|
+
this.states.clear();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export const globalCircuitBreaker = new CircuitBreaker();
|
|
98
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
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
|
@@ -56,42 +56,45 @@ to one provider by namespace ("nim/z-ai/glm-5.2") or by Claude tier (routing.tie
|
|
|
56
56
|
|
|
57
57
|
Usage:
|
|
58
58
|
llm-relay [options] Start the proxy server (default)
|
|
59
|
+
llm-relay onboard Guided setup for 100%-free providers & subscriptions
|
|
60
|
+
llm-relay setup [claude-cli|claude-desktop] Configure Claude CLI wrappers or Claude Desktop
|
|
61
|
+
llm-relay keys | check-keys Check status of all free & subscription keys
|
|
62
|
+
llm-relay telemetry Programmatic JSON metrics and quota report
|
|
59
63
|
llm-relay models [-p <name>] [-r] List live models per provider
|
|
64
|
+
llm-relay ping [-p <name>] Probe model latency, stability & quota across providers
|
|
60
65
|
llm-relay help | --help | -h Show this help documentation
|
|
61
66
|
llm-relay version | --version | -v Show version number
|
|
62
67
|
|
|
63
68
|
Commands:
|
|
64
69
|
(default) Start loopback HTTP proxy server
|
|
70
|
+
onboard Run 100%-free provider onboarding wizard
|
|
71
|
+
setup claude-cli Verify & configure Claude CLI wrapper scripts
|
|
72
|
+
setup claude-desktop | setup desktop Auto-patch Claude Desktop config (claude_desktop_config.json)
|
|
73
|
+
keys | check-keys Validate provider API keys & display signup links
|
|
74
|
+
telemetry Output JSON telemetry & quota report
|
|
65
75
|
models Query live /models catalog across providers
|
|
76
|
+
ping Probe model latency, stability & quota metrics
|
|
66
77
|
help Show help documentation
|
|
67
78
|
version Print package version
|
|
68
79
|
|
|
69
80
|
Options:
|
|
70
81
|
-c, --config <path> Config file (default: ~/.llm-relay/config.json)
|
|
82
|
+
-p, --provider <name> Filter models/ping command to a specific provider
|
|
83
|
+
-r, --refresh Force cache refresh when querying provider models
|
|
71
84
|
|
|
72
85
|
Proxy Startup Overrides (win over config file values):
|
|
73
86
|
-d, --default <provider/model> Override routing.default fallback spec
|
|
74
87
|
-m, --mode <detect|repair|strict> Override mode (detect | repair | strict)
|
|
75
88
|
-l, --listen <host:port> Override listen address (loopback only)
|
|
76
89
|
|
|
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
90
|
Proxy Server Endpoints:
|
|
82
91
|
POST /v1/messages Anthropic Messages proxy with tool repair
|
|
83
|
-
POST /v1/
|
|
92
|
+
POST /v1/messages/count_tokens Local token estimation for OpenAI backends
|
|
93
|
+
POST /v1/chat/completions OpenAI-compatible front (OpenAI in, OpenAI out)
|
|
84
94
|
GET /registry Full JSON view of providers, routing & capabilities
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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.
|
|
95
|
+
GET /telemetry Live JSON telemetry, quota & stability scores for Claude
|
|
96
|
+
GET /ping Trigger health probe pass & query ping mode summary
|
|
97
|
+
GET /health Diagnostic JSON summary of provider availability & health
|
|
95
98
|
`;
|
|
96
99
|
const DEFAULT_CONFIG_TEMPLATE = JSON.stringify({
|
|
97
100
|
listen: "127.0.0.1:8791",
|
|
@@ -206,8 +209,12 @@ export async function runModels() {
|
|
|
206
209
|
continue;
|
|
207
210
|
}
|
|
208
211
|
process.stdout.write(`\n${name} — ${models.length} models:\n`);
|
|
209
|
-
for (const m of models)
|
|
210
|
-
|
|
212
|
+
for (const m of models) {
|
|
213
|
+
const scores = getBenchmarkScores(m);
|
|
214
|
+
const quality = calculateQualityScore(scores);
|
|
215
|
+
const benchStr = scores.sweBench ? ` (SWE-bench: ${scores.sweBench}%, quality: ${quality})` : "";
|
|
216
|
+
process.stdout.write(` ${m.padEnd(50)}${benchStr}\n`);
|
|
217
|
+
}
|
|
211
218
|
}
|
|
212
219
|
}
|
|
213
220
|
/**
|
|
@@ -215,7 +222,14 @@ export async function runModels() {
|
|
|
215
222
|
* does not serve — non-blocking (fire-and-forget) so it never delays listen().
|
|
216
223
|
*/
|
|
217
224
|
export async function warmAndValidate(cfg, catalog) {
|
|
218
|
-
const
|
|
225
|
+
const rawSpecs = [cfg.routing.default, ...Object.values(cfg.routing.tiers)];
|
|
226
|
+
const specs = [];
|
|
227
|
+
for (const s of rawSpecs) {
|
|
228
|
+
if (Array.isArray(s))
|
|
229
|
+
specs.push(...s);
|
|
230
|
+
else if (typeof s === "string")
|
|
231
|
+
specs.push(s);
|
|
232
|
+
}
|
|
219
233
|
const seen = new Set();
|
|
220
234
|
for (const spec of specs) {
|
|
221
235
|
if (seen.has(spec))
|
|
@@ -238,7 +252,9 @@ export function runProxy() {
|
|
|
238
252
|
const server = createProxy(cfg, { catalog });
|
|
239
253
|
server.listen(cfg.port, cfg.host, () => {
|
|
240
254
|
const providers = Object.keys(cfg.providers).join(",");
|
|
241
|
-
|
|
255
|
+
const addr = server.address();
|
|
256
|
+
const boundPort = typeof addr === "object" && addr !== null ? addr.port : cfg.port;
|
|
257
|
+
process.stderr.write(`llm-relay listening on http://${cfg.host}:${boundPort} ` +
|
|
242
258
|
`(mode=${cfg.mode}, providers=[${providers}], default=${cfg.routing.default})\n`);
|
|
243
259
|
void warmAndValidate(cfg, catalog);
|
|
244
260
|
});
|
|
@@ -253,8 +269,67 @@ export function runProxy() {
|
|
|
253
269
|
}
|
|
254
270
|
return server;
|
|
255
271
|
}
|
|
272
|
+
import { PingLoop } from "./ping/cadence.js";
|
|
273
|
+
/** `llm-relay ping` — probe and output model stability, latency, and quota across providers. */
|
|
274
|
+
export async function runPingCommand() {
|
|
275
|
+
const cfg = loadOrExit();
|
|
276
|
+
const catalog = new ModelCatalog();
|
|
277
|
+
const pingLoop = new PingLoop(cfg, catalog);
|
|
278
|
+
const only = argValue("--provider", "-p");
|
|
279
|
+
process.stdout.write("⚡ Probing models across providers for latency and stability...\n");
|
|
280
|
+
await pingLoop.tickOnce();
|
|
281
|
+
const names = Object.keys(cfg.providers).filter((n) => !only || n === only);
|
|
282
|
+
for (const name of names) {
|
|
283
|
+
const p = cfg.providers[name];
|
|
284
|
+
let models = [];
|
|
285
|
+
if (p.kind === "openai") {
|
|
286
|
+
try {
|
|
287
|
+
models = await catalog.list(name, p);
|
|
288
|
+
}
|
|
289
|
+
catch { }
|
|
290
|
+
}
|
|
291
|
+
const quota = pingLoop.getProviderQuota(name);
|
|
292
|
+
const quotaStr = quota !== null ? `${quota}% remaining` : "N/A";
|
|
293
|
+
process.stdout.write(`\nProvider: ${name} (quota: ${quotaStr})\n`);
|
|
294
|
+
if (models.length === 0) {
|
|
295
|
+
process.stdout.write(" (no models listed or reachable)\n");
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
for (const mId of models.slice(0, 10)) {
|
|
299
|
+
const summary = pingLoop.getModelSummary(name, mId);
|
|
300
|
+
const avgStr = summary.avgMs >= 0 ? `${summary.avgMs}ms` : "pending";
|
|
301
|
+
const p95Str = summary.p95Ms >= 0 ? `${summary.p95Ms}ms` : "pending";
|
|
302
|
+
const scoreStr = summary.stabilityScore >= 0 ? `${summary.stabilityScore}/100` : "N/A";
|
|
303
|
+
process.stdout.write(` ${mId.padEnd(45)} | verdict: ${summary.verdict.padEnd(10)} | avg: ${avgStr.padEnd(8)} | p95: ${p95Str.padEnd(8)} | stability: ${scoreStr}\n`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
import { validateProviderKeys } from "./key-checker.js";
|
|
308
|
+
import { getBenchmarkScores, calculateQualityScore } from "./benchmarks.js";
|
|
309
|
+
/** `llm-relay check-keys` — pre-flight verification of provider environment keys. */
|
|
310
|
+
export async function runCheckKeys() {
|
|
311
|
+
const cfg = loadOrExit();
|
|
312
|
+
process.stdout.write("🔑 Validating configured provider API keys...\n\n");
|
|
313
|
+
const results = await validateProviderKeys(cfg);
|
|
314
|
+
process.stdout.write(`Provider`.padEnd(16) +
|
|
315
|
+
`Env Var`.padEnd(24) +
|
|
316
|
+
`Status`.padEnd(16) +
|
|
317
|
+
`Details\n`);
|
|
318
|
+
process.stdout.write("-".repeat(80) + "\n");
|
|
319
|
+
for (const r of results) {
|
|
320
|
+
const envStr = r.authEnv ? `\${${r.authEnv}}` : "(none)";
|
|
321
|
+
const quotaStr = r.quotaPercent !== undefined && r.quotaPercent !== null ? ` | Quota: ${r.quotaPercent}%` : "";
|
|
322
|
+
const modelsStr = r.modelsFound !== undefined ? ` | Models: ${r.modelsFound}` : "";
|
|
323
|
+
process.stdout.write(`${r.provider.padEnd(16)}${envStr.padEnd(24)}${r.status.toUpperCase().padEnd(16)}${r.message}${quotaStr}${modelsStr}\n`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
import { runInteractiveOnboarding } from "./onboarding.js";
|
|
327
|
+
import { setupClaudeCli, setupClaudeDesktop } from "./setup-claude.js";
|
|
328
|
+
import { getTelemetryReport } from "./telemetry.js";
|
|
329
|
+
import { globalCircuitBreaker } from "./circuit-breaker.js";
|
|
256
330
|
export function main() {
|
|
257
331
|
const arg2 = process.argv[2];
|
|
332
|
+
const arg3 = process.argv[3];
|
|
258
333
|
if (hasFlag("--help", "-h") || arg2 === "help") {
|
|
259
334
|
process.stdout.write(HELP);
|
|
260
335
|
process.exit(0);
|
|
@@ -263,13 +338,44 @@ export function main() {
|
|
|
263
338
|
try {
|
|
264
339
|
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "../package.json");
|
|
265
340
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
266
|
-
process.stdout.write(`${pkg.version ?? "0.0.
|
|
341
|
+
process.stdout.write(`${pkg.version ?? "0.0.13"}\n`);
|
|
267
342
|
}
|
|
268
343
|
catch {
|
|
269
|
-
process.stdout.write("0.0.
|
|
344
|
+
process.stdout.write("0.0.13\n");
|
|
270
345
|
}
|
|
271
346
|
process.exit(0);
|
|
272
347
|
}
|
|
348
|
+
if (arg2 === "onboard") {
|
|
349
|
+
const cfg = loadOrExit();
|
|
350
|
+
runInteractiveOnboarding(cfg).catch((e) => {
|
|
351
|
+
process.stderr.write(`llm-relay onboard: ${e.message}\n`);
|
|
352
|
+
process.exit(1);
|
|
353
|
+
});
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
if (arg2 === "setup") {
|
|
357
|
+
if (arg3 === "claude-desktop" || arg3 === "desktop") {
|
|
358
|
+
const res = setupClaudeDesktop();
|
|
359
|
+
process.stdout.write(`${res.message}\n`);
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
setupClaudeCli();
|
|
363
|
+
}
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (arg2 === "telemetry") {
|
|
367
|
+
const cfg = loadOrExit();
|
|
368
|
+
const report = getTelemetryReport(cfg, globalCircuitBreaker);
|
|
369
|
+
process.stdout.write(JSON.stringify(report, null, 2) + "\n");
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
if (arg2 === "keys" || arg2 === "check-keys") {
|
|
373
|
+
runCheckKeys().catch((e) => {
|
|
374
|
+
process.stderr.write(`llm-relay check-keys: ${e.message}\n`);
|
|
375
|
+
process.exit(1);
|
|
376
|
+
});
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
273
379
|
if (arg2 === "models") {
|
|
274
380
|
runModels().catch((e) => {
|
|
275
381
|
process.stderr.write(`llm-relay: ${e.message}\n`);
|
|
@@ -277,6 +383,13 @@ export function main() {
|
|
|
277
383
|
});
|
|
278
384
|
return;
|
|
279
385
|
}
|
|
386
|
+
if (arg2 === "ping" || hasFlag("--ping")) {
|
|
387
|
+
runPingCommand().catch((e) => {
|
|
388
|
+
process.stderr.write(`llm-relay ping: ${e.message}\n`);
|
|
389
|
+
process.exit(1);
|
|
390
|
+
});
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
280
393
|
runProxy();
|
|
281
394
|
}
|
|
282
395
|
if (process.argv[1] && (process.argv[1].endsWith("cli.js") || process.argv[1].endsWith("cli.ts"))) {
|
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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"}
|