llm-relay 0.40.0 → 0.42.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/availability-snapshot.d.ts +8 -0
- package/dist/availability-snapshot.js +20 -8
- package/dist/availability-snapshot.js.map +1 -1
- package/dist/availability.d.ts +67 -5
- package/dist/availability.js +76 -1
- package/dist/availability.js.map +1 -1
- package/dist/backend.d.ts +21 -0
- package/dist/backend.js +91 -5
- package/dist/backend.js.map +1 -1
- package/dist/candidates.js +13 -3
- package/dist/candidates.js.map +1 -1
- package/dist/cli.js +6 -3
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +1 -1
- package/dist/dashboard/assets/{index-B2fuSM77.js → index-u-Ez_oE6.js} +11 -11
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard-contract.d.ts +14 -0
- package/dist/dashboard-contract.js +5 -1
- package/dist/dashboard-contract.js.map +1 -1
- package/dist/dashboard-snapshot.js +72 -9
- package/dist/dashboard-snapshot.js.map +1 -1
- package/dist/log.d.ts +10 -0
- package/dist/log.js +1 -0
- package/dist/log.js.map +1 -1
- package/dist/openai-request.js +37 -6
- package/dist/openai-request.js.map +1 -1
- package/dist/refusal-interpretation.d.ts +1 -1
- package/dist/refusal-interpretation.js +1 -1
- package/dist/responses-request.d.ts +85 -0
- package/dist/responses-request.js +480 -0
- package/dist/responses-request.js.map +1 -0
- package/dist/server.js +41 -9
- package/dist/server.js.map +1 -1
- package/dist/target-facts.d.ts +32 -0
- package/dist/target-facts.js +44 -3
- package/dist/target-facts.js.map +1 -1
- package/dist/tool-use-ids.d.ts +91 -0
- package/dist/tool-use-ids.js +265 -0
- package/dist/tool-use-ids.js.map +1 -0
- package/package.json +1 -1
|
@@ -18,6 +18,7 @@ import { type CooldownRowV1, type QuotaRowV1 } from "./dashboard-contract.js";
|
|
|
18
18
|
import type { CircuitBreaker } from "./circuit-breaker.js";
|
|
19
19
|
import type { AccountingStore } from "./accounting-store.js";
|
|
20
20
|
import { type Config } from "./config.js";
|
|
21
|
+
import { factsFor } from "./target-facts.js";
|
|
21
22
|
/**
|
|
22
23
|
* Dependencies, all optional except the config: quotas come from whatever evidence exists (the
|
|
23
24
|
* bare in-memory proxy has a breaker but no store, so localUsed stays null there), and cooldowns
|
|
@@ -30,6 +31,13 @@ export interface AvailabilityProducerOptions {
|
|
|
30
31
|
readonly accounting?: Pick<AccountingStore, "usedInWindow"> | null;
|
|
31
32
|
/** Injected for deterministic tests; defaults to Date.now(). */
|
|
32
33
|
readonly now?: () => number;
|
|
34
|
+
/**
|
|
35
|
+
* The facts read seam; defaults to `factsFor`. Covers BOTH halves of the snapshot (quota resets
|
|
36
|
+
* and the cooldown panel) — a seam only one consumer honours implies coverage it does not have.
|
|
37
|
+
* Injected by tests to exercise the never-throws guarantee against a throwing reader; the
|
|
38
|
+
* production default never throws.
|
|
39
|
+
*/
|
|
40
|
+
readonly readFacts?: typeof factsFor;
|
|
33
41
|
}
|
|
34
42
|
/** Shape-compatible with `DashboardAvailabilityPort`; typed locally so server.ts stays decoupled. */
|
|
35
43
|
export interface AvailabilitySnapshot {
|
|
@@ -2,7 +2,7 @@ import { parseCredentialId } from "./credential-id.js";
|
|
|
2
2
|
import { CONFIGURED_LIMIT_AXES, configuredLimitQuotaShape, resolveConfiguredLimits } from "./configured-limits.js";
|
|
3
3
|
import { providerCredentialSlots } from "./credential-fleet.js";
|
|
4
4
|
import { observedRateLimits } from "./rate-limits.js";
|
|
5
|
-
import { mapLimitBasis, mapRemainingBasis, resolveRemaining, resolveResetsAt, } from "./availability.js";
|
|
5
|
+
import { factResetInputs, mapLimitBasis, mapRemainingBasis, mapResetsAtBasis, resolveRemaining, resolveResetsAt, } from "./availability.js";
|
|
6
6
|
import { evaluateHardCap } from "./hard-cap.js";
|
|
7
7
|
import { POOL_PREFIX, splitSpec } from "./config.js";
|
|
8
8
|
import { factsFor } from "./target-facts.js";
|
|
@@ -12,7 +12,7 @@ import { factsFor } from "./target-facts.js";
|
|
|
12
12
|
* leaves figures null are still emitted — a known-limit/unknown-used row is exactly the
|
|
13
13
|
* "limit known, usage unmeasured" state §5.3 wants rendered as `-`, not hidden.
|
|
14
14
|
*/
|
|
15
|
-
function buildQuotas(cfg, breaker, accounting, now) {
|
|
15
|
+
function buildQuotas(cfg, breaker, accounting, now, readFacts) {
|
|
16
16
|
const rows = [];
|
|
17
17
|
if (breaker === undefined)
|
|
18
18
|
return rows;
|
|
@@ -24,6 +24,10 @@ function buildQuotas(cfg, breaker, accounting, now) {
|
|
|
24
24
|
const provider = parsed.provider;
|
|
25
25
|
const model = state.target.model;
|
|
26
26
|
const credentialId = state.target.credentialId;
|
|
27
|
+
// ONE fact read per cell, not per bucket: `factsFor` walks and sorts the whole table, and
|
|
28
|
+
// every bucket of this cell asks it the same question. The ordering it returns
|
|
29
|
+
// (most-specific scope first) is load-bearing input to `factResetInputs`.
|
|
30
|
+
const cellFacts = readFacts(provider, credentialId, model, { now });
|
|
27
31
|
const buckets = new Map();
|
|
28
32
|
const bucketFor = (axis, period) => {
|
|
29
33
|
const key = `${axis}:${period}`;
|
|
@@ -78,9 +82,15 @@ function buildQuotas(cfg, breaker, accounting, now) {
|
|
|
78
82
|
localUsed,
|
|
79
83
|
now,
|
|
80
84
|
});
|
|
85
|
+
// The §5.2 rung inputs, resolved by the SAME helper `llm-relay candidates` calls, so the
|
|
86
|
+
// two surfaces cannot report different provenance for one cell.
|
|
81
87
|
const resets = resolveResetsAt({
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
...factResetInputs({
|
|
89
|
+
facts: cellFacts,
|
|
90
|
+
observationReset: resolution.eligibleObservation?.resetsAt ?? null,
|
|
91
|
+
remaining: resolution.remaining,
|
|
92
|
+
now,
|
|
93
|
+
}),
|
|
84
94
|
period: periodPart,
|
|
85
95
|
now,
|
|
86
96
|
});
|
|
@@ -101,6 +111,7 @@ function buildQuotas(cfg, breaker, accounting, now) {
|
|
|
101
111
|
limitBasis: mapLimitBasis(resolution.limitBasis),
|
|
102
112
|
remainingBasis: mapRemainingBasis(resolution.basis),
|
|
103
113
|
localUsedBasis: resolution.localUsedBasis,
|
|
114
|
+
resetsAtBasis: mapResetsAtBasis(resets.basis),
|
|
104
115
|
});
|
|
105
116
|
}
|
|
106
117
|
}
|
|
@@ -150,7 +161,7 @@ function routableModels(cfg) {
|
|
|
150
161
|
* (auth_error), the COOLING half of target-facts, and REACHED operator-set hard caps
|
|
151
162
|
* (`manual` — G2). Fact mapping is documented at use site.
|
|
152
163
|
*/
|
|
153
|
-
function buildCooldowns(cfg, breaker, accounting, now) {
|
|
164
|
+
function buildCooldowns(cfg, breaker, accounting, now, readFacts) {
|
|
154
165
|
const rows = new Map();
|
|
155
166
|
const push = (source, reason, until, observedAt) => {
|
|
156
167
|
const key = `${source.provider} ${source.credentialId} ${source.model ?? ""} ${reason}`;
|
|
@@ -206,7 +217,7 @@ function buildCooldowns(cfg, breaker, accounting, now) {
|
|
|
206
217
|
if (seen.has(key))
|
|
207
218
|
return;
|
|
208
219
|
seen.add(key);
|
|
209
|
-
for (const fact of
|
|
220
|
+
for (const fact of readFacts(cell.provider, cell.credentialId, cell.model, { now })) {
|
|
210
221
|
let reason = null;
|
|
211
222
|
if (fact.kind === "allowance-exhausted" || fact.kind === "rate-limited")
|
|
212
223
|
reason = "rate_limit";
|
|
@@ -271,13 +282,14 @@ function buildCooldowns(cfg, breaker, accounting, now) {
|
|
|
271
282
|
export function createAvailabilityProducer(options) {
|
|
272
283
|
const { breaker, config, accounting } = options;
|
|
273
284
|
const clock = options.now ?? (() => Date.now());
|
|
285
|
+
const readFacts = options.readFacts ?? factsFor;
|
|
274
286
|
return {
|
|
275
287
|
snapshot() {
|
|
276
288
|
try {
|
|
277
289
|
const now = clock();
|
|
278
290
|
return {
|
|
279
|
-
quotas: buildQuotas(config, breaker, accounting ?? null, now),
|
|
280
|
-
cooldowns: buildCooldowns(config, breaker, accounting ?? null, now),
|
|
291
|
+
quotas: buildQuotas(config, breaker, accounting ?? null, now, readFacts),
|
|
292
|
+
cooldowns: buildCooldowns(config, breaker, accounting ?? null, now, readFacts),
|
|
281
293
|
};
|
|
282
294
|
}
|
|
283
295
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"availability-snapshot.js","sourceRoot":"","sources":["../src/availability-snapshot.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"availability-snapshot.js","sourceRoot":"","sources":["../src/availability-snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/availability.d.ts
CHANGED
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
* arithmetic step — rung 2's limit − localUsed — is labelled with WHERE its inputs came from
|
|
14
14
|
* ("derived:<limit-provenance>"), so a reader can always tell a stated figure from a computed one.
|
|
15
15
|
*
|
|
16
|
-
* Pure: no IO, no clock of its own (`now` is an argument), no imports from server.ts.
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Pure: no IO, no clock of its own (`now` is an argument), no imports from server.ts. It reads no
|
|
17
|
+
* store either — `factResetInputs` is handed facts a caller already read, and the only non-type
|
|
18
|
+
* import outside this file's own vocabulary is `target-facts.ts`'s closed kind set, so the set
|
|
19
|
+
* cannot be restated (and drift) in two consumers. Gap 12 calls `resolveRemaining` from the
|
|
20
|
+
* routing path under `routingEligible`; nothing here reorders or refuses anything today.
|
|
19
21
|
*/
|
|
20
22
|
import type { QuotaAxis, QuotaObservation, QuotaPeriod } from "./quota-observation.js";
|
|
21
23
|
/** Where a rung-2 limit may come from, in precedence order (see resolveRemaining). */
|
|
@@ -98,7 +100,7 @@ export type ResetsAtResolution = {
|
|
|
98
100
|
* a stated reset must still be in the future, else it is declined and the next rung answers.
|
|
99
101
|
*
|
|
100
102
|
* `providerStated` / `reviewedRule` arrive pre-resolved: the request path already applies
|
|
101
|
-
* ResetRules beside header parses (`server.ts`
|
|
103
|
+
* ResetRules beside header parses (`server.ts` resolveReset), and re-parsing vendor prose here
|
|
102
104
|
* would risk two readers disagreeing about one response. This module only decides WHICH rung wins
|
|
103
105
|
* and computes the fallback boundary.
|
|
104
106
|
*/
|
|
@@ -108,7 +110,66 @@ export declare function resolveResetsAt(input: {
|
|
|
108
110
|
period: QuotaPeriod;
|
|
109
111
|
now: number;
|
|
110
112
|
}): ResetsAtResolution;
|
|
111
|
-
import
|
|
113
|
+
import { type FactKind, type FactResetBasis } from "./target-facts.js";
|
|
114
|
+
/**
|
|
115
|
+
* One covering fact, in exactly the shape `factsFor()` returns (wider objects satisfy it).
|
|
116
|
+
* Type-only coupling to the store plus its closed kind set — this module still reads nothing.
|
|
117
|
+
*/
|
|
118
|
+
export interface FactResetCandidate {
|
|
119
|
+
readonly kind: FactKind;
|
|
120
|
+
readonly until: number;
|
|
121
|
+
readonly untilBasis?: FactResetBasis;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Turn the facts covering ONE credential×deployment cell into this bucket's rung-1/rung-2 inputs.
|
|
125
|
+
*
|
|
126
|
+
* The ONE place that policy lives, because both the dashboard producer (`availability-snapshot.ts`)
|
|
127
|
+
* and `llm-relay candidates` (`candidates.ts`) resolve the same cell: two implementations is how
|
|
128
|
+
* the two surfaces come to disagree about one row (the shape CLAUDE.md's "two paths, one policy
|
|
129
|
+
* empty" gotcha names). Neither caller re-parses vendor prose — a fact already carries the reset
|
|
130
|
+
* the request path resolved AND the rung it came from (`untilBasis`, minted by `server.ts`
|
|
131
|
+
* `resolveReset`).
|
|
132
|
+
*
|
|
133
|
+
* A fact may answer a bucket only when EVERY one of these holds; each clause is a provenance
|
|
134
|
+
* guard, not a nicety:
|
|
135
|
+
* - the fact's kind is one the QUOTA vocabulary can speak about (`QUOTA_RESET_FACT_KINDS`): an
|
|
136
|
+
* evicting condition ("this deployment is removed from selection") is not a statement about when
|
|
137
|
+
* an allowance refills, and rendering it as one is a category error dressed as a measurement;
|
|
138
|
+
* - the fact carries an explicit `untilBasis`: a legacy row or a kind's default TTL is the relay's
|
|
139
|
+
* own fallback, never something anybody stated;
|
|
140
|
+
* - its `until` is still in the future (rung 2 has no eligibility test of its own, so it gets one
|
|
141
|
+
* here rather than rendering a reset that has already passed);
|
|
142
|
+
* - the bucket is MEASURED-SPENT (`remaining !== null && remaining <= 0`). Unknown remaining has no
|
|
143
|
+
* effect whatsoever — the same rule quota demotion follows — and a bucket with headroom must
|
|
144
|
+
* never be handed a credential-wide reset: that would invent availability for a bucket nobody
|
|
145
|
+
* made a claim about, which is precisely the provenance invariant;
|
|
146
|
+
* - the ladder would otherwise fall through to the derived boundary (`observationReset === null`).
|
|
147
|
+
* A reset this response stated about this bucket always outranks a stored one.
|
|
148
|
+
*
|
|
149
|
+
* Within those gates the MOST-SPECIFIC scope wins per basis class, not the soonest expiry: callers
|
|
150
|
+
* pass `facts` in `factsFor()` order (attempt → group → deployment → credential → provider →
|
|
151
|
+
* model), and the first hit of each class is taken. Racing the two classes on recency would let an
|
|
152
|
+
* unrelated short fact pre-empt rung 2 entirely, so both inputs are returned independently and
|
|
153
|
+
* `resolveResetsAt` picks the rung.
|
|
154
|
+
*
|
|
155
|
+
* ⚠ Residual, stated rather than papered over: a fact carries no axis/period attribution, so a
|
|
156
|
+
* fact admitted here answers whichever spent bucket of the cell asked. The conjunction above IS
|
|
157
|
+
* the containment (same cell, measured-spent, and the provider said nothing about this bucket
|
|
158
|
+
* itself); an axis/period mapping inferred from the fact's kind would be exactly the invention
|
|
159
|
+
* `target-facts.ts` refuses ("scope comes from evidence, never from counting").
|
|
160
|
+
*/
|
|
161
|
+
export declare function factResetInputs(input: {
|
|
162
|
+
/** Covering facts in `factsFor()` order — most-specific scope first. */
|
|
163
|
+
facts: readonly FactResetCandidate[];
|
|
164
|
+
/** Rung 1's own input: the reset the eligible observation stated, if any. */
|
|
165
|
+
observationReset: number | null;
|
|
166
|
+
remaining: number | null;
|
|
167
|
+
now: number;
|
|
168
|
+
}): {
|
|
169
|
+
providerStated: number | null;
|
|
170
|
+
reviewedRule: number | null;
|
|
171
|
+
};
|
|
172
|
+
import type { LimitBasis, LocalUsedBasis, RemainingBasis, ResetsAtBasis } from "./dashboard-contract.js";
|
|
112
173
|
/**
|
|
113
174
|
* Map internal bases onto the dashboard wire vocabulary in ONE place, so the producer and the
|
|
114
175
|
* contract cannot drift. `derived:published` maps onto `derived_configured`'s sibling spelling
|
|
@@ -116,4 +177,5 @@ import type { LimitBasis, LocalUsedBasis, RemainingBasis } from "./dashboard-con
|
|
|
116
177
|
*/
|
|
117
178
|
export declare function mapRemainingBasis(basis: RemainingResolution["basis"]): RemainingBasis | null;
|
|
118
179
|
export declare function mapLimitBasis(basis: RemainingResolution["limitBasis"]): LimitBasis | null;
|
|
180
|
+
export declare function mapResetsAtBasis(basis: ResetsAtResolution["basis"]): ResetsAtBasis | null;
|
|
119
181
|
export type { LimitBasis, LocalUsedBasis, RemainingBasis };
|
package/dist/availability.js
CHANGED
|
@@ -166,7 +166,7 @@ export function resolveRemaining(input) {
|
|
|
166
166
|
* a stated reset must still be in the future, else it is declined and the next rung answers.
|
|
167
167
|
*
|
|
168
168
|
* `providerStated` / `reviewedRule` arrive pre-resolved: the request path already applies
|
|
169
|
-
* ResetRules beside header parses (`server.ts`
|
|
169
|
+
* ResetRules beside header parses (`server.ts` resolveReset), and re-parsing vendor prose here
|
|
170
170
|
* would risk two readers disagreeing about one response. This module only decides WHICH rung wins
|
|
171
171
|
* and computes the fallback boundary.
|
|
172
172
|
*/
|
|
@@ -187,6 +187,69 @@ export function resolveResetsAt(input) {
|
|
|
187
187
|
return { resetsAt: end, basis: "derived-boundary" };
|
|
188
188
|
return { resetsAt: null, basis: null };
|
|
189
189
|
}
|
|
190
|
+
// ── §5.2 rung inputs from persisted target-facts ────────────────────────────────────────────────
|
|
191
|
+
import { QUOTA_RESET_FACT_KINDS } from "./target-facts.js";
|
|
192
|
+
/**
|
|
193
|
+
* Turn the facts covering ONE credential×deployment cell into this bucket's rung-1/rung-2 inputs.
|
|
194
|
+
*
|
|
195
|
+
* The ONE place that policy lives, because both the dashboard producer (`availability-snapshot.ts`)
|
|
196
|
+
* and `llm-relay candidates` (`candidates.ts`) resolve the same cell: two implementations is how
|
|
197
|
+
* the two surfaces come to disagree about one row (the shape CLAUDE.md's "two paths, one policy
|
|
198
|
+
* empty" gotcha names). Neither caller re-parses vendor prose — a fact already carries the reset
|
|
199
|
+
* the request path resolved AND the rung it came from (`untilBasis`, minted by `server.ts`
|
|
200
|
+
* `resolveReset`).
|
|
201
|
+
*
|
|
202
|
+
* A fact may answer a bucket only when EVERY one of these holds; each clause is a provenance
|
|
203
|
+
* guard, not a nicety:
|
|
204
|
+
* - the fact's kind is one the QUOTA vocabulary can speak about (`QUOTA_RESET_FACT_KINDS`): an
|
|
205
|
+
* evicting condition ("this deployment is removed from selection") is not a statement about when
|
|
206
|
+
* an allowance refills, and rendering it as one is a category error dressed as a measurement;
|
|
207
|
+
* - the fact carries an explicit `untilBasis`: a legacy row or a kind's default TTL is the relay's
|
|
208
|
+
* own fallback, never something anybody stated;
|
|
209
|
+
* - its `until` is still in the future (rung 2 has no eligibility test of its own, so it gets one
|
|
210
|
+
* here rather than rendering a reset that has already passed);
|
|
211
|
+
* - the bucket is MEASURED-SPENT (`remaining !== null && remaining <= 0`). Unknown remaining has no
|
|
212
|
+
* effect whatsoever — the same rule quota demotion follows — and a bucket with headroom must
|
|
213
|
+
* never be handed a credential-wide reset: that would invent availability for a bucket nobody
|
|
214
|
+
* made a claim about, which is precisely the provenance invariant;
|
|
215
|
+
* - the ladder would otherwise fall through to the derived boundary (`observationReset === null`).
|
|
216
|
+
* A reset this response stated about this bucket always outranks a stored one.
|
|
217
|
+
*
|
|
218
|
+
* Within those gates the MOST-SPECIFIC scope wins per basis class, not the soonest expiry: callers
|
|
219
|
+
* pass `facts` in `factsFor()` order (attempt → group → deployment → credential → provider →
|
|
220
|
+
* model), and the first hit of each class is taken. Racing the two classes on recency would let an
|
|
221
|
+
* unrelated short fact pre-empt rung 2 entirely, so both inputs are returned independently and
|
|
222
|
+
* `resolveResetsAt` picks the rung.
|
|
223
|
+
*
|
|
224
|
+
* ⚠ Residual, stated rather than papered over: a fact carries no axis/period attribution, so a
|
|
225
|
+
* fact admitted here answers whichever spent bucket of the cell asked. The conjunction above IS
|
|
226
|
+
* the containment (same cell, measured-spent, and the provider said nothing about this bucket
|
|
227
|
+
* itself); an axis/period mapping inferred from the fact's kind would be exactly the invention
|
|
228
|
+
* `target-facts.ts` refuses ("scope comes from evidence, never from counting").
|
|
229
|
+
*/
|
|
230
|
+
export function factResetInputs(input) {
|
|
231
|
+
const spent = input.remaining !== null && input.remaining <= 0;
|
|
232
|
+
if (!spent || input.observationReset !== null) {
|
|
233
|
+
return { providerStated: input.observationReset, reviewedRule: null };
|
|
234
|
+
}
|
|
235
|
+
let stated = null;
|
|
236
|
+
let reviewed = null;
|
|
237
|
+
for (const fact of input.facts) {
|
|
238
|
+
if (fact.untilBasis === undefined)
|
|
239
|
+
continue;
|
|
240
|
+
if (!QUOTA_RESET_FACT_KINDS.has(fact.kind))
|
|
241
|
+
continue;
|
|
242
|
+
if (!Number.isFinite(fact.until) || fact.until <= input.now)
|
|
243
|
+
continue;
|
|
244
|
+
// `retry-after` / `stated-body` came out of the provider's own response, so they belong on
|
|
245
|
+
// rung 1; the reviewed rungs are a reviewer's assertion and belong on rung 2.
|
|
246
|
+
if (fact.untilBasis === "reviewed-field" || fact.untilBasis === "reviewed-fixed")
|
|
247
|
+
reviewed ??= fact.until;
|
|
248
|
+
else
|
|
249
|
+
stated ??= fact.until;
|
|
250
|
+
}
|
|
251
|
+
return { providerStated: stated, reviewedRule: reviewed };
|
|
252
|
+
}
|
|
190
253
|
/**
|
|
191
254
|
* Map internal bases onto the dashboard wire vocabulary in ONE place, so the producer and the
|
|
192
255
|
* contract cannot drift. `derived:published` maps onto `derived_configured`'s sibling spelling
|
|
@@ -222,4 +285,16 @@ export function mapLimitBasis(basis) {
|
|
|
222
285
|
return null;
|
|
223
286
|
}
|
|
224
287
|
}
|
|
288
|
+
export function mapResetsAtBasis(basis) {
|
|
289
|
+
switch (basis) {
|
|
290
|
+
case "provider-stated":
|
|
291
|
+
return "provider_stated";
|
|
292
|
+
case "reviewed-rule":
|
|
293
|
+
return "reviewed_rule";
|
|
294
|
+
case "derived-boundary":
|
|
295
|
+
return "derived_boundary";
|
|
296
|
+
default:
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
225
300
|
//# sourceMappingURL=availability.js.map
|
package/dist/availability.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../src/availability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../src/availability.ts"],"names":[],"mappings":"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"}
|
package/dist/backend.d.ts
CHANGED
|
@@ -117,6 +117,20 @@ export declare const HARD_CAP_HEADER = "x-llm-relay-capped";
|
|
|
117
117
|
export declare const PAID_HEADER = "x-llm-relay-paid";
|
|
118
118
|
/** This response contains a tool call reconstructed from a recognized text dialect envelope. */
|
|
119
119
|
export declare const TOOL_DIALECT_HEADER = "x-llm-relay-tool-dialect";
|
|
120
|
+
/**
|
|
121
|
+
* `tool_use` ids in this response were MINTED by the relay because the host reused ones the
|
|
122
|
+
* conversation already carried — value `"<n> rewritten"`.
|
|
123
|
+
*
|
|
124
|
+
* Same maxim as `DEGRADED_HEADER`: an automatic fix is acceptable only because it is announced.
|
|
125
|
+
* A count, never an id: the ids themselves are in the body the caller already has, and a header
|
|
126
|
+
* is not the place to restate content.
|
|
127
|
+
*
|
|
128
|
+
* ⚠ Buffered responses only. On a stream the headers are written before the first
|
|
129
|
+
* `content_block_start` exists, so a count there could only be a guess; the streaming pass
|
|
130
|
+
* reports through `toolUseIdRewrites()` instead, which the server reads for its log record after
|
|
131
|
+
* the stream drains. See `src/tool-use-ids.ts`.
|
|
132
|
+
*/
|
|
133
|
+
export declare const TOOL_USE_IDS_HEADER = "x-llm-relay-tool-use-ids";
|
|
120
134
|
/**
|
|
121
135
|
* The provider's `Retry-After` in milliseconds, or null.
|
|
122
136
|
*
|
|
@@ -142,6 +156,13 @@ export interface PostHeaderBodyFailure {
|
|
|
142
156
|
export declare function postHeaderBodyFailure(response: Response): PostHeaderBodyFailure | undefined;
|
|
143
157
|
/** Raw model id stated by the upstream response, before any relay translation. */
|
|
144
158
|
export declare function upstreamReportedModel(response: Response): string | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* How many `tool_use` ids this response had minted, or `undefined` when none were.
|
|
161
|
+
*
|
|
162
|
+
* On a streamed response the figure is final only once the body has drained — read it where the
|
|
163
|
+
* server reports end-of-stream facts, not before it writes headers.
|
|
164
|
+
*/
|
|
165
|
+
export declare function toolUseIdRewrites(response: Response): number | undefined;
|
|
145
166
|
/**
|
|
146
167
|
* Fetch the resolved provider target and return an ANTHROPIC-shaped `Response`,
|
|
147
168
|
* regardless of the backend's native wire format. For kind="anthropic" this is a
|
package/dist/backend.js
CHANGED
|
@@ -2,10 +2,12 @@ import { translateBetweenProviders, handleUniversalStreamRequest } from "llm-bri
|
|
|
2
2
|
import { buildAuthHeaders } from "./authEnv.js";
|
|
3
3
|
import { DocumentError, transcodeDocuments } from "./documents.js";
|
|
4
4
|
import { anthropicRequestToOpenAi, RequestMappingError } from "./openai-request.js";
|
|
5
|
+
import { openaiResponsesRequestToAnthropic } from "./responses-request.js";
|
|
5
6
|
import { recoverToolCalls } from "./tool-dialects.js";
|
|
6
7
|
import { recoverDialectInStream } from "./dialect-stream.js";
|
|
7
8
|
import { toolSchemaMap } from "./anthropic.js";
|
|
8
9
|
import { stripOpeningThinkTag, stripThinkTagsInStream } from "./think-tags.js";
|
|
10
|
+
import { knownToolUseIds, rewriteToolUseIds, rewriteToolUseIdsInStream } from "./tool-use-ids.js";
|
|
9
11
|
import { STREAM_PREFLIGHT_LIMIT } from "./stream-commit.js";
|
|
10
12
|
import { inspectDialectInOpenAiChat, recoverDialectInOpenAiChatStream, } from "./openai-dialect.js";
|
|
11
13
|
import { observeUsage } from "./usage-observer.js";
|
|
@@ -139,6 +141,20 @@ export const HARD_CAP_HEADER = "x-llm-relay-capped";
|
|
|
139
141
|
export const PAID_HEADER = "x-llm-relay-paid";
|
|
140
142
|
/** This response contains a tool call reconstructed from a recognized text dialect envelope. */
|
|
141
143
|
export const TOOL_DIALECT_HEADER = "x-llm-relay-tool-dialect";
|
|
144
|
+
/**
|
|
145
|
+
* `tool_use` ids in this response were MINTED by the relay because the host reused ones the
|
|
146
|
+
* conversation already carried — value `"<n> rewritten"`.
|
|
147
|
+
*
|
|
148
|
+
* Same maxim as `DEGRADED_HEADER`: an automatic fix is acceptable only because it is announced.
|
|
149
|
+
* A count, never an id: the ids themselves are in the body the caller already has, and a header
|
|
150
|
+
* is not the place to restate content.
|
|
151
|
+
*
|
|
152
|
+
* ⚠ Buffered responses only. On a stream the headers are written before the first
|
|
153
|
+
* `content_block_start` exists, so a count there could only be a guess; the streaming pass
|
|
154
|
+
* reports through `toolUseIdRewrites()` instead, which the server reads for its log record after
|
|
155
|
+
* the stream drains. See `src/tool-use-ids.ts`.
|
|
156
|
+
*/
|
|
157
|
+
export const TOOL_USE_IDS_HEADER = "x-llm-relay-tool-use-ids";
|
|
142
158
|
/**
|
|
143
159
|
* The provider's `Retry-After` in milliseconds, or null.
|
|
144
160
|
*
|
|
@@ -181,6 +197,16 @@ export function postHeaderBodyFailure(response) {
|
|
|
181
197
|
export function upstreamReportedModel(response) {
|
|
182
198
|
return upstreamResponseMetadata.get(response)?.reportedModel;
|
|
183
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* How many `tool_use` ids this response had minted, or `undefined` when none were.
|
|
202
|
+
*
|
|
203
|
+
* On a streamed response the figure is final only once the body has drained — read it where the
|
|
204
|
+
* server reports end-of-stream facts, not before it writes headers.
|
|
205
|
+
*/
|
|
206
|
+
export function toolUseIdRewrites(response) {
|
|
207
|
+
const n = upstreamResponseMetadata.get(response)?.toolUseIdRewrites;
|
|
208
|
+
return n !== undefined && n > 0 ? n : undefined;
|
|
209
|
+
}
|
|
184
210
|
function attachUpstreamMetadata(response, metadata) {
|
|
185
211
|
upstreamResponseMetadata.set(response, metadata);
|
|
186
212
|
return response;
|
|
@@ -583,8 +609,20 @@ export async function fetchBackend(attempt, args, fetchFn = fetch) {
|
|
|
583
609
|
// declaring tools: with none declared there is no call to recover, and wrapping the stream
|
|
584
610
|
// would add holdback latency for nothing.
|
|
585
611
|
const schemas = toolSchemaMap(args.reqJson);
|
|
586
|
-
const
|
|
587
|
-
|
|
612
|
+
const recovered = schemas.size > 0 ? recoverDialectInStream(strippedStream, schemas) : strippedStream;
|
|
613
|
+
// AFTER recovery, so a call the relay reconstructed is covered too, and BEFORE anything that
|
|
614
|
+
// watches for the first `tool_use` — validation and repair must see the ids the client will.
|
|
615
|
+
// The taken-set is a thunk: a response with no tool call never walks the conversation.
|
|
616
|
+
// ⚠ Deliberately NOT gated on `schemas.size > 0` like the line above, and the asymmetry is
|
|
617
|
+
// the point: recovery needs a schema to parse a call out of text, uniqueness needs only an
|
|
618
|
+
// id to exist. A host may emit `tool_calls` a request never declared — Claude Code's compact
|
|
619
|
+
// turn declares none while the conversation it summarizes is full of tool_use ids — and that
|
|
620
|
+
// is exactly the turn the normalizer would empty to `[Tool use interrupted]`. The framing
|
|
621
|
+
// holdback is already paid by `stripThinkTagsInStream` above, and an event with no
|
|
622
|
+
// `tool_use` substring costs one scan, so the gate would buy little and lose that case.
|
|
623
|
+
const metadata = preflight.metadata;
|
|
624
|
+
const body = rewriteToolUseIdsInStream(recovered, () => knownToolUseIds(args.reqJson), (count) => { metadata.toolUseIdRewrites = count; });
|
|
625
|
+
return attachUpstreamMetadata(new Response(body, { status: res.status, headers: { "content-type": "text/event-stream" } }), metadata);
|
|
588
626
|
}
|
|
589
627
|
catch (e) {
|
|
590
628
|
return anthropicError(502, `llm-relay: response translation failed: ${e.message}`, "local", {}, "relay_mapper_defect");
|
|
@@ -623,6 +661,13 @@ export async function fetchBackend(attempt, args, fetchFn = fetch) {
|
|
|
623
661
|
// the relay mapper rather than the provider or its failure budget.
|
|
624
662
|
return anthropicError(502, `llm-relay: response translation failed: ${e.message}`, "local", {}, "relay_mapper_defect");
|
|
625
663
|
}
|
|
664
|
+
// A host that reuses a tool-call id across turns makes Claude Code drop the call while building
|
|
665
|
+
// its next request; mint a fresh one where it collides. The pass runs on the TRANSLATED message,
|
|
666
|
+
// so a dialect-recovered call is covered too and keeps its `tu_recovered_*` id unless that id is
|
|
667
|
+
// itself already in the conversation. See `src/tool-use-ids.ts`.
|
|
668
|
+
const mintedIds = mintUniqueToolUseIds(anthropicJson, args.reqJson);
|
|
669
|
+
if (mintedIds.message)
|
|
670
|
+
anthropicJson = mintedIds.message;
|
|
626
671
|
// Announce a recovered call for the same reason `x-llm-relay-degraded` is announced: a response
|
|
627
672
|
// whose tool call the RELAY reconstructed is not the same as one that arrived correct, and an
|
|
628
673
|
// unflagged reconstruction is indistinguishable from a host that worked.
|
|
@@ -632,12 +677,34 @@ export async function fetchBackend(attempt, args, fetchFn = fetch) {
|
|
|
632
677
|
headers: {
|
|
633
678
|
"content-type": "application/json",
|
|
634
679
|
...(recoveredDialect ? { [TOOL_DIALECT_HEADER]: recoveredDialect } : {}),
|
|
680
|
+
...(mintedIds.rewritten > 0
|
|
681
|
+
? { [TOOL_USE_IDS_HEADER]: `${mintedIds.rewritten} rewritten` }
|
|
682
|
+
: {}),
|
|
635
683
|
},
|
|
636
684
|
});
|
|
637
685
|
const metadata = {};
|
|
638
686
|
captureReportedModel(metadata, upstreamJson, "openai-chat", false);
|
|
687
|
+
if (mintedIds.rewritten > 0)
|
|
688
|
+
metadata.toolUseIdRewrites = mintedIds.rewritten;
|
|
639
689
|
return attachUpstreamMetadata(response, metadata);
|
|
640
690
|
}
|
|
691
|
+
/**
|
|
692
|
+
* Give a translated message's `tool_use` blocks ids the conversation has not already used.
|
|
693
|
+
*
|
|
694
|
+
* Lazy on purpose: a response with no `tool_use` block never walks the request's messages, so the
|
|
695
|
+
* ordinary text completion — the overwhelming majority of traffic — pays one array scan. `message`
|
|
696
|
+
* is null when nothing changed, so an untouched response is never re-built.
|
|
697
|
+
*/
|
|
698
|
+
function mintUniqueToolUseIds(message, reqJson) {
|
|
699
|
+
const content = message.content;
|
|
700
|
+
if (!Array.isArray(content) || !content.some((b) => isRecord(b) && b.type === "tool_use")) {
|
|
701
|
+
return { message: null, rewritten: 0 };
|
|
702
|
+
}
|
|
703
|
+
const out = rewriteToolUseIds(content, knownToolUseIds(reqJson));
|
|
704
|
+
if (out.rewritten === 0)
|
|
705
|
+
return { message: null, rewritten: 0 };
|
|
706
|
+
return { message: { ...message, content: out.content }, rewritten: out.rewritten };
|
|
707
|
+
}
|
|
641
708
|
/** Did this translated message carry a tool call the relay reconstructed from text? */
|
|
642
709
|
function recoveredDialectOf(message) {
|
|
643
710
|
const content = message.content ?? [];
|
|
@@ -1183,13 +1250,24 @@ export async function fetchOpenAiFront(attempt, args, fetchFn = fetch) {
|
|
|
1183
1250
|
}
|
|
1184
1251
|
let anthropicBody;
|
|
1185
1252
|
try {
|
|
1186
|
-
|
|
1187
|
-
|
|
1253
|
+
// The RESPONSES request direction is relay-owned (`responses-request.ts`), for the same
|
|
1254
|
+
// reason the Anthropic→OpenAI direction is: llm-bridge's `openaiResponsesToUniversal` models
|
|
1255
|
+
// only `function_call_output`, so an assistant `function_call` was flattened into an empty
|
|
1256
|
+
// user turn and an assistant `output_text` reached the backend as a JSON string. The CHAT
|
|
1257
|
+
// request direction stays llm-bridge's (`openaiToUniversal` does handle `tool_calls` and
|
|
1258
|
+
// `role:"tool"`), as does every response/stream direction.
|
|
1259
|
+
anthropicBody = protocol === "responses"
|
|
1260
|
+
? openaiResponsesRequestToAnthropic(base)
|
|
1261
|
+
: translateBetweenProviders("openai", "anthropic", base);
|
|
1188
1262
|
if (target.model !== undefined)
|
|
1189
1263
|
anthropicBody.model = target.model;
|
|
1190
1264
|
anthropicBody.stream = args.wantsStream;
|
|
1191
1265
|
}
|
|
1192
1266
|
catch (e) {
|
|
1267
|
+
// A shape we will not put on the wire is the caller's request being unrepresentable, not a
|
|
1268
|
+
// provider failure — the same clean local 400 the Messages front raises.
|
|
1269
|
+
if (e instanceof RequestMappingError)
|
|
1270
|
+
return openaiError(400, `llm-relay: ${e.message}`, "local");
|
|
1193
1271
|
return openaiError(400, `llm-relay: request translation failed: ${e.message}`, "local");
|
|
1194
1272
|
}
|
|
1195
1273
|
const reqBuf = Buffer.from(JSON.stringify(anthropicBody), "utf8");
|
|
@@ -1264,9 +1342,17 @@ export async function fetchOpenAiFront(attempt, args, fetchFn = fetch) {
|
|
|
1264
1342
|
: `llm-relay: invalid Anthropic upstream envelope: ${invalidReason}`, generated ? "local" : "upstream", generated ? "relay_mapper_defect" : "invalid_upstream_envelope", retryAfterHeader(backendRes.headers));
|
|
1265
1343
|
}
|
|
1266
1344
|
try {
|
|
1345
|
+
// This front's TRANSLATED lane runs through `fetchBackend`, so an `openai`-kind target reached
|
|
1346
|
+
// from `/v1/responses` inherits the id mint. Rebuilding the body must not swallow the
|
|
1347
|
+
// announcement — an automatic fix is acceptable only because it is announced, and the count
|
|
1348
|
+
// is as true here as it was one Response ago.
|
|
1349
|
+
const minted = backendRes.headers.get(TOOL_USE_IDS_HEADER);
|
|
1267
1350
|
const response = new Response(JSON.stringify(anthropicMessageToOpenAi(body, protocol, target.model ?? String(base.model ?? ""))), {
|
|
1268
1351
|
status: backendRes.status,
|
|
1269
|
-
headers: {
|
|
1352
|
+
headers: {
|
|
1353
|
+
"content-type": "application/json",
|
|
1354
|
+
...(minted ? { [TOOL_USE_IDS_HEADER]: minted } : {}),
|
|
1355
|
+
},
|
|
1270
1356
|
});
|
|
1271
1357
|
return metadata ? attachUpstreamMetadata(response, metadata) : response;
|
|
1272
1358
|
}
|