llm-relay 0.35.0 → 0.37.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/LICENSE +21 -0
- package/README.md +12 -0
- package/THIRD_PARTY_NOTICES.md +72 -0
- package/config.example.json +8 -2
- package/dist/accounting-store-io.d.ts +124 -0
- package/dist/accounting-store-io.js +1105 -0
- package/dist/accounting-store-io.js.map +1 -0
- package/dist/accounting-store-schema.d.ts +299 -0
- package/dist/accounting-store-schema.js +1021 -0
- package/dist/accounting-store-schema.js.map +1 -0
- package/dist/accounting-store.d.ts +73 -0
- package/dist/accounting-store.js +1523 -0
- package/dist/accounting-store.js.map +1 -0
- package/dist/accounting.d.ts +177 -0
- package/dist/accounting.js +429 -0
- package/dist/accounting.js.map +1 -0
- package/dist/anthropic.d.ts +2 -2
- package/dist/anthropic.js +22 -5
- package/dist/anthropic.js.map +1 -1
- package/dist/authEnv.d.ts +19 -0
- package/dist/authEnv.js +58 -25
- package/dist/authEnv.js.map +1 -1
- package/dist/backend.d.ts +32 -3
- package/dist/backend.js +324 -41
- package/dist/backend.js.map +1 -1
- package/dist/candidates.d.ts +28 -3
- package/dist/candidates.js +86 -13
- package/dist/candidates.js.map +1 -1
- package/dist/catalog.d.ts +1 -0
- package/dist/catalog.js +36 -12
- package/dist/catalog.js.map +1 -1
- package/dist/circuit-breaker.d.ts +49 -129
- package/dist/circuit-breaker.js +166 -223
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/cli.d.ts +47 -15
- package/dist/cli.js +475 -134
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +23 -1
- package/dist/config.js +189 -19
- package/dist/config.js.map +1 -1
- package/dist/context-limits.js +2 -1
- package/dist/context-limits.js.map +1 -1
- package/dist/control-authorization.js +6 -4
- package/dist/control-authorization.js.map +1 -1
- package/dist/credential-fleet.d.ts +41 -0
- package/dist/credential-fleet.js +78 -0
- package/dist/credential-fleet.js.map +1 -0
- package/dist/credential-id.d.ts +13 -0
- package/dist/credential-id.js +22 -0
- package/dist/credential-id.js.map +1 -0
- package/dist/credential-select.d.ts +86 -0
- package/dist/credential-select.js +303 -0
- package/dist/credential-select.js.map +1 -0
- package/dist/dashboard/.vite/dashboard-bundle-graph.json +32 -0
- package/dist/dashboard/.vite/manifest.json +11 -0
- package/dist/dashboard/assets/index-BeZxN4Lx.css +1 -0
- package/dist/dashboard/assets/index-RtLgb7Cg.js +74 -0
- package/dist/dashboard/index.html +4 -0
- package/dist/dashboard-auth.d.ts +68 -0
- package/dist/dashboard-auth.js +225 -0
- package/dist/dashboard-auth.js.map +1 -0
- package/dist/dashboard-contract.d.ts +391 -0
- package/dist/dashboard-contract.js +619 -0
- package/dist/dashboard-contract.js.map +1 -0
- package/dist/dashboard-routes.d.ts +91 -0
- package/dist/dashboard-routes.js +688 -0
- package/dist/dashboard-routes.js.map +1 -0
- package/dist/dashboard-snapshot.d.ts +36 -0
- package/dist/dashboard-snapshot.js +1132 -0
- package/dist/dashboard-snapshot.js.map +1 -0
- package/dist/dashboard-static.d.ts +61 -0
- package/dist/dashboard-static.js +326 -0
- package/dist/dashboard-static.js.map +1 -0
- package/dist/dispatch.js +11 -6
- package/dist/dispatch.js.map +1 -1
- package/dist/dynamic-pools.js +6 -4
- package/dist/dynamic-pools.js.map +1 -1
- package/dist/kernel/contracts.d.ts +4 -0
- package/dist/kernel/request-lifecycle.js +4 -1
- package/dist/kernel/request-lifecycle.js.map +1 -1
- package/dist/key-checker.d.ts +3 -1
- package/dist/key-checker.js +35 -11
- package/dist/key-checker.js.map +1 -1
- package/dist/key-import.d.ts +29 -0
- package/dist/key-import.js +160 -0
- package/dist/key-import.js.map +1 -0
- package/dist/log.d.ts +20 -2
- package/dist/log.js +53 -2
- package/dist/log.js.map +1 -1
- package/dist/offload.d.ts +9 -0
- package/dist/offload.js +7 -1
- package/dist/offload.js.map +1 -1
- package/dist/onboarding.d.ts +3 -3
- package/dist/onboarding.js +12 -6
- package/dist/onboarding.js.map +1 -1
- package/dist/openai-dialect.d.ts +42 -0
- package/dist/openai-dialect.js +388 -0
- package/dist/openai-dialect.js.map +1 -0
- package/dist/ping/cadence.d.ts +12 -3
- package/dist/ping/cadence.js +68 -15
- package/dist/ping/cadence.js.map +1 -1
- package/dist/ping/ping.d.ts +7 -3
- package/dist/ping/ping.js +11 -35
- package/dist/ping/ping.js.map +1 -1
- package/dist/ping/probe-cache.d.ts +14 -6
- package/dist/ping/probe-cache.js +20 -5
- package/dist/ping/probe-cache.js.map +1 -1
- package/dist/ping/runtime-telemetry.d.ts +2 -1
- package/dist/ping/runtime-telemetry.js +103 -10
- package/dist/ping/runtime-telemetry.js.map +1 -1
- package/dist/pool-health.d.ts +2 -0
- package/dist/pool-health.js +29 -13
- package/dist/pool-health.js.map +1 -1
- package/dist/quota-observation.d.ts +29 -0
- package/dist/quota-observation.js +249 -0
- package/dist/quota-observation.js.map +1 -0
- package/dist/refusal-interpretation.d.ts +13 -7
- package/dist/refusal-interpretation.js +260 -33
- package/dist/refusal-interpretation.js.map +1 -1
- package/dist/registry.d.ts +13 -2
- package/dist/registry.js +12 -4
- package/dist/registry.js.map +1 -1
- package/dist/repair.d.ts +4 -2
- package/dist/repair.js +15 -1
- package/dist/repair.js.map +1 -1
- package/dist/request-log.d.ts +2 -2
- package/dist/request-log.js +9 -1
- package/dist/request-log.js.map +1 -1
- package/dist/reshaper.d.ts +76 -11
- package/dist/reshaper.js +264 -29
- package/dist/reshaper.js.map +1 -1
- package/dist/resolved-attempt.d.ts +14 -0
- package/dist/resolved-attempt.js +21 -0
- package/dist/resolved-attempt.js.map +1 -0
- package/dist/routes/admin.js +7 -1
- package/dist/routes/admin.js.map +1 -1
- package/dist/secret-file-acl.d.ts +25 -0
- package/dist/secret-file-acl.js +37 -0
- package/dist/secret-file-acl.js.map +1 -0
- package/dist/server.d.ts +28 -3
- package/dist/server.js +1774 -467
- package/dist/server.js.map +1 -1
- package/dist/session-pin.d.ts +35 -0
- package/dist/session-pin.js +136 -0
- package/dist/session-pin.js.map +1 -0
- package/dist/stream-commit.d.ts +34 -0
- package/dist/stream-commit.js +325 -0
- package/dist/stream-commit.js.map +1 -0
- package/dist/target-facts.d.ts +23 -136
- package/dist/target-facts.js +138 -179
- package/dist/target-facts.js.map +1 -1
- package/dist/telemetry.d.ts +1 -25
- package/dist/telemetry.js +52 -45
- package/dist/telemetry.js.map +1 -1
- package/dist/think-tags.d.ts +34 -0
- package/dist/think-tags.js +219 -0
- package/dist/think-tags.js.map +1 -0
- package/dist/usage-observer.d.ts +34 -0
- package/dist/usage-observer.js +322 -0
- package/dist/usage-observer.js.map +1 -0
- package/dist/winenv.js +26 -4
- package/dist/winenv.js.map +1 -1
- package/docs/dashboard-bundle-inventory.json +16 -0
- package/package.json +29 -6
- package/skills/llm-relay/SKILL.md +48 -9
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { freezeDeep } from "./accounting-store-schema.js";
|
|
3
|
+
import { DASHBOARD_REQUEST_ID_PATTERN, isDashboardFailureKind, isDashboardOutcome, isDashboardSafeId, isDashboardUtcTimestamp, } from "./dashboard-contract.js";
|
|
4
|
+
/** Explicit provenance for estimates whose method was omitted or unusable. */
|
|
5
|
+
export const ACCOUNTING_UNSPECIFIED_ESTIMATION_METHOD = "unspecified";
|
|
6
|
+
/** A recorder suitable as the default when no read model is mounted. */
|
|
7
|
+
export const NOOP_ACCOUNTING_RECORDER = Object.freeze({
|
|
8
|
+
record: () => undefined,
|
|
9
|
+
});
|
|
10
|
+
function now(clock) {
|
|
11
|
+
return typeof clock === "function" ? clock() : clock.now();
|
|
12
|
+
}
|
|
13
|
+
function timestamp(value) {
|
|
14
|
+
if (typeof value === "string") {
|
|
15
|
+
if (!isDashboardUtcTimestamp(value))
|
|
16
|
+
throw new TypeError("Accounting timestamp must be a canonical UTC timestamp.");
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
if (value instanceof Date)
|
|
20
|
+
return value.toISOString();
|
|
21
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
22
|
+
return new Date(value).toISOString();
|
|
23
|
+
throw new TypeError("Accounting timestamp must be an RFC3339 string, Date, or finite epoch number.");
|
|
24
|
+
}
|
|
25
|
+
function validInteger(value) {
|
|
26
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
27
|
+
}
|
|
28
|
+
function validateOutcome(value) {
|
|
29
|
+
if (!isDashboardOutcome(value))
|
|
30
|
+
throw new TypeError("Invalid accounting outcome.");
|
|
31
|
+
}
|
|
32
|
+
function validateFailureKind(value) {
|
|
33
|
+
if (value !== null && !isDashboardFailureKind(value))
|
|
34
|
+
throw new TypeError("Invalid accounting failure kind.");
|
|
35
|
+
}
|
|
36
|
+
function validateAttribution(value) {
|
|
37
|
+
if (value !== "relay_held" && value !== "caller_operated" && value !== "unknown") {
|
|
38
|
+
throw new TypeError("Invalid accounting attribution.");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function nullableInteger(value) {
|
|
42
|
+
return value === null || value === undefined ? null : validInteger(value) ? value : null;
|
|
43
|
+
}
|
|
44
|
+
function nullableLatency(value) {
|
|
45
|
+
return nullableInteger(value);
|
|
46
|
+
}
|
|
47
|
+
function methodSnapshot(value) {
|
|
48
|
+
if (value === null || value === undefined)
|
|
49
|
+
return null;
|
|
50
|
+
if (typeof value === "string")
|
|
51
|
+
return isDashboardSafeId(value) ? value : null;
|
|
52
|
+
try {
|
|
53
|
+
const serialized = JSON.stringify(value);
|
|
54
|
+
return isDashboardSafeId(serialized) ? serialized : null;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function definedOr(preferred, fallback) {
|
|
61
|
+
return preferred === undefined ? fallback : preferred;
|
|
62
|
+
}
|
|
63
|
+
function safeRecord(recorder, event) {
|
|
64
|
+
try {
|
|
65
|
+
recorder.record(event);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// A metrics sink is never allowed to affect the request path.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function makeId(factory, used) {
|
|
72
|
+
for (let i = 0; i < 128; i += 1) {
|
|
73
|
+
const candidate = factory();
|
|
74
|
+
if (typeof candidate === "string" && DASHBOARD_REQUEST_ID_PATTERN.test(candidate) && !used.has(candidate)) {
|
|
75
|
+
used.add(candidate);
|
|
76
|
+
return candidate;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
throw new Error("Accounting ID factory did not produce a unique valid ID.");
|
|
80
|
+
}
|
|
81
|
+
function randomId() {
|
|
82
|
+
return randomBytes(24).toString("base64url");
|
|
83
|
+
}
|
|
84
|
+
function normalizeTokens(input, observedAt) {
|
|
85
|
+
const source = input ?? {};
|
|
86
|
+
const reported = source.reported ?? {
|
|
87
|
+
inputTokens: source.inputTokens,
|
|
88
|
+
outputTokens: source.outputTokens,
|
|
89
|
+
cachedInputTokens: source.cachedInputTokens,
|
|
90
|
+
cacheCreationInputTokens: source.cacheCreationInputTokens,
|
|
91
|
+
cacheReadInputTokens: source.cacheReadInputTokens,
|
|
92
|
+
};
|
|
93
|
+
const estimated = source.estimated ?? {
|
|
94
|
+
inputTokens: source.estimatedInputTokens,
|
|
95
|
+
outputTokens: source.estimatedOutputTokens,
|
|
96
|
+
inputMethod: source.estimatedInputMethod,
|
|
97
|
+
outputMethod: source.estimatedOutputMethod,
|
|
98
|
+
};
|
|
99
|
+
const reportedInput = nullableInteger(definedOr(reported.reportedInput, reported.inputTokens));
|
|
100
|
+
const reportedOutput = nullableInteger(definedOr(reported.reportedOutput, reported.outputTokens));
|
|
101
|
+
const reportedCached = nullableInteger(definedOr(reported.reportedCachedInput, reported.cachedInputTokens));
|
|
102
|
+
const cacheCreation = nullableInteger(reported.cacheCreationInputTokens !== undefined ? reported.cacheCreationInputTokens : source.cacheCreationInputTokens);
|
|
103
|
+
const cacheRead = nullableInteger(reported.cacheReadInputTokens !== undefined ? reported.cacheReadInputTokens : source.cacheReadInputTokens);
|
|
104
|
+
// Anthropic's cache creation/read facts remain distinct from OpenAI's cached
|
|
105
|
+
// input fact. They are never summed or used to populate that aggregate.
|
|
106
|
+
const cached = reportedCached;
|
|
107
|
+
const estimatedInput = nullableInteger(definedOr(estimated.estimatedInput, definedOr(estimated.inputTokens, source.estimatedInputTokens)));
|
|
108
|
+
const estimatedOutput = nullableInteger(definedOr(estimated.estimatedOutput, definedOr(estimated.outputTokens, source.estimatedOutputTokens)));
|
|
109
|
+
const estimatedInputMethod = methodSnapshot(definedOr(estimated.inputMethod, source.estimatedInputMethod));
|
|
110
|
+
const estimatedOutputMethod = methodSnapshot(definedOr(estimated.outputMethod, source.estimatedOutputMethod));
|
|
111
|
+
const reportedObserved = reported.observedAt !== undefined
|
|
112
|
+
? reported.observedAt
|
|
113
|
+
: source.observedAt !== undefined
|
|
114
|
+
? source.observedAt
|
|
115
|
+
: observedAt;
|
|
116
|
+
const estimatedObserved = estimated.observedAt !== undefined
|
|
117
|
+
? estimated.observedAt
|
|
118
|
+
: source.observedAt !== undefined
|
|
119
|
+
? source.observedAt
|
|
120
|
+
: observedAt;
|
|
121
|
+
for (const observed of [reportedObserved, estimatedObserved]) {
|
|
122
|
+
if (observed !== null && !isDashboardUtcTimestamp(observed)) {
|
|
123
|
+
throw new TypeError("Accounting observedAt must be a canonical UTC timestamp or null.");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const result = {
|
|
127
|
+
reported: {
|
|
128
|
+
reportedInput: { value: reportedInput, source: "provider_reported", observedAt: reportedInput === null ? null : reportedObserved },
|
|
129
|
+
reportedOutput: { value: reportedOutput, source: "provider_reported", observedAt: reportedOutput === null ? null : reportedObserved },
|
|
130
|
+
reportedCachedInput: { value: cached, source: "provider_reported", observedAt: cached === null ? null : reportedObserved },
|
|
131
|
+
cacheCreationInputTokens: { value: cacheCreation, source: "provider_reported", observedAt: cacheCreation === null ? null : reportedObserved },
|
|
132
|
+
cacheReadInputTokens: { value: cacheRead, source: "provider_reported", observedAt: cacheRead === null ? null : reportedObserved },
|
|
133
|
+
},
|
|
134
|
+
estimated: {
|
|
135
|
+
estimatedInput: {
|
|
136
|
+
value: estimatedInput,
|
|
137
|
+
source: "relay_estimated",
|
|
138
|
+
observedAt: estimatedInput === null ? null : estimatedObserved,
|
|
139
|
+
method: estimatedInput === null ? null : estimatedInputMethod ?? ACCOUNTING_UNSPECIFIED_ESTIMATION_METHOD,
|
|
140
|
+
},
|
|
141
|
+
estimatedOutput: {
|
|
142
|
+
value: estimatedOutput,
|
|
143
|
+
source: "relay_estimated",
|
|
144
|
+
observedAt: estimatedOutput === null ? null : estimatedObserved,
|
|
145
|
+
method: estimatedOutput === null ? null : estimatedOutputMethod ?? ACCOUNTING_UNSPECIFIED_ESTIMATION_METHOD,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
return freezeDeep(result);
|
|
150
|
+
}
|
|
151
|
+
function deriveLatency(startedAt, endedAt, supplied) {
|
|
152
|
+
if (supplied !== undefined)
|
|
153
|
+
return nullableLatency(supplied);
|
|
154
|
+
const start = Date.parse(startedAt);
|
|
155
|
+
const end = Date.parse(endedAt);
|
|
156
|
+
return Number.isFinite(start) && Number.isFinite(end) && end >= start ? end - start : null;
|
|
157
|
+
}
|
|
158
|
+
function deriveCommitMs(startedAt, endedAt) {
|
|
159
|
+
const start = Date.parse(startedAt);
|
|
160
|
+
const end = Date.parse(endedAt);
|
|
161
|
+
if (!Number.isFinite(start) || !Number.isFinite(end) || end < start)
|
|
162
|
+
return null;
|
|
163
|
+
const result = end - start;
|
|
164
|
+
return validInteger(result) ? result : null;
|
|
165
|
+
}
|
|
166
|
+
class AccountingRequestLifecycle {
|
|
167
|
+
requestId;
|
|
168
|
+
startedAt;
|
|
169
|
+
options;
|
|
170
|
+
client;
|
|
171
|
+
attribution;
|
|
172
|
+
provider;
|
|
173
|
+
model;
|
|
174
|
+
credentialId;
|
|
175
|
+
attempts = new Map();
|
|
176
|
+
usedIds;
|
|
177
|
+
requestCompleted;
|
|
178
|
+
requestCommitAttemptId = null;
|
|
179
|
+
requestCommitMs = null;
|
|
180
|
+
constructor(options = {}) {
|
|
181
|
+
this.options = {
|
|
182
|
+
recorder: options.recorder ?? NOOP_ACCOUNTING_RECORDER,
|
|
183
|
+
clock: options.clock ?? (() => Date.now()),
|
|
184
|
+
idFactory: options.idFactory ?? randomId,
|
|
185
|
+
};
|
|
186
|
+
this.usedIds = new Set();
|
|
187
|
+
this.requestId = options.requestId ?? makeId(this.options.idFactory, this.usedIds);
|
|
188
|
+
if (!DASHBOARD_REQUEST_ID_PATTERN.test(this.requestId))
|
|
189
|
+
throw new TypeError("Invalid accounting request ID.");
|
|
190
|
+
this.usedIds.add(this.requestId);
|
|
191
|
+
this.startedAt = timestamp(options.startedAt ?? now(this.options.clock));
|
|
192
|
+
this.client = options.client ?? null;
|
|
193
|
+
this.attribution = options.attribution === undefined ? "unknown" : options.attribution;
|
|
194
|
+
validateAttribution(this.attribution);
|
|
195
|
+
this.provider = options.provider ?? null;
|
|
196
|
+
this.model = options.model ?? null;
|
|
197
|
+
this.credentialId = options.credentialId ?? null;
|
|
198
|
+
const event = freezeDeep({
|
|
199
|
+
type: "request-started",
|
|
200
|
+
requestId: this.requestId,
|
|
201
|
+
startedAt: this.startedAt,
|
|
202
|
+
client: this.client,
|
|
203
|
+
attribution: this.attribution,
|
|
204
|
+
provider: this.provider,
|
|
205
|
+
model: this.model,
|
|
206
|
+
credentialId: this.credentialId,
|
|
207
|
+
});
|
|
208
|
+
safeRecord(this.options.recorder, event);
|
|
209
|
+
}
|
|
210
|
+
get completed() { return this.requestCompleted !== undefined; }
|
|
211
|
+
startAttempt(options = {}) {
|
|
212
|
+
if (this.requestCompleted)
|
|
213
|
+
throw new Error("Cannot start an attempt after request completion.");
|
|
214
|
+
const role = options.role ?? "serve";
|
|
215
|
+
if (role !== "serve" && role !== "repair")
|
|
216
|
+
throw new TypeError("Invalid accounting attempt role.");
|
|
217
|
+
const attribution = options.attribution === undefined ? this.attribution : options.attribution;
|
|
218
|
+
validateAttribution(attribution);
|
|
219
|
+
const attemptId = makeId(this.options.idFactory, this.usedIds);
|
|
220
|
+
const startedAt = timestamp(options.startedAt ?? now(this.options.clock));
|
|
221
|
+
const state = {
|
|
222
|
+
attemptId,
|
|
223
|
+
role,
|
|
224
|
+
startedAt,
|
|
225
|
+
attribution,
|
|
226
|
+
provider: options.provider ?? null,
|
|
227
|
+
model: options.model ?? null,
|
|
228
|
+
credentialId: options.credentialId ?? null,
|
|
229
|
+
completed: undefined,
|
|
230
|
+
committed: false,
|
|
231
|
+
commitMs: null,
|
|
232
|
+
};
|
|
233
|
+
this.attempts.set(attemptId, state);
|
|
234
|
+
const event = freezeDeep({
|
|
235
|
+
type: "attempt-started",
|
|
236
|
+
requestId: this.requestId,
|
|
237
|
+
attemptId,
|
|
238
|
+
role,
|
|
239
|
+
startedAt,
|
|
240
|
+
attribution: state.attribution,
|
|
241
|
+
provider: state.provider,
|
|
242
|
+
model: state.model,
|
|
243
|
+
credentialId: state.credentialId,
|
|
244
|
+
});
|
|
245
|
+
safeRecord(this.options.recorder, event);
|
|
246
|
+
return {
|
|
247
|
+
requestId: this.requestId,
|
|
248
|
+
attemptId,
|
|
249
|
+
role,
|
|
250
|
+
startedAt,
|
|
251
|
+
attribution: state.attribution,
|
|
252
|
+
complete: (completion) => this.completeAttempt(state, completion),
|
|
253
|
+
markCommitted: (commit) => this.markAttemptCommitted(state, commit),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
markCommitted(attemptId, options) {
|
|
257
|
+
const state = this.attempts.get(attemptId);
|
|
258
|
+
if (!state)
|
|
259
|
+
throw new Error("Unknown accounting attempt.");
|
|
260
|
+
return this.markAttemptCommitted(state, options);
|
|
261
|
+
}
|
|
262
|
+
markAttemptCommitted(state, options = {}) {
|
|
263
|
+
if (state.completed || state.role !== "serve" || state.committed || this.requestCommitAttemptId !== null)
|
|
264
|
+
return false;
|
|
265
|
+
let commitMs;
|
|
266
|
+
try {
|
|
267
|
+
// Validate an explicitly supplied timestamp even when a direct latency
|
|
268
|
+
// is supplied; invalid input must never be allowed into an event.
|
|
269
|
+
const explicitAt = options.at === undefined ? undefined : timestamp(options.at);
|
|
270
|
+
if (options.commitMs !== undefined) {
|
|
271
|
+
if (!validInteger(options.commitMs))
|
|
272
|
+
return false;
|
|
273
|
+
commitMs = options.commitMs;
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
const at = explicitAt ?? timestamp(now(this.options.clock));
|
|
277
|
+
commitMs = deriveCommitMs(state.startedAt, at);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
if (commitMs === null)
|
|
284
|
+
return false;
|
|
285
|
+
state.committed = true;
|
|
286
|
+
state.commitMs = commitMs;
|
|
287
|
+
this.requestCommitAttemptId = state.attemptId;
|
|
288
|
+
this.requestCommitMs = commitMs;
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
completeAttempt(state, completion) {
|
|
292
|
+
if (state.completed)
|
|
293
|
+
return state.completed;
|
|
294
|
+
if (this.requestCompleted)
|
|
295
|
+
throw new Error("Cannot complete an attempt after request completion.");
|
|
296
|
+
validateOutcome(completion.outcome);
|
|
297
|
+
const failureKind = completion.failureKind === undefined ? null : completion.failureKind;
|
|
298
|
+
validateFailureKind(failureKind);
|
|
299
|
+
if (completion.outcome === "success" && failureKind !== null) {
|
|
300
|
+
throw new Error("A successful accounting attempt cannot carry a failure kind.");
|
|
301
|
+
}
|
|
302
|
+
const endedAt = timestamp(completion.endedAt ?? now(this.options.clock));
|
|
303
|
+
const tokens = normalizeTokens(completion.tokens, endedAt);
|
|
304
|
+
if (completion.commitMs !== undefined && state.role === "serve" && !state.committed && this.requestCommitAttemptId === null) {
|
|
305
|
+
// A direct completion commit is equivalent to a marker supplied at the
|
|
306
|
+
// end of the attempt, but invalid values never latch.
|
|
307
|
+
if (validInteger(completion.commitMs)) {
|
|
308
|
+
state.committed = true;
|
|
309
|
+
state.commitMs = completion.commitMs;
|
|
310
|
+
this.requestCommitAttemptId = state.attemptId;
|
|
311
|
+
this.requestCommitMs = completion.commitMs;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const event = freezeDeep({
|
|
315
|
+
type: "attempt-completed",
|
|
316
|
+
requestId: this.requestId,
|
|
317
|
+
attemptId: state.attemptId,
|
|
318
|
+
role: state.role,
|
|
319
|
+
startedAt: state.startedAt,
|
|
320
|
+
endedAt,
|
|
321
|
+
outcome: completion.outcome,
|
|
322
|
+
failureKind,
|
|
323
|
+
attribution: state.attribution,
|
|
324
|
+
latencyMs: deriveLatency(state.startedAt, endedAt, completion.latencyMs),
|
|
325
|
+
commitMs: state.commitMs,
|
|
326
|
+
provider: state.provider,
|
|
327
|
+
model: state.model,
|
|
328
|
+
credentialId: state.credentialId,
|
|
329
|
+
tokens,
|
|
330
|
+
spend: null,
|
|
331
|
+
});
|
|
332
|
+
state.completed = event;
|
|
333
|
+
safeRecord(this.options.recorder, event);
|
|
334
|
+
return event;
|
|
335
|
+
}
|
|
336
|
+
complete(completion = {}) {
|
|
337
|
+
if (this.requestCompleted)
|
|
338
|
+
return this.requestCompleted;
|
|
339
|
+
for (const attempt of this.attempts.values()) {
|
|
340
|
+
if (!attempt.completed)
|
|
341
|
+
throw new Error("Cannot complete request while an attempt is active.");
|
|
342
|
+
}
|
|
343
|
+
const endedAt = timestamp(completion.endedAt ?? now(this.options.clock));
|
|
344
|
+
const successfulServes = [...this.attempts.values()].filter((attempt) => attempt.role === "serve" && attempt.completed?.outcome === "success");
|
|
345
|
+
const hasWinningAttemptId = Object.prototype.hasOwnProperty.call(completion, "winningAttemptId");
|
|
346
|
+
const hasExplicitWinner = hasWinningAttemptId
|
|
347
|
+
&& completion.winningAttemptId !== null
|
|
348
|
+
&& completion.winningAttemptId !== undefined;
|
|
349
|
+
const commitWinner = this.requestCommitAttemptId === null
|
|
350
|
+
? undefined
|
|
351
|
+
: this.attempts.get(this.requestCommitAttemptId);
|
|
352
|
+
const explicitWinner = hasExplicitWinner ? this.attempts.get(completion.winningAttemptId) : undefined;
|
|
353
|
+
if (hasExplicitWinner && !explicitWinner) {
|
|
354
|
+
throw new Error("Winning attempt must be a completed successful serve attempt.");
|
|
355
|
+
}
|
|
356
|
+
if (explicitWinner && commitWinner && explicitWinner.attemptId !== commitWinner.attemptId) {
|
|
357
|
+
throw new Error("Winning attempt must match the already committed serve attempt.");
|
|
358
|
+
}
|
|
359
|
+
if (explicitWinner
|
|
360
|
+
&& explicitWinner !== commitWinner
|
|
361
|
+
&& (explicitWinner.role !== "serve" || explicitWinner.completed?.outcome !== "success")) {
|
|
362
|
+
throw new Error("Winning attempt must be a completed successful serve attempt.");
|
|
363
|
+
}
|
|
364
|
+
const winner = commitWinner
|
|
365
|
+
?? explicitWinner
|
|
366
|
+
?? (hasWinningAttemptId ? undefined : successfulServes[0]);
|
|
367
|
+
const explicitAttribution = completion.attribution === undefined
|
|
368
|
+
? undefined
|
|
369
|
+
: completion.attribution;
|
|
370
|
+
if (explicitAttribution !== undefined)
|
|
371
|
+
validateAttribution(explicitAttribution);
|
|
372
|
+
if (winner && explicitAttribution !== undefined && explicitAttribution !== winner.attribution) {
|
|
373
|
+
throw new Error("Completion attribution conflicts with winning serve attribution.");
|
|
374
|
+
}
|
|
375
|
+
const terminalAttribution = winner?.attribution ?? explicitAttribution ?? this.attribution;
|
|
376
|
+
const outcome = completion.outcome !== undefined
|
|
377
|
+
? completion.outcome
|
|
378
|
+
: winner?.completed?.outcome;
|
|
379
|
+
if (outcome === undefined) {
|
|
380
|
+
throw new Error("Request outcome is required when no successful serve exists.");
|
|
381
|
+
}
|
|
382
|
+
validateOutcome(outcome);
|
|
383
|
+
const suppliedFailureKind = completion.failureKind === undefined ? null : completion.failureKind;
|
|
384
|
+
validateFailureKind(suppliedFailureKind);
|
|
385
|
+
if (outcome === "success" && suppliedFailureKind !== null) {
|
|
386
|
+
throw new Error("A successful accounting request cannot carry a failure kind.");
|
|
387
|
+
}
|
|
388
|
+
if (winner && outcome !== "success" && (winner !== commitWinner || winner.completed?.outcome !== outcome)) {
|
|
389
|
+
throw new Error("A non-successful request cannot identify a winning serve attempt.");
|
|
390
|
+
}
|
|
391
|
+
if (!winner && outcome === "success") {
|
|
392
|
+
throw new Error("A successful request requires a completed successful serve attempt.");
|
|
393
|
+
}
|
|
394
|
+
const tokens = winner?.completed?.tokens ?? normalizeTokens(null, endedAt);
|
|
395
|
+
if (completion.commitMs !== undefined && winner && this.requestCommitAttemptId === null && validInteger(completion.commitMs)) {
|
|
396
|
+
winner.committed = true;
|
|
397
|
+
winner.commitMs = completion.commitMs;
|
|
398
|
+
this.requestCommitAttemptId = winner.attemptId;
|
|
399
|
+
this.requestCommitMs = completion.commitMs;
|
|
400
|
+
}
|
|
401
|
+
const failureKind = suppliedFailureKind;
|
|
402
|
+
const event = freezeDeep({
|
|
403
|
+
type: "request-completed",
|
|
404
|
+
requestId: this.requestId,
|
|
405
|
+
endedAt,
|
|
406
|
+
outcome,
|
|
407
|
+
failureKind,
|
|
408
|
+
attribution: terminalAttribution,
|
|
409
|
+
attemptCount: this.attempts.size,
|
|
410
|
+
repairIncluded: [...this.attempts.values()].some((attempt) => attempt.role === "repair"),
|
|
411
|
+
winningAttemptId: winner?.attemptId ?? null,
|
|
412
|
+
commitAttemptId: this.requestCommitAttemptId,
|
|
413
|
+
latencyMs: deriveLatency(this.startedAt, endedAt, completion.latencyMs),
|
|
414
|
+
commitMs: this.requestCommitMs,
|
|
415
|
+
provider: winner?.provider ?? this.provider,
|
|
416
|
+
model: winner?.model ?? this.model,
|
|
417
|
+
credentialId: winner?.credentialId ?? this.credentialId,
|
|
418
|
+
tokens,
|
|
419
|
+
spend: null,
|
|
420
|
+
});
|
|
421
|
+
this.requestCompleted = event;
|
|
422
|
+
safeRecord(this.options.recorder, event);
|
|
423
|
+
return event;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
export function createAccountingRequest(options = {}) {
|
|
427
|
+
return new AccountingRequestLifecycle(options);
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=accounting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounting.js","sourceRoot":"","sources":["../src/accounting.ts"],"names":[],"mappings":"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"}
|
package/dist/anthropic.d.ts
CHANGED
|
@@ -59,8 +59,8 @@ export interface AssistantMessage {
|
|
|
59
59
|
}
|
|
60
60
|
export declare function isToolUseBlock(b: ContentBlock): b is ToolUseBlock;
|
|
61
61
|
/**
|
|
62
|
-
* Extract the tools[] map (name →
|
|
63
|
-
* Value is `null` for a tool that is DECLARED but has no
|
|
62
|
+
* Extract the tools[] map (name → JSON schema) from a parsed Anthropic, Chat, or
|
|
63
|
+
* Responses request body. Value is `null` for a tool that is DECLARED but has no schema —
|
|
64
64
|
* notably Anthropic's built-in/typed tools (`bash`, `text_editor`, `computer`,
|
|
65
65
|
* `web_search`), which carry a `type` but no schema. Such tools are "known but
|
|
66
66
|
* unvalidatable": a tool_use naming them must NOT be flagged unknown_tool, but
|
package/dist/anthropic.js
CHANGED
|
@@ -8,8 +8,8 @@ export function isToolUseBlock(b) {
|
|
|
8
8
|
return b.type === "tool_use";
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Extract the tools[] map (name →
|
|
12
|
-
* Value is `null` for a tool that is DECLARED but has no
|
|
11
|
+
* Extract the tools[] map (name → JSON schema) from a parsed Anthropic, Chat, or
|
|
12
|
+
* Responses request body. Value is `null` for a tool that is DECLARED but has no schema —
|
|
13
13
|
* notably Anthropic's built-in/typed tools (`bash`, `text_editor`, `computer`,
|
|
14
14
|
* `web_search`), which carry a `type` but no schema. Such tools are "known but
|
|
15
15
|
* unvalidatable": a tool_use naming them must NOT be flagged unknown_tool, but
|
|
@@ -21,12 +21,29 @@ export function toolSchemaMap(requestBody) {
|
|
|
21
21
|
requestBody !== null &&
|
|
22
22
|
Array.isArray(requestBody.tools)) {
|
|
23
23
|
for (const t of requestBody.tools) {
|
|
24
|
-
if (typeof t
|
|
25
|
-
|
|
24
|
+
if (typeof t !== "object" || t === null || Array.isArray(t))
|
|
25
|
+
continue;
|
|
26
|
+
const tool = t;
|
|
27
|
+
// Anthropic Messages and OpenAI Responses both put the function name on the tool itself;
|
|
28
|
+
// their schema fields differ. Anthropic built-ins deliberately remain declared/null.
|
|
29
|
+
if (typeof tool.name === "string") {
|
|
30
|
+
const rawSchema = tool.input_schema ?? tool.parameters;
|
|
26
31
|
const schema = typeof rawSchema === "object" && rawSchema !== null
|
|
27
32
|
? rawSchema
|
|
28
33
|
: null;
|
|
29
|
-
map.set(
|
|
34
|
+
map.set(tool.name, schema);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// Chat Completions wraps declarations in `{ type, function: { name, parameters } }`.
|
|
38
|
+
// Reading only Anthropic's shape made every direct Chat tool request look tool-free.
|
|
39
|
+
if (tool.type === "function" && typeof tool.function === "object" && tool.function !== null) {
|
|
40
|
+
const fn = tool.function;
|
|
41
|
+
if (typeof fn.name !== "string")
|
|
42
|
+
continue;
|
|
43
|
+
const schema = typeof fn.parameters === "object" && fn.parameters !== null
|
|
44
|
+
? fn.parameters
|
|
45
|
+
: null;
|
|
46
|
+
map.set(fn.name, schema);
|
|
30
47
|
}
|
|
31
48
|
}
|
|
32
49
|
}
|
package/dist/anthropic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../src/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkEH,MAAM,UAAU,cAAc,CAAC,CAAe;IAC5C,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,WAAoB;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IACjD,IACE,OAAO,WAAW,KAAK,QAAQ;QAC/B,WAAW,KAAK,IAAI;QACpB,KAAK,CAAC,OAAO,CAAE,WAAmC,CAAC,KAAK,CAAC,EACzD,CAAC;QACD,KAAK,MAAM,CAAC,IAAK,WAAoC,CAAC,KAAK,EAAE,CAAC;YAC5D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../src/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkEH,MAAM,UAAU,cAAc,CAAC,CAAe;IAC5C,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,WAAoB;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IACjD,IACE,OAAO,WAAW,KAAK,QAAQ;QAC/B,WAAW,KAAK,IAAI;QACpB,KAAK,CAAC,OAAO,CAAE,WAAmC,CAAC,KAAK,CAAC,EACzD,CAAC;QACD,KAAK,MAAM,CAAC,IAAK,WAAoC,CAAC,KAAK,EAAE,CAAC;YAC5D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,SAAS;YACtE,MAAM,IAAI,GAAG,CAA4B,CAAC;YAE1C,yFAAyF;YACzF,qFAAqF;YACrF,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC;gBACvD,MAAM,MAAM,GACV,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;oBACjD,CAAC,CAAE,SAAwB;oBAC3B,CAAC,CAAC,IAAI,CAAC;gBACX,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,qFAAqF;YACrF,qFAAqF;YACrF,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC5F,MAAM,EAAE,GAAG,IAAI,CAAC,QAAmC,CAAC;gBACpD,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ;oBAAE,SAAS;gBAC1C,MAAM,MAAM,GACV,OAAO,EAAE,CAAC,UAAU,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,KAAK,IAAI;oBACzD,CAAC,CAAE,EAAE,CAAC,UAAyB;oBAC/B,CAAC,CAAC,IAAI,CAAC;gBACX,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/authEnv.d.ts
CHANGED
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
* key-shaped. A heuristic match could ship one provider's credential to another
|
|
13
13
|
* provider's endpoint, which is a credential leak, not a convenience.
|
|
14
14
|
*/
|
|
15
|
+
/**
|
|
16
|
+
* The curated aliases only, without the provider-name-derived candidates used by
|
|
17
|
+
* `candidateEnvNames()`. Importers need this narrower surface: accepting a credential from a
|
|
18
|
+
* file is allowed only when its NAME is explicitly listed, never because its value happens to
|
|
19
|
+
* look like a key or because an arbitrary provider slug can be turned into a plausible env name.
|
|
20
|
+
*/
|
|
21
|
+
export declare function curatedEnvNames(providerName: string): string[];
|
|
15
22
|
/**
|
|
16
23
|
* Every env-var name that may carry this provider's credential, most-preferred first:
|
|
17
24
|
* the declared name, then curated aliases, then names derived from the provider name.
|
|
@@ -25,6 +32,11 @@ export interface AuthEnvResolution {
|
|
|
25
32
|
/** Every name that was considered, for diagnostics. */
|
|
26
33
|
candidates: string[];
|
|
27
34
|
}
|
|
35
|
+
export interface CredentialResolution {
|
|
36
|
+
state: CredentialState;
|
|
37
|
+
value: string | undefined;
|
|
38
|
+
envName: string | undefined;
|
|
39
|
+
}
|
|
28
40
|
/**
|
|
29
41
|
* Whether a credential value counts as PRESENT. The single predicate — three
|
|
30
42
|
* call sites used to disagree (config.ts tested Boolean() with no trim while
|
|
@@ -50,6 +62,13 @@ export type CredentialState = "not-declared" | "declared-present" | "declared-mi
|
|
|
50
62
|
export declare function resolveTargetAuthEnv(declaredAuthEnv: string | undefined, env?: NodeJS.ProcessEnv, providerName?: string): string | undefined;
|
|
51
63
|
export declare function credentialState(declaredAuthEnv: string | undefined, env?: NodeJS.ProcessEnv, providerName?: string): CredentialState;
|
|
52
64
|
export declare function readCredential(declaredAuthEnv: string | undefined, env?: NodeJS.ProcessEnv, providerName?: string): string | undefined;
|
|
65
|
+
export declare function resolveCredential(declaredAuthEnv: string | undefined, env?: NodeJS.ProcessEnv, providerName?: string): CredentialResolution;
|
|
66
|
+
/**
|
|
67
|
+
* Resolve one explicitly-declared fleet slot. Unlike the legacy single `authEnv` form this
|
|
68
|
+
* intentionally does not consult curated or provider-derived aliases: alias fallback could make
|
|
69
|
+
* two slots share one environment variable and therefore share a quota domain.
|
|
70
|
+
*/
|
|
71
|
+
export declare function resolveCredentialExact(declaredAuthEnv: string | undefined, env?: NodeJS.ProcessEnv): CredentialResolution;
|
|
53
72
|
/**
|
|
54
73
|
* Which header a provider's credential is injected into.
|
|
55
74
|
*
|