openpond-sdk 0.3.2 → 0.4.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 (126) hide show
  1. package/TASKSETS.md +55 -0
  2. package/dist/actions-local.js +67 -118
  3. package/dist/actions-local.js.map +4 -4
  4. package/dist/actions.js +4 -92
  5. package/dist/actions.js.map +4 -4
  6. package/dist/chunk-27ETSPHQ.js +83 -0
  7. package/dist/chunk-27ETSPHQ.js.map +7 -0
  8. package/dist/chunk-5PRP457R.js +477 -0
  9. package/dist/chunk-5PRP457R.js.map +7 -0
  10. package/dist/chunk-65D4C7HP.js +273 -0
  11. package/dist/chunk-65D4C7HP.js.map +7 -0
  12. package/dist/chunk-747CMU2Y.js +222 -0
  13. package/dist/chunk-747CMU2Y.js.map +7 -0
  14. package/dist/chunk-7O5X7DBU.js +80 -0
  15. package/dist/chunk-7O5X7DBU.js.map +7 -0
  16. package/dist/chunk-A4ZDOZKP.js +115 -0
  17. package/dist/chunk-A4ZDOZKP.js.map +7 -0
  18. package/dist/chunk-APHPXQEA.js +155 -0
  19. package/dist/chunk-APHPXQEA.js.map +7 -0
  20. package/dist/chunk-AVW35YOH.js +574 -0
  21. package/dist/chunk-AVW35YOH.js.map +7 -0
  22. package/dist/chunk-AZUCY3E5.js +2395 -0
  23. package/dist/chunk-AZUCY3E5.js.map +7 -0
  24. package/dist/chunk-IVEXCIHO.js +1373 -0
  25. package/dist/chunk-IVEXCIHO.js.map +7 -0
  26. package/dist/chunk-K5ZCYOZO.js +49 -0
  27. package/dist/chunk-K5ZCYOZO.js.map +7 -0
  28. package/dist/chunk-LLHE4BOD.js +220 -0
  29. package/dist/chunk-LLHE4BOD.js.map +7 -0
  30. package/dist/chunk-LXXQVGQY.js +1 -0
  31. package/dist/chunk-LXXQVGQY.js.map +7 -0
  32. package/dist/chunk-P27DQ65Z.js +138 -0
  33. package/dist/chunk-P27DQ65Z.js.map +7 -0
  34. package/dist/chunk-QLEJOCQX.js +72 -0
  35. package/dist/chunk-QLEJOCQX.js.map +7 -0
  36. package/dist/chunk-S7I45WJQ.js +57 -0
  37. package/dist/chunk-S7I45WJQ.js.map +7 -0
  38. package/dist/chunk-ZPCK222K.js +586 -0
  39. package/dist/chunk-ZPCK222K.js.map +7 -0
  40. package/dist/index.js +33 -2488
  41. package/dist/index.js.map +4 -4
  42. package/dist/learning.js +16 -2042
  43. package/dist/learning.js.map +4 -4
  44. package/dist/model-batch-review.js +5 -42
  45. package/dist/model-batch-review.js.map +3 -3
  46. package/dist/model-projects.js +29 -430
  47. package/dist/model-projects.js.map +3 -3
  48. package/dist/model-starter-attempts.js +62 -311
  49. package/dist/model-starter-attempts.js.map +4 -4
  50. package/dist/model-starter-catalog.js +17 -460
  51. package/dist/model-starter-catalog.js.map +4 -4
  52. package/dist/model-starters.js +32 -709
  53. package/dist/model-starters.js.map +4 -4
  54. package/dist/model-taskset-authoring.js +11 -44
  55. package/dist/model-taskset-authoring.js.map +3 -3
  56. package/dist/profile-actions.js +4 -211
  57. package/dist/profile-actions.js.map +3 -3
  58. package/dist/project-actions.js +4 -224
  59. package/dist/project-actions.js.map +3 -3
  60. package/dist/refiner.js +14 -554
  61. package/dist/refiner.js.map +4 -4
  62. package/dist/taskset-catalog.js +9 -104
  63. package/dist/taskset-catalog.js.map +3 -3
  64. package/dist/taskset-drafts.js +465 -0
  65. package/dist/taskset-drafts.js.map +7 -0
  66. package/dist/taskset-packages.js +946 -3089
  67. package/dist/taskset-packages.js.map +4 -4
  68. package/dist/training.js +43 -822
  69. package/dist/training.js.map +4 -4
  70. package/dist/types/packages/sdk/src/index.d.ts +3 -3
  71. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  72. package/dist/types/packages/sdk/src/learning-client.d.ts +130 -0
  73. package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -0
  74. package/dist/types/packages/sdk/src/learning.d.ts +1 -129
  75. package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
  76. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts +68 -0
  77. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts.map +1 -1
  78. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +1170 -0
  79. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts.map +1 -0
  80. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +560 -0
  81. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -0
  82. package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts +92 -0
  83. package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts.map +1 -0
  84. package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts +15 -0
  85. package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts.map +1 -0
  86. package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts +18 -0
  87. package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts.map +1 -0
  88. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +1681 -0
  89. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -0
  90. package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts +19 -0
  91. package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts.map +1 -0
  92. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2713 -0
  93. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -0
  94. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +1000 -0
  95. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts.map +1 -0
  96. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +429 -0
  97. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts.map +1 -0
  98. package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts +284 -0
  99. package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts.map +1 -0
  100. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +846 -0
  101. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -0
  102. package/dist/types/packages/sdk/src/taskset-draft-files.d.ts +8 -0
  103. package/dist/types/packages/sdk/src/taskset-draft-files.d.ts.map +1 -0
  104. package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts +28 -0
  105. package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts.map +1 -0
  106. package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts +8 -0
  107. package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts.map +1 -0
  108. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +967 -0
  109. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -0
  110. package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts +10 -0
  111. package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts.map +1 -0
  112. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +1297 -0
  113. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -0
  114. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +1597 -0
  115. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -0
  116. package/dist/types/packages/sdk/src/taskset-drafts.d.ts +16 -0
  117. package/dist/types/packages/sdk/src/taskset-drafts.d.ts.map +1 -0
  118. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts +64 -0
  119. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts.map +1 -0
  120. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +1514 -0
  121. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -0
  122. package/dist/types/packages/sdk/src/taskset-packages.d.ts +6 -0
  123. package/dist/types/packages/sdk/src/taskset-packages.d.ts.map +1 -1
  124. package/dist/workflows.js +4 -221
  125. package/dist/workflows.js.map +3 -3
  126. package/package.json +6 -2
