openpond-sdk 0.12.8 → 0.12.10

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 (146) hide show
  1. package/TRAINING_PROTOCOL.md +40 -0
  2. package/TRAINING_WORKFLOWS.md +44 -10
  3. package/dist/advanced-refiner-evaluations.js +8 -7
  4. package/dist/candidate-evaluations.js +7 -6
  5. package/dist/{chunk-MGFI4226.js → chunk-2DK7UBAG.js} +3 -3
  6. package/dist/{chunk-U4QIGSP5.js → chunk-4L556MYM.js} +3 -3
  7. package/dist/{chunk-MRUDFIB6.js → chunk-5QMREXMU.js} +6 -4
  8. package/dist/{chunk-MRUDFIB6.js.map → chunk-5QMREXMU.js.map} +1 -1
  9. package/dist/{chunk-UWM2ZPGS.js → chunk-7FYPFHCQ.js} +3 -3
  10. package/dist/{chunk-RFKZSSLB.js → chunk-7WKCQ4V5.js} +5 -3
  11. package/dist/{chunk-RFKZSSLB.js.map → chunk-7WKCQ4V5.js.map} +1 -1
  12. package/dist/chunk-B3ZHJ2KK.js +152 -0
  13. package/dist/chunk-B3ZHJ2KK.js.map +1 -0
  14. package/dist/{chunk-YSEYPMQ3.js → chunk-BQ2C2Y54.js} +12 -154
  15. package/dist/chunk-BQ2C2Y54.js.map +1 -0
  16. package/dist/{chunk-HYCHLMP7.js → chunk-DMN6EF3R.js} +2 -2
  17. package/dist/{chunk-QVLJFJBU.js → chunk-ESW25WSD.js} +6 -6
  18. package/dist/chunk-EZME7DV4.js +161 -0
  19. package/dist/chunk-EZME7DV4.js.map +1 -0
  20. package/dist/{chunk-UMK6DH75.js → chunk-FC56EMHT.js} +6 -4
  21. package/dist/{chunk-UMK6DH75.js.map → chunk-FC56EMHT.js.map} +1 -1
  22. package/dist/{chunk-YP5DXGGC.js → chunk-GIEST52U.js} +2 -2
  23. package/dist/{chunk-BWFG46HX.js → chunk-GRQWKATA.js} +2 -2
  24. package/dist/chunk-GX6KMHW2.js +108 -0
  25. package/dist/chunk-GX6KMHW2.js.map +1 -0
  26. package/dist/{chunk-WYR3MZHU.js → chunk-HDKP6KE2.js} +2 -2
  27. package/dist/{chunk-EEZ5YHJQ.js → chunk-ICFFZ4WC.js} +3 -3
  28. package/dist/{chunk-EWRWGFKD.js → chunk-IIQENUOK.js} +6 -4
  29. package/dist/{chunk-EWRWGFKD.js.map → chunk-IIQENUOK.js.map} +1 -1
  30. package/dist/{chunk-LUFOAMN5.js → chunk-LKKKTBLL.js} +2 -2
  31. package/dist/{chunk-CJDEVI3T.js → chunk-LT2YQCZI.js} +5 -3
  32. package/dist/{chunk-CJDEVI3T.js.map → chunk-LT2YQCZI.js.map} +1 -1
  33. package/dist/{chunk-QHCY4MBG.js → chunk-PKW3II5M.js} +2 -2
  34. package/dist/{chunk-XL44IXBO.js → chunk-PT72OARU.js} +5 -5
  35. package/dist/{chunk-TWJYL5YF.js → chunk-QQ444G6A.js} +5 -5
  36. package/dist/{chunk-D3WOJTUY.js → chunk-RYDUAY52.js} +4 -14
  37. package/dist/chunk-RYDUAY52.js.map +1 -0
  38. package/dist/chunk-U2KGUAIS.js +18 -0
  39. package/dist/chunk-U2KGUAIS.js.map +1 -0
  40. package/dist/{chunk-IOZCYSJ6.js → chunk-UAYXORU5.js} +2 -2
  41. package/dist/{chunk-TZREEZ4C.js → chunk-WEL535AI.js} +9 -9
  42. package/dist/{chunk-EYMZQML2.js → chunk-WOD72SFI.js} +525 -484
  43. package/dist/chunk-WOD72SFI.js.map +1 -0
  44. package/dist/{chunk-GGG6H4MK.js → chunk-XJKGCU2K.js} +2 -2
  45. package/dist/{chunk-GZSQIOAH.js → chunk-XNRM3QGR.js} +6 -6
  46. package/dist/{chunk-CZXN63A4.js → chunk-ZZZU6XER.js} +2 -2
  47. package/dist/connected-evidence.js +18 -15
  48. package/dist/dataset-workspaces.js +21 -18
  49. package/dist/dataset-workspaces.js.map +1 -1
  50. package/dist/errors.js +13 -0
  51. package/dist/errors.js.map +1 -0
  52. package/dist/experiment-evaluation-schedules.js +22 -19
  53. package/dist/experiment-improvements.js +9 -8
  54. package/dist/experiments.js +22 -19
  55. package/dist/index.js +63 -58
  56. package/dist/index.js.map +1 -1
  57. package/dist/learning.js +4 -2
  58. package/dist/learning.js.map +1 -1
  59. package/dist/model-projects.js +6 -4
  60. package/dist/model-starter-attempts.js +3 -2
  61. package/dist/model-starter-catalog.js +13 -10
  62. package/dist/model-starter-catalog.js.map +1 -1
  63. package/dist/model-starters.js +13 -10
  64. package/dist/model-taskset-runs.js +4 -3
  65. package/dist/model-taskset-runs.js.map +1 -1
  66. package/dist/post-training.js +7 -6
  67. package/dist/taskset-drafts.js +17 -14
  68. package/dist/taskset-drafts.js.map +1 -1
  69. package/dist/taskset-packages.js +24 -21
  70. package/dist/tool-learning-local-store.js +202 -0
  71. package/dist/tool-learning-local-store.js.map +1 -0
  72. package/dist/tool-learning.js +3 -0
  73. package/dist/tool-learning.js.map +1 -0
  74. package/dist/training-bundle.js +31 -16
  75. package/dist/training-bundle.js.map +1 -1
  76. package/dist/training-hardware.js +23 -0
  77. package/dist/training-hardware.js.map +1 -0
  78. package/dist/training.js +30 -12
  79. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +40 -40
  80. package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts +20 -20
  81. package/dist/types/packages/sdk/src/errors.d.ts +3 -0
  82. package/dist/types/packages/sdk/src/errors.d.ts.map +1 -0
  83. package/dist/types/packages/sdk/src/experiment-client.d.ts +636 -636
  84. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1622 -1622
  85. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +54 -54
  86. package/dist/types/packages/sdk/src/learning-client.d.ts +1 -6
  87. package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
  88. package/dist/types/packages/sdk/src/learning-error.d.ts +7 -0
  89. package/dist/types/packages/sdk/src/learning-error.d.ts.map +1 -0
  90. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +2 -0
  91. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  92. package/dist/types/packages/sdk/src/model-projects.d.ts +24 -0
  93. package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
  94. package/dist/types/packages/sdk/src/model-starters.d.ts +6 -0
  95. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  96. package/dist/types/packages/sdk/src/post-training.d.ts +58 -54
  97. package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
  98. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +20 -20
  99. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2 -0
  100. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
  101. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +6 -0
  102. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  103. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
  104. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts +72 -0
  105. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts.map +1 -0
  106. package/dist/types/packages/sdk/src/tool-learning.d.ts +3 -0
  107. package/dist/types/packages/sdk/src/tool-learning.d.ts.map +1 -0
  108. package/dist/types/packages/sdk/src/training-compute-selection.d.ts +2 -0
  109. package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -1
  110. package/dist/types/packages/sdk/src/training-estimates.d.ts +9 -1
  111. package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -1
  112. package/dist/types/packages/sdk/src/training-hardware.d.ts +886 -0
  113. package/dist/types/packages/sdk/src/training-hardware.d.ts.map +1 -0
  114. package/dist/types/packages/sdk/src/training-preparations.d.ts +22 -0
  115. package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
  116. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +2 -0
  117. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
  118. package/dist/types/packages/sdk/src/training-supervised.d.ts +101 -0
  119. package/dist/types/packages/sdk/src/training-supervised.d.ts.map +1 -0
  120. package/dist/types/packages/sdk/src/training-transport.d.ts +24 -0
  121. package/dist/types/packages/sdk/src/training-transport.d.ts.map +1 -0
  122. package/dist/types/packages/sdk/src/training.d.ts +34 -16
  123. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  124. package/examples/training/continual.ts +71 -9
  125. package/package.json +18 -2
  126. package/dist/chunk-D3WOJTUY.js.map +0 -1
  127. package/dist/chunk-EYMZQML2.js.map +0 -1
  128. package/dist/chunk-YSEYPMQ3.js.map +0 -1
  129. /package/dist/{chunk-MGFI4226.js.map → chunk-2DK7UBAG.js.map} +0 -0
  130. /package/dist/{chunk-U4QIGSP5.js.map → chunk-4L556MYM.js.map} +0 -0
  131. /package/dist/{chunk-UWM2ZPGS.js.map → chunk-7FYPFHCQ.js.map} +0 -0
  132. /package/dist/{chunk-HYCHLMP7.js.map → chunk-DMN6EF3R.js.map} +0 -0
  133. /package/dist/{chunk-QVLJFJBU.js.map → chunk-ESW25WSD.js.map} +0 -0
  134. /package/dist/{chunk-YP5DXGGC.js.map → chunk-GIEST52U.js.map} +0 -0
  135. /package/dist/{chunk-BWFG46HX.js.map → chunk-GRQWKATA.js.map} +0 -0
  136. /package/dist/{chunk-WYR3MZHU.js.map → chunk-HDKP6KE2.js.map} +0 -0
  137. /package/dist/{chunk-EEZ5YHJQ.js.map → chunk-ICFFZ4WC.js.map} +0 -0
  138. /package/dist/{chunk-LUFOAMN5.js.map → chunk-LKKKTBLL.js.map} +0 -0
  139. /package/dist/{chunk-QHCY4MBG.js.map → chunk-PKW3II5M.js.map} +0 -0
  140. /package/dist/{chunk-XL44IXBO.js.map → chunk-PT72OARU.js.map} +0 -0
  141. /package/dist/{chunk-TWJYL5YF.js.map → chunk-QQ444G6A.js.map} +0 -0
  142. /package/dist/{chunk-IOZCYSJ6.js.map → chunk-UAYXORU5.js.map} +0 -0
  143. /package/dist/{chunk-TZREEZ4C.js.map → chunk-WEL535AI.js.map} +0 -0
  144. /package/dist/{chunk-GGG6H4MK.js.map → chunk-XJKGCU2K.js.map} +0 -0
  145. /package/dist/{chunk-GZSQIOAH.js.map → chunk-XNRM3QGR.js.map} +0 -0
  146. /package/dist/{chunk-CZXN63A4.js.map → chunk-ZZZU6XER.js.map} +0 -0
@@ -1,7 +1,13 @@
1
+ import {
2
+ createTrainingHardwareClient
3
+ } from "./chunk-EZME7DV4.js";
4
+ import {
5
+ createTrainingRequest
6
+ } from "./chunk-GX6KMHW2.js";
1
7
  import {
2
8
  TrainingHandoffOriginSchema,
3
9
  createPostTrainingClient
4
- } from "./chunk-MRUDFIB6.js";
10
+ } from "./chunk-5QMREXMU.js";
5
11
  import {
6
12
  validateHarnessPolicySourcePackage,
7
13
  validateHarnessSourcePackage
@@ -11,51 +17,131 @@ import {
11
17
  ModelProjectImmutableRefSchema,
12
18
  ModelProjectRecipeDocumentSchema,
13
19
  ModelProjectVersionedRefSchema,
14
- OPENPOND_TRAINING_MEDIA_TYPE,
20
+ TrainingEstimateReviewSchema,
21
+ TrainingGpuCatalogSchema,
22
+ TrainingGpuSelectionSchema
23
+ } from "./chunk-BQ2C2Y54.js";
24
+ import {
15
25
  OpenPondProtocolError,
16
26
  TRAINING_API_RESPONSE_MAX_BYTES,
17
27
  TRAINING_INPUT_ARTIFACT_MAX_BYTES,
18
28
  TRAINING_JOB_SUBMISSION_MAX_BYTES,
19
- TrainingEstimateReviewSchema,
20
- TrainingGpuCatalogSchema,
21
- TrainingGpuSelectionSchema,
22
29
  assertCanonicalPayloadSize,
23
- canonicalSha256,
24
- readBoundedJsonResponse
25
- } from "./chunk-YSEYPMQ3.js";
30
+ canonicalSha256
31
+ } from "./chunk-B3ZHJ2KK.js";
26
32
  import {
27
33
  ImmutableReleaseRefSchema
28
34
  } from "./chunk-H3JZ3P5T.js";
