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.
Files changed (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/THIRD_PARTY_NOTICES.md +72 -0
  4. package/config.example.json +8 -2
  5. package/dist/accounting-store-io.d.ts +124 -0
  6. package/dist/accounting-store-io.js +1105 -0
  7. package/dist/accounting-store-io.js.map +1 -0
  8. package/dist/accounting-store-schema.d.ts +299 -0
  9. package/dist/accounting-store-schema.js +1021 -0
  10. package/dist/accounting-store-schema.js.map +1 -0
  11. package/dist/accounting-store.d.ts +73 -0
  12. package/dist/accounting-store.js +1523 -0
  13. package/dist/accounting-store.js.map +1 -0
  14. package/dist/accounting.d.ts +177 -0
  15. package/dist/accounting.js +429 -0
  16. package/dist/accounting.js.map +1 -0
  17. package/dist/anthropic.d.ts +2 -2
  18. package/dist/anthropic.js +22 -5
  19. package/dist/anthropic.js.map +1 -1
  20. package/dist/authEnv.d.ts +19 -0
  21. package/dist/authEnv.js +58 -25
  22. package/dist/authEnv.js.map +1 -1
  23. package/dist/backend.d.ts +32 -3
  24. package/dist/backend.js +324 -41
  25. package/dist/backend.js.map +1 -1
  26. package/dist/candidates.d.ts +28 -3
  27. package/dist/candidates.js +86 -13
  28. package/dist/candidates.js.map +1 -1
  29. package/dist/catalog.d.ts +1 -0
  30. package/dist/catalog.js +36 -12
  31. package/dist/catalog.js.map +1 -1
  32. package/dist/circuit-breaker.d.ts +49 -129
  33. package/dist/circuit-breaker.js +166 -223
  34. package/dist/circuit-breaker.js.map +1 -1
  35. package/dist/cli.d.ts +47 -15
  36. package/dist/cli.js +475 -134
  37. package/dist/cli.js.map +1 -1
  38. package/dist/config.d.ts +23 -1
  39. package/dist/config.js +189 -19
  40. package/dist/config.js.map +1 -1
  41. package/dist/context-limits.js +2 -1
  42. package/dist/context-limits.js.map +1 -1
  43. package/dist/control-authorization.js +6 -4
  44. package/dist/control-authorization.js.map +1 -1
  45. package/dist/credential-fleet.d.ts +41 -0
  46. package/dist/credential-fleet.js +78 -0
  47. package/dist/credential-fleet.js.map +1 -0
  48. package/dist/credential-id.d.ts +13 -0
  49. package/dist/credential-id.js +22 -0
  50. package/dist/credential-id.js.map +1 -0
  51. package/dist/credential-select.d.ts +86 -0
  52. package/dist/credential-select.js +303 -0
  53. package/dist/credential-select.js.map +1 -0
  54. package/dist/dashboard/.vite/dashboard-bundle-graph.json +32 -0
  55. package/dist/dashboard/.vite/manifest.json +11 -0
  56. package/dist/dashboard/assets/index-BeZxN4Lx.css +1 -0
  57. package/dist/dashboard/assets/index-RtLgb7Cg.js +74 -0
  58. package/dist/dashboard/index.html +4 -0
  59. package/dist/dashboard-auth.d.ts +68 -0
  60. package/dist/dashboard-auth.js +225 -0
  61. package/dist/dashboard-auth.js.map +1 -0
  62. package/dist/dashboard-contract.d.ts +391 -0
  63. package/dist/dashboard-contract.js +619 -0
  64. package/dist/dashboard-contract.js.map +1 -0
  65. package/dist/dashboard-routes.d.ts +91 -0
  66. package/dist/dashboard-routes.js +688 -0
  67. package/dist/dashboard-routes.js.map +1 -0
  68. package/dist/dashboard-snapshot.d.ts +36 -0
  69. package/dist/dashboard-snapshot.js +1132 -0
  70. package/dist/dashboard-snapshot.js.map +1 -0
  71. package/dist/dashboard-static.d.ts +61 -0
  72. package/dist/dashboard-static.js +326 -0
  73. package/dist/dashboard-static.js.map +1 -0
  74. package/dist/dispatch.js +11 -6
  75. package/dist/dispatch.js.map +1 -1
  76. package/dist/dynamic-pools.js +6 -4
  77. package/dist/dynamic-pools.js.map +1 -1
  78. package/dist/kernel/contracts.d.ts +4 -0
  79. package/dist/kernel/request-lifecycle.js +4 -1
  80. package/dist/kernel/request-lifecycle.js.map +1 -1
  81. package/dist/key-checker.d.ts +3 -1
  82. package/dist/key-checker.js +35 -11
  83. package/dist/key-checker.js.map +1 -1
  84. package/dist/key-import.d.ts +29 -0
  85. package/dist/key-import.js +160 -0
  86. package/dist/key-import.js.map +1 -0
  87. package/dist/log.d.ts +20 -2
  88. package/dist/log.js +53 -2
  89. package/dist/log.js.map +1 -1
  90. package/dist/offload.d.ts +9 -0
  91. package/dist/offload.js +7 -1
  92. package/dist/offload.js.map +1 -1
  93. package/dist/onboarding.d.ts +3 -3
  94. package/dist/onboarding.js +12 -6
  95. package/dist/onboarding.js.map +1 -1
  96. package/dist/openai-dialect.d.ts +42 -0
  97. package/dist/openai-dialect.js +388 -0
  98. package/dist/openai-dialect.js.map +1 -0
  99. package/dist/ping/cadence.d.ts +12 -3
  100. package/dist/ping/cadence.js +68 -15
  101. package/dist/ping/cadence.js.map +1 -1
  102. package/dist/ping/ping.d.ts +7 -3
  103. package/dist/ping/ping.js +11 -35
  104. package/dist/ping/ping.js.map +1 -1
  105. package/dist/ping/probe-cache.d.ts +14 -6
  106. package/dist/ping/probe-cache.js +20 -5
  107. package/dist/ping/probe-cache.js.map +1 -1
  108. package/dist/ping/runtime-telemetry.d.ts +2 -1
  109. package/dist/ping/runtime-telemetry.js +103 -10
  110. package/dist/ping/runtime-telemetry.js.map +1 -1
  111. package/dist/pool-health.d.ts +2 -0
  112. package/dist/pool-health.js +29 -13
  113. package/dist/pool-health.js.map +1 -1
  114. package/dist/quota-observation.d.ts +29 -0
  115. package/dist/quota-observation.js +249 -0
  116. package/dist/quota-observation.js.map +1 -0
  117. package/dist/refusal-interpretation.d.ts +13 -7
  118. package/dist/refusal-interpretation.js +260 -33
  119. package/dist/refusal-interpretation.js.map +1 -1
  120. package/dist/registry.d.ts +13 -2
  121. package/dist/registry.js +12 -4
  122. package/dist/registry.js.map +1 -1
  123. package/dist/repair.d.ts +4 -2
  124. package/dist/repair.js +15 -1
  125. package/dist/repair.js.map +1 -1
  126. package/dist/request-log.d.ts +2 -2
  127. package/dist/request-log.js +9 -1
  128. package/dist/request-log.js.map +1 -1
  129. package/dist/reshaper.d.ts +76 -11
  130. package/dist/reshaper.js +264 -29
  131. package/dist/reshaper.js.map +1 -1
  132. package/dist/resolved-attempt.d.ts +14 -0
  133. package/dist/resolved-attempt.js +21 -0
  134. package/dist/resolved-attempt.js.map +1 -0
  135. package/dist/routes/admin.js +7 -1
  136. package/dist/routes/admin.js.map +1 -1
  137. package/dist/secret-file-acl.d.ts +25 -0
  138. package/dist/secret-file-acl.js +37 -0
  139. package/dist/secret-file-acl.js.map +1 -0
  140. package/dist/server.d.ts +28 -3
  141. package/dist/server.js +1774 -467
  142. package/dist/server.js.map +1 -1
  143. package/dist/session-pin.d.ts +35 -0
  144. package/dist/session-pin.js +136 -0
  145. package/dist/session-pin.js.map +1 -0
  146. package/dist/stream-commit.d.ts +34 -0
  147. package/dist/stream-commit.js +325 -0
  148. package/dist/stream-commit.js.map +1 -0
  149. package/dist/target-facts.d.ts +23 -136
  150. package/dist/target-facts.js +138 -179
  151. package/dist/target-facts.js.map +1 -1
  152. package/dist/telemetry.d.ts +1 -25
  153. package/dist/telemetry.js +52 -45
  154. package/dist/telemetry.js.map +1 -1
  155. package/dist/think-tags.d.ts +34 -0
  156. package/dist/think-tags.js +219 -0
  157. package/dist/think-tags.js.map +1 -0
  158. package/dist/usage-observer.d.ts +34 -0
  159. package/dist/usage-observer.js +322 -0
  160. package/dist/usage-observer.js.map +1 -0
  161. package/dist/winenv.js +26 -4
  162. package/dist/winenv.js.map +1 -1
  163. package/docs/dashboard-bundle-inventory.json +16 -0
  164. package/package.json +29 -6
  165. 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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"}
@@ -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 → input_schema) from a parsed request body.
63
- * Value is `null` for a tool that is DECLARED but has no JSON `input_schema` —
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 → input_schema) from a parsed request body.
12
- * Value is `null` for a tool that is DECLARED but has no JSON `input_schema` —
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 === "object" && t !== null && typeof t.name === "string") {
25
- const rawSchema = t.input_schema;
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(t.name, schema);
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
  }
@@ -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,OAAQ,CAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChF,MAAM,SAAS,GAAI,CAAgC,CAAC,YAAY,CAAC;gBACjE,MAAM,MAAM,GACV,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;oBACjD,CAAC,CAAE,SAAwB;oBAC3B,CAAC,CAAC,IAAI,CAAC;gBACX,GAAG,CAAC,GAAG,CAAE,CAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
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
  *