@@ -0,0 +1,574 @@
1
+ import {
2
+ ModelProjectBaseModelSchema,
3
+ ModelProjectImmutableRefSchema,
4
+ ModelProjectRecipeDocumentSchema,
5
+ ModelProjectVersionedRefSchema,
6
+ OPENPOND_TRAINING_MEDIA_TYPE,
7
+ OpenPondProtocolError,
8
+ TRAINING_API_RESPONSE_MAX_BYTES,
9
+ TRAINING_INPUT_ARTIFACT_MAX_BYTES,
10
+ TRAINING_JOB_SUBMISSION_MAX_BYTES,
11
+ assertCanonicalPayloadSize,
12
+ canonicalSha256,
13
+ parseBoundedJson
14
+ } from "./chunk-5PRP457R.js";
15
+
16
+ // src/training.ts
17
+ import { z } from "zod";
18
+ var IdSchema = z.string().trim().min(1).max(500);
19
+ var HashSchema = z.string().regex(/^[a-f0-9]{64}$/);
20
+ var TimestampSchema = z.string().datetime({ offset: true });
21
+ var TrainingInputArtifactUploadSchema = z.object({
22
+ schemaVersion: z.literal("openpond.trainingInputArtifactUpload.v2"),
23
+ kind: z.enum(["portable_training_bundle", "reward_model_dataset"]),
24
+ idempotencyKey: z.string().trim().min(1).max(500),
25
+ sourceManifest: ModelProjectImmutableRefSchema,
26
+ payload: z.unknown(),
27
+ contentHash: HashSchema
28
+ }).strict();
29
+ var TrainingInputArtifactSchema = z.object({
30
+ schemaVersion: z.literal("openpond.trainingInputArtifact.v2"),
31
+ kind: z.enum(["portable_training_bundle", "reward_model_dataset"]),
32
+ sourceManifest: ModelProjectImmutableRefSchema,
33
+ artifactRef: z.string().trim().min(1).max(2e3),
34
+ contentHash: HashSchema,
35
+ sizeBytes: z.number().int().positive(),
36
+ createdAt: TimestampSchema
37
+ }).strict();
38
+ async function trainingInputArtifactUploadHash(upload) {
39
+ const { contentHash: _contentHash, ...content } = upload;
40
+ return canonicalSha256(content);
41
+ }
42
+ async function parseAndVerifyTrainingInputArtifactUpload(value) {
43
+ assertCanonicalPayloadSize(
44
+ value,
45
+ TRAINING_INPUT_ARTIFACT_MAX_BYTES,
46
+ "Training input artifact"
47
+ );
48
+ const parsed = TrainingInputArtifactUploadSchema.parse(value);
49
+ const expectedHash = await trainingInputArtifactUploadHash(parsed);
50
+ if (parsed.contentHash !== expectedHash) {
51
+ throw new OpenPondProtocolError(
52
+ "content_hash_mismatch",
53
+ `Training input artifact contentHash ${parsed.contentHash} does not match ${expectedHash}.`
54
+ );
55
+ }
56
+ return parsed;
57
+ }
58
+ var TrainingJobKindSchema = z.enum([
59
+ "reward_model_train",
60
+ "policy_optimize"
61
+ ]);
62
+ var TrainingJobStateSchema = z.enum([
63
+ "queued",
64
+ "admitting",
65
+ "provisioning",
66
+ "running",
67
+ "stopping",
68
+ "cancelling",
69
+ "succeeded",
70
+ "failed",
71
+ "cancelled"
72
+ ]);
73
+ var TrainingCapabilityRequirementSchema = z.object({
74
+ id: IdSchema,
75
+ version: z.string().trim().min(1).max(200).nullable().default(null),
76
+ required: z.boolean().default(true)
77
+ }).strict();
78
+ var TrainingJobSourceSchema = z.object({
79
+ modelProject: z.object({
80
+ id: IdSchema,
81
+ portableProjectId: IdSchema,
82
+ revision: z.number().int().positive(),
83
+ contentHash: HashSchema
84
+ }).strict(),
85
+ harnessRunManifest: ModelProjectImmutableRefSchema,
86
+ harnessRelease: ModelProjectImmutableRefSchema,
87
+ taskset: ModelProjectVersionedRefSchema,
88
+ tasksetRelease: ModelProjectImmutableRefSchema,
89
+ dataset: ModelProjectImmutableRefSchema,
90
+ evidenceSets: z.array(ModelProjectImmutableRefSchema).max(1e4)
91
+ }).strict();
92
+ var RewardModelTrainingRequestSchema = z.object({
93
+ kind: z.literal("reward_model_train"),
94
+ baseModel: ModelProjectBaseModelSchema,
95
+ preferenceDatasetRelease: ModelProjectImmutableRefSchema,
96
+ processorRelease: ModelProjectImmutableRefSchema,
97
+ recipe: z.object({
98
+ schemaVersion: z.literal("openpond.rewardModelRecipe.v1"),
99
+ method: z.literal("reward_model"),
100
+ parameterization: z.literal("lora_with_scalar_head")
101
+ }).catchall(z.unknown())
102
+ }).strict();
103
+ var DeterministicRewardSourceSchema = z.object({
104
+ kind: z.literal("deterministic"),
105
+ grader: ModelProjectImmutableRefSchema,
106
+ composer: ModelProjectImmutableRefSchema.nullable().default(null)
107
+ }).strict();
108
+ var LearnedRewardSourceSchema = z.object({
109
+ kind: z.literal("learned_reward"),
110
+ rewardModelVersion: ModelProjectImmutableRefSchema,
111
+ qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),
112
+ evaluationReferences: z.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
113
+ scorerArtifact: z.object({
114
+ artifactRef: z.string().trim().min(1).max(2e3),
115
+ contentHash: HashSchema,
116
+ executionReceipt: ModelProjectImmutableRefSchema
117
+ }).strict(),
118
+ processorRelease: ModelProjectImmutableRefSchema,
119
+ rewardComposerRelease: ModelProjectImmutableRefSchema
120
+ }).strict();
121
+ var PolicyOptimizationRequestSchema = z.object({
122
+ kind: z.literal("policy_optimize"),
123
+ baseModel: ModelProjectBaseModelSchema,
124
+ recipe: ModelProjectRecipeDocumentSchema,
125
+ rewardSource: z.discriminatedUnion("kind", [
126
+ DeterministicRewardSourceSchema,
127
+ LearnedRewardSourceSchema
128
+ ]),
129
+ resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null)
130
+ }).strict();
131
+ var TrainingJobRequestSchema = z.discriminatedUnion("kind", [
132
+ RewardModelTrainingRequestSchema,
133
+ PolicyOptimizationRequestSchema
134
+ ]);
135
+ var TrainingJobApprovalSchema = z.object({
136
+ approvalHash: HashSchema,
137
+ approvedAt: TimestampSchema,
138
+ exportApproved: z.boolean(),
139
+ maximumSpendUsd: z.number().nonnegative(),
140
+ retentionDays: z.number().int().nonnegative().nullable(),
141
+ region: z.string().trim().min(1).max(200).nullable().default(null)
142
+ }).strict();
143
+ var TrainingJobSubmissionSchema = z.object({
144
+ schemaVersion: z.literal("openpond.trainingJobSubmission.v2"),
145
+ idempotencyKey: z.string().trim().min(1).max(500),
146
+ name: z.string().trim().min(1).max(200),
147
+ source: TrainingJobSourceSchema,
148
+ job: TrainingJobRequestSchema,
149
+ requestedCapabilities: z.array(TrainingCapabilityRequirementSchema).max(1e3),
150
+ placementObjective: z.enum(["fast", "balanced", "economical"]),
151
+ budget: z.object({
152
+ maximumSpendUsd: z.number().nonnegative(),
153
+ maximumWallSeconds: z.number().int().positive()
154
+ }).strict(),
155
+ approval: TrainingJobApprovalSchema,
156
+ contentHash: HashSchema
157
+ }).strict().superRefine((submission, context) => {
158
+ if (submission.approval.maximumSpendUsd !== submission.budget.maximumSpendUsd) {
159
+ context.addIssue({
160
+ code: "custom",
161
+ path: ["approval", "maximumSpendUsd"],
162
+ message: "Approved spend must equal the immutable Job budget."
163
+ });
164
+ }
165
+ });
166
+ async function trainingJobSubmissionHash(submission) {
167
+ const { contentHash: _contentHash, ...content } = submission;
168
+ return canonicalSha256(content);
169
+ }
170
+ async function parseAndVerifyTrainingJobSubmission(value) {
171
+ assertCanonicalPayloadSize(
172
+ value,
173
+ TRAINING_JOB_SUBMISSION_MAX_BYTES,
174
+ "Training Job submission"
175
+ );
176
+ const parsed = TrainingJobSubmissionSchema.parse(value);
177
+ const expectedHash = await trainingJobSubmissionHash(parsed);
178
+ if (parsed.contentHash !== expectedHash) {
179
+ throw new OpenPondProtocolError(
180
+ "content_hash_mismatch",
181
+ `Training Job contentHash ${parsed.contentHash} does not match ${expectedHash}.`
182
+ );
183
+ }
184
+ return parsed;
185
+ }
186
+ var TrainingJobSchema = z.object({
187
+ schemaVersion: z.literal("openpond.trainingJob.v2"),
188
+ id: IdSchema,
189
+ teamId: IdSchema,
190
+ kind: TrainingJobKindSchema,
191
+ modelProjectId: IdSchema,
192
+ portableProjectId: IdSchema,
193
+ sourceProjectRevision: z.number().int().positive(),
194
+ submissionHash: HashSchema,
195
+ state: TrainingJobStateSchema,
196
+ phase: z.string().trim().min(1).max(200),
197
+ version: z.number().int().nonnegative(),
198
+ progress: z.number().min(0).max(1),
199
+ rolloutProgress: z.object({
200
+ groupsCompleted: z.number().int().nonnegative(),
201
+ groupsTarget: z.number().int().nonnegative(),
202
+ optimizerUpdatesApplied: z.number().int().nonnegative(),
203
+ optimizerUpdatesSkipped: z.number().int().nonnegative()
204
+ }).strict(),
205
+ accruedSpendUsd: z.number().nonnegative(),
206
+ terminalReason: z.string().trim().min(1).max(5e3).nullable(),
207
+ createdAt: TimestampSchema,
208
+ updatedAt: TimestampSchema,
209
+ completedAt: TimestampSchema.nullable()
210
+ }).strict();
211
+ var TrainingJobPageSchema = z.object({
212
+ schemaVersion: z.literal("openpond.trainingJobPage.v2"),
213
+ jobs: z.array(TrainingJobSchema).max(1e3),
214
+ nextCursor: z.string().trim().min(1).max(2e3).nullable()
215
+ }).strict();
216
+ var TrainingJobEventSchema = z.object({
217
+ schemaVersion: z.literal("openpond.trainingJobEvent.v2"),
218
+ id: IdSchema,
219
+ jobId: IdSchema,
220
+ sequence: z.number().int().nonnegative(),
221
+ type: IdSchema,
222
+ phase: z.string().trim().min(1).max(200),
223
+ message: z.string().trim().min(1).max(5e3).nullable(),
224
+ data: z.record(z.string(), z.unknown()).default({}),
225
+ createdAt: TimestampSchema
226
+ }).strict();
227
+ var TrainingJobLogSchema = z.object({
228
+ schemaVersion: z.literal("openpond.trainingJobLog.v2"),
229
+ jobId: IdSchema,
230
+ sequence: z.number().int().nonnegative(),
231
+ level: z.enum(["debug", "info", "warning", "error"]),
232
+ message: z.string().max(2e4),
233
+ createdAt: TimestampSchema
234
+ }).strict();
235
+ var TrainingJobControlRequestSchema = z.object({ expectedVersion: z.number().int().nonnegative() }).strict();
236
+ var TrainingJobOutputSchema = z.object({
237
+ schemaVersion: z.literal("openpond.trainingJobOutput.v2"),
238
+ id: IdSchema,
239
+ jobId: IdSchema,
240
+ kind: z.enum([
241
+ "checkpoint",
242
+ "adapter",
243
+ "scorer",
244
+ "metrics",
245
+ "evaluation",
246
+ "trace",
247
+ "receipt"
248
+ ]),
249
+ artifactRef: z.string().trim().min(1).max(2e3),
250
+ contentHash: HashSchema,
251
+ sizeBytes: z.number().int().nonnegative(),
252
+ metadata: z.record(z.string(), z.unknown()).default({}),
253
+ createdAt: TimestampSchema
254
+ }).strict();
255
+ var TrainingExecutionReceiptSchema = z.object({
256
+ schemaVersion: z.literal("openpond.trainingExecutionReceipt.v2"),
257
+ id: IdSchema,
258
+ teamId: IdSchema,
259
+ jobId: IdSchema,
260
+ submissionHash: HashSchema,
261
+ manifestHash: HashSchema,
262
+ recipeHash: HashSchema,
263
+ capabilityHash: HashSchema,
264
+ runtimeRelease: ModelProjectImmutableRefSchema,
265
+ inputs: z.array(ModelProjectImmutableRefSchema).max(1e4),
266
+ outputs: z.array(ModelProjectImmutableRefSchema).max(1e4),
267
+ spendUsd: z.number().nonnegative(),
268
+ durationSeconds: z.number().nonnegative(),
269
+ cleanupComplete: z.boolean(),
270
+ issuer: IdSchema,
271
+ issuedAt: TimestampSchema,
272
+ signature: z.string().trim().min(1).max(1e4).nullable()
273
+ }).strict();
274
+ async function trainingExecutionReceiptHash(receipt) {
275
+ return canonicalSha256(TrainingExecutionReceiptSchema.parse(receipt));
276
+ }
277
+ async function parseAndVerifyTrainingExecutionReceipt(value, expected) {
278
+ const receipt = TrainingExecutionReceiptSchema.parse(value);
279
+ const expectedId = IdSchema.parse(expected.id);
280
+ const expectedHash = HashSchema.parse(expected.contentHash);
281
+ const actualHash = await trainingExecutionReceiptHash(receipt);
282
+ if (receipt.id !== expectedId || actualHash !== expectedHash) {
283
+ throw new OpenPondProtocolError(
284
+ "execution_receipt_mismatch",
285
+ "The execution receipt identity or canonical content hash did not match."
286
+ );
287
+ }
288
+ if (expected.teamId !== void 0 && receipt.teamId !== IdSchema.parse(expected.teamId)) {
289
+ throw new OpenPondProtocolError(
290
+ "execution_receipt_team_mismatch",
291
+ "The execution receipt belongs to a different team."
292
+ );
293
+ }
294
+ if (expected.jobId !== void 0 && receipt.jobId !== IdSchema.parse(expected.jobId)) {
295
+ throw new OpenPondProtocolError(
296
+ "execution_receipt_job_mismatch",
297
+ "The execution receipt belongs to a different Training Job."
298
+ );
299
+ }
300
+ if ((expected.requireCleanup ?? true) && !receipt.cleanupComplete) {
301
+ throw new OpenPondProtocolError(
302
+ "execution_cleanup_incomplete",
303
+ "The execution receipt does not attest complete terminal cleanup."
304
+ );
305
+ }
306
+ return receipt;
307
+ }
308
+ var TrainingJobOutputsSchema = z.object({
309
+ schemaVersion: z.literal("openpond.trainingJobOutputs.v2"),
310
+ outputs: z.array(TrainingJobOutputSchema).max(1e4),
311
+ receipt: TrainingExecutionReceiptSchema.nullable()
312
+ }).strict();
313
+ var TrainingApiErrorSchema = z.object({
314
+ schemaVersion: z.literal("openpond.trainingApiError.v2"),
315
+ code: z.string().trim().min(1).max(200),
316
+ message: z.string().trim().min(1).max(5e3),
317
+ retryable: z.boolean().default(false),
318
+ requestId: z.string().trim().min(1).max(500).nullable().default(null),
319
+ details: z.record(z.string(), z.unknown()).default({})
320
+ }).strict();
321
+ var OpenPondTrainingApiError = class extends Error {
322
+ status;
323
+ code;
324
+ retryable;
325
+ requestId;
326
+ details;
327
+ constructor(status, error) {
328
+ super(error.message);
329
+ this.name = "OpenPondTrainingApiError";
330
+ this.status = status;
331
+ this.code = error.code;
332
+ this.retryable = error.retryable;
333
+ this.requestId = error.requestId;
334
+ this.details = error.details;
335
+ }
336
+ };
337
+ var TrainingCapabilitiesSchema = z.object({
338
+ schemaVersion: z.literal("openpond.trainingCapabilities.v2"),
339
+ capabilityHash: HashSchema,
340
+ jobKinds: z.array(TrainingJobKindSchema),
341
+ methods: z.array(z.string().trim().min(1).max(200)),
342
+ placements: z.array(
343
+ z.enum(["local", "remote", "colocated", "provider_native"])
344
+ ),
345
+ controls: z.object({
346
+ cancel: z.boolean(),
347
+ stopAfterGroup: z.boolean(),
348
+ resumeFromCheckpoint: z.boolean()
349
+ }).strict(),
350
+ limits: z.object({
351
+ maximumSpendUsd: z.number().nonnegative(),
352
+ maximumWallSeconds: z.number().int().positive(),
353
+ maximumArtifactBytes: z.number().int().positive()
354
+ }).strict(),
355
+ checkedAt: TimestampSchema,
356
+ expiresAt: TimestampSchema
357
+ }).strict();
358
+ function headersRecord(headers) {
359
+ const result = {};
360
+ new Headers(headers).forEach((value, key) => {
361
+ result[key] = value;
362
+ });
363
+ return result;
364
+ }
365
+ function createTrainingClient(input) {
366
+ const fetchImpl = input.fetch ?? fetch;
367
+ const baseUrl = input.baseUrl.replace(/\/$/, "");
368
+ async function request(pathname, init) {
369
+ const readOnly = init?.method === void 0 || init.method.toUpperCase() === "GET";
370
+ const maximumAttempts = readOnly ? 3 : 1;
371
+ for (let attempt = 1; attempt <= maximumAttempts; attempt += 1) {
372
+ let response;
373
+ try {
374
+ const configuredHeaders = typeof input.headers === "function" ? await input.headers() : input.headers ?? {};
375
+ response = await fetchImpl(`${baseUrl}${pathname}`, {
376
+ ...init,
377
+ headers: {
378
+ accept: OPENPOND_TRAINING_MEDIA_TYPE,
379
+ ...init?.body ? { "content-type": OPENPOND_TRAINING_MEDIA_TYPE } : {},
380
+ ...headersRecord(configuredHeaders),
381
+ ...headersRecord(init?.headers)
382
+ }
383
+ });
384
+ } catch (error2) {
385
+ if (attempt === maximumAttempts || init?.signal?.aborted || !trainingReadFailureIsRetryable(null, error2)) {
386
+ throw error2;
387
+ }
388
+ await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));
389
+ continue;
390
+ }
391
+ const body = parseBoundedJson(
392
+ await response.text(),
393
+ TRAINING_API_RESPONSE_MAX_BYTES,
394
+ "Training API response"
395
+ );
396
+ if (response.ok) return body;
397
+ const error = trainingApiError(body, response.status);
398
+ if (attempt === maximumAttempts || !trainingReadFailureIsRetryable(response.status, error)) {
399
+ throw error;
400
+ }
401
+ await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));
402
+ }
403
+ throw new OpenPondProtocolError(
404
+ "training_read_retry_exhausted",
405
+ "Training read retry loop exhausted without a response."
406
+ );
407
+ }
408
+ return {
409
+ async capabilities() {
410
+ return TrainingCapabilitiesSchema.parse(
411
+ unwrapObject(await request("/v1/training/capabilities"), "capabilities")
412
+ );
413
+ },
414
+ async stageArtifact(upload) {
415
+ const parsed = await parseAndVerifyTrainingInputArtifactUpload(upload);
416
+ return TrainingInputArtifactSchema.parse(
417
+ unwrapObject(
418
+ await request("/v1/training/artifacts", {
419
+ method: "POST",
420
+ body: JSON.stringify(parsed)
421
+ }),
422
+ "artifact"
423
+ )
424
+ );
425
+ },
426
+ async createJob(submission) {
427
+ const parsed = await parseAndVerifyTrainingJobSubmission(submission);
428
+ return TrainingJobSchema.parse(
429
+ unwrapObject(
430
+ await request("/v1/training/jobs", {
431
+ method: "POST",
432
+ body: JSON.stringify(parsed)
433
+ }),
434
+ "job"
435
+ )
436
+ );
437
+ },
438
+ async listJobs(options = {}) {
439
+ const parameters = new URLSearchParams();
440
+ if (options.modelProjectId) {
441
+ parameters.set("modelProjectId", IdSchema.parse(options.modelProjectId));
442
+ }
443
+ if (options.cursor) {
444
+ parameters.set("cursor", z.string().trim().min(1).max(2e3).parse(options.cursor));
445
+ }
446
+ if (options.limit !== void 0) {
447
+ parameters.set(
448
+ "limit",
449
+ String(z.number().int().min(1).max(1e3).parse(options.limit))
450
+ );
451
+ }
452
+ const query = parameters.size > 0 ? `?${parameters.toString()}` : "";
453
+ return TrainingJobPageSchema.parse(
454
+ await request(`/v1/training/jobs${query}`)
455
+ );
456
+ },
457
+ async getJob(jobId) {
458
+ return TrainingJobSchema.parse(
459
+ unwrapObject(
460
+ await request(`/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}`),
461
+ "job"
462
+ )
463
+ );
464
+ },
465
+ async cancelJob(jobId, expectedVersion) {
466
+ const control = TrainingJobControlRequestSchema.parse({ expectedVersion });
467
+ return TrainingJobSchema.parse(
468
+ unwrapObject(
469
+ await request(
470
+ `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/cancel`,
471
+ { method: "POST", body: JSON.stringify(control) }
472
+ ),
473
+ "job"
474
+ )
475
+ );
476
+ },
477
+ async stopAfterGroup(jobId, expectedVersion) {
478
+ const control = TrainingJobControlRequestSchema.parse({ expectedVersion });
479
+ return TrainingJobSchema.parse(
480
+ unwrapObject(
481
+ await request(
482
+ `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/stop-after-group`,
483
+ { method: "POST", body: JSON.stringify(control) }
484
+ ),
485
+ "job"
486
+ )
487
+ );
488
+ },
489
+ async events(jobId) {
490
+ return z.array(TrainingJobEventSchema).parse(
491
+ unwrapObject(
492
+ await request(
493
+ `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/events`
494
+ ),
495
+ "events"
496
+ )
497
+ );
498
+ },
499
+ async outputs(jobId) {
500
+ return TrainingJobOutputsSchema.parse(
501
+ await request(
502
+ `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/outputs`
503
+ )
504
+ );
505
+ },
506
+ async logs(jobId) {
507
+ return z.array(TrainingJobLogSchema).max(1e5).parse(
508
+ unwrapObject(
509
+ await request(
510
+ `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/logs`
511
+ ),
512
+ "logs"
513
+ )
514
+ );
515
+ }
516
+ };
517
+ }
518
+ function trainingReadFailureIsRetryable(status, error) {
519
+ if (status !== null) {
520
+ return status === 408 || status === 429 || status >= 500;
521
+ }
522
+ if (error instanceof OpenPondTrainingApiError) return error.retryable;
523
+ if (error instanceof OpenPondProtocolError) {
524
+ return error.code === "invalid_error_response";
525
+ }
526
+ return error instanceof TypeError;
527
+ }
528
+ function unwrapObject(value, key) {
529
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
530
+ return key in value ? value[key] : value;
531
+ }
532
+ function trainingApiError(value, status) {
533
+ const parsed = TrainingApiErrorSchema.safeParse(value);
534
+ if (parsed.success) {
535
+ return new OpenPondTrainingApiError(status, parsed.data);
536
+ }
537
+ return new OpenPondProtocolError(
538
+ "invalid_error_response",
539
+ `Training request failed with HTTP ${status} and an invalid error envelope.`
540
+ );
541
+ }
542
+
543
+ export {
544
+ TrainingInputArtifactUploadSchema,
545
+ TrainingInputArtifactSchema,
546
+ trainingInputArtifactUploadHash,
547
+ parseAndVerifyTrainingInputArtifactUpload,
548
+ TrainingJobKindSchema,
549
+ TrainingJobStateSchema,
550
+ TrainingCapabilityRequirementSchema,
551
+ TrainingJobSourceSchema,
552
+ RewardModelTrainingRequestSchema,
553
+ PolicyOptimizationRequestSchema,
554
+ TrainingJobRequestSchema,
555
+ TrainingJobApprovalSchema,
556
+ TrainingJobSubmissionSchema,
557
+ trainingJobSubmissionHash,
558
+ parseAndVerifyTrainingJobSubmission,
559
+ TrainingJobSchema,
560
+ TrainingJobPageSchema,
561
+ TrainingJobEventSchema,
562
+ TrainingJobLogSchema,
563
+ TrainingJobControlRequestSchema,
564
+ TrainingJobOutputSchema,
565
+ TrainingExecutionReceiptSchema,
566
+ trainingExecutionReceiptHash,
567
+ parseAndVerifyTrainingExecutionReceipt,
568
+ TrainingJobOutputsSchema,
569
+ TrainingApiErrorSchema,
570
+ OpenPondTrainingApiError,
571
+ TrainingCapabilitiesSchema,
572
+ createTrainingClient
573
+ };
574
+ //# sourceMappingURL=chunk-AVW35YOH.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/training.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n ModelProjectBaseModelSchema,\n ModelProjectImmutableRefSchema,\n ModelProjectRecipeDocumentSchema,\n ModelProjectVersionedRefSchema,\n} from \"./model-projects.js\";\nimport {\n OPENPOND_TRAINING_MEDIA_TYPE,\n TRAINING_API_RESPONSE_MAX_BYTES,\n TRAINING_INPUT_ARTIFACT_MAX_BYTES,\n TRAINING_JOB_SUBMISSION_MAX_BYTES,\n OpenPondProtocolError,\n assertCanonicalPayloadSize,\n canonicalSha256,\n parseBoundedJson,\n} from \"./protocol.js\";\n\nexport {\n OPENPOND_TRAINING_MEDIA_TYPE,\n OPENPOND_TRAINING_PROTOCOL_MAJOR,\n TRAINING_API_RESPONSE_MAX_BYTES,\n TRAINING_INPUT_ARTIFACT_MAX_BYTES,\n TRAINING_JOB_SUBMISSION_MAX_BYTES,\n OpenPondProtocolError,\n assertCanonicalPayloadSize,\n canonicalJson,\n canonicalJsonByteLength,\n canonicalSha256,\n parseBoundedJson,\n} from \"./protocol.js\";\n\nconst IdSchema = z.string().trim().min(1).max(500);\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nconst TimestampSchema = z.string().datetime({ offset: true });\n\n/**\n * Stages a content-addressed immutable input before Job admission. The payload\n * is deliberately opaque to the transport contract: its declared kind owns\n * the executable schema, while the envelope provides bounded bytes,\n * idempotency, and a stable manifest lookup key.\n */\nexport const TrainingInputArtifactUploadSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingInputArtifactUpload.v2\"),\n kind: z.enum([\"portable_training_bundle\", \"reward_model_dataset\"]),\n idempotencyKey: z.string().trim().min(1).max(500),\n sourceManifest: ModelProjectImmutableRefSchema,\n payload: z.unknown(),\n contentHash: HashSchema,\n })\n .strict();\n\nexport const TrainingInputArtifactSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingInputArtifact.v2\"),\n kind: z.enum([\"portable_training_bundle\", \"reward_model_dataset\"]),\n sourceManifest: ModelProjectImmutableRefSchema,\n artifactRef: z.string().trim().min(1).max(2_000),\n contentHash: HashSchema,\n sizeBytes: z.number().int().positive(),\n createdAt: TimestampSchema,\n })\n .strict();\n\nexport async function trainingInputArtifactUploadHash(\n upload: Omit<TrainingInputArtifactUpload, \"contentHash\"> | TrainingInputArtifactUpload,\n): Promise<string> {\n const { contentHash: _contentHash, ...content } = upload as TrainingInputArtifactUpload;\n return canonicalSha256(content);\n}\n\nexport async function parseAndVerifyTrainingInputArtifactUpload(\n value: unknown,\n): Promise<TrainingInputArtifactUpload> {\n assertCanonicalPayloadSize(\n value,\n TRAINING_INPUT_ARTIFACT_MAX_BYTES,\n \"Training input artifact\",\n );\n const parsed = TrainingInputArtifactUploadSchema.parse(value);\n const expectedHash = await trainingInputArtifactUploadHash(parsed);\n if (parsed.contentHash !== expectedHash) {\n throw new OpenPondProtocolError(\n \"content_hash_mismatch\",\n `Training input artifact contentHash ${parsed.contentHash} does not match ${expectedHash}.`,\n );\n }\n return parsed;\n}\n\nexport const TrainingJobKindSchema = z.enum([\n \"reward_model_train\",\n \"policy_optimize\",\n]);\n\nexport const TrainingJobStateSchema = z.enum([\n \"queued\",\n \"admitting\",\n \"provisioning\",\n \"running\",\n \"stopping\",\n \"cancelling\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n]);\n\nexport const TrainingCapabilityRequirementSchema = z\n .object({\n id: IdSchema,\n version: z.string().trim().min(1).max(200).nullable().default(null),\n required: z.boolean().default(true),\n })\n .strict();\n\nexport const TrainingJobSourceSchema = z\n .object({\n modelProject: z\n .object({\n id: IdSchema,\n portableProjectId: IdSchema,\n revision: z.number().int().positive(),\n contentHash: HashSchema,\n })\n .strict(),\n harnessRunManifest: ModelProjectImmutableRefSchema,\n harnessRelease: ModelProjectImmutableRefSchema,\n taskset: ModelProjectVersionedRefSchema,\n tasksetRelease: ModelProjectImmutableRefSchema,\n dataset: ModelProjectImmutableRefSchema,\n evidenceSets: z.array(ModelProjectImmutableRefSchema).max(10_000),\n })\n .strict();\n\nexport const RewardModelTrainingRequestSchema = z\n .object({\n kind: z.literal(\"reward_model_train\"),\n baseModel: ModelProjectBaseModelSchema,\n preferenceDatasetRelease: ModelProjectImmutableRefSchema,\n processorRelease: ModelProjectImmutableRefSchema,\n recipe: z\n .object({\n schemaVersion: z.literal(\"openpond.rewardModelRecipe.v1\"),\n method: z.literal(\"reward_model\"),\n parameterization: z.literal(\"lora_with_scalar_head\"),\n })\n .catchall(z.unknown()),\n })\n .strict();\n\nconst DeterministicRewardSourceSchema = z\n .object({\n kind: z.literal(\"deterministic\"),\n grader: ModelProjectImmutableRefSchema,\n composer: ModelProjectImmutableRefSchema.nullable().default(null),\n })\n .strict();\n\nconst LearnedRewardSourceSchema = z\n .object({\n kind: z.literal(\"learned_reward\"),\n rewardModelVersion: ModelProjectImmutableRefSchema,\n qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),\n evaluationReferences: z\n .array(ModelProjectImmutableRefSchema)\n .max(1_000)\n .default([]),\n scorerArtifact: z\n .object({\n artifactRef: z.string().trim().min(1).max(2_000),\n contentHash: HashSchema,\n executionReceipt: ModelProjectImmutableRefSchema,\n })\n .strict(),\n processorRelease: ModelProjectImmutableRefSchema,\n rewardComposerRelease: ModelProjectImmutableRefSchema,\n })\n .strict();\n\nexport const PolicyOptimizationRequestSchema = z\n .object({\n kind: z.literal(\"policy_optimize\"),\n baseModel: ModelProjectBaseModelSchema,\n recipe: ModelProjectRecipeDocumentSchema,\n rewardSource: z.discriminatedUnion(\"kind\", [\n DeterministicRewardSourceSchema,\n LearnedRewardSourceSchema,\n ]),\n resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null),\n })\n .strict();\n\nexport const TrainingJobRequestSchema = z.discriminatedUnion(\"kind\", [\n RewardModelTrainingRequestSchema,\n PolicyOptimizationRequestSchema,\n]);\n\nexport const TrainingJobApprovalSchema = z\n .object({\n approvalHash: HashSchema,\n approvedAt: TimestampSchema,\n exportApproved: z.boolean(),\n maximumSpendUsd: z.number().nonnegative(),\n retentionDays: z.number().int().nonnegative().nullable(),\n region: z.string().trim().min(1).max(200).nullable().default(null),\n })\n .strict();\n\nexport const TrainingJobSubmissionSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingJobSubmission.v2\"),\n idempotencyKey: z.string().trim().min(1).max(500),\n name: z.string().trim().min(1).max(200),\n source: TrainingJobSourceSchema,\n job: TrainingJobRequestSchema,\n requestedCapabilities: z\n .array(TrainingCapabilityRequirementSchema)\n .max(1_000),\n placementObjective: z.enum([\"fast\", \"balanced\", \"economical\"]),\n budget: z\n .object({\n maximumSpendUsd: z.number().nonnegative(),\n maximumWallSeconds: z.number().int().positive(),\n })\n .strict(),\n approval: TrainingJobApprovalSchema,\n contentHash: HashSchema,\n })\n .strict()\n .superRefine((submission, context) => {\n if (submission.approval.maximumSpendUsd !== submission.budget.maximumSpendUsd) {\n context.addIssue({\n code: \"custom\",\n path: [\"approval\", \"maximumSpendUsd\"],\n message: \"Approved spend must equal the immutable Job budget.\",\n });\n }\n });\n\nexport async function trainingJobSubmissionHash(\n submission: Omit<TrainingJobSubmission, \"contentHash\"> | TrainingJobSubmission,\n): Promise<string> {\n const { contentHash: _contentHash, ...content } = submission as TrainingJobSubmission;\n return canonicalSha256(content);\n}\n\nexport async function parseAndVerifyTrainingJobSubmission(\n value: unknown,\n): Promise<TrainingJobSubmission> {\n assertCanonicalPayloadSize(\n value,\n TRAINING_JOB_SUBMISSION_MAX_BYTES,\n \"Training Job submission\",\n );\n const parsed = TrainingJobSubmissionSchema.parse(value);\n const expectedHash = await trainingJobSubmissionHash(parsed);\n if (parsed.contentHash !== expectedHash) {\n throw new OpenPondProtocolError(\n \"content_hash_mismatch\",\n `Training Job contentHash ${parsed.contentHash} does not match ${expectedHash}.`,\n );\n }\n return parsed;\n}\n\nexport const TrainingJobSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingJob.v2\"),\n id: IdSchema,\n teamId: IdSchema,\n kind: TrainingJobKindSchema,\n modelProjectId: IdSchema,\n portableProjectId: IdSchema,\n sourceProjectRevision: z.number().int().positive(),\n submissionHash: HashSchema,\n state: TrainingJobStateSchema,\n phase: z.string().trim().min(1).max(200),\n version: z.number().int().nonnegative(),\n progress: z.number().min(0).max(1),\n rolloutProgress: z\n .object({\n groupsCompleted: z.number().int().nonnegative(),\n groupsTarget: z.number().int().nonnegative(),\n optimizerUpdatesApplied: z.number().int().nonnegative(),\n optimizerUpdatesSkipped: z.number().int().nonnegative(),\n })\n .strict(),\n accruedSpendUsd: z.number().nonnegative(),\n terminalReason: z.string().trim().min(1).max(5_000).nullable(),\n createdAt: TimestampSchema,\n updatedAt: TimestampSchema,\n completedAt: TimestampSchema.nullable(),\n })\n .strict();\n\nexport const TrainingJobPageSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingJobPage.v2\"),\n jobs: z.array(TrainingJobSchema).max(1_000),\n nextCursor: z.string().trim().min(1).max(2_000).nullable(),\n })\n .strict();\n\nexport const TrainingJobEventSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingJobEvent.v2\"),\n id: IdSchema,\n jobId: IdSchema,\n sequence: z.number().int().nonnegative(),\n type: IdSchema,\n phase: z.string().trim().min(1).max(200),\n message: z.string().trim().min(1).max(5_000).nullable(),\n data: z.record(z.string(), z.unknown()).default({}),\n createdAt: TimestampSchema,\n })\n .strict();\n\nexport const TrainingJobLogSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingJobLog.v2\"),\n jobId: IdSchema,\n sequence: z.number().int().nonnegative(),\n level: z.enum([\"debug\", \"info\", \"warning\", \"error\"]),\n message: z.string().max(20_000),\n createdAt: TimestampSchema,\n })\n .strict();\n\nexport const TrainingJobControlRequestSchema = z\n .object({ expectedVersion: z.number().int().nonnegative() })\n .strict();\n\nexport const TrainingJobOutputSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingJobOutput.v2\"),\n id: IdSchema,\n jobId: IdSchema,\n kind: z.enum([\n \"checkpoint\",\n \"adapter\",\n \"scorer\",\n \"metrics\",\n \"evaluation\",\n \"trace\",\n \"receipt\",\n ]),\n artifactRef: z.string().trim().min(1).max(2_000),\n contentHash: HashSchema,\n sizeBytes: z.number().int().nonnegative(),\n metadata: z.record(z.string(), z.unknown()).default({}),\n createdAt: TimestampSchema,\n })\n .strict();\n\nexport const TrainingExecutionReceiptSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingExecutionReceipt.v2\"),\n id: IdSchema,\n teamId: IdSchema,\n jobId: IdSchema,\n submissionHash: HashSchema,\n manifestHash: HashSchema,\n recipeHash: HashSchema,\n capabilityHash: HashSchema,\n runtimeRelease: ModelProjectImmutableRefSchema,\n inputs: z.array(ModelProjectImmutableRefSchema).max(10_000),\n outputs: z.array(ModelProjectImmutableRefSchema).max(10_000),\n spendUsd: z.number().nonnegative(),\n durationSeconds: z.number().nonnegative(),\n cleanupComplete: z.boolean(),\n issuer: IdSchema,\n issuedAt: TimestampSchema,\n signature: z.string().trim().min(1).max(10_000).nullable(),\n })\n .strict();\n\nexport async function trainingExecutionReceiptHash(\n receipt: TrainingExecutionReceipt,\n): Promise<string> {\n return canonicalSha256(TrainingExecutionReceiptSchema.parse(receipt));\n}\n\nexport async function parseAndVerifyTrainingExecutionReceipt(\n value: unknown,\n expected: {\n id: string;\n contentHash: string;\n teamId?: string;\n jobId?: string;\n requireCleanup?: boolean;\n },\n): Promise<TrainingExecutionReceipt> {\n const receipt = TrainingExecutionReceiptSchema.parse(value);\n const expectedId = IdSchema.parse(expected.id);\n const expectedHash = HashSchema.parse(expected.contentHash);\n const actualHash = await trainingExecutionReceiptHash(receipt);\n if (receipt.id !== expectedId || actualHash !== expectedHash) {\n throw new OpenPondProtocolError(\n \"execution_receipt_mismatch\",\n \"The execution receipt identity or canonical content hash did not match.\",\n );\n }\n if (expected.teamId !== undefined && receipt.teamId !== IdSchema.parse(expected.teamId)) {\n throw new OpenPondProtocolError(\n \"execution_receipt_team_mismatch\",\n \"The execution receipt belongs to a different team.\",\n );\n }\n if (expected.jobId !== undefined && receipt.jobId !== IdSchema.parse(expected.jobId)) {\n throw new OpenPondProtocolError(\n \"execution_receipt_job_mismatch\",\n \"The execution receipt belongs to a different Training Job.\",\n );\n }\n if ((expected.requireCleanup ?? true) && !receipt.cleanupComplete) {\n throw new OpenPondProtocolError(\n \"execution_cleanup_incomplete\",\n \"The execution receipt does not attest complete terminal cleanup.\",\n );\n }\n return receipt;\n}\n\nexport const TrainingJobOutputsSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingJobOutputs.v2\"),\n outputs: z.array(TrainingJobOutputSchema).max(10_000),\n receipt: TrainingExecutionReceiptSchema.nullable(),\n })\n .strict();\n\nexport const TrainingApiErrorSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingApiError.v2\"),\n code: z.string().trim().min(1).max(200),\n message: z.string().trim().min(1).max(5_000),\n retryable: z.boolean().default(false),\n requestId: z.string().trim().min(1).max(500).nullable().default(null),\n details: z.record(z.string(), z.unknown()).default({}),\n })\n .strict();\n\nexport class OpenPondTrainingApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly retryable: boolean;\n readonly requestId: string | null;\n readonly details: Record<string, unknown>;\n\n constructor(status: number, error: z.infer<typeof TrainingApiErrorSchema>) {\n super(error.message);\n this.name = \"OpenPondTrainingApiError\";\n this.status = status;\n this.code = error.code;\n this.retryable = error.retryable;\n this.requestId = error.requestId;\n this.details = error.details;\n }\n}\n\nexport const TrainingCapabilitiesSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.trainingCapabilities.v2\"),\n capabilityHash: HashSchema,\n jobKinds: z.array(TrainingJobKindSchema),\n methods: z.array(z.string().trim().min(1).max(200)),\n placements: z.array(\n z.enum([\"local\", \"remote\", \"colocated\", \"provider_native\"]),\n ),\n controls: z\n .object({\n cancel: z.boolean(),\n stopAfterGroup: z.boolean(),\n resumeFromCheckpoint: z.boolean(),\n })\n .strict(),\n limits: z\n .object({\n maximumSpendUsd: z.number().nonnegative(),\n maximumWallSeconds: z.number().int().positive(),\n maximumArtifactBytes: z.number().int().positive(),\n })\n .strict(),\n checkedAt: TimestampSchema,\n expiresAt: TimestampSchema,\n })\n .strict();\n\nexport type TrainingJobSubmission = z.infer<\n typeof TrainingJobSubmissionSchema\n>;\nexport type TrainingInputArtifactUpload = z.infer<\n typeof TrainingInputArtifactUploadSchema\n>;\nexport type TrainingInputArtifact = z.infer<typeof TrainingInputArtifactSchema>;\nexport type TrainingJob = z.infer<typeof TrainingJobSchema>;\nexport type TrainingJobPage = z.infer<typeof TrainingJobPageSchema>;\nexport type TrainingJobEvent = z.infer<typeof TrainingJobEventSchema>;\nexport type TrainingJobLog = z.infer<typeof TrainingJobLogSchema>;\nexport type TrainingJobOutput = z.infer<typeof TrainingJobOutputSchema>;\nexport type TrainingJobOutputs = z.infer<typeof TrainingJobOutputsSchema>;\nexport type TrainingExecutionReceipt = z.infer<\n typeof TrainingExecutionReceiptSchema\n>;\nexport type TrainingCapabilities = z.infer<typeof TrainingCapabilitiesSchema>;\n\nfunction headersRecord(headers: HeadersInit | undefined): Record<string, string> {\n const result: Record<string, string> = {};\n new Headers(headers).forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nexport function createTrainingClient(input: {\n baseUrl: string;\n fetch?: typeof fetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n}) {\n const fetchImpl = input.fetch ?? fetch;\n const baseUrl = input.baseUrl.replace(/\\/$/, \"\");\n\n async function request(pathname: string, init?: RequestInit): Promise<unknown> {\n const readOnly = init?.method === undefined || init.method.toUpperCase() === \"GET\";\n const maximumAttempts = readOnly ? 3 : 1;\n for (let attempt = 1; attempt <= maximumAttempts; attempt += 1) {\n let response: Response;\n try {\n const configuredHeaders =\n typeof input.headers === \"function\"\n ? await input.headers()\n : (input.headers ?? {});\n response = await fetchImpl(`${baseUrl}${pathname}`, {\n ...init,\n headers: {\n accept: OPENPOND_TRAINING_MEDIA_TYPE,\n ...(init?.body ? { \"content-type\": OPENPOND_TRAINING_MEDIA_TYPE } : {}),\n ...headersRecord(configuredHeaders),\n ...headersRecord(init?.headers),\n },\n });\n } catch (error) {\n if (\n attempt === maximumAttempts ||\n init?.signal?.aborted ||\n !trainingReadFailureIsRetryable(null, error)\n ) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));\n continue;\n }\n const body = parseBoundedJson(\n await response.text(),\n TRAINING_API_RESPONSE_MAX_BYTES,\n \"Training API response\",\n );\n if (response.ok) return body;\n const error = trainingApiError(body, response.status);\n if (\n attempt === maximumAttempts ||\n !trainingReadFailureIsRetryable(response.status, error)\n ) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));\n }\n throw new OpenPondProtocolError(\n \"training_read_retry_exhausted\",\n \"Training read retry loop exhausted without a response.\",\n );\n }\n\n return {\n async capabilities() {\n return TrainingCapabilitiesSchema.parse(\n unwrapObject(await request(\"/v1/training/capabilities\"), \"capabilities\"),\n );\n },\n async stageArtifact(upload: TrainingInputArtifactUpload) {\n const parsed = await parseAndVerifyTrainingInputArtifactUpload(upload);\n return TrainingInputArtifactSchema.parse(\n unwrapObject(\n await request(\"/v1/training/artifacts\", {\n method: \"POST\",\n body: JSON.stringify(parsed),\n }),\n \"artifact\",\n ),\n );\n },\n async createJob(submission: TrainingJobSubmission) {\n const parsed = await parseAndVerifyTrainingJobSubmission(submission);\n return TrainingJobSchema.parse(\n unwrapObject(\n await request(\"/v1/training/jobs\", {\n method: \"POST\",\n body: JSON.stringify(parsed),\n }),\n \"job\",\n ),\n );\n },\n async listJobs(options: {\n modelProjectId?: string;\n cursor?: string;\n limit?: number;\n } = {}) {\n const parameters = new URLSearchParams();\n if (options.modelProjectId) {\n parameters.set(\"modelProjectId\", IdSchema.parse(options.modelProjectId));\n }\n if (options.cursor) {\n parameters.set(\"cursor\", z.string().trim().min(1).max(2_000).parse(options.cursor));\n }\n if (options.limit !== undefined) {\n parameters.set(\n \"limit\",\n String(z.number().int().min(1).max(1_000).parse(options.limit)),\n );\n }\n const query = parameters.size > 0 ? `?${parameters.toString()}` : \"\";\n return TrainingJobPageSchema.parse(\n await request(`/v1/training/jobs${query}`),\n );\n },\n async getJob(jobId: string) {\n return TrainingJobSchema.parse(\n unwrapObject(\n await request(`/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}`),\n \"job\",\n ),\n );\n },\n async cancelJob(jobId: string, expectedVersion: number) {\n const control = TrainingJobControlRequestSchema.parse({ expectedVersion });\n return TrainingJobSchema.parse(\n unwrapObject(\n await request(\n `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/cancel`,\n { method: \"POST\", body: JSON.stringify(control) },\n ),\n \"job\",\n ),\n );\n },\n async stopAfterGroup(jobId: string, expectedVersion: number) {\n const control = TrainingJobControlRequestSchema.parse({ expectedVersion });\n return TrainingJobSchema.parse(\n unwrapObject(\n await request(\n `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/stop-after-group`,\n { method: \"POST\", body: JSON.stringify(control) },\n ),\n \"job\",\n ),\n );\n },\n async events(jobId: string) {\n return z\n .array(TrainingJobEventSchema)\n .parse(\n unwrapObject(\n await request(\n `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/events`,\n ),\n \"events\",\n ),\n );\n },\n async outputs(jobId: string) {\n return TrainingJobOutputsSchema.parse(\n await request(\n `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/outputs`,\n ),\n );\n },\n async logs(jobId: string) {\n return z.array(TrainingJobLogSchema).max(100_000).parse(\n unwrapObject(\n await request(\n `/v1/training/jobs/${encodeURIComponent(IdSchema.parse(jobId))}/logs`,\n ),\n \"logs\",\n ),\n );\n },\n };\n}\n\nfunction trainingReadFailureIsRetryable(status: number | null, error: unknown): boolean {\n if (status !== null) {\n return status === 408 || status === 429 || status >= 500;\n }\n if (error instanceof OpenPondTrainingApiError) return error.retryable;\n if (error instanceof OpenPondProtocolError) {\n return error.code === \"invalid_error_response\";\n }\n return error instanceof TypeError;\n}\n\nfunction unwrapObject(value: unknown, key: string): unknown {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return value;\n return key in value ? (value as Record<string, unknown>)[key] : value;\n}\n\nfunction trainingApiError(value: unknown, status: number): Error {\n const parsed = TrainingApiErrorSchema.safeParse(value);\n if (parsed.success) {\n return new OpenPondTrainingApiError(status, parsed.data);\n }\n return new OpenPondProtocolError(\n \"invalid_error_response\",\n `Training request failed with HTTP ${status} and an invalid error envelope.`,\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["error"]
7
+ }