openpond-sdk 0.12.5 → 0.12.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/TASKSETS.md +13 -0
- package/TRAINING_PROTOCOL.md +25 -0
- package/dist/advanced-refiner-evaluations.js +7 -7
- package/dist/candidate-evaluations.js +6 -6
- package/dist/{chunk-EJZ7HOIS.js → chunk-2XLKMZH5.js} +485 -251
- package/dist/chunk-2XLKMZH5.js.map +1 -0
- package/dist/{chunk-CAMLCKSF.js → chunk-3SIGXGAE.js} +132 -87
- package/dist/chunk-3SIGXGAE.js.map +1 -0
- package/dist/{chunk-T3MFWGMX.js → chunk-3VGTVZHL.js} +3 -3
- package/dist/{chunk-O54KGALH.js → chunk-5T76GARR.js} +2 -2
- package/dist/{chunk-WQFU635Q.js → chunk-ATVQQCYN.js} +8 -4
- package/dist/chunk-ATVQQCYN.js.map +1 -0
- package/dist/{chunk-MJELLVQP.js → chunk-B2MKB7NB.js} +2 -2
- package/dist/{chunk-H4NTJFEE.js → chunk-D3WOJTUY.js} +3 -2
- package/dist/{chunk-H4NTJFEE.js.map → chunk-D3WOJTUY.js.map} +1 -1
- package/dist/{chunk-F4GITADW.js → chunk-ETFWUMEJ.js} +2 -2
- package/dist/{chunk-6KKM2XRR.js → chunk-FPA3AVCP.js} +35 -6
- package/dist/chunk-FPA3AVCP.js.map +1 -0
- package/dist/{chunk-QFBSNSUL.js → chunk-HRJKDHHG.js} +6 -4
- package/dist/chunk-HRJKDHHG.js.map +1 -0
- package/dist/{chunk-6GQ3GIAP.js → chunk-HRZLFJXX.js} +3 -3
- package/dist/{chunk-BJ5MKLWH.js → chunk-KD6MM67B.js} +6 -6
- package/dist/{chunk-RE426Q7Y.js → chunk-LIMTJR3A.js} +3 -3
- package/dist/{chunk-ZFYI4P6C.js → chunk-ONGOAEY6.js} +14 -2
- package/dist/chunk-ONGOAEY6.js.map +1 -0
- package/dist/{chunk-FLNWE5ZA.js → chunk-QDYHSJT5.js} +22 -8
- package/dist/chunk-QDYHSJT5.js.map +1 -0
- package/dist/{chunk-GWGDWZVN.js → chunk-RDL6QIQO.js} +2 -2
- package/dist/{chunk-BGNPKYBJ.js → chunk-S2IASCGW.js} +3 -3
- package/dist/{chunk-KKL6OICH.js → chunk-SER76PQ7.js} +2 -2
- package/dist/{chunk-6MFFKAU6.js → chunk-SMHZT6RM.js} +2 -2
- package/dist/{chunk-BYNVSWIQ.js → chunk-SQBYHWZU.js} +2 -2
- package/dist/{chunk-6Y67YHVH.js → chunk-VBVFE33M.js} +5 -5
- package/dist/{chunk-DBKCSQVH.js → chunk-VQGTYGZH.js} +2 -2
- package/dist/{chunk-25L5IXHA.js → chunk-VTAGUWXH.js} +2 -2
- package/dist/{chunk-HOOHJCE7.js → chunk-XF3JR72U.js} +3 -3
- package/dist/{chunk-VZPNRPXL.js → chunk-Y3I7SN5W.js} +61 -35
- package/dist/chunk-Y3I7SN5W.js.map +1 -0
- package/dist/{chunk-XACJ63U4.js → chunk-Z4XGSEKC.js} +577 -249
- package/dist/chunk-Z4XGSEKC.js.map +1 -0
- package/dist/{chunk-AUNNXJQE.js → chunk-ZGZLN4LH.js} +2 -2
- package/dist/connected-evidence.js +14 -14
- package/dist/dataset-workspaces.js +14 -14
- package/dist/experiment-evaluation-schedules.js +18 -18
- package/dist/experiment-improvements.js +7 -7
- package/dist/experiments.js +17 -17
- package/dist/index.js +34 -33
- package/dist/index.js.map +1 -1
- package/dist/learning.js +113 -9
- package/dist/learning.js.map +1 -1
- package/dist/model-projects.js +1 -1
- package/dist/model-starter-attempts.js +2 -2
- package/dist/model-starter-catalog.js +9 -9
- package/dist/model-starters.js +13 -9
- package/dist/model-taskset-runs.js +3 -3
- package/dist/post-training.js +6 -6
- package/dist/taskset-drafts.js +12 -12
- package/dist/taskset-packages.js +15 -15
- package/dist/training-bundle.js +81 -19
- package/dist/training-bundle.js.map +1 -1
- package/dist/training.js +39 -7
- package/dist/types/packages/cloud/src/sandbox/sandbox-instance-client.d.ts.map +1 -1
- package/dist/types/packages/cloud/src/sandbox/url.d.ts +3 -1
- package/dist/types/packages/cloud/src/sandbox/url.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +4 -0
- package/dist/types/packages/sdk/src/connected-evidence-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts +2 -0
- package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +14 -0
- package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts +4 -0
- package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts +4 -0
- package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/learning-client.d.ts +1 -0
- package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/learning-correction-metrics.d.ts +358 -0
- package/dist/types/packages/sdk/src/learning-correction-metrics.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/learning.d.ts +1 -0
- package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +24 -0
- package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-learning-policy.d.ts +16 -0
- package/dist/types/packages/sdk/src/model-learning-policy.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-projects.d.ts +172 -0
- package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-starters.d.ts +84 -1
- package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +28 -28
- package/dist/types/packages/sdk/src/model-training-defaults.d.ts +14 -0
- package/dist/types/packages/sdk/src/model-training-defaults.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/post-training.d.ts +46 -0
- package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +4 -0
- package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +141 -120
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +4 -0
- package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +4 -0
- package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +4 -0
- package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-package-client.d.ts +51 -0
- package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-bundle.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-compute-selection.d.ts +52 -0
- package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-estimates.d.ts +1069 -0
- package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
- package/dist/types/packages/sdk/src/training-physical-placement.d.ts +16 -0
- package/dist/types/packages/sdk/src/training-physical-placement.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-preparations.d.ts +248 -0
- package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +20 -0
- package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-queue.d.ts +24 -0
- package/dist/types/packages/sdk/src/training-queue.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-recipe-binding.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-recovery.d.ts +85 -0
- package/dist/types/packages/sdk/src/training-recovery.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-verifier-assets.d.ts +7 -0
- package/dist/types/packages/sdk/src/training-verifier-assets.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training.d.ts +599 -0
- package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-6KKM2XRR.js.map +0 -1
- package/dist/chunk-CAMLCKSF.js.map +0 -1
- package/dist/chunk-EJZ7HOIS.js.map +0 -1
- package/dist/chunk-FLNWE5ZA.js.map +0 -1
- package/dist/chunk-QFBSNSUL.js.map +0 -1
- package/dist/chunk-VZPNRPXL.js.map +0 -1
- package/dist/chunk-WQFU635Q.js.map +0 -1
- package/dist/chunk-XACJ63U4.js.map +0 -1
- package/dist/chunk-ZFYI4P6C.js.map +0 -1
- /package/dist/{chunk-T3MFWGMX.js.map → chunk-3VGTVZHL.js.map} +0 -0
- /package/dist/{chunk-O54KGALH.js.map → chunk-5T76GARR.js.map} +0 -0
- /package/dist/{chunk-MJELLVQP.js.map → chunk-B2MKB7NB.js.map} +0 -0
- /package/dist/{chunk-F4GITADW.js.map → chunk-ETFWUMEJ.js.map} +0 -0
- /package/dist/{chunk-6GQ3GIAP.js.map → chunk-HRZLFJXX.js.map} +0 -0
- /package/dist/{chunk-BJ5MKLWH.js.map → chunk-KD6MM67B.js.map} +0 -0
- /package/dist/{chunk-RE426Q7Y.js.map → chunk-LIMTJR3A.js.map} +0 -0
- /package/dist/{chunk-GWGDWZVN.js.map → chunk-RDL6QIQO.js.map} +0 -0
- /package/dist/{chunk-BGNPKYBJ.js.map → chunk-S2IASCGW.js.map} +0 -0
- /package/dist/{chunk-KKL6OICH.js.map → chunk-SER76PQ7.js.map} +0 -0
- /package/dist/{chunk-6MFFKAU6.js.map → chunk-SMHZT6RM.js.map} +0 -0
- /package/dist/{chunk-BYNVSWIQ.js.map → chunk-SQBYHWZU.js.map} +0 -0
- /package/dist/{chunk-6Y67YHVH.js.map → chunk-VBVFE33M.js.map} +0 -0
- /package/dist/{chunk-DBKCSQVH.js.map → chunk-VQGTYGZH.js.map} +0 -0
- /package/dist/{chunk-25L5IXHA.js.map → chunk-VTAGUWXH.js.map} +0 -0
- /package/dist/{chunk-HOOHJCE7.js.map → chunk-XF3JR72U.js.map} +0 -0
- /package/dist/{chunk-AUNNXJQE.js.map → chunk-ZGZLN4LH.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TrainingHandoffOriginSchema,
|
|
3
3
|
createPostTrainingClient
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LIMTJR3A.js";
|
|
5
5
|
import {
|
|
6
6
|
validateHarnessPolicySourcePackage,
|
|
7
7
|
validateHarnessSourcePackage
|
|
@@ -16,10 +16,13 @@ import {
|
|
|
16
16
|
TRAINING_API_RESPONSE_MAX_BYTES,
|
|
17
17
|
TRAINING_INPUT_ARTIFACT_MAX_BYTES,
|
|
18
18
|
TRAINING_JOB_SUBMISSION_MAX_BYTES,
|
|
19
|
+
TrainingEstimateReviewSchema,
|
|
20
|
+
TrainingGpuCatalogSchema,
|
|
21
|
+
TrainingGpuSelectionSchema,
|
|
19
22
|
assertCanonicalPayloadSize,
|
|
20
23
|
canonicalSha256,
|
|
21
24
|
parseBoundedJson
|
|
22
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-3SIGXGAE.js";
|
|
23
26
|
import {
|
|
24
27
|
ImmutableReleaseRefSchema
|
|
25
28
|
} from "./chunk-H3JZ3P5T.js";
|
|
@@ -77,41 +80,123 @@ function createTrainingAcceptanceClient(request) {
|
|
|
77
80
|
}
|
|
78
81
|
|
|
79
82
|
// src/training.ts
|
|
80
|
-
import { z as
|
|
83
|
+
import { z as z12 } from "zod";
|
|
81
84
|
|
|
82
|
-
// src/training-
|
|
85
|
+
// src/training-recovery.ts
|
|
83
86
|
import { z as z2 } from "zod";
|
|
84
|
-
var
|
|
85
|
-
var
|
|
86
|
-
var
|
|
87
|
-
schemaVersion: z2.literal("openpond.
|
|
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"),
|
|
91
|
+
ownerUserId: id,
|
|
92
|
+
teamId: id,
|
|
93
|
+
sourceJobId: id,
|
|
94
|
+
sourceJobVersion: z2.number().int().positive(),
|
|
95
|
+
sourceInputManifestSha256: hash,
|
|
96
|
+
checkpointId: id,
|
|
97
|
+
adapterSha256: hash,
|
|
98
|
+
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(
|
|
102
|
+
(value) => Number(value.toFixed(6)) === value,
|
|
103
|
+
"Recovery spend must use whole microdollars"
|
|
104
|
+
),
|
|
105
|
+
maximumGpuSeconds: z2.number().int().positive().max(21600),
|
|
106
|
+
maximumWallSeconds: z2.number().int().positive().max(21600)
|
|
107
|
+
}).strict();
|
|
108
|
+
var TrainingCheckpointRecoveryResourceApprovalSchema = ApprovalBodySchema.extend({
|
|
109
|
+
approvalHash: hash
|
|
110
|
+
}).strict().superRefine((value, context) => {
|
|
111
|
+
if (value.maximumGpuSeconds > value.maximumWallSeconds)
|
|
112
|
+
context.addIssue({
|
|
113
|
+
code: "custom",
|
|
114
|
+
path: ["maximumGpuSeconds"],
|
|
115
|
+
message: "Recovery GPU duration exceeds its wall"
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
async function createTrainingCheckpointRecoveryResourceApproval(input) {
|
|
119
|
+
const body = ApprovalBodySchema.parse(input);
|
|
120
|
+
return TrainingCheckpointRecoveryResourceApprovalSchema.parse({
|
|
121
|
+
...body,
|
|
122
|
+
approvalHash: await canonicalSha256(body)
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
var TrainingCheckpointRecoveryRequestSchema = z2.object({
|
|
126
|
+
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(),
|
|
130
|
+
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)
|
|
134
|
+
}).strict().superRefine((value, context) => {
|
|
135
|
+
if (value.evaluationGpuType && value.mode !== "evaluation_only")
|
|
136
|
+
context.addIssue({
|
|
137
|
+
code: "custom",
|
|
138
|
+
path: ["evaluationGpuType"],
|
|
139
|
+
message: "GPU substitution requires explicit evaluation-only recovery"
|
|
140
|
+
});
|
|
141
|
+
const a = value.resourceApproval;
|
|
142
|
+
if (a && (a.sourceJobVersion !== value.expectedVersion || a.checkpointId !== value.checkpointId || a.idempotencyKey !== value.idempotencyKey || a.maximumSpendUsd !== value.maximumSpendUsd || a.maximumWallSeconds !== value.maximumWallSeconds))
|
|
143
|
+
context.addIssue({
|
|
144
|
+
code: "custom",
|
|
145
|
+
path: ["resourceApproval"],
|
|
146
|
+
message: "Recovery resource approval does not match its request"
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// 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 })
|
|
163
|
+
}).strict();
|
|
164
|
+
|
|
165
|
+
// 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"),
|
|
88
171
|
teamId: Id2,
|
|
89
172
|
operationId: Id2,
|
|
90
173
|
projectId: Id2.nullable(),
|
|
91
|
-
configuration:
|
|
174
|
+
configuration: z4.object({ id: Id2, expectedRevision: z4.number().int().positive(), expectedEtag: Hash }).strict(),
|
|
92
175
|
origin: TrainingHandoffOriginSchema.optional(),
|
|
93
176
|
batch: ModelProjectVersionedRefSchema,
|
|
94
|
-
name:
|
|
95
|
-
maximumSpendUsd:
|
|
177
|
+
name: z4.string().trim().min(1).max(191),
|
|
178
|
+
maximumSpendUsd: z4.number().finite().positive().max(1e6),
|
|
179
|
+
gpuSelection: TrainingGpuSelectionSchema.optional(),
|
|
180
|
+
physicalPlacement: TrainingPhysicalPlacementSchema.optional()
|
|
96
181
|
}).strict();
|
|
97
|
-
var TrainingPreparationPlanContentSchema =
|
|
98
|
-
schemaVersion:
|
|
182
|
+
var TrainingPreparationPlanContentSchema = z4.object({
|
|
183
|
+
schemaVersion: z4.literal("openpond.trainingPreparationPlan.v1"),
|
|
99
184
|
id: Id2,
|
|
100
185
|
creatorUserId: Id2,
|
|
101
186
|
request: TrainingPreparationRequestSchema,
|
|
102
187
|
requestHash: Hash,
|
|
103
|
-
source:
|
|
188
|
+
source: z4.lazy(() => TrainingJobSourceSchema),
|
|
104
189
|
submissionHash: Hash,
|
|
105
|
-
createdAt:
|
|
190
|
+
createdAt: z4.string().datetime({ offset: true })
|
|
106
191
|
}).strict();
|
|
107
192
|
var TrainingPreparationPlanSchema = TrainingPreparationPlanContentSchema.extend({
|
|
108
193
|
contentHash: Hash
|
|
109
194
|
}).strict();
|
|
110
|
-
var TrainingPreparationReceiptSchema =
|
|
111
|
-
schemaVersion:
|
|
195
|
+
var TrainingPreparationReceiptSchema = z4.object({
|
|
196
|
+
schemaVersion: z4.literal("openpond.trainingPreparationReceipt.v1"),
|
|
112
197
|
plan: TrainingPreparationPlanSchema,
|
|
113
|
-
revision:
|
|
114
|
-
state:
|
|
198
|
+
revision: z4.number().int().positive(),
|
|
199
|
+
state: z4.enum(["prepared", "submitted", "cancelled"]),
|
|
115
200
|
jobId: Id2.nullable()
|
|
116
201
|
}).strict().superRefine((value, context) => {
|
|
117
202
|
if (value.state === "submitted" !== Boolean(value.jobId))
|
|
@@ -121,21 +206,22 @@ var TrainingPreparationReceiptSchema = z2.object({
|
|
|
121
206
|
message: "Only submitted preparations identify a job."
|
|
122
207
|
});
|
|
123
208
|
});
|
|
124
|
-
var TrainingPreparationControlSchema =
|
|
209
|
+
var TrainingPreparationControlSchema = z4.object({
|
|
125
210
|
teamId: Id2,
|
|
126
211
|
planHash: Hash,
|
|
127
|
-
expectedRevision:
|
|
212
|
+
expectedRevision: z4.number().int().positive(),
|
|
213
|
+
estimateReview: TrainingEstimateReviewSchema.optional()
|
|
128
214
|
}).strict();
|
|
129
|
-
var TrainingPreparationListQuerySchema =
|
|
215
|
+
var TrainingPreparationListQuerySchema = z4.object({
|
|
130
216
|
projectId: Id2.optional(),
|
|
131
|
-
state:
|
|
217
|
+
state: z4.enum(["prepared", "submitted", "cancelled"]).optional(),
|
|
132
218
|
afterId: Id2.optional(),
|
|
133
|
-
limit:
|
|
219
|
+
limit: z4.number().int().min(1).max(100).default(25)
|
|
134
220
|
}).strict();
|
|
135
|
-
var TrainingPreparationPageSchema =
|
|
136
|
-
schemaVersion:
|
|
221
|
+
var TrainingPreparationPageSchema = z4.object({
|
|
222
|
+
schemaVersion: z4.literal("openpond.trainingPreparationPage.v1"),
|
|
137
223
|
teamId: Id2,
|
|
138
|
-
items:
|
|
224
|
+
items: z4.array(TrainingPreparationReceiptSchema).max(100),
|
|
139
225
|
nextCursor: Id2.nullable()
|
|
140
226
|
}).strict();
|
|
141
227
|
async function parseAndVerifyTrainingPreparationReceipt(value) {
|
|
@@ -150,9 +236,9 @@ async function parseAndVerifyTrainingPreparationReceipt(value) {
|
|
|
150
236
|
return receipt;
|
|
151
237
|
}
|
|
152
238
|
function createTrainingPreparationClient(request) {
|
|
153
|
-
async function read(value, teamId,
|
|
239
|
+
async function read(value, teamId, id2) {
|
|
154
240
|
const receipt = await parseAndVerifyTrainingPreparationReceipt(value);
|
|
155
|
-
if (receipt.plan.request.teamId !== teamId ||
|
|
241
|
+
if (receipt.plan.request.teamId !== teamId || id2 && receipt.plan.id !== id2)
|
|
156
242
|
throw new OpenPondProtocolError(
|
|
157
243
|
"training_preparation_scope_mismatch",
|
|
158
244
|
"The training preparation belongs to a different workspace or request."
|
|
@@ -205,22 +291,22 @@ function createTrainingPreparationClient(request) {
|
|
|
205
291
|
);
|
|
206
292
|
return receipt;
|
|
207
293
|
},
|
|
208
|
-
async getPreparation(teamId,
|
|
294
|
+
async getPreparation(teamId, id2) {
|
|
209
295
|
return read(
|
|
210
|
-
await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(
|
|
296
|
+
await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}`),
|
|
211
297
|
Id2.parse(teamId),
|
|
212
|
-
|
|
298
|
+
id2
|
|
213
299
|
);
|
|
214
300
|
},
|
|
215
|
-
async startPreparation(
|
|
301
|
+
async startPreparation(id2, input) {
|
|
216
302
|
const parsed = TrainingPreparationControlSchema.parse(input);
|
|
217
303
|
const receipt = await read(
|
|
218
|
-
await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(
|
|
304
|
+
await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}/start`, {
|
|
219
305
|
method: "POST",
|
|
220
306
|
body: JSON.stringify(parsed)
|
|
221
307
|
}),
|
|
222
308
|
parsed.teamId,
|
|
223
|
-
|
|
309
|
+
id2
|
|
224
310
|
);
|
|
225
311
|
if (receipt.plan.contentHash !== parsed.planHash || receipt.state !== "submitted")
|
|
226
312
|
throw new OpenPondProtocolError(
|
|
@@ -229,15 +315,15 @@ function createTrainingPreparationClient(request) {
|
|
|
229
315
|
);
|
|
230
316
|
return receipt;
|
|
231
317
|
},
|
|
232
|
-
async cancelPreparation(
|
|
318
|
+
async cancelPreparation(id2, input) {
|
|
233
319
|
const parsed = TrainingPreparationControlSchema.parse(input);
|
|
234
320
|
const receipt = await read(
|
|
235
|
-
await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(
|
|
321
|
+
await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}/cancel`, {
|
|
236
322
|
method: "POST",
|
|
237
323
|
body: JSON.stringify(parsed)
|
|
238
324
|
}),
|
|
239
325
|
parsed.teamId,
|
|
240
|
-
|
|
326
|
+
id2
|
|
241
327
|
);
|
|
242
328
|
if (receipt.plan.contentHash !== parsed.planHash || receipt.state !== "cancelled")
|
|
243
329
|
throw new OpenPondProtocolError(
|
|
@@ -249,13 +335,184 @@ function createTrainingPreparationClient(request) {
|
|
|
249
335
|
};
|
|
250
336
|
}
|
|
251
337
|
|
|
338
|
+
// 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,
|
|
351
|
+
batch: ModelProjectVersionedRefSchema.nullable().default(null)
|
|
352
|
+
}).strict(),
|
|
353
|
+
z5.object({ kind: z5.literal("submission"), submission: z5.lazy(() => TrainingJobSubmissionSchema) }).strict()
|
|
354
|
+
]);
|
|
355
|
+
var TrainingEstimateRequestSchema = z5.object({
|
|
356
|
+
schemaVersion: z5.literal("openpond.trainingEstimateRequest.v1"),
|
|
357
|
+
teamId: Id3,
|
|
358
|
+
source: TrainingEstimateSourceSchema,
|
|
359
|
+
gpuSelection: TrainingGpuSelectionSchema.optional()
|
|
360
|
+
}).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([
|
|
364
|
+
"startup",
|
|
365
|
+
"baseline_evaluation",
|
|
366
|
+
"rollouts",
|
|
367
|
+
"optimization",
|
|
368
|
+
"checkpointing",
|
|
369
|
+
"backbone_materialization",
|
|
370
|
+
"final_evaluation",
|
|
371
|
+
"publication",
|
|
372
|
+
"cleanup",
|
|
373
|
+
"retention"
|
|
374
|
+
]),
|
|
375
|
+
resource: z5.enum(["gpu", "cpu", "judge", "storage", "network"]),
|
|
376
|
+
expectedUsd: NonNegative.nullable(),
|
|
377
|
+
expectedSeconds: NonNegative.nullable(),
|
|
378
|
+
planningRangeUsd: PlanningRange.nullable(),
|
|
379
|
+
evidence: z5.enum(["measured", "configured_rate", "unavailable"]),
|
|
380
|
+
reason: z5.string().trim().min(1).max(1e3).nullable()
|
|
381
|
+
}).strict();
|
|
382
|
+
function trainingEstimateSourceIdentity(source) {
|
|
383
|
+
if (source.kind === "submission") return {
|
|
384
|
+
kind: source.kind,
|
|
385
|
+
id: source.submission.idempotencyKey,
|
|
386
|
+
contentHash: source.submission.contentHash,
|
|
387
|
+
revision: null
|
|
388
|
+
};
|
|
389
|
+
if (source.kind === "preparation") return {
|
|
390
|
+
kind: source.kind,
|
|
391
|
+
id: source.id,
|
|
392
|
+
contentHash: source.planHash,
|
|
393
|
+
revision: source.expectedRevision
|
|
394
|
+
};
|
|
395
|
+
return { kind: source.kind, id: source.id, contentHash: source.expectedEtag, revision: source.expectedRevision };
|
|
396
|
+
}
|
|
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()
|
|
408
|
+
}).strict(),
|
|
409
|
+
status: z5.enum(["available", "partial", "insufficient_evidence"]),
|
|
410
|
+
currency: z5.literal("USD"),
|
|
411
|
+
createdAt: Timestamp,
|
|
412
|
+
expiresAt: Timestamp,
|
|
413
|
+
estimatorVersion: Id3,
|
|
414
|
+
runtimeVersion: Id3,
|
|
415
|
+
pricing: z5.object({ version: Id3, quoteExpiresAt: Timestamp.nullable() }).strict(),
|
|
416
|
+
gpu: z5.object({
|
|
417
|
+
requested: TrainingGpuSelectionSchema,
|
|
418
|
+
resolved: z5.object({ availabilityId: Id3, gpuType: z5.string().min(1).max(256), gpuCount: z5.literal(1) }).strict().nullable(),
|
|
419
|
+
customerHourlyUsd: NonNegative.nullable(),
|
|
420
|
+
availability: z5.enum(["available", "limited", "unavailable", "unknown"])
|
|
421
|
+
}).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(),
|
|
434
|
+
approvedMaximumUsd: NonNegative.nullable()
|
|
435
|
+
}).strict(),
|
|
436
|
+
cost: z5.object({
|
|
437
|
+
expectedUsd: NonNegative.nullable(),
|
|
438
|
+
planningRangeUsd: PlanningRange.nullable(),
|
|
439
|
+
knownMinimumUsd: NonNegative,
|
|
440
|
+
recommendedMaximumUsd: NonNegative.nullable(),
|
|
441
|
+
minimumCleanupReserveUsd: NonNegative.nullable(),
|
|
442
|
+
components: z5.array(TrainingEstimateComponentSchema).max(50)
|
|
443
|
+
}).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"])
|
|
452
|
+
}).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),
|
|
455
|
+
review: TrainingEstimateReviewSchema
|
|
456
|
+
}).strict().superRefine((estimate, context) => {
|
|
457
|
+
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) {
|
|
458
|
+
context.addIssue({ code: "custom", path: ["review"], message: "Estimate review identity differs from the estimate" });
|
|
459
|
+
}
|
|
460
|
+
if (Date.parse(estimate.expiresAt) <= Date.parse(estimate.createdAt)) {
|
|
461
|
+
context.addIssue({ code: "custom", path: ["expiresAt"], message: "Estimate must expire after its creation" });
|
|
462
|
+
}
|
|
463
|
+
if (estimate.status === "available" && (estimate.cost.expectedUsd === null || estimate.executionSeconds.expected === null || estimate.unknowns.length > 0)) {
|
|
464
|
+
context.addIssue({ code: "custom", path: ["status"], message: "An available estimate requires complete cost and duration coverage" });
|
|
465
|
+
}
|
|
466
|
+
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
|
+
context.addIssue({ code: "custom", path: ["gpu"], message: "An explicit GPU offering cannot be substituted" });
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
function createTrainingEstimateClient(request) {
|
|
471
|
+
return {
|
|
472
|
+
async estimate(input) {
|
|
473
|
+
const parsed = TrainingEstimateRequestSchema.parse(input);
|
|
474
|
+
if (parsed.source.kind === "submission") await parseAndVerifyTrainingJobSubmission(parsed.source.submission);
|
|
475
|
+
const result = TrainingEstimateSchema.parse(await request("/v1/training/estimates", {
|
|
476
|
+
method: "POST",
|
|
477
|
+
body: JSON.stringify(parsed)
|
|
478
|
+
}));
|
|
479
|
+
if (result.teamId !== parsed.teamId || result.requestHash !== await canonicalSha256(parsed) || await canonicalSha256(result.source) !== await canonicalSha256(trainingEstimateSourceIdentity(parsed.source)) || parsed.gpuSelection && await canonicalSha256(result.gpu.requested) !== await canonicalSha256(parsed.gpuSelection)) {
|
|
480
|
+
throw new OpenPondProtocolError("training_estimate_scope_mismatch", "The estimate does not match the requested workspace and exact configuration.");
|
|
481
|
+
}
|
|
482
|
+
return result;
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// 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"),
|
|
496
|
+
enqueuedAt: Timestamp2,
|
|
497
|
+
asOf: Timestamp2,
|
|
498
|
+
estimate: z6.object({
|
|
499
|
+
revision: z6.number().int().nonnegative(),
|
|
500
|
+
estimatedStartAt: Timestamp2,
|
|
501
|
+
expiresAt: Timestamp2,
|
|
502
|
+
evidence: z6.enum(["observed_capacity", "measured_bootstrap", "scheduled_release"])
|
|
503
|
+
}).strict().nullable()
|
|
504
|
+
}).strict().superRefine((value, context) => {
|
|
505
|
+
if (value.estimate && Date.parse(value.estimate.expiresAt) <= Date.parse(value.asOf))
|
|
506
|
+
context.addIssue({ code: "custom", path: ["estimate"], message: "An expired queue forecast must be returned as unavailable" });
|
|
507
|
+
});
|
|
508
|
+
|
|
252
509
|
// src/training-harness-sources.ts
|
|
253
|
-
import { z as
|
|
254
|
-
var TrainingHarnessSourcePublicationSchema =
|
|
255
|
-
schemaVersion:
|
|
510
|
+
import { z as z7 } from "zod";
|
|
511
|
+
var TrainingHarnessSourcePublicationSchema = z7.object({
|
|
512
|
+
schemaVersion: z7.literal("openpond.trainingHarnessSourcePublication.v1"),
|
|
256
513
|
harnessRelease: ImmutableReleaseRefSchema,
|
|
257
|
-
sourcePackageHash:
|
|
258
|
-
sizeBytes:
|
|
514
|
+
sourcePackageHash: z7.string().regex(/^[a-f0-9]{64}$/),
|
|
515
|
+
sizeBytes: z7.number().int().positive().max(TRAINING_INPUT_ARTIFACT_MAX_BYTES)
|
|
259
516
|
}).strict();
|
|
260
517
|
function createTrainingHarnessSourceClient(request) {
|
|
261
518
|
const route = (reference) => {
|
|
@@ -288,28 +545,28 @@ function validateSource(value, reference) {
|
|
|
288
545
|
}
|
|
289
546
|
|
|
290
547
|
// src/training-candidate-decisions.ts
|
|
291
|
-
import { z as
|
|
292
|
-
var IdSchema = /* @__PURE__ */ (() =>
|
|
293
|
-
var HashSchema = /* @__PURE__ */ (() =>
|
|
294
|
-
var TrainingCandidateDecisionRequestSchema = /* @__PURE__ */ (() =>
|
|
295
|
-
schemaVersion:
|
|
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"),
|
|
296
553
|
teamId: IdSchema,
|
|
297
554
|
jobId: IdSchema,
|
|
298
555
|
artifact: ModelProjectImmutableRefSchema,
|
|
299
556
|
evaluation: ModelProjectImmutableRefSchema,
|
|
300
557
|
executionReceipt: ModelProjectImmutableRefSchema,
|
|
301
|
-
decision:
|
|
302
|
-
reason:
|
|
558
|
+
decision: z8.enum(["accepted", "rejected"]),
|
|
559
|
+
reason: z8.string().trim().min(1).max(5e3),
|
|
303
560
|
idempotencyKey: IdSchema,
|
|
304
561
|
expectedDecision: ModelProjectImmutableRefSchema.nullable()
|
|
305
562
|
}).strict())();
|
|
306
|
-
var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() =>
|
|
307
|
-
schemaVersion:
|
|
563
|
+
var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() => z8.object({
|
|
564
|
+
schemaVersion: z8.literal("openpond.trainingCandidateDecision.v1"),
|
|
308
565
|
id: IdSchema,
|
|
309
566
|
request: TrainingCandidateDecisionRequestSchema,
|
|
310
|
-
revision:
|
|
311
|
-
actor:
|
|
312
|
-
decidedAt:
|
|
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 }),
|
|
313
570
|
contentHash: HashSchema
|
|
314
571
|
}).strict().superRefine((value, context) => {
|
|
315
572
|
if (value.revision === 1 !== (value.request.expectedDecision === null)) {
|
|
@@ -346,7 +603,7 @@ function createTrainingCandidateDecisionClient(request) {
|
|
|
346
603
|
IdSchema.parse(target.teamId);
|
|
347
604
|
const reference = options.decision ? ModelProjectImmutableRefSchema.parse(options.decision) : void 0;
|
|
348
605
|
const query = reference ? `?decisionId=${encodeURIComponent(reference.id)}` : "";
|
|
349
|
-
const response =
|
|
606
|
+
const response = z8.object({ decision: z8.unknown().nullable() }).strict().parse(await request(`${route(target)}${query}`));
|
|
350
607
|
if (response.decision === null && !reference) return null;
|
|
351
608
|
const decision = await parseAndVerifyTrainingCandidateDecision(response.decision, target);
|
|
352
609
|
if (reference && (decision.id !== reference.id || decision.contentHash !== reference.contentHash)) {
|
|
@@ -363,38 +620,38 @@ function createTrainingCandidateDecisionClient(request) {
|
|
|
363
620
|
}
|
|
364
621
|
|
|
365
622
|
// src/training-evaluation-results.ts
|
|
366
|
-
import { z as
|
|
367
|
-
var IdSchema2 = /* @__PURE__ */ (() =>
|
|
368
|
-
var HashSchema2 = /* @__PURE__ */ (() =>
|
|
369
|
-
var TrainingEvaluationTaskResultSchema = /* @__PURE__ */ (() =>
|
|
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({
|
|
370
627
|
taskId: IdSchema2,
|
|
371
628
|
taskSha256: HashSchema2,
|
|
372
629
|
resultSha256: HashSchema2,
|
|
373
|
-
input:
|
|
374
|
-
instruction:
|
|
375
|
-
context:
|
|
630
|
+
input: z9.object({
|
|
631
|
+
instruction: z9.string().max(1e6),
|
|
632
|
+
context: z9.record(z9.string(), z9.unknown())
|
|
376
633
|
}).strict(),
|
|
377
|
-
output:
|
|
634
|
+
output: z9.string().max(1e6),
|
|
378
635
|
outputSha256: HashSchema2,
|
|
379
|
-
score:
|
|
380
|
-
evidence:
|
|
381
|
-
kind:
|
|
636
|
+
score: z9.number().finite().min(0).max(1),
|
|
637
|
+
evidence: z9.object({
|
|
638
|
+
kind: z9.enum(["worker_command", "hosted_trace", "local_trace"]),
|
|
382
639
|
id: IdSchema2
|
|
383
640
|
}).strict()
|
|
384
641
|
}).strict())();
|
|
385
|
-
var TrainingEvaluationTaskPageSchema = /* @__PURE__ */ (() =>
|
|
386
|
-
schemaVersion:
|
|
642
|
+
var TrainingEvaluationTaskPageSchema = /* @__PURE__ */ (() => z9.object({
|
|
643
|
+
schemaVersion: z9.literal("openpond.trainingEvaluationTaskPage.v1"),
|
|
387
644
|
jobId: IdSchema2,
|
|
388
645
|
teamId: IdSchema2,
|
|
389
646
|
evaluation: ModelProjectImmutableRefSchema,
|
|
390
|
-
kind:
|
|
391
|
-
policyVersion:
|
|
647
|
+
kind: z9.enum(["baseline", "candidate"]),
|
|
648
|
+
policyVersion: z9.number().int().nonnegative(),
|
|
392
649
|
taskset: ModelProjectVersionedRefSchema,
|
|
393
650
|
panelSha256: HashSchema2,
|
|
394
|
-
offset:
|
|
395
|
-
total:
|
|
396
|
-
tasks:
|
|
397
|
-
nextCursor:
|
|
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(),
|
|
398
655
|
contentHash: HashSchema2
|
|
399
656
|
}).strict().superRefine((page, context) => {
|
|
400
657
|
const end = page.offset + page.tasks.length;
|
|
@@ -429,12 +686,12 @@ async function parseAndVerifyTrainingEvaluationTaskPage(value, expected) {
|
|
|
429
686
|
}
|
|
430
687
|
|
|
431
688
|
// src/training-grading-plan.ts
|
|
432
|
-
import { z as
|
|
689
|
+
import { z as z10 } from "zod";
|
|
433
690
|
import { compileBoundGraders, RewardBindingSchema, RewardReleaseSchema } from "@openpond/evals/rewards";
|
|
434
|
-
var GradersSchema =
|
|
435
|
-
var RewardExecutionSchema =
|
|
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({
|
|
436
693
|
binding: RewardBindingSchema,
|
|
437
|
-
rewards:
|
|
694
|
+
rewards: z10.array(RewardReleaseSchema).min(1).max(100)
|
|
438
695
|
}).strict();
|
|
439
696
|
async function deterministicTrainingRewardSource(input) {
|
|
440
697
|
const execution = input.rewardExecution ? RewardExecutionSchema.parse(input.rewardExecution) : null;
|
|
@@ -442,32 +699,32 @@ async function deterministicTrainingRewardSource(input) {
|
|
|
442
699
|
if (new Set(graders.map((grader) => grader.id)).size !== graders.length) {
|
|
443
700
|
throw new Error("Training grader identities must be unique.");
|
|
444
701
|
}
|
|
445
|
-
const
|
|
702
|
+
const hash2 = await canonicalSha256({ schemaVersion: "openpond.trainingGraderSet.v1", graders });
|
|
446
703
|
return {
|
|
447
704
|
kind: "deterministic",
|
|
448
|
-
grader: { id: `training-graders-${
|
|
705
|
+
grader: { id: `training-graders-${hash2.slice(0, 32)}`, contentHash: hash2 },
|
|
449
706
|
composer: execution ? { id: execution.binding.id, contentHash: execution.binding.contentHash } : null
|
|
450
707
|
};
|
|
451
708
|
}
|
|
452
709
|
|
|
453
710
|
// src/training-evaluation-source.ts
|
|
454
|
-
import { z as
|
|
711
|
+
import { z as z11 } from "zod";
|
|
455
712
|
var TRAINING_EVALUATION_SOURCE_PATH = "evaluation-source.json";
|
|
456
|
-
var TaskIdentitySchema =
|
|
457
|
-
id:
|
|
458
|
-
clusterKey:
|
|
459
|
-
split:
|
|
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"])
|
|
460
717
|
}).passthrough();
|
|
461
|
-
var TrainingEvaluationSourceSchema =
|
|
462
|
-
schemaVersion:
|
|
718
|
+
var TrainingEvaluationSourceSchema = z11.object({
|
|
719
|
+
schemaVersion: z11.literal("openpond.trainingEvaluationSource.v1"),
|
|
463
720
|
taskset: ModelProjectVersionedRefSchema,
|
|
464
|
-
tasks:
|
|
465
|
-
assets:
|
|
466
|
-
path:
|
|
467
|
-
sha256:
|
|
468
|
-
sizeBytes:
|
|
469
|
-
encoding:
|
|
470
|
-
content:
|
|
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)
|
|
471
728
|
}).strict()).max(1e4)
|
|
472
729
|
}).strict().superRefine((source, context) => {
|
|
473
730
|
const ids = /* @__PURE__ */ new Set();
|
|
@@ -478,8 +735,8 @@ var TrainingEvaluationSourceSchema = z7.object({
|
|
|
478
735
|
});
|
|
479
736
|
});
|
|
480
737
|
function assertTrainingEvaluationIsolation(trainingTasks, evaluationTasks) {
|
|
481
|
-
const training =
|
|
482
|
-
const evaluation =
|
|
738
|
+
const training = z11.array(TaskIdentitySchema).min(1).max(1e4).parse(trainingTasks);
|
|
739
|
+
const evaluation = z11.array(TaskIdentitySchema).min(1).max(1e4).parse(evaluationTasks);
|
|
483
740
|
const trainIds = /* @__PURE__ */ new Set();
|
|
484
741
|
const trainFamilies = /* @__PURE__ */ new Set();
|
|
485
742
|
for (const task of training) {
|
|
@@ -500,29 +757,29 @@ function assertTrainingEvaluationIsolation(trainingTasks, evaluationTasks) {
|
|
|
500
757
|
}
|
|
501
758
|
async function trainingEvaluationSourceRef(input) {
|
|
502
759
|
const source = TrainingEvaluationSourceSchema.parse(input);
|
|
503
|
-
const
|
|
504
|
-
return { taskset: source.taskset, dataset: { id: `training-evaluation-${
|
|
760
|
+
const hash2 = await canonicalSha256(source);
|
|
761
|
+
return { taskset: source.taskset, dataset: { id: `training-evaluation-${hash2.slice(0, 32)}`, contentHash: hash2 } };
|
|
505
762
|
}
|
|
506
763
|
|
|
507
764
|
// src/training.ts
|
|
508
|
-
var IdSchema3 =
|
|
509
|
-
var HashSchema3 =
|
|
510
|
-
var TimestampSchema =
|
|
511
|
-
var TrainingInputArtifactUploadSchema =
|
|
512
|
-
schemaVersion:
|
|
513
|
-
kind:
|
|
514
|
-
idempotencyKey:
|
|
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),
|
|
515
772
|
sourceManifest: ModelProjectImmutableRefSchema,
|
|
516
|
-
payload:
|
|
773
|
+
payload: z12.unknown(),
|
|
517
774
|
contentHash: HashSchema3
|
|
518
775
|
}).strict();
|
|
519
|
-
var TrainingInputArtifactSchema =
|
|
520
|
-
schemaVersion:
|
|
521
|
-
kind:
|
|
776
|
+
var TrainingInputArtifactSchema = z12.object({
|
|
777
|
+
schemaVersion: z12.literal("openpond.trainingInputArtifact.v2"),
|
|
778
|
+
kind: z12.enum(["portable_training_bundle", "reward_model_dataset"]),
|
|
522
779
|
sourceManifest: ModelProjectImmutableRefSchema,
|
|
523
|
-
artifactRef:
|
|
780
|
+
artifactRef: z12.string().trim().min(1).max(2e3),
|
|
524
781
|
contentHash: HashSchema3,
|
|
525
|
-
sizeBytes:
|
|
782
|
+
sizeBytes: z12.number().int().positive(),
|
|
526
783
|
createdAt: TimestampSchema
|
|
527
784
|
}).strict();
|
|
528
785
|
async function trainingInputArtifactUploadHash(upload) {
|
|
@@ -541,8 +798,8 @@ async function parseAndVerifyTrainingInputArtifactUpload(value) {
|
|
|
541
798
|
}
|
|
542
799
|
return parsed;
|
|
543
800
|
}
|
|
544
|
-
var TrainingJobKindSchema =
|
|
545
|
-
var TrainingJobStateSchema =
|
|
801
|
+
var TrainingJobKindSchema = z12.enum(["reward_model_train", "policy_optimize"]);
|
|
802
|
+
var TrainingJobStateSchema = z12.enum([
|
|
546
803
|
"queued",
|
|
547
804
|
"admitting",
|
|
548
805
|
"provisioning",
|
|
@@ -553,53 +810,53 @@ var TrainingJobStateSchema = z8.enum([
|
|
|
553
810
|
"failed",
|
|
554
811
|
"cancelled"
|
|
555
812
|
]);
|
|
556
|
-
var TrainingCapabilityRequirementSchema =
|
|
813
|
+
var TrainingCapabilityRequirementSchema = z12.object({
|
|
557
814
|
id: IdSchema3,
|
|
558
|
-
version:
|
|
559
|
-
required:
|
|
815
|
+
version: z12.string().trim().min(1).max(200).nullable().default(null),
|
|
816
|
+
required: z12.boolean().default(true)
|
|
560
817
|
}).strict();
|
|
561
|
-
var TrainingJobSourceSchema =
|
|
818
|
+
var TrainingJobSourceSchema = z12.object({
|
|
562
819
|
origin: TrainingHandoffOriginSchema.optional(),
|
|
563
|
-
modelProject:
|
|
820
|
+
modelProject: z12.object({
|
|
564
821
|
id: IdSchema3,
|
|
565
822
|
portableProjectId: IdSchema3,
|
|
566
|
-
revision:
|
|
823
|
+
revision: z12.number().int().positive(),
|
|
567
824
|
contentHash: HashSchema3
|
|
568
825
|
}).strict(),
|
|
569
826
|
harnessRunManifest: ModelProjectImmutableRefSchema,
|
|
570
827
|
harnessRelease: ModelProjectImmutableRefSchema,
|
|
571
828
|
taskset: ModelProjectVersionedRefSchema,
|
|
572
829
|
tasksetRelease: ModelProjectImmutableRefSchema,
|
|
573
|
-
evaluation:
|
|
830
|
+
evaluation: z12.object({
|
|
574
831
|
taskset: ModelProjectVersionedRefSchema,
|
|
575
832
|
dataset: ModelProjectImmutableRefSchema
|
|
576
833
|
}).strict().nullable().optional(),
|
|
577
834
|
dataset: ModelProjectImmutableRefSchema,
|
|
578
|
-
evidenceSets:
|
|
835
|
+
evidenceSets: z12.array(ModelProjectImmutableRefSchema).max(1e4)
|
|
579
836
|
}).strict();
|
|
580
|
-
var RewardModelTrainingRequestSchema =
|
|
581
|
-
kind:
|
|
837
|
+
var RewardModelTrainingRequestSchema = z12.object({
|
|
838
|
+
kind: z12.literal("reward_model_train"),
|
|
582
839
|
baseModel: ModelProjectBaseModelSchema,
|
|
583
840
|
preferenceDatasetRelease: ModelProjectImmutableRefSchema,
|
|
584
841
|
processorRelease: ModelProjectImmutableRefSchema,
|
|
585
|
-
recipe:
|
|
586
|
-
schemaVersion:
|
|
587
|
-
method:
|
|
588
|
-
parameterization:
|
|
589
|
-
}).catchall(
|
|
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())
|
|
590
847
|
}).strict();
|
|
591
|
-
var DeterministicRewardSourceSchema =
|
|
592
|
-
kind:
|
|
848
|
+
var DeterministicRewardSourceSchema = z12.object({
|
|
849
|
+
kind: z12.literal("deterministic"),
|
|
593
850
|
grader: ModelProjectImmutableRefSchema,
|
|
594
851
|
composer: ModelProjectImmutableRefSchema.nullable().default(null)
|
|
595
852
|
}).strict();
|
|
596
|
-
var LearnedRewardSourceSchema =
|
|
597
|
-
kind:
|
|
853
|
+
var LearnedRewardSourceSchema = z12.object({
|
|
854
|
+
kind: z12.literal("learned_reward"),
|
|
598
855
|
rewardModelVersion: ModelProjectImmutableRefSchema,
|
|
599
856
|
qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),
|
|
600
|
-
evaluationReferences:
|
|
601
|
-
scorerArtifact:
|
|
602
|
-
artifactRef:
|
|
857
|
+
evaluationReferences: z12.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
|
|
858
|
+
scorerArtifact: z12.object({
|
|
859
|
+
artifactRef: z12.string().trim().min(1).max(2e3),
|
|
603
860
|
contentHash: HashSchema3,
|
|
604
861
|
executionReceipt: ModelProjectImmutableRefSchema
|
|
605
862
|
}).strict(),
|
|
@@ -607,49 +864,54 @@ var LearnedRewardSourceSchema = z8.object({
|
|
|
607
864
|
rewardComposerRelease: ModelProjectImmutableRefSchema
|
|
608
865
|
}).strict();
|
|
609
866
|
var TrainingQualificationBaseModelSchema = ModelProjectBaseModelSchema.extend({
|
|
610
|
-
revision:
|
|
611
|
-
tokenizerRevision:
|
|
867
|
+
revision: z12.string().regex(/^[a-f0-9]{40,64}$/),
|
|
868
|
+
tokenizerRevision: z12.string().regex(/^[a-f0-9]{40,64}$/),
|
|
612
869
|
chatTemplateHash: HashSchema3
|
|
613
870
|
}).strict();
|
|
614
|
-
var PolicyOptimizationRequestSchema =
|
|
615
|
-
kind:
|
|
871
|
+
var PolicyOptimizationRequestSchema = z12.object({
|
|
872
|
+
kind: z12.literal("policy_optimize"),
|
|
616
873
|
/** Collect and grade one original-learner group without optimizer work. */
|
|
617
|
-
executionMode:
|
|
874
|
+
executionMode: z12.literal("qualification").optional(),
|
|
618
875
|
baseModel: ModelProjectBaseModelSchema,
|
|
619
876
|
recipe: ModelProjectRecipeDocumentSchema,
|
|
620
|
-
rewardSource:
|
|
877
|
+
rewardSource: z12.discriminatedUnion("kind", [
|
|
621
878
|
DeterministicRewardSourceSchema,
|
|
622
879
|
LearnedRewardSourceSchema
|
|
623
880
|
]),
|
|
624
881
|
resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null)
|
|
625
882
|
}).strict();
|
|
626
|
-
var TrainingJobRequestSchema =
|
|
883
|
+
var TrainingJobRequestSchema = z12.discriminatedUnion("kind", [
|
|
627
884
|
RewardModelTrainingRequestSchema,
|
|
628
885
|
PolicyOptimizationRequestSchema
|
|
629
886
|
]);
|
|
630
|
-
var TrainingJobApprovalSchema =
|
|
887
|
+
var TrainingJobApprovalSchema = z12.object({
|
|
631
888
|
approvalHash: HashSchema3,
|
|
632
889
|
approvedAt: TimestampSchema,
|
|
633
|
-
exportApproved:
|
|
634
|
-
maximumSpendUsd:
|
|
635
|
-
retentionDays:
|
|
636
|
-
region:
|
|
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)
|
|
637
894
|
}).strict();
|
|
638
|
-
var TrainingJobSubmissionSchema =
|
|
639
|
-
schemaVersion:
|
|
640
|
-
idempotencyKey:
|
|
641
|
-
name:
|
|
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),
|
|
642
899
|
source: TrainingJobSourceSchema,
|
|
643
900
|
job: TrainingJobRequestSchema,
|
|
644
|
-
requestedCapabilities:
|
|
645
|
-
placementObjective:
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
901
|
+
requestedCapabilities: z12.array(TrainingCapabilityRequirementSchema).max(1e3),
|
|
902
|
+
placementObjective: z12.enum(["fast", "balanced", "economical"]),
|
|
903
|
+
gpuSelection: TrainingGpuSelectionSchema.optional(),
|
|
904
|
+
physicalPlacement: TrainingPhysicalPlacementSchema.optional(),
|
|
905
|
+
budget: z12.object({
|
|
906
|
+
maximumSpendUsd: z12.number().nonnegative(),
|
|
907
|
+
maximumWallSeconds: z12.number().int().positive()
|
|
649
908
|
}).strict(),
|
|
650
909
|
approval: TrainingJobApprovalSchema,
|
|
651
910
|
contentHash: HashSchema3
|
|
652
911
|
}).strict().superRefine((submission, context) => {
|
|
912
|
+
if (submission.physicalPlacement && (submission.job.kind !== "policy_optimize" || submission.job.resumeFrom || submission.job.executionMode || submission.job.recipe.continuation !== void 0)) {
|
|
913
|
+
context.addIssue({ code: "custom", path: ["physicalPlacement"], message: "Reuse-only placement requires fresh-base policy training without continuation." });
|
|
914
|
+
}
|
|
653
915
|
if (submission.job.kind === "policy_optimize" && submission.job.executionMode === "qualification") {
|
|
654
916
|
const job = submission.job;
|
|
655
917
|
if (!TrainingQualificationBaseModelSchema.safeParse(job.baseModel).success) {
|
|
@@ -694,87 +956,99 @@ async function parseAndVerifyTrainingJobSubmission(value) {
|
|
|
694
956
|
}
|
|
695
957
|
return parsed;
|
|
696
958
|
}
|
|
697
|
-
var
|
|
698
|
-
|
|
959
|
+
var TrainingJobRecoverySchema = z12.object({
|
|
960
|
+
resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
|
|
961
|
+
mode: z12.literal("evaluation_only").optional(),
|
|
962
|
+
trainingWorkloadComplete: z12.boolean().optional(),
|
|
963
|
+
sourceJobId: IdSchema3,
|
|
964
|
+
checkpointId: IdSchema3,
|
|
965
|
+
policyVersion: z12.number().int().positive(),
|
|
966
|
+
completedGroups: z12.number().int().positive(),
|
|
967
|
+
optimizerMode: z12.literal("continue")
|
|
968
|
+
}).strict();
|
|
969
|
+
var TrainingJobSchema = z12.object({
|
|
970
|
+
schemaVersion: z12.literal("openpond.trainingJob.v2"),
|
|
699
971
|
id: IdSchema3,
|
|
700
972
|
teamId: IdSchema3,
|
|
701
973
|
kind: TrainingJobKindSchema,
|
|
702
|
-
executionMode:
|
|
974
|
+
executionMode: z12.literal("qualification").optional(),
|
|
975
|
+
recovery: TrainingJobRecoverySchema.optional(),
|
|
703
976
|
modelProjectId: IdSchema3,
|
|
704
977
|
portableProjectId: IdSchema3,
|
|
705
|
-
sourceProjectRevision:
|
|
978
|
+
sourceProjectRevision: z12.number().int().positive(),
|
|
706
979
|
submissionHash: HashSchema3,
|
|
707
980
|
state: TrainingJobStateSchema,
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
981
|
+
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()
|
|
716
990
|
}).strict(),
|
|
717
|
-
accruedSpendUsd:
|
|
718
|
-
terminalReason:
|
|
991
|
+
accruedSpendUsd: z12.number().nonnegative(),
|
|
992
|
+
terminalReason: z12.string().trim().min(1).max(5e3).nullable(),
|
|
719
993
|
createdAt: TimestampSchema,
|
|
720
994
|
updatedAt: TimestampSchema,
|
|
721
995
|
completedAt: TimestampSchema.nullable()
|
|
722
996
|
}).strict();
|
|
723
|
-
var TrainingJobPageSchema =
|
|
724
|
-
schemaVersion:
|
|
725
|
-
jobs:
|
|
726
|
-
nextCursor:
|
|
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()
|
|
727
1001
|
}).strict();
|
|
728
|
-
var TrainingJobEventSchema =
|
|
729
|
-
schemaVersion:
|
|
1002
|
+
var TrainingJobEventSchema = z12.object({
|
|
1003
|
+
schemaVersion: z12.literal("openpond.trainingJobEvent.v2"),
|
|
730
1004
|
id: IdSchema3,
|
|
731
1005
|
jobId: IdSchema3,
|
|
732
|
-
sequence:
|
|
1006
|
+
sequence: z12.number().int().nonnegative(),
|
|
733
1007
|
type: IdSchema3,
|
|
734
|
-
phase:
|
|
735
|
-
message:
|
|
736
|
-
data:
|
|
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({}),
|
|
737
1011
|
createdAt: TimestampSchema
|
|
738
1012
|
}).strict();
|
|
739
|
-
var TrainingJobLogSchema =
|
|
740
|
-
schemaVersion:
|
|
1013
|
+
var TrainingJobLogSchema = z12.object({
|
|
1014
|
+
schemaVersion: z12.literal("openpond.trainingJobLog.v2"),
|
|
741
1015
|
jobId: IdSchema3,
|
|
742
|
-
sequence:
|
|
743
|
-
level:
|
|
744
|
-
message:
|
|
1016
|
+
sequence: z12.number().int().nonnegative(),
|
|
1017
|
+
level: z12.enum(["debug", "info", "warning", "error"]),
|
|
1018
|
+
message: z12.string().max(2e4),
|
|
745
1019
|
createdAt: TimestampSchema
|
|
746
1020
|
}).strict();
|
|
747
|
-
var TrainingJobControlRequestSchema =
|
|
748
|
-
var TrainingJobOutputSchema =
|
|
749
|
-
schemaVersion:
|
|
1021
|
+
var TrainingJobControlRequestSchema = z12.object({ expectedVersion: z12.number().int().nonnegative() }).strict();
|
|
1022
|
+
var TrainingJobOutputSchema = z12.object({
|
|
1023
|
+
schemaVersion: z12.literal("openpond.trainingJobOutput.v2"),
|
|
750
1024
|
id: IdSchema3,
|
|
751
1025
|
jobId: IdSchema3,
|
|
752
|
-
kind:
|
|
753
|
-
artifactRef:
|
|
1026
|
+
kind: z12.enum(["checkpoint", "adapter", "scorer", "metrics", "evaluation", "trace", "receipt"]),
|
|
1027
|
+
artifactRef: z12.string().trim().min(1).max(2e3),
|
|
754
1028
|
contentHash: HashSchema3,
|
|
755
|
-
sizeBytes:
|
|
756
|
-
metadata:
|
|
1029
|
+
sizeBytes: z12.number().int().nonnegative(),
|
|
1030
|
+
metadata: z12.record(z12.string(), z12.unknown()).default({}),
|
|
757
1031
|
createdAt: TimestampSchema
|
|
758
1032
|
}).strict();
|
|
759
|
-
var TrainingQualificationEvidenceSchema =
|
|
760
|
-
schemaVersion:
|
|
1033
|
+
var TrainingQualificationEvidenceSchema = z12.object({
|
|
1034
|
+
schemaVersion: z12.literal("openpond.trainingQualificationEvidence.v1"),
|
|
761
1035
|
baseModel: TrainingQualificationBaseModelSchema,
|
|
762
1036
|
group: ModelProjectImmutableRefSchema,
|
|
763
|
-
rolloutReceipts:
|
|
1037
|
+
rolloutReceipts: z12.array(ModelProjectImmutableRefSchema).min(1).max(1e3),
|
|
764
1038
|
rewardEvidenceHash: HashSchema3,
|
|
765
|
-
groupsCompleted:
|
|
766
|
-
optimizerUpdatesApplied:
|
|
767
|
-
optimizerUpdatesSkipped:
|
|
768
|
-
trainingStepsCreated:
|
|
769
|
-
checkpointsCreated:
|
|
770
|
-
artifactsCreated:
|
|
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)
|
|
771
1045
|
}).strict().superRefine((evidence, context) => {
|
|
772
1046
|
if (new Set(evidence.rolloutReceipts.map((receipt) => receipt.id)).size !== evidence.rolloutReceipts.length) {
|
|
773
1047
|
context.addIssue({ code: "custom", path: ["rolloutReceipts"], message: "Qualification rollout receipt identities must be unique." });
|
|
774
1048
|
}
|
|
775
1049
|
});
|
|
776
|
-
var TrainingExecutionReceiptSchema =
|
|
777
|
-
schemaVersion:
|
|
1050
|
+
var TrainingExecutionReceiptSchema = z12.object({
|
|
1051
|
+
schemaVersion: z12.literal("openpond.trainingExecutionReceipt.v2"),
|
|
778
1052
|
id: IdSchema3,
|
|
779
1053
|
teamId: IdSchema3,
|
|
780
1054
|
jobId: IdSchema3,
|
|
@@ -783,15 +1057,15 @@ var TrainingExecutionReceiptSchema = z8.object({
|
|
|
783
1057
|
recipeHash: HashSchema3,
|
|
784
1058
|
capabilityHash: HashSchema3,
|
|
785
1059
|
runtimeRelease: ModelProjectImmutableRefSchema,
|
|
786
|
-
inputs:
|
|
787
|
-
outputs:
|
|
788
|
-
spendUsd:
|
|
789
|
-
durationSeconds:
|
|
790
|
-
cleanupComplete:
|
|
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(),
|
|
791
1065
|
qualification: TrainingQualificationEvidenceSchema.optional(),
|
|
792
1066
|
issuer: IdSchema3,
|
|
793
1067
|
issuedAt: TimestampSchema,
|
|
794
|
-
signature:
|
|
1068
|
+
signature: z12.string().trim().min(1).max(1e4).nullable()
|
|
795
1069
|
}).strict();
|
|
796
1070
|
async function trainingExecutionReceiptHash(receipt) {
|
|
797
1071
|
return canonicalSha256(TrainingExecutionReceiptSchema.parse(receipt));
|
|
@@ -846,18 +1120,18 @@ async function assertTrainingQualificationReceipt(receipt, expected) {
|
|
|
846
1120
|
throw new OpenPondProtocolError("qualification_updated_artifact", "Qualification must not publish trained artifacts or checkpoints.");
|
|
847
1121
|
}
|
|
848
1122
|
}
|
|
849
|
-
var TrainingJobOutputsSchema =
|
|
850
|
-
schemaVersion:
|
|
851
|
-
outputs:
|
|
1123
|
+
var TrainingJobOutputsSchema = z12.object({
|
|
1124
|
+
schemaVersion: z12.literal("openpond.trainingJobOutputs.v2"),
|
|
1125
|
+
outputs: z12.array(TrainingJobOutputSchema).max(1e4),
|
|
852
1126
|
receipt: TrainingExecutionReceiptSchema.nullable()
|
|
853
1127
|
}).strict();
|
|
854
|
-
var TrainingApiErrorSchema =
|
|
855
|
-
schemaVersion:
|
|
856
|
-
code:
|
|
857
|
-
message:
|
|
858
|
-
retryable:
|
|
859
|
-
requestId:
|
|
860
|
-
details:
|
|
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({})
|
|
861
1135
|
}).strict();
|
|
862
1136
|
var OpenPondTrainingApiError = class extends Error {
|
|
863
1137
|
status;
|
|
@@ -875,31 +1149,56 @@ var OpenPondTrainingApiError = class extends Error {
|
|
|
875
1149
|
this.details = error.details;
|
|
876
1150
|
}
|
|
877
1151
|
};
|
|
878
|
-
var
|
|
879
|
-
|
|
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")
|
|
1163
|
+
}).strict()
|
|
1164
|
+
}).strict().superRefine((value, context) => {
|
|
1165
|
+
if (new Set(value.supportedRanks).size !== value.supportedRanks.length || value.supportedRanks.some((rank) => rank > value.envelopeRank))
|
|
1166
|
+
context.addIssue({ code: "custom", path: ["supportedRanks"], message: "Supported ranks must be unique and fit the physical adapter envelope." });
|
|
1167
|
+
if (value.supportedRanks.length && !value.qualification)
|
|
1168
|
+
context.addIssue({ code: "custom", path: ["qualification"], message: "Advertised ranks require immutable image qualification evidence." });
|
|
1169
|
+
});
|
|
1170
|
+
function supportsTrainingPolicyLoraRank(capabilities, rank, continuation) {
|
|
1171
|
+
if (!capabilities.supportedRanks.includes(rank)) return false;
|
|
1172
|
+
if (!continuation) return true;
|
|
1173
|
+
return continuation.mode === "residual_append" ? continuation.parentEnabledRank + rank <= capabilities.envelopeRank : continuation.parentEnabledRank === rank;
|
|
1174
|
+
}
|
|
1175
|
+
var TrainingCapabilitiesSchema = z12.object({
|
|
1176
|
+
schemaVersion: z12.literal("openpond.trainingCapabilities.v2"),
|
|
880
1177
|
capabilityHash: HashSchema3,
|
|
881
|
-
jobKinds:
|
|
882
|
-
methods:
|
|
883
|
-
executionModes:
|
|
884
|
-
|
|
885
|
-
|
|
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(),
|
|
1181
|
+
policyLora: TrainingPolicyLoraCapabilitiesSchema.optional(),
|
|
1182
|
+
structuredOutputs: z12.object({
|
|
1183
|
+
capability: z12.literal("work.structured-output.v1"),
|
|
886
1184
|
harnessRuntimeHash: HashSchema3,
|
|
887
1185
|
workHarnessHash: HashSchema3,
|
|
888
1186
|
schemaHash: HashSchema3,
|
|
889
1187
|
artifactHash: HashSchema3,
|
|
890
|
-
invalidDataRejected:
|
|
891
|
-
invalidBytesRejected:
|
|
1188
|
+
invalidDataRejected: z12.literal(true),
|
|
1189
|
+
invalidBytesRejected: z12.literal(true)
|
|
892
1190
|
}).strict().optional(),
|
|
893
|
-
placements:
|
|
894
|
-
controls:
|
|
895
|
-
cancel:
|
|
896
|
-
stopAfterGroup:
|
|
897
|
-
resumeFromCheckpoint:
|
|
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()
|
|
898
1196
|
}).strict(),
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
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()
|
|
903
1202
|
}).strict(),
|
|
904
1203
|
checkedAt: TimestampSchema,
|
|
905
1204
|
expiresAt: TimestampSchema
|
|
@@ -953,6 +1252,7 @@ function createTrainingClient(input) {
|
|
|
953
1252
|
return {
|
|
954
1253
|
postTraining: createPostTrainingClient({ request }),
|
|
955
1254
|
...createTrainingPreparationClient(request),
|
|
1255
|
+
...createTrainingEstimateClient(request),
|
|
956
1256
|
...createTrainingAcceptanceClient(request),
|
|
957
1257
|
...createTrainingHarnessSourceClient(request),
|
|
958
1258
|
...createTrainingCandidateDecisionClient(request),
|
|
@@ -961,6 +1261,9 @@ function createTrainingClient(input) {
|
|
|
961
1261
|
unwrapObject(await request("/v1/training/capabilities"), "capabilities")
|
|
962
1262
|
);
|
|
963
1263
|
},
|
|
1264
|
+
async gpuCatalog() {
|
|
1265
|
+
return TrainingGpuCatalogSchema.parse(unwrapObject(await request("/v1/training/gpu-catalog"), "catalog"));
|
|
1266
|
+
},
|
|
964
1267
|
async stageArtifact(upload) {
|
|
965
1268
|
const parsed = await parseAndVerifyTrainingInputArtifactUpload(upload);
|
|
966
1269
|
return TrainingInputArtifactSchema.parse(
|
|
@@ -991,10 +1294,10 @@ function createTrainingClient(input) {
|
|
|
991
1294
|
parameters.set("modelProjectId", IdSchema3.parse(options.modelProjectId));
|
|
992
1295
|
}
|
|
993
1296
|
if (options.cursor) {
|
|
994
|
-
parameters.set("cursor",
|
|
1297
|
+
parameters.set("cursor", z12.string().trim().min(1).max(2e3).parse(options.cursor));
|
|
995
1298
|
}
|
|
996
1299
|
if (options.limit !== void 0) {
|
|
997
|
-
parameters.set("limit", String(
|
|
1300
|
+
parameters.set("limit", String(z12.number().int().min(1).max(1e3).parse(options.limit)));
|
|
998
1301
|
}
|
|
999
1302
|
const query = parameters.size > 0 ? `?${parameters.toString()}` : "";
|
|
1000
1303
|
return TrainingJobPageSchema.parse(await request(`/v1/training/jobs${query}`));
|
|
@@ -1031,8 +1334,20 @@ function createTrainingClient(input) {
|
|
|
1031
1334
|
)
|
|
1032
1335
|
);
|
|
1033
1336
|
},
|
|
1337
|
+
async recoverCheckpoint(jobId, input2) {
|
|
1338
|
+
const recovery = TrainingCheckpointRecoveryRequestSchema.parse(input2);
|
|
1339
|
+
if (recovery.resourceApproval) {
|
|
1340
|
+
const { approvalHash, ...body } = recovery.resourceApproval;
|
|
1341
|
+
if (body.sourceJobId !== jobId || await canonicalSha256(body) !== approvalHash)
|
|
1342
|
+
throw new OpenPondProtocolError("content_hash_mismatch", "Recovery resource approval does not bind this source request.");
|
|
1343
|
+
}
|
|
1344
|
+
return TrainingJobSchema.parse(unwrapObject(await request(
|
|
1345
|
+
`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/recover`,
|
|
1346
|
+
{ method: "POST", body: JSON.stringify(recovery) }
|
|
1347
|
+
), "job"));
|
|
1348
|
+
},
|
|
1034
1349
|
async events(jobId) {
|
|
1035
|
-
return
|
|
1350
|
+
return z12.array(TrainingJobEventSchema).parse(
|
|
1036
1351
|
unwrapObject(
|
|
1037
1352
|
await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/events`),
|
|
1038
1353
|
"events"
|
|
@@ -1045,24 +1360,24 @@ function createTrainingClient(input) {
|
|
|
1045
1360
|
);
|
|
1046
1361
|
},
|
|
1047
1362
|
async evaluationTasks(jobId, evaluation, options = {}) {
|
|
1048
|
-
const
|
|
1363
|
+
const id2 = IdSchema3.parse(jobId);
|
|
1049
1364
|
const reference = ModelProjectImmutableRefSchema.parse(evaluation);
|
|
1050
1365
|
const parameters = new URLSearchParams();
|
|
1051
|
-
const cursor = options.cursor === void 0 ? void 0 :
|
|
1052
|
-
const offset = cursor === void 0 ? 0 :
|
|
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));
|
|
1053
1368
|
if (cursor !== void 0) parameters.set("cursor", cursor);
|
|
1054
1369
|
if (options.limit !== void 0)
|
|
1055
|
-
parameters.set("limit", String(
|
|
1370
|
+
parameters.set("limit", String(z12.number().int().min(1).max(100).parse(options.limit)));
|
|
1056
1371
|
const query = parameters.size ? `?${parameters.toString()}` : "";
|
|
1057
1372
|
return parseAndVerifyTrainingEvaluationTaskPage(
|
|
1058
1373
|
await request(
|
|
1059
|
-
`/v1/training/jobs/${encodeURIComponent(
|
|
1374
|
+
`/v1/training/jobs/${encodeURIComponent(id2)}/evaluations/${encodeURIComponent(reference.id)}/tasks${query}`
|
|
1060
1375
|
),
|
|
1061
|
-
{ jobId:
|
|
1376
|
+
{ jobId: id2, evaluation: reference, offset }
|
|
1062
1377
|
);
|
|
1063
1378
|
},
|
|
1064
1379
|
async logs(jobId) {
|
|
1065
|
-
return
|
|
1380
|
+
return z12.array(TrainingJobLogSchema).max(1e5).parse(
|
|
1066
1381
|
unwrapObject(
|
|
1067
1382
|
await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/logs`),
|
|
1068
1383
|
"logs"
|
|
@@ -1101,6 +1416,10 @@ export {
|
|
|
1101
1416
|
TrainingAcceptanceGroupSummarySchema,
|
|
1102
1417
|
TrainingAcceptanceGroupPageSchema,
|
|
1103
1418
|
TrainingAcceptanceGroupQuerySchema,
|
|
1419
|
+
TrainingCheckpointRecoveryResourceApprovalSchema,
|
|
1420
|
+
createTrainingCheckpointRecoveryResourceApproval,
|
|
1421
|
+
TrainingCheckpointRecoveryRequestSchema,
|
|
1422
|
+
TrainingPhysicalPlacementSchema,
|
|
1104
1423
|
TrainingPreparationRequestSchema,
|
|
1105
1424
|
TrainingPreparationPlanContentSchema,
|
|
1106
1425
|
TrainingPreparationPlanSchema,
|
|
@@ -1109,6 +1428,12 @@ export {
|
|
|
1109
1428
|
TrainingPreparationListQuerySchema,
|
|
1110
1429
|
TrainingPreparationPageSchema,
|
|
1111
1430
|
parseAndVerifyTrainingPreparationReceipt,
|
|
1431
|
+
TrainingEstimateSourceSchema,
|
|
1432
|
+
TrainingEstimateRequestSchema,
|
|
1433
|
+
TrainingEstimateComponentSchema,
|
|
1434
|
+
trainingEstimateSourceIdentity,
|
|
1435
|
+
TrainingEstimateSchema,
|
|
1436
|
+
TrainingQueueStatusSchema,
|
|
1112
1437
|
TrainingHarnessSourcePublicationSchema,
|
|
1113
1438
|
TrainingCandidateDecisionRequestSchema,
|
|
1114
1439
|
TrainingCandidateDecisionSchema,
|
|
@@ -1139,6 +1464,7 @@ export {
|
|
|
1139
1464
|
TrainingJobSubmissionSchema,
|
|
1140
1465
|
trainingJobSubmissionHash,
|
|
1141
1466
|
parseAndVerifyTrainingJobSubmission,
|
|
1467
|
+
TrainingJobRecoverySchema,
|
|
1142
1468
|
TrainingJobSchema,
|
|
1143
1469
|
TrainingJobPageSchema,
|
|
1144
1470
|
TrainingJobEventSchema,
|
|
@@ -1153,7 +1479,9 @@ export {
|
|
|
1153
1479
|
TrainingJobOutputsSchema,
|
|
1154
1480
|
TrainingApiErrorSchema,
|
|
1155
1481
|
OpenPondTrainingApiError,
|
|
1482
|
+
TrainingPolicyLoraCapabilitiesSchema,
|
|
1483
|
+
supportsTrainingPolicyLoraRank,
|
|
1156
1484
|
TrainingCapabilitiesSchema,
|
|
1157
1485
|
createTrainingClient
|
|
1158
1486
|
};
|
|
1159
|
-
//# sourceMappingURL=chunk-
|
|
1487
|
+
//# sourceMappingURL=chunk-Z4XGSEKC.js.map
|