llm-relay 0.72.3 → 0.73.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/dist/config/routing-parser.d.ts +33 -0
- package/dist/config/routing-parser.js +578 -0
- package/dist/config/routing-parser.js.map +1 -0
- package/dist/config.d.ts +3 -13
- package/dist/config.js +5 -584
- package/dist/config.js.map +1 -1
- package/dist/ping/ping.d.ts +1 -6
- package/dist/ping/ping.js +1 -5
- package/dist/ping/ping.js.map +1 -1
- package/dist/routes/messages.js +3 -3
- package/dist/routes/messages.js.map +1 -1
- package/dist/routes/openai-front.js +3 -3
- package/dist/routes/openai-front.js.map +1 -1
- package/dist/spec.d.ts +35 -0
- package/dist/spec.js +9 -0
- package/dist/spec.js.map +1 -0
- package/dist/stream-commit.d.ts +29 -0
- package/dist/stream-commit.js +5 -0
- package/dist/stream-commit.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsing and validating the `routing` block of a config document (HOTSPOT-03).
|
|
3
|
+
*
|
|
4
|
+
* `parseRouting` plus the seventeen declarations only it reaches: the six sub-block parsers
|
|
5
|
+
* (`parseQuotaEnforcement`, `parseLatencyDemotion`, `parseHedge`, `parseMcpSettings`,
|
|
6
|
+
* `parseLaneProbe`, `parseSticky`), `parseOffload`, the ladder family (`parseLadder`,
|
|
7
|
+
* `parseCliLane`, `parseSpawnEnv` and its three placeholder tokens), `dropDisabledSpecs`,
|
|
8
|
+
* `assertSpecResolvable`, `hasAsciiControl`, `DEFAULT_LANE_PROBE` and `EFFORT_LEVEL_SET`.
|
|
9
|
+
* Roughly 700 lines out of a 2,000-line `config.ts`.
|
|
10
|
+
*
|
|
11
|
+
* ⚠ **It imports `config-types.js` and `spec.js`, and NOTHING else.** That is the property the item
|
|
12
|
+
* asks for, and it is why `spec.ts` had to exist first: this parser needs `POOL_PREFIX`,
|
|
13
|
+
* `AUTO_MODEL` and `splitSpec`, and reaching into `config.js` for them would be a cycle straight
|
|
14
|
+
* back into the file it was extracted from. The dependency runs one way — `config.ts` imports this
|
|
15
|
+
* module and re-exports its three publicly-consumed names, so no other importer changed.
|
|
16
|
+
*
|
|
17
|
+
* ⚠ Everything here is PURE over its inputs: no IO, no clock, no randomness, no `await`. A config
|
|
18
|
+
* document goes in and either a validated `Routing` comes out or a `ConfigError` is thrown. Keep it
|
|
19
|
+
* that way — the request path must never be reachable from a parser, and a parser that read the
|
|
20
|
+
* filesystem could not be tested by handing it a literal.
|
|
21
|
+
*
|
|
22
|
+
* ⚠ A parse failure here is LOUD by design. An unknown key in a `compat`, `limits`, `hedge`,
|
|
23
|
+
* `latency` or `laneProbe` block is a hard load error naming the key, because an ignored typo reads
|
|
24
|
+
* as a declaration that took effect while the wire was unchanged. The one deliberate exception is
|
|
25
|
+
* an unset `${ENV}`, which DISABLES one provider rather than aborting startup: this proxy fronts
|
|
26
|
+
* every client session, so refusing to start would turn one unused optional provider into a total
|
|
27
|
+
* outage. See the degradation rules in `CLAUDE.md`.
|
|
28
|
+
*/
|
|
29
|
+
import { type LaneProbeSettings, type OffloadConfig, type ProviderConfig, type Routing } from "../config-types.js";
|
|
30
|
+
export declare function parseRouting(raw: unknown, providers: Record<string, ProviderConfig>, overrideDefault: string | undefined, warnings?: string[], disabledProviders?: Set<string>): Routing;
|
|
31
|
+
export declare const DEFAULT_LANE_PROBE: LaneProbeSettings;
|
|
32
|
+
/** Parse the legacy global switch or the independently keyed client-rule form. */
|
|
33
|
+
export declare function parseOffload(raw: unknown): OffloadConfig;
|
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
import { EFFORT_LEVELS, } from "../config-types.js";
|
|
2
|
+
import { AUTO_MODEL, POOL_PREFIX, splitSpec } from "../spec.js";
|
|
3
|
+
const EFFORT_LEVEL_SET = new Set(EFFORT_LEVELS);
|
|
4
|
+
function parseQuotaEnforcement(raw) {
|
|
5
|
+
if (raw === undefined || raw === null)
|
|
6
|
+
return undefined;
|
|
7
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
8
|
+
throw new Error("config.routing.quota must be an object");
|
|
9
|
+
}
|
|
10
|
+
const value = raw;
|
|
11
|
+
const out = {};
|
|
12
|
+
if (value.enforce !== undefined) {
|
|
13
|
+
if (typeof value.enforce !== "boolean")
|
|
14
|
+
throw new Error("config.routing.quota.enforce must be a boolean");
|
|
15
|
+
out.enforce = value.enforce;
|
|
16
|
+
}
|
|
17
|
+
if (value.enforceLearned !== undefined) {
|
|
18
|
+
if (typeof value.enforceLearned !== "boolean") {
|
|
19
|
+
throw new Error("config.routing.quota.enforceLearned must be a boolean");
|
|
20
|
+
}
|
|
21
|
+
out.enforceLearned = value.enforceLearned;
|
|
22
|
+
}
|
|
23
|
+
if (value.hardCaps !== undefined) {
|
|
24
|
+
if (typeof value.hardCaps !== "boolean") {
|
|
25
|
+
throw new Error("config.routing.quota.hardCaps must be a boolean");
|
|
26
|
+
}
|
|
27
|
+
out.hardCaps = value.hardCaps;
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
function parseLatencyDemotion(raw) {
|
|
32
|
+
if (raw === undefined || raw === null)
|
|
33
|
+
return {};
|
|
34
|
+
if (typeof raw === "boolean")
|
|
35
|
+
return { enabled: raw };
|
|
36
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
37
|
+
throw new Error("config.routing.latency must be an object or a boolean");
|
|
38
|
+
}
|
|
39
|
+
const value = raw;
|
|
40
|
+
const known = new Set(["enabled", "p95Ms", "msPerToken", "minSamples"]);
|
|
41
|
+
for (const key of Object.keys(value)) {
|
|
42
|
+
if (!known.has(key)) {
|
|
43
|
+
throw new Error(`config.routing.latency has an unknown key "${key}"`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const out = {};
|
|
47
|
+
if (value.enabled !== undefined) {
|
|
48
|
+
if (typeof value.enabled !== "boolean")
|
|
49
|
+
throw new Error("config.routing.latency.enabled must be a boolean");
|
|
50
|
+
out.enabled = value.enabled;
|
|
51
|
+
}
|
|
52
|
+
for (const key of ["p95Ms", "msPerToken", "minSamples"]) {
|
|
53
|
+
const n = value[key];
|
|
54
|
+
if (n === undefined)
|
|
55
|
+
continue;
|
|
56
|
+
if (typeof n !== "number" || !Number.isFinite(n) || n <= 0) {
|
|
57
|
+
throw new Error(`config.routing.latency.${key} must be a positive finite number`);
|
|
58
|
+
}
|
|
59
|
+
out[key] = n;
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
function parseHedge(raw) {
|
|
64
|
+
if (raw === undefined || raw === null)
|
|
65
|
+
return {};
|
|
66
|
+
if (typeof raw === "boolean")
|
|
67
|
+
return { enabled: raw };
|
|
68
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
69
|
+
throw new Error("config.routing.hedge must be an object or a boolean");
|
|
70
|
+
}
|
|
71
|
+
const value = raw;
|
|
72
|
+
const known = new Set(["enabled", "floorMs", "minFloorMs", "msPerInputToken", "margin", "minSamples"]);
|
|
73
|
+
for (const key of Object.keys(value)) {
|
|
74
|
+
if (!known.has(key)) {
|
|
75
|
+
throw new Error(`config.routing.hedge has an unknown key "${key}"`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const out = {};
|
|
79
|
+
if (value.enabled !== undefined) {
|
|
80
|
+
if (typeof value.enabled !== "boolean")
|
|
81
|
+
throw new Error("config.routing.hedge.enabled must be a boolean");
|
|
82
|
+
out.enabled = value.enabled;
|
|
83
|
+
}
|
|
84
|
+
for (const key of ["floorMs", "minFloorMs", "msPerInputToken", "margin", "minSamples"]) {
|
|
85
|
+
const n = value[key];
|
|
86
|
+
if (n === undefined)
|
|
87
|
+
continue;
|
|
88
|
+
if (typeof n !== "number" || !Number.isFinite(n) || n <= 0) {
|
|
89
|
+
throw new Error(`config.routing.hedge.${key} must be a positive finite number`);
|
|
90
|
+
}
|
|
91
|
+
out[key] = n;
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
export function parseRouting(raw, providers, overrideDefault, warnings = [], disabledProviders = new Set()) {
|
|
96
|
+
const r = (typeof raw === "object" && raw !== null ? raw : {});
|
|
97
|
+
if (providers[POOL_PREFIX]) {
|
|
98
|
+
throw new Error(`config.providers."${POOL_PREFIX}" is reserved — it would shadow "pool/<name>" routing`);
|
|
99
|
+
}
|
|
100
|
+
if (providers[AUTO_MODEL]) {
|
|
101
|
+
throw new Error(`config.providers."${AUTO_MODEL}" is reserved — it would shadow "${AUTO_MODEL}" routing`);
|
|
102
|
+
}
|
|
103
|
+
const dfltRaw = overrideDefault !== undefined ? overrideDefault : r.default;
|
|
104
|
+
let dflt;
|
|
105
|
+
if (Array.isArray(dfltRaw)) {
|
|
106
|
+
dflt = dfltRaw.filter((s) => typeof s === "string" && s.length > 0);
|
|
107
|
+
if (dflt.length === 0) {
|
|
108
|
+
throw new Error(`config.routing.default array must contain at least one valid spec string`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (typeof dfltRaw === "string" && dfltRaw.length > 0) {
|
|
112
|
+
dflt = dfltRaw;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
throw new Error(`config.routing.default ("provider/model") is required`);
|
|
116
|
+
}
|
|
117
|
+
const tiers = {};
|
|
118
|
+
if (typeof r.tiers === "object" && r.tiers !== null) {
|
|
119
|
+
for (const [k, v] of Object.entries(r.tiers)) {
|
|
120
|
+
if (Array.isArray(v)) {
|
|
121
|
+
const arr = v.filter((s) => typeof s === "string" && s.length > 0);
|
|
122
|
+
if (arr.length > 0)
|
|
123
|
+
tiers[k] = arr;
|
|
124
|
+
}
|
|
125
|
+
else if (typeof v === "string" && v.length > 0) {
|
|
126
|
+
tiers[k] = v;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const pools = {};
|
|
131
|
+
const poolPolicies = {};
|
|
132
|
+
if (typeof r.pools === "object" && r.pools !== null) {
|
|
133
|
+
for (const [k, v] of Object.entries(r.pools)) {
|
|
134
|
+
let declared;
|
|
135
|
+
if (Array.isArray(v)) {
|
|
136
|
+
declared = v.filter((s) => typeof s === "string" && s.length > 0);
|
|
137
|
+
}
|
|
138
|
+
else if (typeof v === "object" && v !== null) {
|
|
139
|
+
const policy = v;
|
|
140
|
+
if (!Array.isArray(policy.preferred) || policy.preferred.some((s) => typeof s !== "string" || s.length === 0)) {
|
|
141
|
+
throw new Error(`config.routing.pools.${k}.preferred must be an array of non-empty "provider/model" specs`);
|
|
142
|
+
}
|
|
143
|
+
if (policy.include !== "free") {
|
|
144
|
+
throw new Error(`config.routing.pools.${k}.include must be "free"`);
|
|
145
|
+
}
|
|
146
|
+
if (policy.exclude !== undefined &&
|
|
147
|
+
(!Array.isArray(policy.exclude) ||
|
|
148
|
+
policy.exclude.some((s) => typeof s !== "string" ||
|
|
149
|
+
!/^\S+\/\S+$/.test(s) ||
|
|
150
|
+
s.startsWith(`${POOL_PREFIX}/`)))) {
|
|
151
|
+
throw new Error(`config.routing.pools.${k}.exclude must be an array of "provider/model" specs`);
|
|
152
|
+
}
|
|
153
|
+
if (policy.effort !== undefined && !EFFORT_LEVEL_SET.has(policy.effort)) {
|
|
154
|
+
throw new Error(`config.routing.pools.${k}.effort must be low, medium, high, or xhigh`);
|
|
155
|
+
}
|
|
156
|
+
const exclude = [...(policy.exclude ?? [])];
|
|
157
|
+
const excluded = new Set(exclude);
|
|
158
|
+
declared = policy.preferred.filter((spec) => !excluded.has(spec));
|
|
159
|
+
poolPolicies[k] = {
|
|
160
|
+
preferred: declared,
|
|
161
|
+
include: "free",
|
|
162
|
+
...(exclude.length > 0 ? { exclude } : {}),
|
|
163
|
+
...(policy.effort ? { effort: policy.effort } : {}),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
throw new Error(`config.routing.pools.${k} must be an array of specs or {"preferred":[...],"include":"free"}`);
|
|
168
|
+
}
|
|
169
|
+
const arr = declared.filter((s) => {
|
|
170
|
+
const { provider } = splitSpec(s);
|
|
171
|
+
if (!disabledProviders.has(provider))
|
|
172
|
+
return true;
|
|
173
|
+
warnings.push(`routing.pools.${k}: dropped "${s}" — provider "${provider}" is disabled`);
|
|
174
|
+
return false;
|
|
175
|
+
});
|
|
176
|
+
if (arr.length === 0 && !poolPolicies[k]) {
|
|
177
|
+
throw new Error(`config.routing.pools.${k} must contain at least one valid spec string`);
|
|
178
|
+
}
|
|
179
|
+
const nested = arr.find((s) => s.startsWith(`${POOL_PREFIX}/`));
|
|
180
|
+
if (nested) {
|
|
181
|
+
throw new Error(`config.routing.pools.${k} member "${nested}" — a pool cannot reference another pool`);
|
|
182
|
+
}
|
|
183
|
+
pools[k] = arr;
|
|
184
|
+
if (poolPolicies[k])
|
|
185
|
+
poolPolicies[k] = { ...poolPolicies[k], preferred: arr, include: "free" };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const subagents = {};
|
|
189
|
+
if (typeof r.subagents === "object" && r.subagents !== null) {
|
|
190
|
+
for (const [k, v] of Object.entries(r.subagents)) {
|
|
191
|
+
if (typeof v === "string" && v.length > 0)
|
|
192
|
+
subagents[k] = v;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const benchmarkSort = typeof r.benchmarkSort === "boolean" ? r.benchmarkSort : true;
|
|
196
|
+
const offload = parseOffload(r.offload);
|
|
197
|
+
const routing = { default: dflt, tiers, benchmarkSort, offload };
|
|
198
|
+
const sticky = parseSticky(r.sticky);
|
|
199
|
+
if (sticky)
|
|
200
|
+
routing.sticky = sticky;
|
|
201
|
+
const quota = parseQuotaEnforcement(r.quota);
|
|
202
|
+
if (quota)
|
|
203
|
+
routing.quota = quota;
|
|
204
|
+
routing.latency = parseLatencyDemotion(r.latency);
|
|
205
|
+
routing.hedge = parseHedge(r.hedge);
|
|
206
|
+
routing.laneProbe = parseLaneProbe(r.laneProbe);
|
|
207
|
+
const mcpSettings = parseMcpSettings(r.mcp);
|
|
208
|
+
if (mcpSettings)
|
|
209
|
+
routing.mcp = mcpSettings;
|
|
210
|
+
if (Object.keys(pools).length > 0)
|
|
211
|
+
routing.pools = pools;
|
|
212
|
+
if (Object.keys(poolPolicies).length > 0)
|
|
213
|
+
routing.poolPolicies = poolPolicies;
|
|
214
|
+
if (Object.keys(subagents).length > 0)
|
|
215
|
+
routing.subagents = subagents;
|
|
216
|
+
const ladder = parseLadder(r.ladder, "config.routing.ladder");
|
|
217
|
+
if (ladder.length > 0)
|
|
218
|
+
routing.ladder = ladder;
|
|
219
|
+
if (r.ladders !== undefined && (typeof r.ladders !== "object" || r.ladders === null || Array.isArray(r.ladders))) {
|
|
220
|
+
throw new Error(`config.routing.ladders must be an object of named ladder arrays`);
|
|
221
|
+
}
|
|
222
|
+
const ladders = {};
|
|
223
|
+
for (const [tier, rawLadder] of Object.entries((r.ladders ?? {}))) {
|
|
224
|
+
const parsed = parseLadder(rawLadder, `config.routing.ladders.${tier}`);
|
|
225
|
+
if (parsed.length === 0)
|
|
226
|
+
throw new Error(`config.routing.ladders.${tier} must contain at least one rung`);
|
|
227
|
+
ladders[tier] = parsed;
|
|
228
|
+
}
|
|
229
|
+
if (Object.keys(ladders).length > 0)
|
|
230
|
+
routing.ladders = ladders;
|
|
231
|
+
const cliLane = parseCliLane(r.cliLane, "config.routing.cliLane");
|
|
232
|
+
if (cliLane)
|
|
233
|
+
routing.cliLane = cliLane;
|
|
234
|
+
for (const [tier, spec] of Object.entries(tiers)) {
|
|
235
|
+
const kept = dropDisabledSpecs(spec, disabledProviders, warnings, `routing.tiers.${tier}`);
|
|
236
|
+
if (kept === null)
|
|
237
|
+
delete tiers[tier];
|
|
238
|
+
else
|
|
239
|
+
tiers[tier] = kept;
|
|
240
|
+
}
|
|
241
|
+
for (const [tier, spec] of Object.entries(subagents)) {
|
|
242
|
+
const kept = dropDisabledSpecs(spec, disabledProviders, warnings, `routing.subagents.${tier}`);
|
|
243
|
+
if (kept === null)
|
|
244
|
+
delete subagents[tier];
|
|
245
|
+
else
|
|
246
|
+
subagents[tier] = kept;
|
|
247
|
+
}
|
|
248
|
+
if (Array.isArray(routing.default)) {
|
|
249
|
+
const kept = dropDisabledSpecs(routing.default, disabledProviders, warnings, "routing.default");
|
|
250
|
+
if (kept !== null)
|
|
251
|
+
routing.default = kept;
|
|
252
|
+
}
|
|
253
|
+
routing.ladder = ladder.filter((rung) => {
|
|
254
|
+
if (rung.kind !== "relay" || !rung.spec)
|
|
255
|
+
return true;
|
|
256
|
+
return dropDisabledSpecs(rung.spec, disabledProviders, warnings, `routing.ladder[${rung.id}].spec`) !== null;
|
|
257
|
+
});
|
|
258
|
+
if (routing.ladder.length === 0)
|
|
259
|
+
delete routing.ladder;
|
|
260
|
+
for (const [tier, tierLadder] of Object.entries(routing.ladders ?? {})) {
|
|
261
|
+
const kept = tierLadder.filter((rung) => {
|
|
262
|
+
if (rung.kind !== "relay" || !rung.spec)
|
|
263
|
+
return true;
|
|
264
|
+
return dropDisabledSpecs(rung.spec, disabledProviders, warnings, `routing.ladders.${tier}[${rung.id}].spec`) !== null;
|
|
265
|
+
});
|
|
266
|
+
if (kept.length === 0)
|
|
267
|
+
delete routing.ladders[tier];
|
|
268
|
+
else
|
|
269
|
+
routing.ladders[tier] = kept;
|
|
270
|
+
}
|
|
271
|
+
if (routing.ladders && Object.keys(routing.ladders).length === 0)
|
|
272
|
+
delete routing.ladders;
|
|
273
|
+
assertSpecResolvable(routing.default, providers, pools, "routing.default", disabledProviders);
|
|
274
|
+
for (const [tier, spec] of Object.entries(tiers)) {
|
|
275
|
+
assertSpecResolvable(spec, providers, pools, `routing.tiers.${tier}`);
|
|
276
|
+
}
|
|
277
|
+
for (const [pool, specs] of Object.entries(pools)) {
|
|
278
|
+
assertSpecResolvable(specs, providers, {}, `routing.pools.${pool}`);
|
|
279
|
+
}
|
|
280
|
+
for (const [tier, spec] of Object.entries(subagents)) {
|
|
281
|
+
assertSpecResolvable(spec, providers, pools, `routing.subagents.${tier}`);
|
|
282
|
+
}
|
|
283
|
+
for (const rung of routing.ladder ?? []) {
|
|
284
|
+
if (rung.kind === "relay" && rung.spec) {
|
|
285
|
+
assertSpecResolvable(rung.spec, providers, pools, `routing.ladder[${rung.id}].spec`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
for (const [tier, tierLadder] of Object.entries(routing.ladders ?? {})) {
|
|
289
|
+
for (const rung of tierLadder) {
|
|
290
|
+
if (rung.kind === "relay" && rung.spec) {
|
|
291
|
+
assertSpecResolvable(rung.spec, providers, pools, `routing.ladders.${tier}[${rung.id}].spec`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return routing;
|
|
296
|
+
}
|
|
297
|
+
function parseMcpSettings(raw) {
|
|
298
|
+
if (raw === undefined || raw === null)
|
|
299
|
+
return undefined;
|
|
300
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
301
|
+
throw new Error(`config.routing.mcp must be an object`);
|
|
302
|
+
}
|
|
303
|
+
const o = raw;
|
|
304
|
+
for (const key of Object.keys(o)) {
|
|
305
|
+
if (key !== "allowedRoots") {
|
|
306
|
+
throw new Error(`config.routing.mcp.${key} is not a recognized key (allowedRoots)`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (o.allowedRoots === undefined)
|
|
310
|
+
return {};
|
|
311
|
+
if (!Array.isArray(o.allowedRoots) || o.allowedRoots.some((r) => typeof r !== "string" || r.length === 0)) {
|
|
312
|
+
throw new Error(`config.routing.mcp.allowedRoots must be an array of non-empty strings`);
|
|
313
|
+
}
|
|
314
|
+
return { allowedRoots: [...o.allowedRoots] };
|
|
315
|
+
}
|
|
316
|
+
export const DEFAULT_LANE_PROBE = {
|
|
317
|
+
enabled: true,
|
|
318
|
+
quotaIntervalMs: 6 * 60 * 60 * 1000,
|
|
319
|
+
catalogIntervalMs: 24 * 60 * 60 * 1000,
|
|
320
|
+
};
|
|
321
|
+
function parseLaneProbe(raw) {
|
|
322
|
+
if (raw === undefined || raw === null)
|
|
323
|
+
return { ...DEFAULT_LANE_PROBE };
|
|
324
|
+
if (typeof raw === "boolean")
|
|
325
|
+
return { ...DEFAULT_LANE_PROBE, enabled: raw };
|
|
326
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
327
|
+
throw new Error(`config.routing.laneProbe must be a boolean or an object`);
|
|
328
|
+
}
|
|
329
|
+
const o = raw;
|
|
330
|
+
for (const key of Object.keys(o)) {
|
|
331
|
+
if (key !== "enabled" && key !== "quotaIntervalMs" && key !== "catalogIntervalMs") {
|
|
332
|
+
throw new Error(`config.routing.laneProbe.${key} is not a recognized key (enabled, quotaIntervalMs, catalogIntervalMs)`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (typeof o.enabled !== "boolean") {
|
|
336
|
+
throw new Error(`config.routing.laneProbe.enabled must be a boolean`);
|
|
337
|
+
}
|
|
338
|
+
const interval = (name, value, fallback) => {
|
|
339
|
+
if (value === undefined)
|
|
340
|
+
return fallback;
|
|
341
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 60_000 || value > 2_592_000_000) {
|
|
342
|
+
throw new Error(`config.routing.laneProbe.${name} must be between 60000 (1m) and 2592000000 ms (30d)`);
|
|
343
|
+
}
|
|
344
|
+
return Math.floor(value);
|
|
345
|
+
};
|
|
346
|
+
return {
|
|
347
|
+
enabled: o.enabled,
|
|
348
|
+
quotaIntervalMs: interval("quotaIntervalMs", o.quotaIntervalMs, DEFAULT_LANE_PROBE.quotaIntervalMs),
|
|
349
|
+
catalogIntervalMs: interval("catalogIntervalMs", o.catalogIntervalMs, DEFAULT_LANE_PROBE.catalogIntervalMs),
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
function parseSticky(raw) {
|
|
353
|
+
if (raw === undefined || raw === null)
|
|
354
|
+
return undefined;
|
|
355
|
+
if (typeof raw === "boolean") {
|
|
356
|
+
return { enabled: raw, ttlMs: 1_800_000, maxSessions: 1000 };
|
|
357
|
+
}
|
|
358
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
359
|
+
throw new Error(`config.routing.sticky must be a boolean or an object`);
|
|
360
|
+
}
|
|
361
|
+
const sticky = raw;
|
|
362
|
+
if (typeof sticky.enabled !== "boolean") {
|
|
363
|
+
throw new Error(`config.routing.sticky.enabled must be a boolean`);
|
|
364
|
+
}
|
|
365
|
+
let ttlMs = 1_800_000;
|
|
366
|
+
if (sticky.ttlMs !== undefined) {
|
|
367
|
+
if (typeof sticky.ttlMs !== "number" ||
|
|
368
|
+
!Number.isFinite(sticky.ttlMs) ||
|
|
369
|
+
sticky.ttlMs < 1000 ||
|
|
370
|
+
sticky.ttlMs > 86_400_000) {
|
|
371
|
+
throw new Error(`config.routing.sticky.ttlMs must be between 1000 and 86400000 ms (1s to 24h)`);
|
|
372
|
+
}
|
|
373
|
+
ttlMs = Math.floor(sticky.ttlMs);
|
|
374
|
+
}
|
|
375
|
+
let maxSessions = 1000;
|
|
376
|
+
if (sticky.maxSessions !== undefined) {
|
|
377
|
+
if (typeof sticky.maxSessions !== "number" ||
|
|
378
|
+
!Number.isFinite(sticky.maxSessions) ||
|
|
379
|
+
sticky.maxSessions < 10 ||
|
|
380
|
+
sticky.maxSessions > 100_000) {
|
|
381
|
+
throw new Error(`config.routing.sticky.maxSessions must be an integer between 10 and 100000`);
|
|
382
|
+
}
|
|
383
|
+
maxSessions = Math.floor(sticky.maxSessions);
|
|
384
|
+
}
|
|
385
|
+
return { enabled: sticky.enabled, ttlMs, maxSessions };
|
|
386
|
+
}
|
|
387
|
+
export function parseOffload(raw) {
|
|
388
|
+
let out = false;
|
|
389
|
+
if (typeof raw === "boolean") {
|
|
390
|
+
out = raw;
|
|
391
|
+
}
|
|
392
|
+
else if (raw !== undefined) {
|
|
393
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
394
|
+
throw new Error(`config.routing.offload must be a boolean or an object keyed by client`);
|
|
395
|
+
}
|
|
396
|
+
const parsed = {};
|
|
397
|
+
for (const [client, value] of Object.entries(raw)) {
|
|
398
|
+
if (client.length === 0)
|
|
399
|
+
throw new Error(`config.routing.offload client name must not be empty`);
|
|
400
|
+
if (typeof value === "boolean") {
|
|
401
|
+
parsed[client] = { enabled: value, scope: "subagents" };
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
405
|
+
throw new Error(`config.routing.offload.${client} must be a boolean or {"enabled":bool,"scope":...}`);
|
|
406
|
+
}
|
|
407
|
+
const rule = value;
|
|
408
|
+
if (typeof rule.enabled !== "boolean") {
|
|
409
|
+
throw new Error(`config.routing.offload.${client}.enabled must be true or false`);
|
|
410
|
+
}
|
|
411
|
+
const scope = rule.scope === undefined ? "subagents" : rule.scope;
|
|
412
|
+
if (scope !== "subagents" && scope !== "all") {
|
|
413
|
+
throw new Error(`config.routing.offload.${client}.scope must be "subagents" or "all"`);
|
|
414
|
+
}
|
|
415
|
+
if (rule.freeOnly !== undefined && typeof rule.freeOnly !== "boolean") {
|
|
416
|
+
throw new Error(`config.routing.offload.${client}.freeOnly must be true or false`);
|
|
417
|
+
}
|
|
418
|
+
parsed[client] = { enabled: rule.enabled, scope, ...(rule.freeOnly !== undefined ? { freeOnly: rule.freeOnly } : {}) };
|
|
419
|
+
}
|
|
420
|
+
out = parsed;
|
|
421
|
+
}
|
|
422
|
+
return out;
|
|
423
|
+
}
|
|
424
|
+
function hasAsciiControl(value) {
|
|
425
|
+
for (let i = 0; i < value.length; i++) {
|
|
426
|
+
const code = value.charCodeAt(i);
|
|
427
|
+
if (code <= 0x1f || (code >= 0x7f && code <= 0x9f))
|
|
428
|
+
return true;
|
|
429
|
+
}
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
function dropDisabledSpecs(spec, disabled, warnings, where) {
|
|
433
|
+
if (disabled.size === 0)
|
|
434
|
+
return spec;
|
|
435
|
+
const specs = Array.isArray(spec) ? spec : [spec];
|
|
436
|
+
const kept = specs.filter((s) => {
|
|
437
|
+
const { provider } = splitSpec(s);
|
|
438
|
+
if (provider === POOL_PREFIX || !disabled.has(provider))
|
|
439
|
+
return true;
|
|
440
|
+
warnings.push(`config.${where}: dropped "${s}" — provider "${provider}" is disabled. ` +
|
|
441
|
+
`That routing now falls through to routing.default, which for a passthrough default ` +
|
|
442
|
+
`means primary quota.`);
|
|
443
|
+
return false;
|
|
444
|
+
});
|
|
445
|
+
if (kept.length === 0)
|
|
446
|
+
return null;
|
|
447
|
+
return Array.isArray(spec) ? kept : kept[0];
|
|
448
|
+
}
|
|
449
|
+
const LADDER_TASK_TOKEN = "{task}";
|
|
450
|
+
const LADDER_SPEC_TOKEN = "{spec}";
|
|
451
|
+
const LADDER_CONTEXT_TOKEN = "{contextWindow}";
|
|
452
|
+
function parseSpawnEnv(raw, where) {
|
|
453
|
+
if (raw === undefined)
|
|
454
|
+
return undefined;
|
|
455
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
456
|
+
throw new Error(`${where}.env must be an object mapping variable names to a string (set) or null (unset)`);
|
|
457
|
+
}
|
|
458
|
+
const env = {};
|
|
459
|
+
for (const [name, value] of Object.entries(raw)) {
|
|
460
|
+
if (name.length === 0 || name.includes("=") || /\s/.test(name) || hasAsciiControl(name)) {
|
|
461
|
+
throw new Error(`${where}.env has an invalid variable name ${JSON.stringify(name)}`);
|
|
462
|
+
}
|
|
463
|
+
if (typeof value !== "string" && value !== null) {
|
|
464
|
+
throw new Error(`${where}.env.${name} must be a string (set) or null (unset)`);
|
|
465
|
+
}
|
|
466
|
+
env[name] = value;
|
|
467
|
+
}
|
|
468
|
+
return Object.keys(env).length > 0 ? env : undefined;
|
|
469
|
+
}
|
|
470
|
+
function parseCliLane(raw, root) {
|
|
471
|
+
if (raw === undefined || raw === null)
|
|
472
|
+
return undefined;
|
|
473
|
+
if (typeof raw !== "object" || Array.isArray(raw))
|
|
474
|
+
throw new Error(`${root} must be an object`);
|
|
475
|
+
const e = raw;
|
|
476
|
+
if (typeof e.command !== "string" || e.command.length === 0) {
|
|
477
|
+
throw new Error(`${root}.command must be a non-empty string`);
|
|
478
|
+
}
|
|
479
|
+
if (!Array.isArray(e.args) || e.args.some((a) => typeof a !== "string")) {
|
|
480
|
+
throw new Error(`${root}.args must be an array of strings`);
|
|
481
|
+
}
|
|
482
|
+
const args = e.args;
|
|
483
|
+
if (!args.some((a) => a.includes(LADDER_SPEC_TOKEN))) {
|
|
484
|
+
throw new Error(`${root}.args must contain "${LADDER_SPEC_TOKEN}" in one argument — otherwise every transposed rung ` +
|
|
485
|
+
`invokes ${e.command} with the same model and the ladder only appears to fail over`);
|
|
486
|
+
}
|
|
487
|
+
if (!args.some((a) => a.includes(LADDER_TASK_TOKEN))) {
|
|
488
|
+
throw new Error(`${root}.args must contain "${LADDER_TASK_TOKEN}" in one argument — otherwise the task is never passed to ${e.command}`);
|
|
489
|
+
}
|
|
490
|
+
const lane = { command: e.command, args };
|
|
491
|
+
const env = parseSpawnEnv(e.env, root);
|
|
492
|
+
if (env) {
|
|
493
|
+
for (const [name, value] of Object.entries(env)) {
|
|
494
|
+
if (typeof value === "string" && value.includes(LADDER_TASK_TOKEN)) {
|
|
495
|
+
throw new Error(`${root}.env.${name} must not contain "${LADDER_TASK_TOKEN}" — task text is never placed in a spawned ` +
|
|
496
|
+
`process's environment (use args for the task; "${LADDER_CONTEXT_TOKEN}" is available here)`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
lane.env = env;
|
|
500
|
+
}
|
|
501
|
+
return lane;
|
|
502
|
+
}
|
|
503
|
+
function parseLadder(raw, root) {
|
|
504
|
+
if (raw === undefined || raw === null)
|
|
505
|
+
return [];
|
|
506
|
+
if (!Array.isArray(raw))
|
|
507
|
+
throw new Error(`${root} must be an array of rungs`);
|
|
508
|
+
const out = [];
|
|
509
|
+
const seen = new Set();
|
|
510
|
+
for (const [i, entry] of raw.entries()) {
|
|
511
|
+
const where = `${root}[${i}]`;
|
|
512
|
+
if (typeof entry !== "object" || entry === null)
|
|
513
|
+
throw new Error(`${where} must be an object`);
|
|
514
|
+
const e = entry;
|
|
515
|
+
const id = e.id;
|
|
516
|
+
if (typeof id !== "string" || id.length === 0)
|
|
517
|
+
throw new Error(`${where}.id must be a non-empty string`);
|
|
518
|
+
if (seen.has(id))
|
|
519
|
+
throw new Error(`${where}.id "${id}" is already used by an earlier rung`);
|
|
520
|
+
seen.add(id);
|
|
521
|
+
const kind = e.kind;
|
|
522
|
+
if (kind !== "cli" && kind !== "relay")
|
|
523
|
+
throw new Error(`${where}.kind must be "cli" or "relay" (got ${JSON.stringify(kind)})`);
|
|
524
|
+
const rung = { id, kind, enabled: e.enabled !== false };
|
|
525
|
+
if (typeof e.quota === "string" && e.quota.length > 0)
|
|
526
|
+
rung.quota = e.quota;
|
|
527
|
+
if (typeof e.note === "string" && e.note.length > 0)
|
|
528
|
+
rung.note = e.note;
|
|
529
|
+
if (kind === "cli") {
|
|
530
|
+
if (typeof e.command !== "string" || e.command.length === 0) {
|
|
531
|
+
throw new Error(`${where}.command must be a non-empty string for a "cli" rung`);
|
|
532
|
+
}
|
|
533
|
+
if (!Array.isArray(e.args) || e.args.some((a) => typeof a !== "string")) {
|
|
534
|
+
throw new Error(`${where}.args must be an array of strings for a "cli" rung`);
|
|
535
|
+
}
|
|
536
|
+
const args = e.args;
|
|
537
|
+
if (!args.some((a) => a.includes(LADDER_TASK_TOKEN))) {
|
|
538
|
+
throw new Error(`${where}.args must contain "${LADDER_TASK_TOKEN}" in one argument — otherwise the task is never passed to ${e.command}`);
|
|
539
|
+
}
|
|
540
|
+
rung.command = e.command;
|
|
541
|
+
rung.args = args;
|
|
542
|
+
const env = parseSpawnEnv(e.env, where);
|
|
543
|
+
if (env)
|
|
544
|
+
rung.env = env;
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
if (typeof e.spec !== "string" || e.spec.length === 0) {
|
|
548
|
+
throw new Error(`${where}.spec must be a non-empty string for a "relay" rung`);
|
|
549
|
+
}
|
|
550
|
+
rung.spec = e.spec;
|
|
551
|
+
}
|
|
552
|
+
out.push(rung);
|
|
553
|
+
}
|
|
554
|
+
return out;
|
|
555
|
+
}
|
|
556
|
+
function assertSpecResolvable(spec, providers, pools, where, disabled = new Set()) {
|
|
557
|
+
const specs = Array.isArray(spec) ? spec : [spec];
|
|
558
|
+
for (const s of specs) {
|
|
559
|
+
const { provider, model } = splitSpec(s);
|
|
560
|
+
if (provider === POOL_PREFIX) {
|
|
561
|
+
if (!model || !pools[model]) {
|
|
562
|
+
throw new Error(`config.${where} "${s}" names unknown pool "${model ?? ""}" (available: ${Object.keys(pools).join(", ") || "none"})`);
|
|
563
|
+
}
|
|
564
|
+
continue;
|
|
565
|
+
}
|
|
566
|
+
const p = providers[provider];
|
|
567
|
+
if (!p && disabled.has(provider)) {
|
|
568
|
+
throw new Error(`config.${where} "${s}" names provider "${provider}", which is DISABLED because its ` +
|
|
569
|
+
`base references an unset \${ENV} (see the warning above). Set the variable, or point ` +
|
|
570
|
+
`${where} somewhere else.`);
|
|
571
|
+
}
|
|
572
|
+
if (!p)
|
|
573
|
+
throw new Error(`config.${where} "${s}" names unknown provider "${provider}"`);
|
|
574
|
+
if (p.kind === "openai" && !model)
|
|
575
|
+
throw new Error(`config.${where} "${s}" needs a model id for openai provider "${provider}"`);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=routing-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-parser.js","sourceRoot":"","sources":["../../src/config/routing-parser.ts"],"names":[],"mappings":"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"}
|