@acme-engine/core 0.1.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 (137) hide show
  1. package/dist/common.d.ts +40 -0
  2. package/dist/common.d.ts.map +1 -0
  3. package/dist/common.js +2 -0
  4. package/dist/common.js.map +1 -0
  5. package/dist/contracts.d.ts +65 -0
  6. package/dist/contracts.d.ts.map +1 -0
  7. package/dist/contracts.js +2 -0
  8. package/dist/contracts.js.map +1 -0
  9. package/dist/errors.d.ts +24 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +20 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/evaluation.d.ts +14 -0
  14. package/dist/evaluation.d.ts.map +1 -0
  15. package/dist/evaluation.js +2 -0
  16. package/dist/evaluation.js.map +1 -0
  17. package/dist/execution-engine.d.ts +30 -0
  18. package/dist/execution-engine.d.ts.map +1 -0
  19. package/dist/execution-engine.js +885 -0
  20. package/dist/execution-engine.js.map +1 -0
  21. package/dist/execution-identity.d.ts +35 -0
  22. package/dist/execution-identity.d.ts.map +1 -0
  23. package/dist/execution-identity.js +177 -0
  24. package/dist/execution-identity.js.map +1 -0
  25. package/dist/execution-status.d.ts +2 -0
  26. package/dist/execution-status.d.ts.map +1 -0
  27. package/dist/execution-status.js +2 -0
  28. package/dist/execution-status.js.map +1 -0
  29. package/dist/execution-types.d.ts +58 -0
  30. package/dist/execution-types.d.ts.map +1 -0
  31. package/dist/execution-types.js +2 -0
  32. package/dist/execution-types.js.map +1 -0
  33. package/dist/hashing.d.ts +6 -0
  34. package/dist/hashing.d.ts.map +1 -0
  35. package/dist/hashing.js +73 -0
  36. package/dist/hashing.js.map +1 -0
  37. package/dist/index.d.ts +34 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +33 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/memory-engine.d.ts +13 -0
  42. package/dist/memory-engine.d.ts.map +1 -0
  43. package/dist/memory-engine.js +591 -0
  44. package/dist/memory-engine.js.map +1 -0
  45. package/dist/memory.d.ts +151 -0
  46. package/dist/memory.d.ts.map +1 -0
  47. package/dist/memory.js +2 -0
  48. package/dist/memory.js.map +1 -0
  49. package/dist/model-call-usage.d.ts +40 -0
  50. package/dist/model-call-usage.d.ts.map +1 -0
  51. package/dist/model-call-usage.js +0 -0
  52. package/dist/model-call-usage.js.map +1 -0
  53. package/dist/model-execution-engine.d.ts +16 -0
  54. package/dist/model-execution-engine.d.ts.map +1 -0
  55. package/dist/model-execution-engine.js +598 -0
  56. package/dist/model-execution-engine.js.map +1 -0
  57. package/dist/model-execution-identity.d.ts +16 -0
  58. package/dist/model-execution-identity.d.ts.map +1 -0
  59. package/dist/model-execution-identity.js +84 -0
  60. package/dist/model-execution-identity.js.map +1 -0
  61. package/dist/model-execution-types.d.ts +66 -0
  62. package/dist/model-execution-types.d.ts.map +1 -0
  63. package/dist/model-execution-types.js +8 -0
  64. package/dist/model-execution-types.js.map +1 -0
  65. package/dist/model-gateway-router.d.ts +11 -0
  66. package/dist/model-gateway-router.d.ts.map +1 -0
  67. package/dist/model-gateway-router.js +69 -0
  68. package/dist/model-gateway-router.js.map +1 -0
  69. package/dist/model-request-hash.d.ts +5 -0
  70. package/dist/model-request-hash.d.ts.map +1 -0
  71. package/dist/model-request-hash.js +11 -0
  72. package/dist/model-request-hash.js.map +1 -0
  73. package/dist/model-response-hash.d.ts +5 -0
  74. package/dist/model-response-hash.d.ts.map +1 -0
  75. package/dist/model-response-hash.js +11 -0
  76. package/dist/model-response-hash.js.map +1 -0
  77. package/dist/model-validation.d.ts +11 -0
  78. package/dist/model-validation.d.ts.map +1 -0
  79. package/dist/model-validation.js +580 -0
  80. package/dist/model-validation.js.map +1 -0
  81. package/dist/model.d.ts +125 -0
  82. package/dist/model.d.ts.map +1 -0
  83. package/dist/model.js +4 -0
  84. package/dist/model.js.map +1 -0
  85. package/dist/modules.d.ts +83 -0
  86. package/dist/modules.d.ts.map +1 -0
  87. package/dist/modules.js +7 -0
  88. package/dist/modules.js.map +1 -0
  89. package/dist/outbox.d.ts +88 -0
  90. package/dist/outbox.d.ts.map +1 -0
  91. package/dist/outbox.js +180 -0
  92. package/dist/outbox.js.map +1 -0
  93. package/dist/payload-encryptor.d.ts +92 -0
  94. package/dist/payload-encryptor.d.ts.map +1 -0
  95. package/dist/payload-encryptor.js +173 -0
  96. package/dist/payload-encryptor.js.map +1 -0
  97. package/dist/registries.d.ts +5 -0
  98. package/dist/registries.d.ts.map +1 -0
  99. package/dist/registries.js +159 -0
  100. package/dist/registries.js.map +1 -0
  101. package/dist/repository-digest.d.ts +5 -0
  102. package/dist/repository-digest.d.ts.map +1 -0
  103. package/dist/repository-digest.js +25 -0
  104. package/dist/repository-digest.js.map +1 -0
  105. package/dist/repository-model-call.d.ts +43 -0
  106. package/dist/repository-model-call.d.ts.map +1 -0
  107. package/dist/repository-model-call.js +2 -0
  108. package/dist/repository-model-call.js.map +1 -0
  109. package/dist/repository-model-execution.d.ts +49 -0
  110. package/dist/repository-model-execution.d.ts.map +1 -0
  111. package/dist/repository-model-execution.js +2 -0
  112. package/dist/repository-model-execution.js.map +1 -0
  113. package/dist/repository.d.ts +260 -0
  114. package/dist/repository.d.ts.map +1 -0
  115. package/dist/repository.js +2 -0
  116. package/dist/repository.js.map +1 -0
  117. package/dist/response-pipeline.d.ts +3 -0
  118. package/dist/response-pipeline.d.ts.map +1 -0
  119. package/dist/response-pipeline.js +132 -0
  120. package/dist/response-pipeline.js.map +1 -0
  121. package/dist/state-engine.d.ts +19 -0
  122. package/dist/state-engine.d.ts.map +1 -0
  123. package/dist/state-engine.js +272 -0
  124. package/dist/state-engine.js.map +1 -0
  125. package/dist/state-projection.d.ts +5 -0
  126. package/dist/state-projection.d.ts.map +1 -0
  127. package/dist/state-projection.js +145 -0
  128. package/dist/state-projection.js.map +1 -0
  129. package/dist/state.d.ts +41 -0
  130. package/dist/state.d.ts.map +1 -0
  131. package/dist/state.js +2 -0
  132. package/dist/state.js.map +1 -0
  133. package/dist/stranded-execution.d.ts +59 -0
  134. package/dist/stranded-execution.d.ts.map +1 -0
  135. package/dist/stranded-execution.js +235 -0
  136. package/dist/stranded-execution.js.map +1 -0
  137. package/package.json +36 -0