29
35
 
30
- // src/training-acceptance.ts
36
+ // src/training-supervised.ts
31
37
  import { z } from "zod";
32
- import { assertAcceptanceGroupSnapshot, AcceptanceGroupSnapshotSchema } from "@openpond/evals/learning";
33
38
  var Id = z.string().trim().min(1).max(240);
34
- var TrainingAcceptanceGroupReferenceSchema = ModelProjectImmutableRefSchema.extend({ revision: z.number().int().positive() }).strict();
39
+ var Hash = z.string().trim().min(8).max(256);
40
+ var SftRecipeSchema = z.object({
41
+ schemaVersion: z.literal("openpond.sftRecipe.v1"),
42
+ method: z.literal("sft"),
43
+ parameterization: z.literal("lora"),
44
+ baseModel: z.object({
45
+ id: Id,
46
+ revision: z.string().trim().min(1).max(256),
47
+ tokenizerRevision: z.string().trim().min(1).max(256),
48
+ chatTemplateHash: Hash
49
+ }),
50
+ dataset: z.object({
51
+ trainSplit: z.literal("train"),
52
+ validationSplit: z.enum(["validation", "frozen_eval"]),
53
+ completionOnly: z.boolean(),
54
+ maxSequenceLength: z.number().int().positive().max(32768),
55
+ maxExamples: z.number().int().positive().max(1e5).default(1e3),
56
+ selectionStrategy: z.literal("stable_hash_top_n").default("stable_hash_top_n"),
57
+ selectionSeed: z.number().int().default(17)
58
+ }),
59
+ lora: z.object({
60
+ rank: z.number().int().positive().max(256),
61
+ alpha: z.number().positive().max(1024),
62
+ dropout: z.number().min(0).max(1),
63
+ targetModules: z.array(Id).min(1).max(100)
64
+ }),
65
+ optimizer: z.object({
66
+ learningRate: z.number().positive(),
67
+ epochs: z.number().positive().max(100),
68
+ maxSteps: z.number().int().positive().max(1e6),
69
+ batchSize: z.number().int().positive().max(1e4),
70
+ gradientAccumulationSteps: z.number().int().positive().max(1e4),
71
+ seed: z.number().int()
72
+ }),
73
+ resourceLimits: z.object({
74
+ cpuThreads: z.number().int().positive().max(256),
75
+ memoryBytes: z.number().int().positive(),
76
+ wallTimeMs: z.number().int().positive()
77
+ })
78
+ });
79
+ var ManagedSftRecipeSchema = SftRecipeSchema.safeExtend({
80
+ dataset: SftRecipeSchema.shape.dataset.safeExtend({
81
+ completionOnly: z.literal(true),
82
+ maxSequenceLength: z.number().int().min(2).max(8192),
83
+ maxExamples: z.number().int().min(1).max(1e3).default(1e3)
84
+ }),
85
+ lora: SftRecipeSchema.shape.lora.safeExtend({
86
+ rank: z.number().int().min(1).max(64),
87
+ dropout: z.number().min(0).lt(1),
88
+ targetModules: z.array(z.enum(["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"])).min(1).max(7)
89
+ }),
90
+ optimizer: SftRecipeSchema.shape.optimizer.safeExtend({
91
+ learningRate: z.number().positive().max(1e-3),
92
+ epochs: z.number().positive().max(10),
93
+ maxSteps: z.number().int().min(1).max(128),
94
+ batchSize: z.number().int().min(1).max(32),
95
+ gradientAccumulationSteps: z.number().int().min(1).max(32),
96
+ seed: z.number().int().min(-(2 ** 31)).max(2 ** 31 - 1)
97
+ }),
98
+ resourceLimits: SftRecipeSchema.shape.resourceLimits.safeExtend({
99
+ wallTimeMs: z.number().int().min(1e3).max(216e5)
100
+ })
101
+ }).superRefine((recipe, context) => {
102
+ if (recipe.optimizer.batchSize * recipe.optimizer.gradientAccumulationSteps > 32)
103
+ context.addIssue({
104
+ code: "custom",
105
+ path: ["optimizer"],
106
+ message: "Managed SFT supports at most 32 accumulated examples."
107
+ });
108
+ if (new Set(recipe.lora.targetModules).size !== recipe.lora.targetModules.length)
109
+ context.addIssue({
110
+ code: "custom",
111
+ path: ["lora", "targetModules"],
112
+ message: "Adapter target modules must be unique."
113
+ });
114
+ });
115
+
116
+ // src/training-acceptance.ts
117
+ import { z as z2 } from "zod";
118
+ import { assertAcceptanceGroupSnapshot, AcceptanceGroupSnapshotSchema } from "@openpond/evals/learning";
119
+ var Id2 = z2.string().trim().min(1).max(240);
120
+ var TrainingAcceptanceGroupReferenceSchema = ModelProjectImmutableRefSchema.extend({ revision: z2.number().int().positive() }).strict();
35
121
  var TrainingAcceptanceGroupSummarySchema = TrainingAcceptanceGroupReferenceSchema.extend({
36
- teamId: Id,
37
- jobId: Id,
122
+ teamId: Id2,
123
+ jobId: Id2,
38
124
  plan: ModelProjectImmutableRefSchema,
39
125
  baseline: ModelProjectImmutableRefSchema,
40
126
  candidate: ModelProjectImmutableRefSchema,
41
127
  state: AcceptanceGroupSnapshotSchema.shape.state,
42
- updatedAt: z.string().datetime()
128
+ updatedAt: z2.string().datetime()
43
129
  }).strict();
44
- var TrainingAcceptanceGroupPageSchema = z.object({
45
- schemaVersion: z.literal("openpond.trainingAcceptanceGroupPage.v1"),
46
- teamId: Id,
47
- jobId: Id,
48
- groups: z.array(TrainingAcceptanceGroupSummarySchema).max(100),
49
- nextCursor: Id.nullable()
130
+ var TrainingAcceptanceGroupPageSchema = z2.object({
131
+ schemaVersion: z2.literal("openpond.trainingAcceptanceGroupPage.v1"),
132
+ teamId: Id2,
133
+ jobId: Id2,
134
+ groups: z2.array(TrainingAcceptanceGroupSummarySchema).max(100),
135
+ nextCursor: Id2.nullable()
50
136
  }).strict();
51
- var TrainingAcceptanceGroupQuerySchema = z.object({
52
- cursor: Id.optional(),
53
- limit: z.number().int().min(1).max(100).default(25)
137
+ var TrainingAcceptanceGroupQuerySchema = z2.object({
138
+ cursor: Id2.optional(),
139
+ limit: z2.number().int().min(1).max(100).default(25)
54
140
  }).strict();
55
141
  function createTrainingAcceptanceClient(request) {
56
142
  const route = (target) => {
57
- Id.parse(target.teamId);
58
- return `/v1/training/jobs/${encodeURIComponent(Id.parse(target.jobId))}/acceptance-groups`;
143
+ Id2.parse(target.teamId);
144
+ return `/v1/training/jobs/${encodeURIComponent(Id2.parse(target.jobId))}/acceptance-groups`;
59
145
  };
60
146
  return {
61
147
  async acceptanceGroups(target, input = {}) {
@@ -71,7 +157,7 @@ function createTrainingAcceptanceClient(request) {
71
157
  const reference = expected ? TrainingAcceptanceGroupReferenceSchema.parse({ id: expected.id, revision: expected.revision, contentHash: expected.contentHash }) : null;
72
158
  if (reference && reference.id !== groupId) throw new OpenPondProtocolError("acceptance_group_identity_mismatch", "The retained group reference differs from the requested group.");
73
159
  const suffix = reference ? `?revision=${reference.revision}` : "";
74
- const snapshot = assertAcceptanceGroupSnapshot(await request(`${route(target)}/${encodeURIComponent(Id.parse(groupId))}${suffix}`));
160
+ const snapshot = assertAcceptanceGroupSnapshot(await request(`${route(target)}/${encodeURIComponent(Id2.parse(groupId))}${suffix}`));
75
161
  if (snapshot.manifest.teamId !== target.teamId || snapshot.manifest.trainingJob.id !== target.jobId || snapshot.manifest.id !== groupId || reference && (snapshot.revision !== reference.revision || snapshot.contentHash !== reference.contentHash))
76
162
  throw new OpenPondProtocolError("acceptance_group_identity_mismatch", "Acceptance evidence does not match the requested workspace, job or retained revision.");
77
163
  return snapshot;
@@ -80,30 +166,30 @@ function createTrainingAcceptanceClient(request) {
80
166
  }
81
167
 
82
168
  // src/training.ts
83
- import { z as z12 } from "zod";
169
+ import { z as z13 } from "zod";
84
170
 
85
171
  // src/training-recovery.ts
86
- import { z as z2 } from "zod";
87
- var id = z2.string().trim().min(1).max(191);
88
- var hash = z2.string().regex(/^[a-f0-9]{64}$/);
89
- var ApprovalBodySchema = z2.object({
90
- schemaVersion: z2.literal("openpond.checkpointRecoveryResourceApproval.v1"),
172
+ import { z as z3 } from "zod";
173
+ var id = z3.string().trim().min(1).max(191);
174
+ var hash = z3.string().regex(/^[a-f0-9]{64}$/);
175
+ var ApprovalBodySchema = z3.object({
176
+ schemaVersion: z3.literal("openpond.checkpointRecoveryResourceApproval.v1"),
91
177
  ownerUserId: id,
92
178
  teamId: id,
93
179
  sourceJobId: id,
94
- sourceJobVersion: z2.number().int().positive(),
180
+ sourceJobVersion: z3.number().int().positive(),
95
181
  sourceInputManifestSha256: hash,
96
182
  checkpointId: id,
97
183
  adapterSha256: hash,
98
184
  resumeSha256: hash,
99
- idempotencyKey: z2.string().trim().min(16).max(191),
100
- approvedAt: z2.iso.datetime({ offset: true }),
101
- maximumSpendUsd: z2.number().positive().finite().max(30).refine(
185
+ idempotencyKey: z3.string().trim().min(16).max(191),
186
+ approvedAt: z3.iso.datetime({ offset: true }),
187
+ maximumSpendUsd: z3.number().positive().finite().max(30).refine(
102
188
  (value) => Number(value.toFixed(6)) === value,
103
189
  "Recovery spend must use whole microdollars"
104
190
  ),
105
- maximumGpuSeconds: z2.number().int().positive().max(21600),
106
- maximumWallSeconds: z2.number().int().positive().max(21600)
191
+ maximumGpuSeconds: z3.number().int().positive().max(21600),
192
+ maximumWallSeconds: z3.number().int().positive().max(21600)
107
193
  }).strict();
108
194
  var TrainingCheckpointRecoveryResourceApprovalSchema = ApprovalBodySchema.extend({
109
195
  approvalHash: hash
@@ -122,15 +208,15 @@ async function createTrainingCheckpointRecoveryResourceApproval(input) {
122
208
  approvalHash: await canonicalSha256(body)
123
209
  });
124
210
  }
125
- var TrainingCheckpointRecoveryRequestSchema = z2.object({
211
+ var TrainingCheckpointRecoveryRequestSchema = z3.object({
126
212
  resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
127
- mode: z2.literal("evaluation_only").optional(),
128
- evaluationGpuType: z2.enum(["NVIDIA A100 80GB PCIe", "NVIDIA A100-SXM4-80GB", "NVIDIA H100 80GB HBM3"]).optional(),
129
- expectedVersion: z2.number().int().positive(),
213
+ mode: z3.literal("evaluation_only").optional(),
214
+ evaluationGpuType: z3.enum(["NVIDIA A100 80GB PCIe", "NVIDIA A100-SXM4-80GB", "NVIDIA H100 80GB HBM3"]).optional(),
215
+ expectedVersion: z3.number().int().positive(),
130
216
  checkpointId: id,
131
- idempotencyKey: z2.string().trim().min(16).max(191),
132
- maximumSpendUsd: z2.number().positive().finite(),
133
- maximumWallSeconds: z2.number().int().positive().max(21600)
217
+ idempotencyKey: z3.string().trim().min(16).max(191),
218
+ maximumSpendUsd: z3.number().positive().finite(),
219
+ maximumWallSeconds: z3.number().int().positive().max(21600)
134
220
  }).strict().superRefine((value, context) => {
135
221
  if (value.evaluationGpuType && value.mode !== "evaluation_only")
136
222
  context.addIssue({
@@ -148,56 +234,56 @@ var TrainingCheckpointRecoveryRequestSchema = z2.object({
148
234
  });
149
235
 
150
236
  // src/training-physical-placement.ts
151
- import { z as z3 } from "zod";
152
- var TrainingPhysicalPlacementSchema = z3.object({
153
- mode: z3.literal("reuse_only"),
154
- physicalWorkerId: z3.string().trim().min(1).max(191),
155
- providerPodId: z3.string().trim().min(1).max(191),
156
- workerImageDigest: z3.string().regex(/^sha256:[a-f0-9]{64}$/),
157
- baseProfileSha256: z3.string().regex(/^[a-f0-9]{64}$/),
158
- gpuType: z3.string().trim().min(1).max(200),
159
- sourceJobId: z3.string().trim().min(1).max(191),
160
- sourceInputManifestSha256: z3.string().regex(/^[a-f0-9]{64}$/),
161
- ownerTeamId: z3.string().trim().min(1).max(191),
162
- deadlineAt: z3.string().datetime({ offset: true })
237
+ import { z as z4 } from "zod";
238
+ var TrainingPhysicalPlacementSchema = z4.object({
239
+ mode: z4.literal("reuse_only"),
240
+ physicalWorkerId: z4.string().trim().min(1).max(191),
241
+ providerPodId: z4.string().trim().min(1).max(191),
242
+ workerImageDigest: z4.string().regex(/^sha256:[a-f0-9]{64}$/),
243
+ baseProfileSha256: z4.string().regex(/^[a-f0-9]{64}$/),
244
+ gpuType: z4.string().trim().min(1).max(200),
245
+ sourceJobId: z4.string().trim().min(1).max(191),
246
+ sourceInputManifestSha256: z4.string().regex(/^[a-f0-9]{64}$/),
247
+ ownerTeamId: z4.string().trim().min(1).max(191),
248
+ deadlineAt: z4.string().datetime({ offset: true })
163
249
  }).strict();
164
250
 
165
251
  // src/training-preparations.ts
166
- import { z as z4 } from "zod";
167
- var Id2 = z4.string().trim().min(1).max(191);
168
- var Hash = z4.string().regex(/^[a-f0-9]{64}$/);
169
- var TrainingPreparationRequestSchema = z4.object({
170
- schemaVersion: z4.literal("openpond.trainingPreparationRequest.v1"),
171
- teamId: Id2,
172
- operationId: Id2,
173
- projectId: Id2.nullable(),
174
- configuration: z4.object({ id: Id2, expectedRevision: z4.number().int().positive(), expectedEtag: Hash }).strict(),
252
+ import { z as z5 } from "zod";
253
+ var Id3 = z5.string().trim().min(1).max(191);
254
+ var Hash2 = z5.string().regex(/^[a-f0-9]{64}$/);
255
+ var TrainingPreparationRequestSchema = z5.object({
256
+ schemaVersion: z5.literal("openpond.trainingPreparationRequest.v1"),
257
+ teamId: Id3,
258
+ operationId: Id3,
259
+ projectId: Id3.nullable(),
260
+ configuration: z5.object({ id: Id3, expectedRevision: z5.number().int().positive(), expectedEtag: Hash2 }).strict(),
175
261
  origin: TrainingHandoffOriginSchema.optional(),
176
262
  batch: ModelProjectVersionedRefSchema,
177
- name: z4.string().trim().min(1).max(191),
178
- maximumSpendUsd: z4.number().finite().positive().max(1e6),
263
+ name: z5.string().trim().min(1).max(191),
264
+ maximumSpendUsd: z5.number().finite().positive().max(1e6),
179
265
  gpuSelection: TrainingGpuSelectionSchema.optional(),
180
266
  physicalPlacement: TrainingPhysicalPlacementSchema.optional()
181
267
  }).strict();
182
- var TrainingPreparationPlanContentSchema = z4.object({
183
- schemaVersion: z4.literal("openpond.trainingPreparationPlan.v1"),
184
- id: Id2,
185
- creatorUserId: Id2,
268
+ var TrainingPreparationPlanContentSchema = z5.object({
269
+ schemaVersion: z5.literal("openpond.trainingPreparationPlan.v1"),
270
+ id: Id3,
271
+ creatorUserId: Id3,
186
272
  request: TrainingPreparationRequestSchema,
187
- requestHash: Hash,
188
- source: z4.lazy(() => TrainingJobSourceSchema),
189
- submissionHash: Hash,
190
- createdAt: z4.string().datetime({ offset: true })
273
+ requestHash: Hash2,
274
+ source: z5.lazy(() => TrainingJobSourceSchema),
275
+ submissionHash: Hash2,
276
+ createdAt: z5.string().datetime({ offset: true })
191
277
  }).strict();
192
278
  var TrainingPreparationPlanSchema = TrainingPreparationPlanContentSchema.extend({
193
- contentHash: Hash
279
+ contentHash: Hash2
194
280
  }).strict();
195
- var TrainingPreparationReceiptSchema = z4.object({
196
- schemaVersion: z4.literal("openpond.trainingPreparationReceipt.v1"),
281
+ var TrainingPreparationReceiptSchema = z5.object({
282
+ schemaVersion: z5.literal("openpond.trainingPreparationReceipt.v1"),
197
283
  plan: TrainingPreparationPlanSchema,
198
- revision: z4.number().int().positive(),
199
- state: z4.enum(["prepared", "submitted", "cancelled"]),
200
- jobId: Id2.nullable()
284
+ revision: z5.number().int().positive(),
285
+ state: z5.enum(["prepared", "submitted", "cancelled"]),
286
+ jobId: Id3.nullable()
201
287
  }).strict().superRefine((value, context) => {
202
288
  if (value.state === "submitted" !== Boolean(value.jobId))
203
289
  context.addIssue({
@@ -206,23 +292,23 @@ var TrainingPreparationReceiptSchema = z4.object({
206
292
  message: "Only submitted preparations identify a job."
207
293
  });
208
294
  });
209
- var TrainingPreparationControlSchema = z4.object({
210
- teamId: Id2,
211
- planHash: Hash,
212
- expectedRevision: z4.number().int().positive(),
295
+ var TrainingPreparationControlSchema = z5.object({
296
+ teamId: Id3,
297
+ planHash: Hash2,
298
+ expectedRevision: z5.number().int().positive(),
213
299
  estimateReview: TrainingEstimateReviewSchema.optional()
214
300
  }).strict();
215
- var TrainingPreparationListQuerySchema = z4.object({
216
- projectId: Id2.optional(),
217
- state: z4.enum(["prepared", "submitted", "cancelled"]).optional(),
218
- afterId: Id2.optional(),
219
- limit: z4.number().int().min(1).max(100).default(25)
301
+ var TrainingPreparationListQuerySchema = z5.object({
302
+ projectId: Id3.optional(),
303
+ state: z5.enum(["prepared", "submitted", "cancelled"]).optional(),
304
+ afterId: Id3.optional(),
305
+ limit: z5.number().int().min(1).max(100).default(25)
220
306
  }).strict();
221
- var TrainingPreparationPageSchema = z4.object({
222
- schemaVersion: z4.literal("openpond.trainingPreparationPage.v1"),
223
- teamId: Id2,
224
- items: z4.array(TrainingPreparationReceiptSchema).max(100),
225
- nextCursor: Id2.nullable()
307
+ var TrainingPreparationPageSchema = z5.object({
308
+ schemaVersion: z5.literal("openpond.trainingPreparationPage.v1"),
309
+ teamId: Id3,
310
+ items: z5.array(TrainingPreparationReceiptSchema).max(100),
311
+ nextCursor: Id3.nullable()
226
312
  }).strict();
227
313
  async function parseAndVerifyTrainingPreparationReceipt(value) {
228
314
  const receipt = TrainingPreparationReceiptSchema.parse(value);
@@ -248,7 +334,7 @@ function createTrainingPreparationClient(request) {
248
334
  return {
249
335
  /** Discover the authenticated user's retained preparations without creating jobs. */
250
336
  async listPreparations(teamId, input = {}) {
251
- const scope = Id2.parse(teamId);
337
+ const scope = Id3.parse(teamId);
252
338
  const query = TrainingPreparationListQuerySchema.parse(input);
253
339
  const params = new URLSearchParams();
254
340
  for (const [key, value] of Object.entries(query)) params.set(key, String(value));
@@ -293,15 +379,15 @@ function createTrainingPreparationClient(request) {
293
379
  },
294
380
  async getPreparation(teamId, id2) {
295
381
  return read(
296
- await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}`),
297
- Id2.parse(teamId),
382
+ await request(`/v1/training/preparations/${encodeURIComponent(Id3.parse(id2))}`),
383
+ Id3.parse(teamId),
298
384
  id2
299
385
  );
300
386
  },
301
387
  async startPreparation(id2, input) {
302
388
  const parsed = TrainingPreparationControlSchema.parse(input);
303
389
  const receipt = await read(
304
- await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}/start`, {
390
+ await request(`/v1/training/preparations/${encodeURIComponent(Id3.parse(id2))}/start`, {
305
391
  method: "POST",
306
392
  body: JSON.stringify(parsed)
307
393
  }),
@@ -318,7 +404,7 @@ function createTrainingPreparationClient(request) {
318
404
  async cancelPreparation(id2, input) {
319
405
  const parsed = TrainingPreparationControlSchema.parse(input);
320
406
  const receipt = await read(
321
- await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}/cancel`, {
407
+ await request(`/v1/training/preparations/${encodeURIComponent(Id3.parse(id2))}/cancel`, {
322
408
  method: "POST",
323
409
  body: JSON.stringify(parsed)
324
410
  }),
@@ -336,31 +422,31 @@ function createTrainingPreparationClient(request) {
336
422
  }
337
423
 
338
424
  // src/training-estimates.ts
339
- import { z as z5 } from "zod";
340
- var Id3 = z5.string().trim().min(1).max(191);
341
- var Hash2 = z5.string().regex(/^[a-f0-9]{64}$/);
342
- var Timestamp = z5.string().datetime({ offset: true });
343
- var NonNegative = z5.number().finite().nonnegative();
344
- var TrainingEstimateSourceSchema = z5.discriminatedUnion("kind", [
345
- z5.object({ kind: z5.literal("preparation"), id: Id3, planHash: Hash2, expectedRevision: z5.number().int().positive() }).strict(),
346
- z5.object({
347
- kind: z5.literal("configuration"),
348
- id: Id3,
349
- expectedRevision: z5.number().int().positive(),
350
- expectedEtag: Hash2,
425
+ import { z as z6 } from "zod";
426
+ var Id4 = z6.string().trim().min(1).max(191);
427
+ var Hash3 = z6.string().regex(/^[a-f0-9]{64}$/);
428
+ var Timestamp = z6.string().datetime({ offset: true });
429
+ var NonNegative = z6.number().finite().nonnegative();
430
+ var TrainingEstimateSourceSchema = z6.discriminatedUnion("kind", [
431
+ z6.object({ kind: z6.literal("preparation"), id: Id4, planHash: Hash3, expectedRevision: z6.number().int().positive() }).strict(),
432
+ z6.object({
433
+ kind: z6.literal("configuration"),
434
+ id: Id4,
435
+ expectedRevision: z6.number().int().positive(),
436
+ expectedEtag: Hash3,
351
437
  batch: ModelProjectVersionedRefSchema.nullable().default(null)
352
438
  }).strict(),
353
- z5.object({ kind: z5.literal("submission"), submission: z5.lazy(() => TrainingJobSubmissionSchema) }).strict()
439
+ z6.object({ kind: z6.literal("submission"), submission: z6.lazy(() => TrainingJobSubmissionSchema) }).strict()
354
440
  ]);
355
- var TrainingEstimateRequestSchema = z5.object({
356
- schemaVersion: z5.literal("openpond.trainingEstimateRequest.v1"),
357
- teamId: Id3,
441
+ var TrainingEstimateRequestSchema = z6.object({
442
+ schemaVersion: z6.literal("openpond.trainingEstimateRequest.v1"),
443
+ teamId: Id4,
358
444
  source: TrainingEstimateSourceSchema,
359
445
  gpuSelection: TrainingGpuSelectionSchema.optional()
360
446
  }).strict();
361
- var PlanningRange = z5.object({ low: NonNegative, high: NonNegative }).strict().refine((value) => value.high >= value.low, "Planning range must be ordered");
362
- var TrainingEstimateComponentSchema = z5.object({
363
- phase: z5.enum([
447
+ var PlanningRange = z6.object({ low: NonNegative, high: NonNegative }).strict().refine((value) => value.high >= value.low, "Planning range must be ordered");
448
+ var TrainingEstimateComponentSchema = z6.object({
449
+ phase: z6.enum([
364
450
  "startup",
365
451
  "baseline_evaluation",
366
452
  "rollouts",
@@ -372,12 +458,12 @@ var TrainingEstimateComponentSchema = z5.object({
372
458
  "cleanup",
373
459
  "retention"
374
460
  ]),
375
- resource: z5.enum(["gpu", "cpu", "judge", "storage", "network"]),
461
+ resource: z6.enum(["gpu", "cpu", "judge", "storage", "network"]),
376
462
  expectedUsd: NonNegative.nullable(),
377
463
  expectedSeconds: NonNegative.nullable(),
378
464
  planningRangeUsd: PlanningRange.nullable(),
379
- evidence: z5.enum(["measured", "configured_rate", "unavailable"]),
380
- reason: z5.string().trim().min(1).max(1e3).nullable()
465
+ evidence: z6.enum(["measured", "configured_rate", "unavailable"]),
466
+ reason: z6.string().trim().min(1).max(1e3).nullable()
381
467
  }).strict();
382
468
  function trainingEstimateSourceIdentity(source) {
383
469
  if (source.kind === "submission") return {
@@ -394,64 +480,64 @@ function trainingEstimateSourceIdentity(source) {
394
480
  };
395
481
  return { kind: source.kind, id: source.id, contentHash: source.expectedEtag, revision: source.expectedRevision };
396
482
  }
397
- var TrainingEstimateSchema = z5.object({
398
- schemaVersion: z5.literal("openpond.trainingEstimate.v1"),
399
- id: Id3,
400
- teamId: Id3,
401
- requestHash: Hash2,
402
- inputHash: Hash2,
403
- source: z5.object({
404
- kind: z5.enum(["preparation", "configuration", "submission"]),
405
- id: Id3,
406
- contentHash: Hash2,
407
- revision: z5.number().int().positive().nullable()
483
+ var TrainingEstimateSchema = z6.object({
484
+ schemaVersion: z6.literal("openpond.trainingEstimate.v1"),
485
+ id: Id4,
486
+ teamId: Id4,
487
+ requestHash: Hash3,
488
+ inputHash: Hash3,
489
+ source: z6.object({
490
+ kind: z6.enum(["preparation", "configuration", "submission"]),
491
+ id: Id4,
492
+ contentHash: Hash3,
493
+ revision: z6.number().int().positive().nullable()
408
494
  }).strict(),
409
- status: z5.enum(["available", "partial", "insufficient_evidence"]),
410
- currency: z5.literal("USD"),
495
+ status: z6.enum(["available", "partial", "insufficient_evidence"]),
496
+ currency: z6.literal("USD"),
411
497
  createdAt: Timestamp,
412
498
  expiresAt: Timestamp,
413
- estimatorVersion: Id3,
414
- runtimeVersion: Id3,
415
- pricing: z5.object({ version: Id3, quoteExpiresAt: Timestamp.nullable() }).strict(),
416
- gpu: z5.object({
499
+ estimatorVersion: Id4,
500
+ runtimeVersion: Id4,
501
+ pricing: z6.object({ version: Id4, quoteExpiresAt: Timestamp.nullable() }).strict(),
502
+ gpu: z6.object({
417
503
  requested: TrainingGpuSelectionSchema,
418
- resolved: z5.object({ availabilityId: Id3, gpuType: z5.string().min(1).max(256), gpuCount: z5.literal(1) }).strict().nullable(),
504
+ resolved: z6.object({ availabilityId: Id4, gpuType: z6.string().min(1).max(256), gpuCount: z6.union([z6.literal(1), z6.literal(2)]) }).strict().nullable(),
419
505
  customerHourlyUsd: NonNegative.nullable(),
420
- availability: z5.enum(["available", "limited", "unavailable", "unknown"])
506
+ availability: z6.enum(["available", "limited", "unavailable", "unknown"])
421
507
  }).strict(),
422
- configuration: z5.object({
423
- modelId: Id3,
424
- modelRevision: z5.string().min(1).max(256),
425
- method: Id3,
426
- loraRank: z5.number().int().positive().nullable(),
427
- adapterMode: z5.enum(["residual_append", "shared", "sequential_merge"]).nullable(),
428
- groups: z5.number().int().nonnegative().nullable(),
429
- rolloutConcurrency: z5.number().int().positive().nullable(),
430
- maxOutputTokens: z5.number().int().positive().nullable(),
431
- trainingRows: z5.number().int().nonnegative().nullable(),
432
- evaluationRows: z5.number().int().nonnegative().nullable(),
433
- retentionDays: z5.number().int().positive().nullable(),
508
+ configuration: z6.object({
509
+ modelId: Id4,
510
+ modelRevision: z6.string().min(1).max(256),
511
+ method: Id4,
512
+ loraRank: z6.number().int().positive().nullable(),
513
+ adapterMode: z6.enum(["residual_append", "shared", "sequential_merge"]).nullable(),
514
+ groups: z6.number().int().nonnegative().nullable(),
515
+ rolloutConcurrency: z6.number().int().positive().nullable(),
516
+ maxOutputTokens: z6.number().int().positive().nullable(),
517
+ trainingRows: z6.number().int().nonnegative().nullable(),
518
+ evaluationRows: z6.number().int().nonnegative().nullable(),
519
+ retentionDays: z6.number().int().positive().nullable(),
434
520
  approvedMaximumUsd: NonNegative.nullable()
435
521
  }).strict(),
436
- cost: z5.object({
522
+ cost: z6.object({
437
523
  expectedUsd: NonNegative.nullable(),
438
524
  planningRangeUsd: PlanningRange.nullable(),
439
525
  knownMinimumUsd: NonNegative,
440
526
  recommendedMaximumUsd: NonNegative.nullable(),
441
527
  minimumCleanupReserveUsd: NonNegative.nullable(),
442
- components: z5.array(TrainingEstimateComponentSchema).max(50)
528
+ components: z6.array(TrainingEstimateComponentSchema).max(50)
443
529
  }).strict(),
444
- executionSeconds: z5.object({ expected: NonNegative.nullable(), planningRange: PlanningRange.nullable() }).strict(),
445
- queueWaitSeconds: z5.object({ expected: NonNegative, planningRange: PlanningRange.nullable() }).strict().nullable(),
446
- calibration: z5.object({
447
- version: Id3,
448
- cohortHash: Hash2,
449
- completedSamples: z5.number().int().nonnegative(),
450
- partialSamples: z5.number().int().nonnegative(),
451
- scope: z5.enum(["workspace", "authorized_aggregate"])
530
+ executionSeconds: z6.object({ expected: NonNegative.nullable(), planningRange: PlanningRange.nullable() }).strict(),
531
+ queueWaitSeconds: z6.object({ expected: NonNegative, planningRange: PlanningRange.nullable() }).strict().nullable(),
532
+ calibration: z6.object({
533
+ version: Id4,
534
+ cohortHash: Hash3,
535
+ completedSamples: z6.number().int().nonnegative(),
536
+ partialSamples: z6.number().int().nonnegative(),
537
+ scope: z6.enum(["workspace", "authorized_aggregate"])
452
538
  }).strict(),
453
- assumptions: z5.array(z5.string().trim().min(1).max(1e3)).max(50),
454
- unknowns: z5.array(z5.string().trim().min(1).max(1e3)).max(50),
539
+ assumptions: z6.array(z6.string().trim().min(1).max(1e3)).max(50),
540
+ unknowns: z6.array(z6.string().trim().min(1).max(1e3)).max(50),
455
541
  review: TrainingEstimateReviewSchema
456
542
  }).strict().superRefine((estimate, context) => {
457
543
  if (estimate.review.estimateId !== estimate.id || estimate.review.inputHash !== estimate.inputHash || estimate.review.requestHash !== estimate.requestHash || estimate.review.pricingVersion !== estimate.pricing.version || estimate.review.expiresAt !== estimate.expiresAt) {
@@ -466,6 +552,9 @@ var TrainingEstimateSchema = z5.object({
466
552
  if (estimate.gpu.requested.mode === "manual" && estimate.gpu.resolved && (estimate.gpu.requested.availabilityId !== estimate.gpu.resolved.availabilityId || estimate.gpu.requested.gpuType !== estimate.gpu.resolved.gpuType)) {
467
553
  context.addIssue({ code: "custom", path: ["gpu"], message: "An explicit GPU offering cannot be substituted" });
468
554
  }
555
+ if (estimate.gpu.resolved && estimate.gpu.resolved.gpuCount !== (estimate.gpu.requested.gpuCount ?? 1)) {
556
+ context.addIssue({ code: "custom", path: ["gpu", "resolved", "gpuCount"], message: "The resolved GPU count must match the requested count" });
557
+ }
469
558
  });
470
559
  function createTrainingEstimateClient(request) {
471
560
  return {
@@ -485,21 +574,21 @@ function createTrainingEstimateClient(request) {
485
574
  }
486
575
 
487
576
  // src/training-queue.ts
488
- import { z as z6 } from "zod";
489
- var Timestamp2 = z6.string().datetime({ offset: true });
490
- var TrainingQueueStatusSchema = z6.object({
491
- ticketId: z6.string().trim().min(1).max(191),
492
- ticketNumber: z6.number().int().positive().max(Number.MAX_SAFE_INTEGER),
493
- label: z6.literal("Waiting for resources"),
494
- position: z6.number().int().positive().nullable(),
495
- positionScope: z6.literal("compatible_fair_queue"),
577
+ import { z as z7 } from "zod";
578
+ var Timestamp2 = z7.string().datetime({ offset: true });
579
+ var TrainingQueueStatusSchema = z7.object({
580
+ ticketId: z7.string().trim().min(1).max(191),
581
+ ticketNumber: z7.number().int().positive().max(Number.MAX_SAFE_INTEGER),
582
+ label: z7.literal("Waiting for resources"),
583
+ position: z7.number().int().positive().nullable(),
584
+ positionScope: z7.literal("compatible_fair_queue"),
496
585
  enqueuedAt: Timestamp2,
497
586
  asOf: Timestamp2,
498
- estimate: z6.object({
499
- revision: z6.number().int().nonnegative(),
587
+ estimate: z7.object({
588
+ revision: z7.number().int().nonnegative(),
500
589
  estimatedStartAt: Timestamp2,
501
590
  expiresAt: Timestamp2,
502
- evidence: z6.enum(["observed_capacity", "measured_bootstrap", "scheduled_release"])
591
+ evidence: z7.enum(["observed_capacity", "measured_bootstrap", "scheduled_release"])
503
592
  }).strict().nullable()
504
593
  }).strict().superRefine((value, context) => {
505
594
  if (value.estimate && Date.parse(value.estimate.expiresAt) <= Date.parse(value.asOf))
@@ -507,12 +596,12 @@ var TrainingQueueStatusSchema = z6.object({
507
596
  });
508
597
 
509
598
  // src/training-harness-sources.ts
510
- import { z as z7 } from "zod";
511
- var TrainingHarnessSourcePublicationSchema = z7.object({
512
- schemaVersion: z7.literal("openpond.trainingHarnessSourcePublication.v1"),
599
+ import { z as z8 } from "zod";
600
+ var TrainingHarnessSourcePublicationSchema = z8.object({
601
+ schemaVersion: z8.literal("openpond.trainingHarnessSourcePublication.v1"),
513
602
  harnessRelease: ImmutableReleaseRefSchema,
514
- sourcePackageHash: z7.string().regex(/^[a-f0-9]{64}$/),
515
- sizeBytes: z7.number().int().positive().max(TRAINING_INPUT_ARTIFACT_MAX_BYTES)
603
+ sourcePackageHash: z8.string().regex(/^[a-f0-9]{64}$/),
604
+ sizeBytes: z8.number().int().positive().max(TRAINING_INPUT_ARTIFACT_MAX_BYTES)
516
605
  }).strict();
517
606
  function createTrainingHarnessSourceClient(request) {
518
607
  const route = (reference) => {
@@ -545,28 +634,28 @@ function validateSource(value, reference) {
545
634
  }
546
635
 
547
636
  // src/training-candidate-decisions.ts
548
- import { z as z8 } from "zod";
549
- var IdSchema = /* @__PURE__ */ (() => z8.string().trim().min(1).max(500))();
550
- var HashSchema = /* @__PURE__ */ (() => z8.string().regex(/^[a-f0-9]{64}$/))();
551
- var TrainingCandidateDecisionRequestSchema = /* @__PURE__ */ (() => z8.object({
552
- schemaVersion: z8.literal("openpond.trainingCandidateDecisionRequest.v1"),
637
+ import { z as z9 } from "zod";
638
+ var IdSchema = /* @__PURE__ */ (() => z9.string().trim().min(1).max(500))();
639
+ var HashSchema = /* @__PURE__ */ (() => z9.string().regex(/^[a-f0-9]{64}$/))();
640
+ var TrainingCandidateDecisionRequestSchema = /* @__PURE__ */ (() => z9.object({
641
+ schemaVersion: z9.literal("openpond.trainingCandidateDecisionRequest.v1"),
553
642
  teamId: IdSchema,
554
643
  jobId: IdSchema,
555
644
  artifact: ModelProjectImmutableRefSchema,
556
645
  evaluation: ModelProjectImmutableRefSchema,
557
646
  executionReceipt: ModelProjectImmutableRefSchema,
558
- decision: z8.enum(["accepted", "rejected"]),
559
- reason: z8.string().trim().min(1).max(5e3),
647
+ decision: z9.enum(["accepted", "rejected"]),
648
+ reason: z9.string().trim().min(1).max(5e3),
560
649
  idempotencyKey: IdSchema,
561
650
  expectedDecision: ModelProjectImmutableRefSchema.nullable()
562
651
  }).strict())();
563
- var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() => z8.object({
564
- schemaVersion: z8.literal("openpond.trainingCandidateDecision.v1"),
652
+ var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() => z9.object({
653
+ schemaVersion: z9.literal("openpond.trainingCandidateDecision.v1"),
565
654
  id: IdSchema,
566
655
  request: TrainingCandidateDecisionRequestSchema,
567
- revision: z8.number().int().positive(),
568
- actor: z8.object({ userId: IdSchema, kind: z8.enum(["user", "api_key", "agent_delegate"]), id: IdSchema }).strict(),
569
- decidedAt: z8.string().datetime({ offset: true }),
656
+ revision: z9.number().int().positive(),
657
+ actor: z9.object({ userId: IdSchema, kind: z9.enum(["user", "api_key", "agent_delegate"]), id: IdSchema }).strict(),
658
+ decidedAt: z9.string().datetime({ offset: true }),
570
659
  contentHash: HashSchema
571
660
  }).strict().superRefine((value, context) => {
572
661
  if (value.revision === 1 !== (value.request.expectedDecision === null)) {
@@ -603,7 +692,7 @@ function createTrainingCandidateDecisionClient(request) {
603
692
  IdSchema.parse(target.teamId);
604
693
  const reference = options.decision ? ModelProjectImmutableRefSchema.parse(options.decision) : void 0;
605
694
  const query = reference ? `?decisionId=${encodeURIComponent(reference.id)}` : "";
606
- const response = z8.object({ decision: z8.unknown().nullable() }).strict().parse(await request(`${route(target)}${query}`));
695
+ const response = z9.object({ decision: z9.unknown().nullable() }).strict().parse(await request(`${route(target)}${query}`));
607
696
  if (response.decision === null && !reference) return null;
608
697
  const decision = await parseAndVerifyTrainingCandidateDecision(response.decision, target);
609
698
  if (reference && (decision.id !== reference.id || decision.contentHash !== reference.contentHash)) {
@@ -620,38 +709,38 @@ function createTrainingCandidateDecisionClient(request) {
620
709
  }
621
710
 
622
711
  // src/training-evaluation-results.ts
623
- import { z as z9 } from "zod";
624
- var IdSchema2 = /* @__PURE__ */ (() => z9.string().trim().min(1).max(500))();
625
- var HashSchema2 = /* @__PURE__ */ (() => z9.string().regex(/^[a-f0-9]{64}$/))();
626
- var TrainingEvaluationTaskResultSchema = /* @__PURE__ */ (() => z9.object({
712
+ import { z as z10 } from "zod";
713
+ var IdSchema2 = /* @__PURE__ */ (() => z10.string().trim().min(1).max(500))();
714
+ var HashSchema2 = /* @__PURE__ */ (() => z10.string().regex(/^[a-f0-9]{64}$/))();
715
+ var TrainingEvaluationTaskResultSchema = /* @__PURE__ */ (() => z10.object({
627
716
  taskId: IdSchema2,
628
717
  taskSha256: HashSchema2,
629
718
  resultSha256: HashSchema2,
630
- input: z9.object({
631
- instruction: z9.string().max(1e6),
632
- context: z9.record(z9.string(), z9.unknown())
719
+ input: z10.object({
720
+ instruction: z10.string().max(1e6),
721
+ context: z10.record(z10.string(), z10.unknown())
633
722
  }).strict(),
634
- output: z9.string().max(1e6),
723
+ output: z10.string().max(1e6),
635
724
  outputSha256: HashSchema2,
636
- score: z9.number().finite().min(0).max(1),
637
- evidence: z9.object({
638
- kind: z9.enum(["worker_command", "hosted_trace", "local_trace"]),
725
+ score: z10.number().finite().min(0).max(1),
726
+ evidence: z10.object({
727
+ kind: z10.enum(["worker_command", "hosted_trace", "local_trace"]),
639
728
  id: IdSchema2
640
729
  }).strict()
641
730
  }).strict())();
642
- var TrainingEvaluationTaskPageSchema = /* @__PURE__ */ (() => z9.object({
643
- schemaVersion: z9.literal("openpond.trainingEvaluationTaskPage.v1"),
731
+ var TrainingEvaluationTaskPageSchema = /* @__PURE__ */ (() => z10.object({
732
+ schemaVersion: z10.literal("openpond.trainingEvaluationTaskPage.v1"),
644
733
  jobId: IdSchema2,
645
734
  teamId: IdSchema2,
646
735
  evaluation: ModelProjectImmutableRefSchema,
647
- kind: z9.enum(["baseline", "candidate"]),
648
- policyVersion: z9.number().int().nonnegative(),
736
+ kind: z10.enum(["baseline", "candidate"]),
737
+ policyVersion: z10.number().int().nonnegative(),
649
738
  taskset: ModelProjectVersionedRefSchema,
650
739
  panelSha256: HashSchema2,
651
- offset: z9.number().int().nonnegative(),
652
- total: z9.number().int().min(1).max(1e4),
653
- tasks: z9.array(TrainingEvaluationTaskResultSchema).min(1).max(100),
654
- nextCursor: z9.string().regex(/^[1-9]\d*$/).nullable(),
740
+ offset: z10.number().int().nonnegative(),
741
+ total: z10.number().int().min(1).max(1e4),
742
+ tasks: z10.array(TrainingEvaluationTaskResultSchema).min(1).max(100),
743
+ nextCursor: z10.string().regex(/^[1-9]\d*$/).nullable(),
655
744
  contentHash: HashSchema2
656
745
  }).strict().superRefine((page, context) => {
657
746
  const end = page.offset + page.tasks.length;
@@ -686,12 +775,12 @@ async function parseAndVerifyTrainingEvaluationTaskPage(value, expected) {
686
775
  }
687
776
 
688
777
  // src/training-grading-plan.ts
689
- import { z as z10 } from "zod";
778
+ import { z as z11 } from "zod";
690
779
  import { compileBoundGraders, RewardBindingSchema, RewardReleaseSchema } from "@openpond/evals/rewards";
691
- var GradersSchema = z10.array(z10.object({ id: z10.string().trim().min(1) }).catchall(z10.unknown())).min(1).max(1e3);
692
- var RewardExecutionSchema = z10.object({
780
+ var GradersSchema = z11.array(z11.object({ id: z11.string().trim().min(1) }).catchall(z11.unknown())).min(1).max(1e3);
781
+ var RewardExecutionSchema = z11.object({
693
782
  binding: RewardBindingSchema,
694
- rewards: z10.array(RewardReleaseSchema).min(1).max(100)
783
+ rewards: z11.array(RewardReleaseSchema).min(1).max(100)
695
784
  }).strict();
696
785
  async function deterministicTrainingRewardSource(input) {
697
786
  const execution = input.rewardExecution ? RewardExecutionSchema.parse(input.rewardExecution) : null;
@@ -708,23 +797,23 @@ async function deterministicTrainingRewardSource(input) {
708
797
  }
709
798
 
710
799
  // src/training-evaluation-source.ts
711
- import { z as z11 } from "zod";
800
+ import { z as z12 } from "zod";
712
801
  var TRAINING_EVALUATION_SOURCE_PATH = "evaluation-source.json";
713
- var TaskIdentitySchema = z11.object({
714
- id: z11.string().trim().min(1),
715
- clusterKey: z11.string().trim().min(1),
716
- split: z11.enum(["train", "validation", "frozen_eval"])
802
+ var TaskIdentitySchema = z12.object({
803
+ id: z12.string().trim().min(1),
804
+ clusterKey: z12.string().trim().min(1),
805
+ split: z12.enum(["train", "validation", "frozen_eval"])
717
806
  }).passthrough();
718
- var TrainingEvaluationSourceSchema = z11.object({
719
- schemaVersion: z11.literal("openpond.trainingEvaluationSource.v1"),
807
+ var TrainingEvaluationSourceSchema = z12.object({
808
+ schemaVersion: z12.literal("openpond.trainingEvaluationSource.v1"),
720
809
  taskset: ModelProjectVersionedRefSchema,
721
- tasks: z11.array(TaskIdentitySchema).min(1).max(1e4),
722
- assets: z11.array(z11.object({
723
- path: z11.string().trim().min(1).max(2e3),
724
- sha256: z11.string().regex(/^[a-f0-9]{64}$/),
725
- sizeBytes: z11.number().int().nonnegative(),
726
- encoding: z11.literal("base64"),
727
- content: z11.string().max(32 * 1024 * 1024)
810
+ tasks: z12.array(TaskIdentitySchema).min(1).max(1e4),
811
+ assets: z12.array(z12.object({
812
+ path: z12.string().trim().min(1).max(2e3),
813
+ sha256: z12.string().regex(/^[a-f0-9]{64}$/),
814
+ sizeBytes: z12.number().int().nonnegative(),
815
+ encoding: z12.literal("base64"),
816
+ content: z12.string().max(32 * 1024 * 1024)
728
817
  }).strict()).max(1e4)
729
818
  }).strict().superRefine((source, context) => {
730
819
  const ids = /* @__PURE__ */ new Set();
@@ -735,8 +824,8 @@ var TrainingEvaluationSourceSchema = z11.object({
735
824
  });
736
825
  });
737
826
  function assertTrainingEvaluationIsolation(trainingTasks, evaluationTasks) {
738
- const training = z11.array(TaskIdentitySchema).min(1).max(1e4).parse(trainingTasks);
739
- const evaluation = z11.array(TaskIdentitySchema).min(1).max(1e4).parse(evaluationTasks);
827
+ const training = z12.array(TaskIdentitySchema).min(1).max(1e4).parse(trainingTasks);
828
+ const evaluation = z12.array(TaskIdentitySchema).min(1).max(1e4).parse(evaluationTasks);
740
829
  const trainIds = /* @__PURE__ */ new Set();
741
830
  const trainFamilies = /* @__PURE__ */ new Set();
742
831
  for (const task of training) {
@@ -762,24 +851,24 @@ async function trainingEvaluationSourceRef(input) {
762
851
  }
763
852
 
764
853
  // src/training.ts
765
- var IdSchema3 = z12.string().trim().min(1).max(500);
766
- var HashSchema3 = z12.string().regex(/^[a-f0-9]{64}$/);
767
- var TimestampSchema = z12.string().datetime({ offset: true });
768
- var TrainingInputArtifactUploadSchema = z12.object({
769
- schemaVersion: z12.literal("openpond.trainingInputArtifactUpload.v2"),
770
- kind: z12.enum(["portable_training_bundle", "reward_model_dataset"]),
771
- idempotencyKey: z12.string().trim().min(1).max(500),
854
+ var IdSchema3 = z13.string().trim().min(1).max(500);
855
+ var HashSchema3 = z13.string().regex(/^[a-f0-9]{64}$/);
856
+ var TimestampSchema = z13.string().datetime({ offset: true });
857
+ var TrainingInputArtifactUploadSchema = z13.object({
858
+ schemaVersion: z13.literal("openpond.trainingInputArtifactUpload.v2"),
859
+ kind: z13.enum(["portable_training_bundle", "reward_model_dataset"]),
860
+ idempotencyKey: z13.string().trim().min(1).max(500),
772
861
  sourceManifest: ModelProjectImmutableRefSchema,
773
- payload: z12.unknown(),
862
+ payload: z13.unknown(),
774
863
  contentHash: HashSchema3
775
864
  }).strict();
776
- var TrainingInputArtifactSchema = z12.object({
777
- schemaVersion: z12.literal("openpond.trainingInputArtifact.v2"),
778
- kind: z12.enum(["portable_training_bundle", "reward_model_dataset"]),
865
+ var TrainingInputArtifactSchema = z13.object({
866
+ schemaVersion: z13.literal("openpond.trainingInputArtifact.v2"),
867
+ kind: z13.enum(["portable_training_bundle", "reward_model_dataset"]),
779
868
  sourceManifest: ModelProjectImmutableRefSchema,
780
- artifactRef: z12.string().trim().min(1).max(2e3),
869
+ artifactRef: z13.string().trim().min(1).max(2e3),
781
870
  contentHash: HashSchema3,
782
- sizeBytes: z12.number().int().positive(),
871
+ sizeBytes: z13.number().int().positive(),
783
872
  createdAt: TimestampSchema
784
873
  }).strict();
785
874
  async function trainingInputArtifactUploadHash(upload) {
@@ -798,8 +887,8 @@ async function parseAndVerifyTrainingInputArtifactUpload(value) {
798
887
  }
799
888
  return parsed;
800
889
  }
801
- var TrainingJobKindSchema = z12.enum(["reward_model_train", "policy_optimize"]);
802
- var TrainingJobStateSchema = z12.enum([
890
+ var TrainingJobKindSchema = z13.enum(["reward_model_train", "policy_optimize"]);
891
+ var TrainingJobStateSchema = z13.enum([
803
892
  "queued",
804
893
  "admitting",
805
894
  "provisioning",
@@ -810,53 +899,53 @@ var TrainingJobStateSchema = z12.enum([
810
899
  "failed",
811
900
  "cancelled"
812
901
  ]);
813
- var TrainingCapabilityRequirementSchema = z12.object({
902
+ var TrainingCapabilityRequirementSchema = z13.object({
814
903
  id: IdSchema3,
815
- version: z12.string().trim().min(1).max(200).nullable().default(null),
816
- required: z12.boolean().default(true)
904
+ version: z13.string().trim().min(1).max(200).nullable().default(null),
905
+ required: z13.boolean().default(true)
817
906
  }).strict();
818
- var TrainingJobSourceSchema = z12.object({
907
+ var TrainingJobSourceSchema = z13.object({
819
908
  origin: TrainingHandoffOriginSchema.optional(),
820
- modelProject: z12.object({
909
+ modelProject: z13.object({
821
910
  id: IdSchema3,
822
911
  portableProjectId: IdSchema3,
823
- revision: z12.number().int().positive(),
912
+ revision: z13.number().int().positive(),
824
913
  contentHash: HashSchema3
825
914
  }).strict(),
826
915
  harnessRunManifest: ModelProjectImmutableRefSchema,
827
916
  harnessRelease: ModelProjectImmutableRefSchema,
828
917
  taskset: ModelProjectVersionedRefSchema,
829
918
  tasksetRelease: ModelProjectImmutableRefSchema,
830
- evaluation: z12.object({
919
+ evaluation: z13.object({
831
920
  taskset: ModelProjectVersionedRefSchema,
832
921
  dataset: ModelProjectImmutableRefSchema
833
922
  }).strict().nullable().optional(),
834
923
  dataset: ModelProjectImmutableRefSchema,
835
- evidenceSets: z12.array(ModelProjectImmutableRefSchema).max(1e4)
924
+ evidenceSets: z13.array(ModelProjectImmutableRefSchema).max(1e4)
836
925
  }).strict();
837
- var RewardModelTrainingRequestSchema = z12.object({
838
- kind: z12.literal("reward_model_train"),
926
+ var RewardModelTrainingRequestSchema = z13.object({
927
+ kind: z13.literal("reward_model_train"),
839
928
  baseModel: ModelProjectBaseModelSchema,
840
929
  preferenceDatasetRelease: ModelProjectImmutableRefSchema,
841
930
  processorRelease: ModelProjectImmutableRefSchema,
842
- recipe: z12.object({
843
- schemaVersion: z12.literal("openpond.rewardModelRecipe.v1"),
844
- method: z12.literal("reward_model"),
845
- parameterization: z12.literal("lora_with_scalar_head")
846
- }).catchall(z12.unknown())
931
+ recipe: z13.object({
932
+ schemaVersion: z13.literal("openpond.rewardModelRecipe.v1"),
933
+ method: z13.literal("reward_model"),
934
+ parameterization: z13.literal("lora_with_scalar_head")
935
+ }).catchall(z13.unknown())
847
936
  }).strict();
848
- var DeterministicRewardSourceSchema = z12.object({
849
- kind: z12.literal("deterministic"),
937
+ var DeterministicRewardSourceSchema = z13.object({
938
+ kind: z13.literal("deterministic"),
850
939
  grader: ModelProjectImmutableRefSchema,
851
940
  composer: ModelProjectImmutableRefSchema.nullable().default(null)
852
941
  }).strict();
853
- var LearnedRewardSourceSchema = z12.object({
854
- kind: z12.literal("learned_reward"),
942
+ var LearnedRewardSourceSchema = z13.object({
943
+ kind: z13.literal("learned_reward"),
855
944
  rewardModelVersion: ModelProjectImmutableRefSchema,
856
945
  qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),
857
- evaluationReferences: z12.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
858
- scorerArtifact: z12.object({
859
- artifactRef: z12.string().trim().min(1).max(2e3),
946
+ evaluationReferences: z13.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
947
+ scorerArtifact: z13.object({
948
+ artifactRef: z13.string().trim().min(1).max(2e3),
860
949
  contentHash: HashSchema3,
861
950
  executionReceipt: ModelProjectImmutableRefSchema
862
951
  }).strict(),
@@ -864,51 +953,81 @@ var LearnedRewardSourceSchema = z12.object({
864
953
  rewardComposerRelease: ModelProjectImmutableRefSchema
865
954
  }).strict();
866
955
  var TrainingQualificationBaseModelSchema = ModelProjectBaseModelSchema.extend({
867
- revision: z12.string().regex(/^[a-f0-9]{40,64}$/),
868
- tokenizerRevision: z12.string().regex(/^[a-f0-9]{40,64}$/),
956
+ revision: z13.string().regex(/^[a-f0-9]{40,64}$/),
957
+ tokenizerRevision: z13.string().regex(/^[a-f0-9]{40,64}$/),
869
958
  chatTemplateHash: HashSchema3
870
959
  }).strict();
871
- var PolicyOptimizationRequestSchema = z12.object({
872
- kind: z12.literal("policy_optimize"),
960
+ var PolicyOptimizationRequestSchema = z13.object({
961
+ kind: z13.literal("policy_optimize"),
873
962
  /** Collect and grade one original-learner group without optimizer work. */
874
- executionMode: z12.literal("qualification").optional(),
963
+ executionMode: z13.literal("qualification").optional(),
875
964
  baseModel: ModelProjectBaseModelSchema,
876
965
  recipe: ModelProjectRecipeDocumentSchema,
877
- rewardSource: z12.discriminatedUnion("kind", [
966
+ rewardSource: z13.discriminatedUnion("kind", [
878
967
  DeterministicRewardSourceSchema,
879
968
  LearnedRewardSourceSchema
880
969
  ]),
881
970
  resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null)
882
- }).strict();
883
- var TrainingJobRequestSchema = z12.discriminatedUnion("kind", [
971
+ }).strict().superRefine((job, context) => {
972
+ if (job.recipe.method !== "sft") return;
973
+ const recipe = SftRecipeSchema.safeParse(job.recipe);
974
+ if (!recipe.success) {
975
+ context.addIssue({
976
+ code: "custom",
977
+ path: ["recipe"],
978
+ message: "The SFT recipe is incomplete or invalid."
979
+ });
980
+ return;
981
+ }
982
+ if (job.executionMode || job.resumeFrom || "continuation" in job.recipe)
983
+ context.addIssue({
984
+ code: "custom",
985
+ message: "Initial managed SFT requires a fresh supervised run without rollout qualification or continuation."
986
+ });
987
+ if (recipe.data.baseModel.id !== job.baseModel.modelId || recipe.data.baseModel.revision !== job.baseModel.revision || recipe.data.baseModel.tokenizerRevision !== job.baseModel.tokenizerRevision || recipe.data.baseModel.chatTemplateHash !== job.baseModel.chatTemplateHash)
988
+ context.addIssue({
989
+ code: "custom",
990
+ path: ["baseModel"],
991
+ message: "The SFT recipe must pin the exact submitted base and tokenizer."
992
+ });
993
+ });
994
+ var TrainingJobRequestSchema = z13.discriminatedUnion("kind", [
884
995
  RewardModelTrainingRequestSchema,
885
996
  PolicyOptimizationRequestSchema
886
997
  ]);
887
- var TrainingJobApprovalSchema = z12.object({
998
+ var TrainingJobApprovalSchema = z13.object({
888
999
  approvalHash: HashSchema3,
889
1000
  approvedAt: TimestampSchema,
890
- exportApproved: z12.boolean(),
891
- maximumSpendUsd: z12.number().nonnegative(),
892
- retentionDays: z12.number().int().nonnegative().nullable(),
893
- region: z12.string().trim().min(1).max(200).nullable().default(null)
1001
+ exportApproved: z13.boolean(),
1002
+ maximumSpendUsd: z13.number().nonnegative(),
1003
+ retentionDays: z13.number().int().nonnegative().nullable(),
1004
+ region: z13.string().trim().min(1).max(200).nullable().default(null)
894
1005
  }).strict();
895
- var TrainingJobSubmissionSchema = z12.object({
896
- schemaVersion: z12.literal("openpond.trainingJobSubmission.v2"),
897
- idempotencyKey: z12.string().trim().min(1).max(500),
898
- name: z12.string().trim().min(1).max(200),
1006
+ var TrainingJobSubmissionSchema = z13.object({
1007
+ schemaVersion: z13.literal("openpond.trainingJobSubmission.v2"),
1008
+ idempotencyKey: z13.string().trim().min(1).max(500),
1009
+ name: z13.string().trim().min(1).max(200),
899
1010
  source: TrainingJobSourceSchema,
900
1011
  job: TrainingJobRequestSchema,
901
- requestedCapabilities: z12.array(TrainingCapabilityRequirementSchema).max(1e3),
902
- placementObjective: z12.enum(["fast", "balanced", "economical"]),
1012
+ requestedCapabilities: z13.array(TrainingCapabilityRequirementSchema).max(1e3),
1013
+ placementObjective: z13.enum(["fast", "balanced", "economical"]),
903
1014
  gpuSelection: TrainingGpuSelectionSchema.optional(),
904
1015
  physicalPlacement: TrainingPhysicalPlacementSchema.optional(),
905
- budget: z12.object({
906
- maximumSpendUsd: z12.number().nonnegative(),
907
- maximumWallSeconds: z12.number().int().positive()
1016
+ budget: z13.object({
1017
+ maximumSpendUsd: z13.number().nonnegative(),
1018
+ maximumWallSeconds: z13.number().int().positive()
908
1019
  }).strict(),
909
1020
  approval: TrainingJobApprovalSchema,
910
1021
  contentHash: HashSchema3
911
1022
  }).strict().superRefine((submission, context) => {
1023
+ const distributed = (submission.gpuSelection?.gpuCount ?? 1) === 2;
1024
+ const distributedRequirement = submission.requestedCapabilities.some((requirement) => requirement.id === "managed_rl.policy.data_parallel" && requirement.version === "1" && requirement.required);
1025
+ if (distributed !== distributedRequirement) {
1026
+ context.addIssue({ code: "custom", path: ["requestedCapabilities"], message: "Two-GPU training must require managed_rl.policy.data_parallel@1 and bind gpuSelection.gpuCount to 2." });
1027
+ }
1028
+ if (distributed && (submission.job.kind !== "policy_optimize" || submission.job.executionMode || submission.job.recipe.method !== "grpo" || submission.physicalPlacement)) {
1029
+ context.addIssue({ code: "custom", path: ["gpuSelection"], message: "Two-GPU execution requires exclusive GRPO policy training." });
1030
+ }
912
1031
  if (submission.physicalPlacement && (submission.job.kind !== "policy_optimize" || submission.job.resumeFrom || submission.job.executionMode || submission.job.recipe.continuation !== void 0)) {
913
1032
  context.addIssue({ code: "custom", path: ["physicalPlacement"], message: "Reuse-only placement requires fresh-base policy training without continuation." });
914
1033
  }
@@ -956,99 +1075,99 @@ async function parseAndVerifyTrainingJobSubmission(value) {
956
1075
  }
957
1076
  return parsed;
958
1077
  }
959
- var TrainingJobRecoverySchema = z12.object({
1078
+ var TrainingJobRecoverySchema = z13.object({
960
1079
  resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
961
- mode: z12.literal("evaluation_only").optional(),
962
- trainingWorkloadComplete: z12.boolean().optional(),
1080
+ mode: z13.literal("evaluation_only").optional(),
1081
+ trainingWorkloadComplete: z13.boolean().optional(),
963
1082
  sourceJobId: IdSchema3,
964
1083
  checkpointId: IdSchema3,
965
- policyVersion: z12.number().int().positive(),
966
- completedGroups: z12.number().int().positive(),
967
- optimizerMode: z12.literal("continue")
1084
+ policyVersion: z13.number().int().positive(),
1085
+ completedGroups: z13.number().int().positive(),
1086
+ optimizerMode: z13.literal("continue")
968
1087
  }).strict();
969
- var TrainingJobSchema = z12.object({
970
- schemaVersion: z12.literal("openpond.trainingJob.v2"),
1088
+ var TrainingJobSchema = z13.object({
1089
+ schemaVersion: z13.literal("openpond.trainingJob.v2"),
971
1090
  id: IdSchema3,
972
1091
  teamId: IdSchema3,
973
1092
  kind: TrainingJobKindSchema,
974
- executionMode: z12.literal("qualification").optional(),
1093
+ executionMode: z13.literal("qualification").optional(),
975
1094
  recovery: TrainingJobRecoverySchema.optional(),
976
1095
  modelProjectId: IdSchema3,
977
1096
  portableProjectId: IdSchema3,
978
- sourceProjectRevision: z12.number().int().positive(),
1097
+ sourceProjectRevision: z13.number().int().positive(),
979
1098
  submissionHash: HashSchema3,
980
1099
  state: TrainingJobStateSchema,
981
1100
  queue: TrainingQueueStatusSchema.optional(),
982
- phase: z12.string().trim().min(1).max(200),
983
- version: z12.number().int().nonnegative(),
984
- progress: z12.number().min(0).max(1),
985
- rolloutProgress: z12.object({
986
- groupsCompleted: z12.number().int().nonnegative(),
987
- groupsTarget: z12.number().int().nonnegative(),
988
- optimizerUpdatesApplied: z12.number().int().nonnegative(),
989
- optimizerUpdatesSkipped: z12.number().int().nonnegative()
1101
+ phase: z13.string().trim().min(1).max(200),
1102
+ version: z13.number().int().nonnegative(),
1103
+ progress: z13.number().min(0).max(1),
1104
+ rolloutProgress: z13.object({
1105
+ groupsCompleted: z13.number().int().nonnegative(),
1106
+ groupsTarget: z13.number().int().nonnegative(),
1107
+ optimizerUpdatesApplied: z13.number().int().nonnegative(),
1108
+ optimizerUpdatesSkipped: z13.number().int().nonnegative()
990
1109
  }).strict(),
991
- accruedSpendUsd: z12.number().nonnegative(),
992
- terminalReason: z12.string().trim().min(1).max(5e3).nullable(),
1110
+ accruedSpendUsd: z13.number().nonnegative(),
1111
+ terminalReason: z13.string().trim().min(1).max(5e3).nullable(),
993
1112
  createdAt: TimestampSchema,
994
1113
  updatedAt: TimestampSchema,
995
1114
  completedAt: TimestampSchema.nullable()
996
1115
  }).strict();
997
- var TrainingJobPageSchema = z12.object({
998
- schemaVersion: z12.literal("openpond.trainingJobPage.v2"),
999
- jobs: z12.array(TrainingJobSchema).max(1e3),
1000
- nextCursor: z12.string().trim().min(1).max(2e3).nullable()
1116
+ var TrainingJobPageSchema = z13.object({
1117
+ schemaVersion: z13.literal("openpond.trainingJobPage.v2"),
1118
+ jobs: z13.array(TrainingJobSchema).max(1e3),
1119
+ nextCursor: z13.string().trim().min(1).max(2e3).nullable()
1001
1120
  }).strict();
1002
- var TrainingJobEventSchema = z12.object({
1003
- schemaVersion: z12.literal("openpond.trainingJobEvent.v2"),
1121
+ var TrainingJobEventSchema = z13.object({
1122
+ schemaVersion: z13.literal("openpond.trainingJobEvent.v2"),
1004
1123
  id: IdSchema3,
1005
1124
  jobId: IdSchema3,
1006
- sequence: z12.number().int().nonnegative(),
1125
+ sequence: z13.number().int().nonnegative(),
1007
1126
  type: IdSchema3,
1008
- phase: z12.string().trim().min(1).max(200),
1009
- message: z12.string().trim().min(1).max(5e3).nullable(),
1010
- data: z12.record(z12.string(), z12.unknown()).default({}),
1127
+ phase: z13.string().trim().min(1).max(200),
1128
+ message: z13.string().trim().min(1).max(5e3).nullable(),
1129
+ data: z13.record(z13.string(), z13.unknown()).default({}),
1011
1130
  createdAt: TimestampSchema
1012
1131
  }).strict();
1013
- var TrainingJobLogSchema = z12.object({
1014
- schemaVersion: z12.literal("openpond.trainingJobLog.v2"),
1132
+ var TrainingJobLogSchema = z13.object({
1133
+ schemaVersion: z13.literal("openpond.trainingJobLog.v2"),
1015
1134
  jobId: IdSchema3,
1016
- sequence: z12.number().int().nonnegative(),
1017
- level: z12.enum(["debug", "info", "warning", "error"]),
1018
- message: z12.string().max(2e4),
1135
+ sequence: z13.number().int().nonnegative(),
1136
+ level: z13.enum(["debug", "info", "warning", "error"]),
1137
+ message: z13.string().max(2e4),
1019
1138
  createdAt: TimestampSchema
1020
1139
  }).strict();
1021
- var TrainingJobControlRequestSchema = z12.object({ expectedVersion: z12.number().int().nonnegative() }).strict();
1022
- var TrainingJobOutputSchema = z12.object({
1023
- schemaVersion: z12.literal("openpond.trainingJobOutput.v2"),
1140
+ var TrainingJobControlRequestSchema = z13.object({ expectedVersion: z13.number().int().nonnegative() }).strict();
1141
+ var TrainingJobOutputSchema = z13.object({
1142
+ schemaVersion: z13.literal("openpond.trainingJobOutput.v2"),
1024
1143
  id: IdSchema3,
1025
1144
  jobId: IdSchema3,
1026
- kind: z12.enum(["checkpoint", "adapter", "scorer", "metrics", "evaluation", "trace", "receipt"]),
1027
- artifactRef: z12.string().trim().min(1).max(2e3),
1145
+ kind: z13.enum(["checkpoint", "adapter", "scorer", "metrics", "evaluation", "trace", "receipt"]),
1146
+ artifactRef: z13.string().trim().min(1).max(2e3),
1028
1147
  contentHash: HashSchema3,
1029
- sizeBytes: z12.number().int().nonnegative(),
1030
- metadata: z12.record(z12.string(), z12.unknown()).default({}),
1148
+ sizeBytes: z13.number().int().nonnegative(),
1149
+ metadata: z13.record(z13.string(), z13.unknown()).default({}),
1031
1150
  createdAt: TimestampSchema
1032
1151
  }).strict();
1033
- var TrainingQualificationEvidenceSchema = z12.object({
1034
- schemaVersion: z12.literal("openpond.trainingQualificationEvidence.v1"),
1152
+ var TrainingQualificationEvidenceSchema = z13.object({
1153
+ schemaVersion: z13.literal("openpond.trainingQualificationEvidence.v1"),
1035
1154
  baseModel: TrainingQualificationBaseModelSchema,
1036
1155
  group: ModelProjectImmutableRefSchema,
1037
- rolloutReceipts: z12.array(ModelProjectImmutableRefSchema).min(1).max(1e3),
1156
+ rolloutReceipts: z13.array(ModelProjectImmutableRefSchema).min(1).max(1e3),
1038
1157
  rewardEvidenceHash: HashSchema3,
1039
- groupsCompleted: z12.literal(1),
1040
- optimizerUpdatesApplied: z12.literal(0),
1041
- optimizerUpdatesSkipped: z12.literal(0),
1042
- trainingStepsCreated: z12.literal(0),
1043
- checkpointsCreated: z12.literal(0),
1044
- artifactsCreated: z12.literal(0)
1158
+ groupsCompleted: z13.literal(1),
1159
+ optimizerUpdatesApplied: z13.literal(0),
1160
+ optimizerUpdatesSkipped: z13.literal(0),
1161
+ trainingStepsCreated: z13.literal(0),
1162
+ checkpointsCreated: z13.literal(0),
1163
+ artifactsCreated: z13.literal(0)
1045
1164
  }).strict().superRefine((evidence, context) => {
1046
1165
  if (new Set(evidence.rolloutReceipts.map((receipt) => receipt.id)).size !== evidence.rolloutReceipts.length) {
1047
1166
  context.addIssue({ code: "custom", path: ["rolloutReceipts"], message: "Qualification rollout receipt identities must be unique." });
1048
1167
  }
1049
1168
  });
1050
- var TrainingExecutionReceiptSchema = z12.object({
1051
- schemaVersion: z12.literal("openpond.trainingExecutionReceipt.v2"),
1169
+ var TrainingExecutionReceiptSchema = z13.object({
1170
+ schemaVersion: z13.literal("openpond.trainingExecutionReceipt.v2"),
1052
1171
  id: IdSchema3,
1053
1172
  teamId: IdSchema3,
1054
1173
  jobId: IdSchema3,
@@ -1057,15 +1176,15 @@ var TrainingExecutionReceiptSchema = z12.object({
1057
1176
  recipeHash: HashSchema3,
1058
1177
  capabilityHash: HashSchema3,
1059
1178
  runtimeRelease: ModelProjectImmutableRefSchema,
1060
- inputs: z12.array(ModelProjectImmutableRefSchema).max(1e4),
1061
- outputs: z12.array(ModelProjectImmutableRefSchema).max(1e4),
1062
- spendUsd: z12.number().nonnegative(),
1063
- durationSeconds: z12.number().nonnegative(),
1064
- cleanupComplete: z12.boolean(),
1179
+ inputs: z13.array(ModelProjectImmutableRefSchema).max(1e4),
1180
+ outputs: z13.array(ModelProjectImmutableRefSchema).max(1e4),
1181
+ spendUsd: z13.number().nonnegative(),
1182
+ durationSeconds: z13.number().nonnegative(),
1183
+ cleanupComplete: z13.boolean(),
1065
1184
  qualification: TrainingQualificationEvidenceSchema.optional(),
1066
1185
  issuer: IdSchema3,
1067
1186
  issuedAt: TimestampSchema,
1068
- signature: z12.string().trim().min(1).max(1e4).nullable()
1187
+ signature: z13.string().trim().min(1).max(1e4).nullable()
1069
1188
  }).strict();
1070
1189
  async function trainingExecutionReceiptHash(receipt) {
1071
1190
  return canonicalSha256(TrainingExecutionReceiptSchema.parse(receipt));
@@ -1120,46 +1239,22 @@ async function assertTrainingQualificationReceipt(receipt, expected) {
1120
1239
  throw new OpenPondProtocolError("qualification_updated_artifact", "Qualification must not publish trained artifacts or checkpoints.");
1121
1240
  }
1122
1241
  }
1123
- var TrainingJobOutputsSchema = z12.object({
1124
- schemaVersion: z12.literal("openpond.trainingJobOutputs.v2"),
1125
- outputs: z12.array(TrainingJobOutputSchema).max(1e4),
1242
+ var TrainingJobOutputsSchema = z13.object({
1243
+ schemaVersion: z13.literal("openpond.trainingJobOutputs.v2"),
1244
+ outputs: z13.array(TrainingJobOutputSchema).max(1e4),
1126
1245
  receipt: TrainingExecutionReceiptSchema.nullable()
1127
1246
  }).strict();
1128
- var TrainingApiErrorSchema = z12.object({
1129
- schemaVersion: z12.literal("openpond.trainingApiError.v2"),
1130
- code: z12.string().trim().min(1).max(200),
1131
- message: z12.string().trim().min(1).max(5e3),
1132
- retryable: z12.boolean().default(false),
1133
- requestId: z12.string().trim().min(1).max(500).nullable().default(null),
1134
- details: z12.record(z12.string(), z12.unknown()).default({})
1135
- }).strict();
1136
- var OpenPondTrainingApiError = class extends Error {
1137
- status;
1138
- code;
1139
- retryable;
1140
- requestId;
1141
- details;
1142
- constructor(status, error) {
1143
- super(error.message);
1144
- this.name = "OpenPondTrainingApiError";
1145
- this.status = status;
1146
- this.code = error.code;
1147
- this.retryable = error.retryable;
1148
- this.requestId = error.requestId;
1149
- this.details = error.details;
1150
- }
1151
- };
1152
- var TrainingPolicyLoraCapabilitiesSchema = z12.object({
1153
- workerImageDigest: z12.string().regex(/^sha256:[a-f0-9]{64}$/),
1154
- envelopeRank: z12.number().int().positive().max(256),
1155
- supportedRanks: z12.array(z12.number().int().positive().max(256)).max(256),
1156
- qualification: z12.object({ evidenceRef: z12.string().min(1), evidenceSha256: HashSchema3 }).strict().nullable(),
1157
- continuation: z12.object({
1158
- sharedRequiresSameRank: z12.literal(true),
1159
- mergedRequiresSameRank: z12.literal(true),
1160
- residualAppendRequiresFreeCapacity: z12.literal(true),
1161
- stageOptimizer: z12.literal("reset"),
1162
- interruptedRecoveryOptimizer: z12.literal("restore")
1247
+ var TrainingPolicyLoraCapabilitiesSchema = z13.object({
1248
+ workerImageDigest: z13.string().regex(/^sha256:[a-f0-9]{64}$/),
1249
+ envelopeRank: z13.number().int().positive().max(256),
1250
+ supportedRanks: z13.array(z13.number().int().positive().max(256)).max(256),
1251
+ qualification: z13.object({ evidenceRef: z13.string().min(1), evidenceSha256: HashSchema3 }).strict().nullable(),
1252
+ continuation: z13.object({
1253
+ sharedRequiresSameRank: z13.literal(true),
1254
+ mergedRequiresSameRank: z13.literal(true),
1255
+ residualAppendRequiresFreeCapacity: z13.literal(true),
1256
+ stageOptimizer: z13.literal("reset"),
1257
+ interruptedRecoveryOptimizer: z13.literal("restore")
1163
1258
  }).strict()
1164
1259
  }).strict().superRefine((value, context) => {
1165
1260
  if (new Set(value.supportedRanks).size !== value.supportedRanks.length || value.supportedRanks.some((rank) => rank > value.envelopeRank))
@@ -1172,88 +1267,54 @@ function supportsTrainingPolicyLoraRank(capabilities, rank, continuation) {
1172
1267
  if (!continuation) return true;
1173
1268
  return continuation.mode === "residual_append" ? continuation.parentEnabledRank + rank <= capabilities.envelopeRank : continuation.parentEnabledRank === rank;
1174
1269
  }
1175
- var TrainingCapabilitiesSchema = z12.object({
1176
- schemaVersion: z12.literal("openpond.trainingCapabilities.v2"),
1270
+ var TrainingCapabilitiesSchema = z13.object({
1271
+ schemaVersion: z13.literal("openpond.trainingCapabilities.v2"),
1177
1272
  capabilityHash: HashSchema3,
1178
- jobKinds: z12.array(TrainingJobKindSchema),
1179
- methods: z12.array(z12.string().trim().min(1).max(200)),
1180
- executionModes: z12.array(z12.enum(["training", "qualification"])).optional(),
1273
+ jobKinds: z13.array(TrainingJobKindSchema),
1274
+ methods: z13.array(z13.string().trim().min(1).max(200)),
1275
+ executionModes: z13.array(z13.enum(["training", "qualification"])).optional(),
1181
1276
  policyLora: TrainingPolicyLoraCapabilitiesSchema.optional(),
1182
- structuredOutputs: z12.object({
1183
- capability: z12.literal("work.structured-output.v1"),
1277
+ policyDataParallel: z13.object({
1278
+ capability: z13.literal("managed_rl.policy.data_parallel"),
1279
+ version: z13.literal("1"),
1280
+ gpuCount: z13.literal(2),
1281
+ worldSize: z13.literal(2),
1282
+ backend: z13.literal("nccl"),
1283
+ allocationMode: z13.literal("exclusive"),
1284
+ workerImageDigest: z13.string().regex(/^sha256:[a-f0-9]{64}$/)
1285
+ }).strict().optional(),
1286
+ structuredOutputs: z13.object({
1287
+ capability: z13.literal("work.structured-output.v1"),
1184
1288
  harnessRuntimeHash: HashSchema3,
1185
1289
  workHarnessHash: HashSchema3,
1186
1290
  schemaHash: HashSchema3,
1187
1291
  artifactHash: HashSchema3,
1188
- invalidDataRejected: z12.literal(true),
1189
- invalidBytesRejected: z12.literal(true)
1292
+ invalidDataRejected: z13.literal(true),
1293
+ invalidBytesRejected: z13.literal(true)
1190
1294
  }).strict().optional(),
1191
- placements: z12.array(z12.enum(["local", "remote", "colocated", "provider_native"])),
1192
- controls: z12.object({
1193
- cancel: z12.boolean(),
1194
- stopAfterGroup: z12.boolean(),
1195
- resumeFromCheckpoint: z12.boolean()
1295
+ placements: z13.array(z13.enum(["local", "remote", "colocated", "provider_native"])),
1296
+ controls: z13.object({
1297
+ cancel: z13.boolean(),
1298
+ stopAfterGroup: z13.boolean(),
1299
+ resumeFromCheckpoint: z13.boolean()
1196
1300
  }).strict(),
1197
- estimates: z12.object({ schemaVersion: z12.literal("openpond.trainingEstimate.v1") }).strict().optional(),
1198
- limits: z12.object({
1199
- maximumSpendUsd: z12.number().nonnegative(),
1200
- maximumWallSeconds: z12.number().int().positive(),
1201
- maximumArtifactBytes: z12.number().int().positive()
1301
+ estimates: z13.object({ schemaVersion: z13.literal("openpond.trainingEstimate.v1") }).strict().optional(),
1302
+ limits: z13.object({
1303
+ maximumSpendUsd: z13.number().nonnegative(),
1304
+ maximumWallSeconds: z13.number().int().positive(),
1305
+ maximumArtifactBytes: z13.number().int().positive()
1202
1306
  }).strict(),
1203
1307
  checkedAt: TimestampSchema,
1204
1308
  expiresAt: TimestampSchema
1205
1309
  }).strict();
1206
- function headersRecord(headers) {
1207
- const result = {};
1208
- new Headers(headers).forEach((value, key) => {
1209
- result[key] = value;
1210
- });
1211
- return result;
1212
- }
1213
1310
  function createTrainingClient(input) {
1214
- const fetchImpl = input.fetch ?? fetch;
1215
- const baseUrl = input.baseUrl.replace(/\/$/, "");
1216
- async function request(pathname, init, responseLimit = TRAINING_API_RESPONSE_MAX_BYTES) {
1217
- const readOnly = init?.method === void 0 || init.method.toUpperCase() === "GET";
1218
- const maximumAttempts = readOnly ? 3 : 1;
1219
- for (let attempt = 1; attempt <= maximumAttempts; attempt += 1) {
1220
- let response;
1221
- try {
1222
- const configuredHeaders = typeof input.headers === "function" ? await input.headers() : input.headers ?? {};
1223
- response = await fetchImpl(`${baseUrl}${pathname}`, {
1224
- ...init,
1225
- headers: {
1226
- accept: OPENPOND_TRAINING_MEDIA_TYPE,
1227
- ...init?.body ? { "content-type": OPENPOND_TRAINING_MEDIA_TYPE } : {},
1228
- ...headersRecord(configuredHeaders),
1229
- ...headersRecord(init?.headers)
1230
- }
1231
- });
1232
- } catch (error2) {
1233
- if (attempt === maximumAttempts || init?.signal?.aborted || !trainingReadFailureIsRetryable(null, error2)) {
1234
- throw error2;
1235
- }
1236
- await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));
1237
- continue;
1238
- }
1239
- const body = await readBoundedJsonResponse(response, responseLimit, "Training API response");
1240
- if (response.ok) return body;
1241
- const error = trainingApiError(body, response.status);
1242
- if (attempt === maximumAttempts || !trainingReadFailureIsRetryable(response.status, error)) {
1243
- throw error;
1244
- }
1245
- await new Promise((resolve) => setTimeout(resolve, 250 * 2 ** (attempt - 1)));
1246
- }
1247
- throw new OpenPondProtocolError(
1248
- "training_read_retry_exhausted",
1249
- "Training read retry loop exhausted without a response."
1250
- );
1251
- }
1311
+ const request = createTrainingRequest(input);
1252
1312
  return {
1253
1313
  postTraining: createPostTrainingClient({ request }),
1254
1314
  ...createTrainingPreparationClient(request),
1255
1315
  ...createTrainingEstimateClient(request),
1256
1316
  ...createTrainingAcceptanceClient(request),
1317
+ ...createTrainingHardwareClient(request),
1257
1318
  ...createTrainingHarnessSourceClient(request),
1258
1319
  ...createTrainingCandidateDecisionClient(request),
1259
1320
  async capabilities() {
@@ -1294,10 +1355,10 @@ function createTrainingClient(input) {
1294
1355
  parameters.set("modelProjectId", IdSchema3.parse(options.modelProjectId));
1295
1356
  }
1296
1357
  if (options.cursor) {
1297
- parameters.set("cursor", z12.string().trim().min(1).max(2e3).parse(options.cursor));
1358
+ parameters.set("cursor", z13.string().trim().min(1).max(2e3).parse(options.cursor));
1298
1359
  }
1299
1360
  if (options.limit !== void 0) {
1300
- parameters.set("limit", String(z12.number().int().min(1).max(1e3).parse(options.limit)));
1361
+ parameters.set("limit", String(z13.number().int().min(1).max(1e3).parse(options.limit)));
1301
1362
  }
1302
1363
  const query = parameters.size > 0 ? `?${parameters.toString()}` : "";
1303
1364
  return TrainingJobPageSchema.parse(await request(`/v1/training/jobs${query}`));
@@ -1347,7 +1408,7 @@ function createTrainingClient(input) {
1347
1408
  ), "job"));
1348
1409
  },
1349
1410
  async events(jobId) {
1350
- return z12.array(TrainingJobEventSchema).parse(
1411
+ return z13.array(TrainingJobEventSchema).parse(
1351
1412
  unwrapObject(
1352
1413
  await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/events`),
1353
1414
  "events"
@@ -1363,11 +1424,11 @@ function createTrainingClient(input) {
1363
1424
  const id2 = IdSchema3.parse(jobId);
1364
1425
  const reference = ModelProjectImmutableRefSchema.parse(evaluation);
1365
1426
  const parameters = new URLSearchParams();
1366
- const cursor = options.cursor === void 0 ? void 0 : z12.string().regex(/^[1-9]\d*$/).parse(options.cursor);
1367
- const offset = cursor === void 0 ? 0 : z12.number().int().min(1).max(9999).parse(Number(cursor));
1427
+ const cursor = options.cursor === void 0 ? void 0 : z13.string().regex(/^[1-9]\d*$/).parse(options.cursor);
1428
+ const offset = cursor === void 0 ? 0 : z13.number().int().min(1).max(9999).parse(Number(cursor));
1368
1429
  if (cursor !== void 0) parameters.set("cursor", cursor);
1369
1430
  if (options.limit !== void 0)
1370
- parameters.set("limit", String(z12.number().int().min(1).max(100).parse(options.limit)));
1431
+ parameters.set("limit", String(z13.number().int().min(1).max(100).parse(options.limit)));
1371
1432
  const query = parameters.size ? `?${parameters.toString()}` : "";
1372
1433
  return parseAndVerifyTrainingEvaluationTaskPage(
1373
1434
  await request(
@@ -1377,7 +1438,7 @@ function createTrainingClient(input) {
1377
1438
  );
1378
1439
  },
1379
1440
  async logs(jobId) {
1380
- return z12.array(TrainingJobLogSchema).max(1e5).parse(
1441
+ return z13.array(TrainingJobLogSchema).max(1e5).parse(
1381
1442
  unwrapObject(
1382
1443
  await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/logs`),
1383
1444
  "logs"
@@ -1386,32 +1447,14 @@ function createTrainingClient(input) {
1386
1447
  }
1387
1448
  };
1388
1449
  }
1389
- function trainingReadFailureIsRetryable(status, error) {
1390
- if (status !== null) {
1391
- return status === 408 || status === 429 || status >= 500;
1392
- }
1393
- if (error instanceof OpenPondTrainingApiError) return error.retryable;
1394
- if (error instanceof OpenPondProtocolError) {
1395
- return error.code === "invalid_error_response";
1396
- }
1397
- return error instanceof TypeError;
1398
- }
1399
1450
  function unwrapObject(value, key) {
1400
1451
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
1401
1452
  return key in value ? value[key] : value;
1402
1453
  }
1403
- function trainingApiError(value, status) {
1404
- const parsed = TrainingApiErrorSchema.safeParse(value);
1405
- if (parsed.success) {
1406
- return new OpenPondTrainingApiError(status, parsed.data);
1407
- }
1408
- return new OpenPondProtocolError(
1409
- "invalid_error_response",
1410
- `Training request failed with HTTP ${status} and an invalid error envelope.`
1411
- );
1412
- }
1413
1454
 
1414
1455
  export {
1456
+ SftRecipeSchema,
1457
+ ManagedSftRecipeSchema,
1415
1458
  TrainingAcceptanceGroupReferenceSchema,
1416
1459
  TrainingAcceptanceGroupSummarySchema,
1417
1460
  TrainingAcceptanceGroupPageSchema,
@@ -1477,11 +1520,9 @@ export {
1477
1520
  parseAndVerifyTrainingExecutionReceipt,
1478
1521
  assertTrainingQualificationReceipt,
1479
1522
  TrainingJobOutputsSchema,
1480
- TrainingApiErrorSchema,
1481
- OpenPondTrainingApiError,
1482
1523
  TrainingPolicyLoraCapabilitiesSchema,
1483
1524
  supportsTrainingPolicyLoraRank,
1484
1525
  TrainingCapabilitiesSchema,
1485
1526
  createTrainingClient
1486
1527
  };
1487
- //# sourceMappingURL=chunk-EYMZQML2.js.map
1528
+ //# sourceMappingURL=chunk-WOD72SFI.js.map