@@ -0,0 +1,598 @@
1
+ import { AcmeError, AmbiguousModelCallError, } from './errors.js';
2
+ import { nodeHashing } from './hashing.js';
3
+ import { computeModelExecutionFingerprint, deriveModelExecutionId, resolveModelExecutionPolicy, } from './model-execution-identity.js';
4
+ import { ACME_MODEL_EXECUTION_MAX_RETAINED_PAYLOAD_BYTES, ACME_MODEL_EXECUTION_MAX_STREAM_EVENT_BYTES, } from './model-execution-types.js';
5
+ import { computeModelRequestHash } from './model-request-hash.js';
6
+ import { computeModelResponseHash } from './model-response-hash.js';
7
+ import { isJsonModelOutput, } from './model.js';
8
+ import { assertRequiredModelCapabilities, validateGatewayCallContext, validateModelRequest, validateModelSelection, validateModelStreamEvent, validateNormalizedModelResponse, validateRequiredModelCapabilities, } from './model-validation.js';
9
+ const requestKeys = new Set([
10
+ 'model',
11
+ 'policy',
12
+ 'request',
13
+ 'requestKey',
14
+ 'requiredCapabilities',
15
+ ]);
16
+ function deepFreeze(value) {
17
+ if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
18
+ Object.freeze(value);
19
+ for (const child of Object.values(value)) {
20
+ deepFreeze(child);
21
+ }
22
+ }
23
+ return value;
24
+ }
25
+ function invalid(message, details, code = 'INVALID_REQUEST') {
26
+ throw new AcmeError({
27
+ code,
28
+ message,
29
+ stage: 'accepted',
30
+ retryable: false,
31
+ ...(details === undefined ? {} : { details }),
32
+ });
33
+ }
34
+ function requireText(value, field) {
35
+ if (typeof value !== 'string' || value.trim().length === 0) {
36
+ invalid(`${field} must be a non-empty string.`, { field });
37
+ }
38
+ return value;
39
+ }
40
+ function isObject(value) {
41
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
42
+ }
43
+ function errorData(error, stage) {
44
+ if (error instanceof AcmeError) {
45
+ return error.data;
46
+ }
47
+ if (isObject(error) &&
48
+ isObject(error.data) &&
49
+ typeof error.data.code === 'string' &&
50
+ typeof error.data.message === 'string' &&
51
+ typeof error.data.stage === 'string' &&
52
+ typeof error.data.retryable === 'boolean') {
53
+ return deepFreeze(error.data);
54
+ }
55
+ return Object.freeze({
56
+ code: 'INTERNAL',
57
+ message: 'Model execution failed with an unexpected internal error.',
58
+ stage,
59
+ retryable: false,
60
+ });
61
+ }
62
+ function isAmbiguous(error) {
63
+ return (error instanceof AmbiguousModelCallError ||
64
+ (error instanceof AcmeError &&
65
+ 'ambiguous' in error &&
66
+ error.ambiguous === true));
67
+ }
68
+ function diagnosticOf(error, extra = {}) {
69
+ const details = isObject(error.details) ? error.details : {};
70
+ const delivery = details.delivery === 'not-sent' ||
71
+ details.delivery === 'sent' ||
72
+ details.delivery === 'unknown'
73
+ ? details.delivery
74
+ : extra.delivery;
75
+ const httpStatus = typeof details.status === 'number' ? details.status : extra.httpStatus;
76
+ const kind = extra.kind ?? kindOf(error, delivery);
77
+ return deepFreeze({
78
+ kind,
79
+ ...(delivery === undefined ? {} : { delivery }),
80
+ ...(httpStatus === undefined ? {} : { httpStatus }),
81
+ ...(extra.finishReason === undefined
82
+ ? {}
83
+ : { finishReason: extra.finishReason }),
84
+ });
85
+ }
86
+ function kindOf(error, delivery) {
87
+ if (error.code === 'TIMEOUT') {
88
+ return delivery === 'sent' || delivery === 'unknown'
89
+ ? 'ambiguous-delivery'
90
+ : 'timeout';
91
+ }
92
+ if (error.code === 'CANCELLED') {
93
+ return 'cancel';
94
+ }
95
+ if (error.code === 'MODEL_AUTH') {
96
+ return 'auth';
97
+ }
98
+ if (error.code === 'MODEL_RATE_LIMIT') {
99
+ return 'rate-limit';
100
+ }
101
+ if (error.code === 'MODEL_CONTENT_FILTER') {
102
+ return 'content-filter';
103
+ }
104
+ if (error.code === 'MODEL_INVALID_RESPONSE') {
105
+ if (error.message.includes('truncated')) {
106
+ return 'truncated-stream';
107
+ }
108
+ if (error.message.includes('malformed')) {
109
+ return 'malformed-stream';
110
+ }
111
+ return 'invalid-response';
112
+ }
113
+ if (error.code === 'CONFLICT_IDEMPOTENCY_KEY') {
114
+ return 'conflict';
115
+ }
116
+ if (error.code === 'UNSUPPORTED_CAPABILITY') {
117
+ return 'unsupported-capability';
118
+ }
119
+ if (error.code === 'INVALID_REQUEST') {
120
+ return 'invalid-request';
121
+ }
122
+ if (error.code === 'RESUME_EVIDENCE_UNAVAILABLE') {
123
+ return 'resume-evidence-unavailable';
124
+ }
125
+ if (error.code === 'MODEL_UNAVAILABLE' &&
126
+ (delivery === 'sent' || delivery === 'unknown')) {
127
+ return 'ambiguous-delivery';
128
+ }
129
+ if (typeof error.details === 'object' && error.details !== null) {
130
+ const status = error.details.status;
131
+ if (typeof status === 'number') {
132
+ return 'provider-http';
133
+ }
134
+ }
135
+ if (error.code === 'MODEL_UNAVAILABLE') {
136
+ return 'unavailable';
137
+ }
138
+ return 'internal';
139
+ }
140
+ function terminalStatus(error) {
141
+ if (error.code === 'CONFLICT_IDEMPOTENCY_KEY') {
142
+ return 'conflicted';
143
+ }
144
+ return error.code === 'CANCELLED' ? 'cancelled' : 'failed';
145
+ }
146
+ function validateEnvelope(request) {
147
+ if (!isObject(request)) {
148
+ invalid('Model execution request must be an object.');
149
+ }
150
+ const unexpected = Object.keys(request)
151
+ .filter((key) => !requestKeys.has(key))
152
+ .sort();
153
+ const missing = ['requestKey', 'model', 'request'].filter((key) => !Object.hasOwn(request, key));
154
+ if (unexpected.length > 0 || missing.length > 0) {
155
+ invalid('Model execution request has an invalid shape.', {
156
+ missing,
157
+ unexpected,
158
+ });
159
+ }
160
+ return Object.freeze({
161
+ requestKey: requireText(request.requestKey, 'requestKey'),
162
+ model: validateModelSelection(request.model),
163
+ request: validateModelRequest(request.request),
164
+ ...(Object.hasOwn(request, 'requiredCapabilities') &&
165
+ request.requiredCapabilities !== undefined
166
+ ? {
167
+ requiredCapabilities: validateRequiredModelCapabilities(request.requiredCapabilities),
168
+ }
169
+ : {}),
170
+ ...(Object.hasOwn(request, 'policy') && request.policy !== undefined
171
+ ? {
172
+ policy: request.policy,
173
+ }
174
+ : {}),
175
+ });
176
+ }
177
+ function requiredCapabilitiesOf(request) {
178
+ const supplied = request.requiredCapabilities ?? {};
179
+ return deepFreeze({
180
+ ...supplied,
181
+ ...(isJsonModelOutput(request.request.output)
182
+ ? { structuredOutput: true }
183
+ : {}),
184
+ ...(request.request.tools !== undefined ? { tools: true } : {}),
185
+ });
186
+ }
187
+ function assertRetainedPayloadBound(response, hashing) {
188
+ const bytes = hashing.canonicalJson(response).length;
189
+ if (bytes > ACME_MODEL_EXECUTION_MAX_RETAINED_PAYLOAD_BYTES) {
190
+ invalid('Retained model response exceeds the 1 MiB payload bound.', { bytes, limit: ACME_MODEL_EXECUTION_MAX_RETAINED_PAYLOAD_BYTES }, 'BUDGET_EXCEEDED');
191
+ }
192
+ }
193
+ function assertStreamEventBound(event, hashing) {
194
+ const bytes = hashing.canonicalJson(event).length;
195
+ if (bytes > ACME_MODEL_EXECUTION_MAX_STREAM_EVENT_BYTES) {
196
+ invalid('Model stream event exceeds the per-event bound.', { bytes, limit: ACME_MODEL_EXECUTION_MAX_STREAM_EVENT_BYTES }, 'BUDGET_EXCEEDED');
197
+ }
198
+ }
199
+ async function* streamFromGenerate(gateway, request, context) {
200
+ const response = await gateway.generate(request, context);
201
+ let sequence = 0;
202
+ if (response.text.length > 0) {
203
+ yield deepFreeze({
204
+ type: 'content-delta',
205
+ sequence,
206
+ text: response.text,
207
+ });
208
+ sequence += 1;
209
+ }
210
+ for (const [index, call] of (response.toolCalls ?? []).entries()) {
211
+ yield deepFreeze({
212
+ type: 'tool-call-delta',
213
+ sequence,
214
+ index,
215
+ toolCallId: call.toolCallId,
216
+ name: call.name,
217
+ argumentsDelta: JSON.stringify(call.arguments),
218
+ });
219
+ sequence += 1;
220
+ }
221
+ yield deepFreeze({
222
+ type: 'completed',
223
+ sequence,
224
+ response,
225
+ });
226
+ }
227
+ class ModelOnlyExecutionEngine {
228
+ #clock;
229
+ #ids;
230
+ #gateway;
231
+ #repository;
232
+ #hashing;
233
+ constructor(options) {
234
+ this.#clock = options.clock;
235
+ this.#ids = options.ids;
236
+ this.#gateway = options.gateway;
237
+ this.#repository = options.repository;
238
+ this.#hashing = options.hashing ?? nodeHashing;
239
+ }
240
+ async execute(rawRequest, options = {}) {
241
+ let nextSequence = 0;
242
+ const callerOnEvent = options.onEvent;
243
+ const executionOptions = callerOnEvent === undefined
244
+ ? options
245
+ : {
246
+ ...options,
247
+ onEvent: async (event) => {
248
+ const numbered = deepFreeze({
249
+ ...event,
250
+ sequence: nextSequence,
251
+ });
252
+ nextSequence += 1;
253
+ await callerOnEvent(numbered);
254
+ },
255
+ };
256
+ const envelope = validateEnvelope(rawRequest);
257
+ const policy = resolveModelExecutionPolicy(envelope.policy);
258
+ const requiredCapabilities = requiredCapabilitiesOf(envelope);
259
+ const requestHash = computeModelRequestHash(envelope.request, this.#hashing);
260
+ const modelExecutionId = deriveModelExecutionId(envelope.requestKey, this.#hashing);
261
+ const requestFingerprint = computeModelExecutionFingerprint({
262
+ requestKey: envelope.requestKey,
263
+ model: envelope.model,
264
+ requestHash,
265
+ requiredCapabilities,
266
+ policy,
267
+ }, this.#hashing);
268
+ const now = this.#clock.now();
269
+ const acceptance = await this.#repository.accept({
270
+ modelExecutionId,
271
+ requestKey: envelope.requestKey,
272
+ requestFingerprint,
273
+ requestHash,
274
+ selection: envelope.model,
275
+ request: envelope.request,
276
+ requiredCapabilities,
277
+ effectivePolicy: policy,
278
+ createdAt: now,
279
+ });
280
+ if (acceptance.kind === 'conflict') {
281
+ const error = {
282
+ code: 'CONFLICT_IDEMPOTENCY_KEY',
283
+ message: 'Request key was already accepted with different identity.',
284
+ stage: 'accepted',
285
+ retryable: false,
286
+ details: { requestKey: envelope.requestKey },
287
+ };
288
+ const result = deepFreeze({
289
+ status: 'conflicted',
290
+ modelExecutionId: acceptance.existingExecutionId,
291
+ error,
292
+ diagnostic: diagnosticOf(error, { kind: 'conflict' }),
293
+ });
294
+ await executionOptions.onEvent?.({
295
+ type: 'failed',
296
+ sequence: 0,
297
+ error,
298
+ });
299
+ return result;
300
+ }
301
+ try {
302
+ if (acceptance.kind === 'existing') {
303
+ return await this.#resume(acceptance.execution, executionOptions, now);
304
+ }
305
+ return await this.#dispatch(envelope, {
306
+ modelExecutionId,
307
+ requestHash,
308
+ requiredCapabilities,
309
+ policy,
310
+ now,
311
+ options: executionOptions,
312
+ });
313
+ }
314
+ catch (error) {
315
+ const data = errorData(error, 'calling-model');
316
+ const status = terminalStatus(data);
317
+ const diagnostic = isAmbiguous(error)
318
+ ? diagnosticOf(data, { kind: 'ambiguous-delivery' })
319
+ : diagnosticOf(data);
320
+ const result = deepFreeze({
321
+ status,
322
+ modelExecutionId,
323
+ error: data,
324
+ diagnostic,
325
+ });
326
+ await this.#repository.markTerminal({
327
+ modelExecutionId,
328
+ status: isAmbiguous(error) ? 'ambiguous' : status,
329
+ result,
330
+ error: data,
331
+ diagnostic,
332
+ terminalAt: now,
333
+ });
334
+ await executionOptions.onEvent?.({
335
+ type: 'failed',
336
+ sequence: 0,
337
+ error: data,
338
+ });
339
+ return result;
340
+ }
341
+ }
342
+ async #resume(existing, options, now) {
343
+ if (existing.result !== undefined) {
344
+ if (existing.result.status === 'succeeded') {
345
+ await options.onEvent?.({
346
+ type: 'completed',
347
+ sequence: 0,
348
+ response: existing.result.response,
349
+ });
350
+ return deepFreeze({ ...existing.result, replayed: true });
351
+ }
352
+ await options.onEvent?.({
353
+ type: 'failed',
354
+ sequence: 0,
355
+ error: existing.result.error,
356
+ });
357
+ return existing.result;
358
+ }
359
+ const resume = await this.#repository.loadResumeState(existing.modelExecutionId);
360
+ if (resume === null) {
361
+ invalid('Accepted model execution has no recorded resume state.', { modelExecutionId: existing.modelExecutionId }, 'PERSISTENCE_CORRUPTION');
362
+ }
363
+ const primary = resume.modelCalls.find((call) => call.callKey === 'model:0' && call.attempt === 1);
364
+ if (primary === undefined) {
365
+ return this.#dispatchFromAccepted(existing, options, now);
366
+ }
367
+ if (primary.status === 'succeeded') {
368
+ if (primary.response === undefined) {
369
+ const error = {
370
+ code: 'RESUME_EVIDENCE_UNAVAILABLE',
371
+ message: 'A succeeded model call has no recoverable retained response.',
372
+ stage: 'calling-model',
373
+ retryable: false,
374
+ details: { modelExecutionId: existing.modelExecutionId },
375
+ };
376
+ const result = deepFreeze({
377
+ status: 'failed',
378
+ modelExecutionId: existing.modelExecutionId,
379
+ error,
380
+ diagnostic: diagnosticOf(error),
381
+ });
382
+ if (existing.status !== 'failed') {
383
+ await this.#repository.markTerminal({
384
+ modelExecutionId: existing.modelExecutionId,
385
+ status: 'failed',
386
+ result,
387
+ error,
388
+ diagnostic: result.diagnostic,
389
+ terminalAt: now,
390
+ });
391
+ }
392
+ await options.onEvent?.({ type: 'failed', sequence: 0, error });
393
+ return result;
394
+ }
395
+ const response = validateNormalizedModelResponse(primary.response);
396
+ const result = deepFreeze({
397
+ status: 'succeeded',
398
+ modelExecutionId: existing.modelExecutionId,
399
+ replayed: true,
400
+ response,
401
+ usage: response.usage,
402
+ diagnostic: { kind: 'completed', finishReason: response.finishReason },
403
+ });
404
+ if (existing.status !== 'succeeded') {
405
+ await this.#repository.markTerminal({
406
+ modelExecutionId: existing.modelExecutionId,
407
+ status: 'succeeded',
408
+ result,
409
+ diagnostic: result.diagnostic,
410
+ terminalAt: now,
411
+ });
412
+ }
413
+ await options.onEvent?.({
414
+ type: 'completed',
415
+ sequence: 0,
416
+ response,
417
+ });
418
+ return result;
419
+ }
420
+ if (primary.status === 'failed' || primary.status === 'ambiguous') {
421
+ const error = primary.error ?? {
422
+ code: 'MODEL_UNAVAILABLE',
423
+ message: 'Recorded model call failed without error evidence.',
424
+ stage: 'calling-model',
425
+ retryable: false,
426
+ };
427
+ const diagnostic = primary.status === 'ambiguous'
428
+ ? diagnosticOf(error, { kind: 'ambiguous-delivery' })
429
+ : diagnosticOf(error);
430
+ const result = deepFreeze({
431
+ status: 'failed',
432
+ modelExecutionId: existing.modelExecutionId,
433
+ error,
434
+ diagnostic,
435
+ });
436
+ await this.#repository.markTerminal({
437
+ modelExecutionId: existing.modelExecutionId,
438
+ status: primary.status === 'ambiguous' ? 'ambiguous' : 'failed',
439
+ result,
440
+ error,
441
+ diagnostic,
442
+ terminalAt: now,
443
+ });
444
+ await options.onEvent?.({ type: 'failed', sequence: 0, error });
445
+ return result;
446
+ }
447
+ const error = {
448
+ code: 'MODEL_UNAVAILABLE',
449
+ message: 'The model call was reserved or in flight; the outcome is unobserved and is not retried.',
450
+ stage: 'calling-model',
451
+ retryable: false,
452
+ details: {
453
+ modelExecutionId: existing.modelExecutionId,
454
+ modelCallStatus: primary.status,
455
+ },
456
+ };
457
+ const result = deepFreeze({
458
+ status: 'failed',
459
+ modelExecutionId: existing.modelExecutionId,
460
+ error,
461
+ diagnostic: diagnosticOf(error, { kind: 'ambiguous-delivery' }),
462
+ });
463
+ await this.#repository.failModelCall({
464
+ modelCallId: primary.modelCallId,
465
+ error,
466
+ ambiguous: true,
467
+ completedAt: now,
468
+ });
469
+ await this.#repository.markTerminal({
470
+ modelExecutionId: existing.modelExecutionId,
471
+ status: 'ambiguous',
472
+ result,
473
+ error,
474
+ diagnostic: result.diagnostic,
475
+ terminalAt: now,
476
+ });
477
+ await options.onEvent?.({ type: 'failed', sequence: 0, error });
478
+ return result;
479
+ }
480
+ async #dispatchFromAccepted(existing, options, now) {
481
+ return this.#dispatch({
482
+ requestKey: existing.requestKey,
483
+ model: existing.selection,
484
+ request: existing.request,
485
+ requiredCapabilities: existing.requiredCapabilities,
486
+ policy: existing.policy,
487
+ }, {
488
+ modelExecutionId: existing.modelExecutionId,
489
+ requestHash: existing.requestHash,
490
+ requiredCapabilities: existing.requiredCapabilities,
491
+ policy: existing.policy,
492
+ now,
493
+ options,
494
+ });
495
+ }
496
+ async #dispatch(envelope, input) {
497
+ const available = await this.#gateway.capabilities(envelope.model);
498
+ assertRequiredModelCapabilities(available, input.requiredCapabilities);
499
+ const signal = input.options.signal ?? new AbortController().signal;
500
+ const context = validateGatewayCallContext({
501
+ executionId: input.modelExecutionId,
502
+ callKey: 'model:0',
503
+ selection: envelope.model,
504
+ requiredCapabilities: input.requiredCapabilities,
505
+ timeoutMs: input.policy.timeoutMs,
506
+ signal,
507
+ });
508
+ const modelCallId = this.#ids.next('call');
509
+ await this.#repository.reserveModelCall({
510
+ modelCallId,
511
+ executionId: input.modelExecutionId,
512
+ callKey: 'model:0',
513
+ attempt: 1,
514
+ purpose: 'primary',
515
+ selection: envelope.model,
516
+ requestHash: input.requestHash,
517
+ startedAt: input.now,
518
+ });
519
+ try {
520
+ const stream = this.#gateway.stream === undefined
521
+ ? streamFromGenerate(this.#gateway, envelope.request, context)
522
+ : this.#gateway.stream(envelope.request, context);
523
+ let completed;
524
+ let lastSequence = -1;
525
+ for await (const raw of stream) {
526
+ const event = validateModelStreamEvent(raw);
527
+ assertStreamEventBound(event, this.#hashing);
528
+ if (event.sequence !== lastSequence + 1) {
529
+ invalid('Model stream events must be strictly ordered.', { expected: lastSequence + 1, actual: event.sequence }, 'MODEL_INVALID_RESPONSE');
530
+ }
531
+ lastSequence = event.sequence;
532
+ if (event.type === 'failed') {
533
+ throw new AcmeError(event.error);
534
+ }
535
+ if (event.type === 'completed') {
536
+ completed = validateNormalizedModelResponse(event.response);
537
+ }
538
+ if (event.type !== 'completed') {
539
+ await input.options.onEvent?.(event);
540
+ }
541
+ }
542
+ if (completed === undefined) {
543
+ throw new AcmeError({
544
+ code: 'MODEL_INVALID_RESPONSE',
545
+ message: 'The provider stream ended without a completed response; the stream was truncated.',
546
+ stage: 'calling-model',
547
+ retryable: false,
548
+ });
549
+ }
550
+ assertRetainedPayloadBound(completed, this.#hashing);
551
+ await this.#repository.completeModelCall({
552
+ modelCallId,
553
+ response: completed,
554
+ responseHash: computeModelResponseHash(completed, this.#hashing),
555
+ completedAt: input.now,
556
+ });
557
+ const result = deepFreeze({
558
+ status: 'succeeded',
559
+ modelExecutionId: input.modelExecutionId,
560
+ replayed: false,
561
+ response: completed,
562
+ usage: completed.usage,
563
+ diagnostic: {
564
+ kind: 'completed',
565
+ finishReason: completed.finishReason,
566
+ },
567
+ });
568
+ await this.#repository.markTerminal({
569
+ modelExecutionId: input.modelExecutionId,
570
+ status: 'succeeded',
571
+ result,
572
+ diagnostic: result.diagnostic,
573
+ terminalAt: input.now,
574
+ });
575
+ await input.options.onEvent?.({
576
+ type: 'completed',
577
+ sequence: lastSequence,
578
+ response: completed,
579
+ });
580
+ return result;
581
+ }
582
+ catch (error) {
583
+ const data = errorData(error, 'calling-model');
584
+ const ambiguous = isAmbiguous(error);
585
+ await this.#repository.failModelCall({
586
+ modelCallId,
587
+ error: data,
588
+ ambiguous,
589
+ completedAt: input.now,
590
+ });
591
+ throw error instanceof AcmeError ? error : new AcmeError(data);
592
+ }
593
+ }
594
+ }
595
+ export function createModelExecutionEngine(options) {
596
+ return new ModelOnlyExecutionEngine(options);
597
+ }
598
+ //# sourceMappingURL=model-execution-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-execution-engine.js","sourceRoot":"","sources":["../src/model-execution-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Hashing } from './common.js';
2
+ import type { ModelCapabilities, ModelSelection } from './model.js';
3
+ import { type ModelExecutionPolicy } from './model-execution-types.js';
4
+ export declare const ACME_MODEL_EXECUTION_ID_ALGORITHM: "acme-model-execution-id-1";
5
+ export declare const ACME_MODEL_EXECUTION_FINGERPRINT_ALGORITHM: "acme-model-execution-fingerprint-1";
6
+ export declare function resolveModelExecutionPolicy(supplied?: Partial<ModelExecutionPolicy>): ModelExecutionPolicy;
7
+ export declare function deriveModelExecutionId(requestKey: string, hashing?: Hashing): string;
8
+ export interface ModelExecutionFingerprintInput {
9
+ readonly requestKey: string;
10
+ readonly model: ModelSelection;
11
+ readonly requestHash: string;
12
+ readonly requiredCapabilities: Partial<ModelCapabilities>;
13
+ readonly policy: ModelExecutionPolicy;
14
+ }
15
+ export declare function computeModelExecutionFingerprint(input: ModelExecutionFingerprintInput, hashing?: Hashing): string;
16
+ //# sourceMappingURL=model-execution-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-execution-identity.d.ts","sourceRoot":"","sources":["../src/model-execution-identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,aAAa,CAAC;AAGtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,iCAAiC,EAC5C,2BAAoC,CAAC;AACvC,eAAO,MAAM,0CAA0C,EACrD,oCAA6C,CAAC;AAqChD,wBAAgB,2BAA2B,CACzC,QAAQ,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACvC,oBAAoB,CAgCtB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAqB,GAC7B,MAAM,CAQR;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1D,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,8BAA8B,EACrC,OAAO,GAAE,OAAqB,GAC7B,MAAM,CAcR"}