openpond-sdk 0.12.9 → 0.12.11
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/README.md +2 -0
- package/TRAINING_PROTOCOL.md +40 -0
- package/dist/advanced-refiner-evaluations.js +8 -7
- package/dist/candidate-evaluations.js +7 -6
- package/dist/{chunk-TWJYL5YF.js → chunk-2LVR24GU.js} +5 -5
- package/dist/{chunk-MRUDFIB6.js → chunk-7BYLH47N.js} +6 -4
- package/dist/{chunk-MRUDFIB6.js.map → chunk-7BYLH47N.js.map} +1 -1
- package/dist/chunk-B3ZHJ2KK.js +152 -0
- package/dist/chunk-B3ZHJ2KK.js.map +1 -0
- package/dist/{chunk-D3WOJTUY.js → chunk-C3TS766N.js} +24 -87
- package/dist/chunk-C3TS766N.js.map +1 -0
- package/dist/{chunk-WYR3MZHU.js → chunk-C4W2MEFP.js} +2 -2
- package/dist/{chunk-GGG6H4MK.js → chunk-CNREFTAV.js} +2 -2
- package/dist/chunk-EZME7DV4.js +161 -0
- package/dist/chunk-EZME7DV4.js.map +1 -0
- package/dist/{chunk-IOZCYSJ6.js → chunk-GHPCQXG5.js} +2 -2
- package/dist/{chunk-EYMZQML2.js → chunk-GJRXJL6G.js} +525 -484
- package/dist/chunk-GJRXJL6G.js.map +1 -0
- package/dist/chunk-GX6KMHW2.js +108 -0
- package/dist/chunk-GX6KMHW2.js.map +1 -0
- package/dist/{chunk-BWFG46HX.js → chunk-HAQPGTQ4.js} +2 -2
- package/dist/{chunk-RFKZSSLB.js → chunk-IFBCLRBM.js} +5 -3
- package/dist/{chunk-RFKZSSLB.js.map → chunk-IFBCLRBM.js.map} +1 -1
- package/dist/chunk-IZ26ZCGU.js +65 -0
- package/dist/chunk-IZ26ZCGU.js.map +1 -0
- package/dist/{chunk-EEZ5YHJQ.js → chunk-JBYFD3QS.js} +3 -3
- package/dist/{chunk-U4QIGSP5.js → chunk-JDQVAG3R.js} +3 -3
- package/dist/{chunk-UWM2ZPGS.js → chunk-K54BDIKL.js} +3 -3
- package/dist/{chunk-QVLJFJBU.js → chunk-KOJC3TH4.js} +6 -6
- package/dist/{chunk-YP5DXGGC.js → chunk-LHHHJIDR.js} +2 -2
- package/dist/{chunk-UMK6DH75.js → chunk-NKF5NIML.js} +7 -5
- package/dist/{chunk-UMK6DH75.js.map → chunk-NKF5NIML.js.map} +1 -1
- package/dist/{chunk-LUFOAMN5.js → chunk-O3NOGKMT.js} +2 -2
- package/dist/{chunk-GZSQIOAH.js → chunk-ORYA2G7S.js} +6 -6
- package/dist/{chunk-XL44IXBO.js → chunk-RIN6Z56W.js} +5 -5
- package/dist/{chunk-CJDEVI3T.js → chunk-RLW4Y5ZV.js} +5 -3
- package/dist/{chunk-CJDEVI3T.js.map → chunk-RLW4Y5ZV.js.map} +1 -1
- package/dist/{chunk-QHCY4MBG.js → chunk-TLSP5JKG.js} +2 -2
- package/dist/chunk-U2KGUAIS.js +18 -0
- package/dist/chunk-U2KGUAIS.js.map +1 -0
- package/dist/{chunk-YSEYPMQ3.js → chunk-UOV2LEXS.js} +12 -154
- package/dist/chunk-UOV2LEXS.js.map +1 -0
- package/dist/{chunk-CZXN63A4.js → chunk-UWY5PUHR.js} +2 -2
- package/dist/{chunk-HYCHLMP7.js → chunk-XMVSQIK4.js} +2 -2
- package/dist/{chunk-TZREEZ4C.js → chunk-XRBM6PBD.js} +9 -9
- package/dist/{chunk-MGFI4226.js → chunk-YIGFQWZV.js} +3 -3
- package/dist/{chunk-EWRWGFKD.js → chunk-ZYDDHHZZ.js} +6 -4
- package/dist/{chunk-EWRWGFKD.js.map → chunk-ZYDDHHZZ.js.map} +1 -1
- package/dist/connected-evidence.js +18 -15
- package/dist/dataset-workspaces.js +21 -18
- package/dist/dataset-workspaces.js.map +1 -1
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/experiment-evaluation-schedules.js +22 -19
- package/dist/experiment-improvements.js +9 -8
- package/dist/experiments.js +22 -19
- package/dist/index.js +64 -58
- package/dist/index.js.map +1 -1
- package/dist/learning.js +9 -5
- package/dist/learning.js.map +1 -1
- package/dist/model-projects.js +6 -4
- package/dist/model-starter-attempts.js +3 -2
- package/dist/model-starter-catalog.js +13 -10
- package/dist/model-starter-catalog.js.map +1 -1
- package/dist/model-starters.js +13 -10
- package/dist/model-taskset-runs.js +5 -4
- package/dist/model-taskset-runs.js.map +1 -1
- package/dist/post-training.js +7 -6
- package/dist/taskset-drafts.js +17 -14
- package/dist/taskset-drafts.js.map +1 -1
- package/dist/taskset-packages.js +24 -21
- package/dist/tool-learning-local-store.js +355 -0
- package/dist/tool-learning-local-store.js.map +1 -0
- package/dist/tool-learning.js +414 -0
- package/dist/tool-learning.js.map +1 -0
- package/dist/training-bundle.js +31 -16
- package/dist/training-bundle.js.map +1 -1
- package/dist/training-hardware.js +23 -0
- package/dist/training-hardware.js.map +1 -0
- package/dist/training.js +31 -13
- package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +40 -40
- package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts +20 -20
- package/dist/types/packages/sdk/src/errors.d.ts +3 -0
- package/dist/types/packages/sdk/src/errors.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/experiment-client.d.ts +636 -636
- package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1622 -1622
- package/dist/types/packages/sdk/src/experiment-run-details.d.ts +54 -54
- package/dist/types/packages/sdk/src/learning-client.d.ts +1 -6
- package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/learning-error.d.ts +7 -0
- package/dist/types/packages/sdk/src/learning-error.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +2 -0
- package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-projects.d.ts +24 -0
- package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/model-starters.d.ts +6 -0
- package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/post-training.d.ts +58 -54
- package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +20 -20
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2 -0
- package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-package-client.d.ts +6 -0
- package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
- package/dist/types/packages/sdk/src/tool-learning-client.d.ts +1217 -0
- package/dist/types/packages/sdk/src/tool-learning-client.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts +140 -0
- package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/tool-learning.d.ts +4 -0
- package/dist/types/packages/sdk/src/tool-learning.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-compute-selection.d.ts +2 -0
- package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-estimates.d.ts +9 -1
- package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-hardware.d.ts +886 -0
- package/dist/types/packages/sdk/src/training-hardware.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-preparations.d.ts +22 -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 +2 -0
- package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
- package/dist/types/packages/sdk/src/training-supervised.d.ts +101 -0
- package/dist/types/packages/sdk/src/training-supervised.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training-transport.d.ts +24 -0
- package/dist/types/packages/sdk/src/training-transport.d.ts.map +1 -0
- package/dist/types/packages/sdk/src/training.d.ts +34 -16
- package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
- package/package.json +18 -2
- package/dist/chunk-D3WOJTUY.js.map +0 -1
- package/dist/chunk-EYMZQML2.js.map +0 -1
- package/dist/chunk-YSEYPMQ3.js.map +0 -1
- /package/dist/{chunk-TWJYL5YF.js.map → chunk-2LVR24GU.js.map} +0 -0
- /package/dist/{chunk-WYR3MZHU.js.map → chunk-C4W2MEFP.js.map} +0 -0
- /package/dist/{chunk-GGG6H4MK.js.map → chunk-CNREFTAV.js.map} +0 -0
- /package/dist/{chunk-IOZCYSJ6.js.map → chunk-GHPCQXG5.js.map} +0 -0
- /package/dist/{chunk-BWFG46HX.js.map → chunk-HAQPGTQ4.js.map} +0 -0
- /package/dist/{chunk-EEZ5YHJQ.js.map → chunk-JBYFD3QS.js.map} +0 -0
- /package/dist/{chunk-U4QIGSP5.js.map → chunk-JDQVAG3R.js.map} +0 -0
- /package/dist/{chunk-UWM2ZPGS.js.map → chunk-K54BDIKL.js.map} +0 -0
- /package/dist/{chunk-QVLJFJBU.js.map → chunk-KOJC3TH4.js.map} +0 -0
- /package/dist/{chunk-YP5DXGGC.js.map → chunk-LHHHJIDR.js.map} +0 -0
- /package/dist/{chunk-LUFOAMN5.js.map → chunk-O3NOGKMT.js.map} +0 -0
- /package/dist/{chunk-GZSQIOAH.js.map → chunk-ORYA2G7S.js.map} +0 -0
- /package/dist/{chunk-XL44IXBO.js.map → chunk-RIN6Z56W.js.map} +0 -0
- /package/dist/{chunk-QHCY4MBG.js.map → chunk-TLSP5JKG.js.map} +0 -0
- /package/dist/{chunk-CZXN63A4.js.map → chunk-UWY5PUHR.js.map} +0 -0
- /package/dist/{chunk-HYCHLMP7.js.map → chunk-XMVSQIK4.js.map} +0 -0
- /package/dist/{chunk-TZREEZ4C.js.map → chunk-XRBM6PBD.js.map} +0 -0
- /package/dist/{chunk-MGFI4226.js.map → chunk-YIGFQWZV.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-
|
|
10
|
+
} from "./chunk-7BYLH47N.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
|
-
|
|
20
|
+
TrainingEstimateReviewSchema,
|
|
21
|
+
TrainingGpuCatalogSchema,
|
|
22
|
+
TrainingGpuSelectionSchema
|
|
23
|
+
} from "./chunk-UOV2LEXS.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
|
-
|
|
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-
|
|
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
|
|
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:
|
|
37
|
-
jobId:
|
|
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:
|
|
128
|
+
updatedAt: z2.string().datetime()
|
|
43
129
|
}).strict();
|
|
44
|
-
var TrainingAcceptanceGroupPageSchema =
|
|
45
|
-
schemaVersion:
|
|
46
|
-
teamId:
|
|
47
|
-
jobId:
|
|
48
|
-
groups:
|
|
49
|
-
nextCursor:
|
|
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 =
|
|
52
|
-
cursor:
|
|
53
|
-
limit:
|
|
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
|
-
|
|
58
|
-
return `/v1/training/jobs/${encodeURIComponent(
|
|
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(
|
|
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
|
|
169
|
+
import { z as z13 } from "zod";
|
|
84
170
|
|
|
85
171
|
// src/training-recovery.ts
|
|
86
|
-
import { z as
|
|
87
|
-
var id =
|
|
88
|
-
var hash =
|
|
89
|
-
var ApprovalBodySchema =
|
|
90
|
-
schemaVersion:
|
|
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:
|
|
180
|
+
sourceJobVersion: z3.number().int().positive(),
|
|
95
181
|
sourceInputManifestSha256: hash,
|
|
96
182
|
checkpointId: id,
|
|
97
183
|
adapterSha256: hash,
|
|
98
184
|
resumeSha256: hash,
|
|
99
|
-
idempotencyKey:
|
|
100
|
-
approvedAt:
|
|
101
|
-
maximumSpendUsd:
|
|
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:
|
|
106
|
-
maximumWallSeconds:
|
|
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 =
|
|
211
|
+
var TrainingCheckpointRecoveryRequestSchema = z3.object({
|
|
126
212
|
resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
|
|
127
|
-
mode:
|
|
128
|
-
evaluationGpuType:
|
|
129
|
-
expectedVersion:
|
|
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:
|
|
132
|
-
maximumSpendUsd:
|
|
133
|
-
maximumWallSeconds:
|
|
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
|
|
152
|
-
var TrainingPhysicalPlacementSchema =
|
|
153
|
-
mode:
|
|
154
|
-
physicalWorkerId:
|
|
155
|
-
providerPodId:
|
|
156
|
-
workerImageDigest:
|
|
157
|
-
baseProfileSha256:
|
|
158
|
-
gpuType:
|
|
159
|
-
sourceJobId:
|
|
160
|
-
sourceInputManifestSha256:
|
|
161
|
-
ownerTeamId:
|
|
162
|
-
deadlineAt:
|
|
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
|
|
167
|
-
var
|
|
168
|
-
var
|
|
169
|
-
var TrainingPreparationRequestSchema =
|
|
170
|
-
schemaVersion:
|
|
171
|
-
teamId:
|
|
172
|
-
operationId:
|
|
173
|
-
projectId:
|
|
174
|
-
configuration:
|
|
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:
|
|
178
|
-
maximumSpendUsd:
|
|
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 =
|
|
183
|
-
schemaVersion:
|
|
184
|
-
id:
|
|
185
|
-
creatorUserId:
|
|
268
|
+
var TrainingPreparationPlanContentSchema = z5.object({
|
|
269
|
+
schemaVersion: z5.literal("openpond.trainingPreparationPlan.v1"),
|
|
270
|
+
id: Id3,
|
|
271
|
+
creatorUserId: Id3,
|
|
186
272
|
request: TrainingPreparationRequestSchema,
|
|
187
|
-
requestHash:
|
|
188
|
-
source:
|
|
189
|
-
submissionHash:
|
|
190
|
-
createdAt:
|
|
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:
|
|
279
|
+
contentHash: Hash2
|
|
194
280
|
}).strict();
|
|
195
|
-
var TrainingPreparationReceiptSchema =
|
|
196
|
-
schemaVersion:
|
|
281
|
+
var TrainingPreparationReceiptSchema = z5.object({
|
|
282
|
+
schemaVersion: z5.literal("openpond.trainingPreparationReceipt.v1"),
|
|
197
283
|
plan: TrainingPreparationPlanSchema,
|
|
198
|
-
revision:
|
|
199
|
-
state:
|
|
200
|
-
jobId:
|
|
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 =
|
|
210
|
-
teamId:
|
|
211
|
-
planHash:
|
|
212
|
-
expectedRevision:
|
|
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 =
|
|
216
|
-
projectId:
|
|
217
|
-
state:
|
|
218
|
-
afterId:
|
|
219
|
-
limit:
|
|
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 =
|
|
222
|
-
schemaVersion:
|
|
223
|
-
teamId:
|
|
224
|
-
items:
|
|
225
|
-
nextCursor:
|
|
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 =
|
|
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(
|
|
297
|
-
|
|
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(
|
|
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(
|
|
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
|
|
340
|
-
var
|
|
341
|
-
var
|
|
342
|
-
var Timestamp =
|
|
343
|
-
var NonNegative =
|
|
344
|
-
var TrainingEstimateSourceSchema =
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
kind:
|
|
348
|
-
id:
|
|
349
|
-
expectedRevision:
|
|
350
|
-
expectedEtag:
|
|
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
|
-
|
|
439
|
+
z6.object({ kind: z6.literal("submission"), submission: z6.lazy(() => TrainingJobSubmissionSchema) }).strict()
|
|
354
440
|
]);
|
|
355
|
-
var TrainingEstimateRequestSchema =
|
|
356
|
-
schemaVersion:
|
|
357
|
-
teamId:
|
|
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 =
|
|
362
|
-
var TrainingEstimateComponentSchema =
|
|
363
|
-
phase:
|
|
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:
|
|
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:
|
|
380
|
-
reason:
|
|
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 =
|
|
398
|
-
schemaVersion:
|
|
399
|
-
id:
|
|
400
|
-
teamId:
|
|
401
|
-
requestHash:
|
|
402
|
-
inputHash:
|
|
403
|
-
source:
|
|
404
|
-
kind:
|
|
405
|
-
id:
|
|
406
|
-
contentHash:
|
|
407
|
-
revision:
|
|
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:
|
|
410
|
-
currency:
|
|
495
|
+
status: z6.enum(["available", "partial", "insufficient_evidence"]),
|
|
496
|
+
currency: z6.literal("USD"),
|
|
411
497
|
createdAt: Timestamp,
|
|
412
498
|
expiresAt: Timestamp,
|
|
413
|
-
estimatorVersion:
|
|
414
|
-
runtimeVersion:
|
|
415
|
-
pricing:
|
|
416
|
-
gpu:
|
|
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:
|
|
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:
|
|
506
|
+
availability: z6.enum(["available", "limited", "unavailable", "unknown"])
|
|
421
507
|
}).strict(),
|
|
422
|
-
configuration:
|
|
423
|
-
modelId:
|
|
424
|
-
modelRevision:
|
|
425
|
-
method:
|
|
426
|
-
loraRank:
|
|
427
|
-
adapterMode:
|
|
428
|
-
groups:
|
|
429
|
-
rolloutConcurrency:
|
|
430
|
-
maxOutputTokens:
|
|
431
|
-
trainingRows:
|
|
432
|
-
evaluationRows:
|
|
433
|
-
retentionDays:
|
|
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:
|
|
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:
|
|
528
|
+
components: z6.array(TrainingEstimateComponentSchema).max(50)
|
|
443
529
|
}).strict(),
|
|
444
|
-
executionSeconds:
|
|
445
|
-
queueWaitSeconds:
|
|
446
|
-
calibration:
|
|
447
|
-
version:
|
|
448
|
-
cohortHash:
|
|
449
|
-
completedSamples:
|
|
450
|
-
partialSamples:
|
|
451
|
-
scope:
|
|
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:
|
|
454
|
-
unknowns:
|
|
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
|
|
489
|
-
var Timestamp2 =
|
|
490
|
-
var TrainingQueueStatusSchema =
|
|
491
|
-
ticketId:
|
|
492
|
-
ticketNumber:
|
|
493
|
-
label:
|
|
494
|
-
position:
|
|
495
|
-
positionScope:
|
|
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:
|
|
499
|
-
revision:
|
|
587
|
+
estimate: z7.object({
|
|
588
|
+
revision: z7.number().int().nonnegative(),
|
|
500
589
|
estimatedStartAt: Timestamp2,
|
|
501
590
|
expiresAt: Timestamp2,
|
|
502
|
-
evidence:
|
|
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
|
|
511
|
-
var TrainingHarnessSourcePublicationSchema =
|
|
512
|
-
schemaVersion:
|
|
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:
|
|
515
|
-
sizeBytes:
|
|
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
|
|
549
|
-
var IdSchema = /* @__PURE__ */ (() =>
|
|
550
|
-
var HashSchema = /* @__PURE__ */ (() =>
|
|
551
|
-
var TrainingCandidateDecisionRequestSchema = /* @__PURE__ */ (() =>
|
|
552
|
-
schemaVersion:
|
|
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:
|
|
559
|
-
reason:
|
|
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__ */ (() =>
|
|
564
|
-
schemaVersion:
|
|
652
|
+
var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() => z9.object({
|
|
653
|
+
schemaVersion: z9.literal("openpond.trainingCandidateDecision.v1"),
|
|
565
654
|
id: IdSchema,
|
|
566
655
|
request: TrainingCandidateDecisionRequestSchema,
|
|
567
|
-
revision:
|
|
568
|
-
actor:
|
|
569
|
-
decidedAt:
|
|
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 =
|
|
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
|
|
624
|
-
var IdSchema2 = /* @__PURE__ */ (() =>
|
|
625
|
-
var HashSchema2 = /* @__PURE__ */ (() =>
|
|
626
|
-
var TrainingEvaluationTaskResultSchema = /* @__PURE__ */ (() =>
|
|
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:
|
|
631
|
-
instruction:
|
|
632
|
-
context:
|
|
719
|
+
input: z10.object({
|
|
720
|
+
instruction: z10.string().max(1e6),
|
|
721
|
+
context: z10.record(z10.string(), z10.unknown())
|
|
633
722
|
}).strict(),
|
|
634
|
-
output:
|
|
723
|
+
output: z10.string().max(1e6),
|
|
635
724
|
outputSha256: HashSchema2,
|
|
636
|
-
score:
|
|
637
|
-
evidence:
|
|
638
|
-
kind:
|
|
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__ */ (() =>
|
|
643
|
-
schemaVersion:
|
|
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:
|
|
648
|
-
policyVersion:
|
|
736
|
+
kind: z10.enum(["baseline", "candidate"]),
|
|
737
|
+
policyVersion: z10.number().int().nonnegative(),
|
|
649
738
|
taskset: ModelProjectVersionedRefSchema,
|
|
650
739
|
panelSha256: HashSchema2,
|
|
651
|
-
offset:
|
|
652
|
-
total:
|
|
653
|
-
tasks:
|
|
654
|
-
nextCursor:
|
|
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
|
|
778
|
+
import { z as z11 } from "zod";
|
|
690
779
|
import { compileBoundGraders, RewardBindingSchema, RewardReleaseSchema } from "@openpond/evals/rewards";
|
|
691
|
-
var GradersSchema =
|
|
692
|
-
var RewardExecutionSchema =
|
|
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:
|
|
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
|
|
800
|
+
import { z as z12 } from "zod";
|
|
712
801
|
var TRAINING_EVALUATION_SOURCE_PATH = "evaluation-source.json";
|
|
713
|
-
var TaskIdentitySchema =
|
|
714
|
-
id:
|
|
715
|
-
clusterKey:
|
|
716
|
-
split:
|
|
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 =
|
|
719
|
-
schemaVersion:
|
|
807
|
+
var TrainingEvaluationSourceSchema = z12.object({
|
|
808
|
+
schemaVersion: z12.literal("openpond.trainingEvaluationSource.v1"),
|
|
720
809
|
taskset: ModelProjectVersionedRefSchema,
|
|
721
|
-
tasks:
|
|
722
|
-
assets:
|
|
723
|
-
path:
|
|
724
|
-
sha256:
|
|
725
|
-
sizeBytes:
|
|
726
|
-
encoding:
|
|
727
|
-
content:
|
|
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 =
|
|
739
|
-
const evaluation =
|
|
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 =
|
|
766
|
-
var HashSchema3 =
|
|
767
|
-
var TimestampSchema =
|
|
768
|
-
var TrainingInputArtifactUploadSchema =
|
|
769
|
-
schemaVersion:
|
|
770
|
-
kind:
|
|
771
|
-
idempotencyKey:
|
|
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:
|
|
862
|
+
payload: z13.unknown(),
|
|
774
863
|
contentHash: HashSchema3
|
|
775
864
|
}).strict();
|
|
776
|
-
var TrainingInputArtifactSchema =
|
|
777
|
-
schemaVersion:
|
|
778
|
-
kind:
|
|
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:
|
|
869
|
+
artifactRef: z13.string().trim().min(1).max(2e3),
|
|
781
870
|
contentHash: HashSchema3,
|
|
782
|
-
sizeBytes:
|
|
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 =
|
|
802
|
-
var TrainingJobStateSchema =
|
|
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 =
|
|
902
|
+
var TrainingCapabilityRequirementSchema = z13.object({
|
|
814
903
|
id: IdSchema3,
|
|
815
|
-
version:
|
|
816
|
-
required:
|
|
904
|
+
version: z13.string().trim().min(1).max(200).nullable().default(null),
|
|
905
|
+
required: z13.boolean().default(true)
|
|
817
906
|
}).strict();
|
|
818
|
-
var TrainingJobSourceSchema =
|
|
907
|
+
var TrainingJobSourceSchema = z13.object({
|
|
819
908
|
origin: TrainingHandoffOriginSchema.optional(),
|
|
820
|
-
modelProject:
|
|
909
|
+
modelProject: z13.object({
|
|
821
910
|
id: IdSchema3,
|
|
822
911
|
portableProjectId: IdSchema3,
|
|
823
|
-
revision:
|
|
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:
|
|
919
|
+
evaluation: z13.object({
|
|
831
920
|
taskset: ModelProjectVersionedRefSchema,
|
|
832
921
|
dataset: ModelProjectImmutableRefSchema
|
|
833
922
|
}).strict().nullable().optional(),
|
|
834
923
|
dataset: ModelProjectImmutableRefSchema,
|
|
835
|
-
evidenceSets:
|
|
924
|
+
evidenceSets: z13.array(ModelProjectImmutableRefSchema).max(1e4)
|
|
836
925
|
}).strict();
|
|
837
|
-
var RewardModelTrainingRequestSchema =
|
|
838
|
-
kind:
|
|
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:
|
|
843
|
-
schemaVersion:
|
|
844
|
-
method:
|
|
845
|
-
parameterization:
|
|
846
|
-
}).catchall(
|
|
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 =
|
|
849
|
-
kind:
|
|
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 =
|
|
854
|
-
kind:
|
|
942
|
+
var LearnedRewardSourceSchema = z13.object({
|
|
943
|
+
kind: z13.literal("learned_reward"),
|
|
855
944
|
rewardModelVersion: ModelProjectImmutableRefSchema,
|
|
856
945
|
qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),
|
|
857
|
-
evaluationReferences:
|
|
858
|
-
scorerArtifact:
|
|
859
|
-
artifactRef:
|
|
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:
|
|
868
|
-
tokenizerRevision:
|
|
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 =
|
|
872
|
-
kind:
|
|
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:
|
|
963
|
+
executionMode: z13.literal("qualification").optional(),
|
|
875
964
|
baseModel: ModelProjectBaseModelSchema,
|
|
876
965
|
recipe: ModelProjectRecipeDocumentSchema,
|
|
877
|
-
rewardSource:
|
|
966
|
+
rewardSource: z13.discriminatedUnion("kind", [
|
|
878
967
|
DeterministicRewardSourceSchema,
|
|
879
968
|
LearnedRewardSourceSchema
|
|
880
969
|
]),
|
|
881
970
|
resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null)
|
|
882
|
-
}).strict()
|
|
883
|
-
|
|
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 =
|
|
998
|
+
var TrainingJobApprovalSchema = z13.object({
|
|
888
999
|
approvalHash: HashSchema3,
|
|
889
1000
|
approvedAt: TimestampSchema,
|
|
890
|
-
exportApproved:
|
|
891
|
-
maximumSpendUsd:
|
|
892
|
-
retentionDays:
|
|
893
|
-
region:
|
|
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 =
|
|
896
|
-
schemaVersion:
|
|
897
|
-
idempotencyKey:
|
|
898
|
-
name:
|
|
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:
|
|
902
|
-
placementObjective:
|
|
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:
|
|
906
|
-
maximumSpendUsd:
|
|
907
|
-
maximumWallSeconds:
|
|
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 =
|
|
1078
|
+
var TrainingJobRecoverySchema = z13.object({
|
|
960
1079
|
resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
|
|
961
|
-
mode:
|
|
962
|
-
trainingWorkloadComplete:
|
|
1080
|
+
mode: z13.literal("evaluation_only").optional(),
|
|
1081
|
+
trainingWorkloadComplete: z13.boolean().optional(),
|
|
963
1082
|
sourceJobId: IdSchema3,
|
|
964
1083
|
checkpointId: IdSchema3,
|
|
965
|
-
policyVersion:
|
|
966
|
-
completedGroups:
|
|
967
|
-
optimizerMode:
|
|
1084
|
+
policyVersion: z13.number().int().positive(),
|
|
1085
|
+
completedGroups: z13.number().int().positive(),
|
|
1086
|
+
optimizerMode: z13.literal("continue")
|
|
968
1087
|
}).strict();
|
|
969
|
-
var TrainingJobSchema =
|
|
970
|
-
schemaVersion:
|
|
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:
|
|
1093
|
+
executionMode: z13.literal("qualification").optional(),
|
|
975
1094
|
recovery: TrainingJobRecoverySchema.optional(),
|
|
976
1095
|
modelProjectId: IdSchema3,
|
|
977
1096
|
portableProjectId: IdSchema3,
|
|
978
|
-
sourceProjectRevision:
|
|
1097
|
+
sourceProjectRevision: z13.number().int().positive(),
|
|
979
1098
|
submissionHash: HashSchema3,
|
|
980
1099
|
state: TrainingJobStateSchema,
|
|
981
1100
|
queue: TrainingQueueStatusSchema.optional(),
|
|
982
|
-
phase:
|
|
983
|
-
version:
|
|
984
|
-
progress:
|
|
985
|
-
rolloutProgress:
|
|
986
|
-
groupsCompleted:
|
|
987
|
-
groupsTarget:
|
|
988
|
-
optimizerUpdatesApplied:
|
|
989
|
-
optimizerUpdatesSkipped:
|
|
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:
|
|
992
|
-
terminalReason:
|
|
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 =
|
|
998
|
-
schemaVersion:
|
|
999
|
-
jobs:
|
|
1000
|
-
nextCursor:
|
|
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 =
|
|
1003
|
-
schemaVersion:
|
|
1121
|
+
var TrainingJobEventSchema = z13.object({
|
|
1122
|
+
schemaVersion: z13.literal("openpond.trainingJobEvent.v2"),
|
|
1004
1123
|
id: IdSchema3,
|
|
1005
1124
|
jobId: IdSchema3,
|
|
1006
|
-
sequence:
|
|
1125
|
+
sequence: z13.number().int().nonnegative(),
|
|
1007
1126
|
type: IdSchema3,
|
|
1008
|
-
phase:
|
|
1009
|
-
message:
|
|
1010
|
-
data:
|
|
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 =
|
|
1014
|
-
schemaVersion:
|
|
1132
|
+
var TrainingJobLogSchema = z13.object({
|
|
1133
|
+
schemaVersion: z13.literal("openpond.trainingJobLog.v2"),
|
|
1015
1134
|
jobId: IdSchema3,
|
|
1016
|
-
sequence:
|
|
1017
|
-
level:
|
|
1018
|
-
message:
|
|
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 =
|
|
1022
|
-
var TrainingJobOutputSchema =
|
|
1023
|
-
schemaVersion:
|
|
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:
|
|
1027
|
-
artifactRef:
|
|
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:
|
|
1030
|
-
metadata:
|
|
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 =
|
|
1034
|
-
schemaVersion:
|
|
1152
|
+
var TrainingQualificationEvidenceSchema = z13.object({
|
|
1153
|
+
schemaVersion: z13.literal("openpond.trainingQualificationEvidence.v1"),
|
|
1035
1154
|
baseModel: TrainingQualificationBaseModelSchema,
|
|
1036
1155
|
group: ModelProjectImmutableRefSchema,
|
|
1037
|
-
rolloutReceipts:
|
|
1156
|
+
rolloutReceipts: z13.array(ModelProjectImmutableRefSchema).min(1).max(1e3),
|
|
1038
1157
|
rewardEvidenceHash: HashSchema3,
|
|
1039
|
-
groupsCompleted:
|
|
1040
|
-
optimizerUpdatesApplied:
|
|
1041
|
-
optimizerUpdatesSkipped:
|
|
1042
|
-
trainingStepsCreated:
|
|
1043
|
-
checkpointsCreated:
|
|
1044
|
-
artifactsCreated:
|
|
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 =
|
|
1051
|
-
schemaVersion:
|
|
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:
|
|
1061
|
-
outputs:
|
|
1062
|
-
spendUsd:
|
|
1063
|
-
durationSeconds:
|
|
1064
|
-
cleanupComplete:
|
|
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:
|
|
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 =
|
|
1124
|
-
schemaVersion:
|
|
1125
|
-
outputs:
|
|
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
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
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 =
|
|
1176
|
-
schemaVersion:
|
|
1270
|
+
var TrainingCapabilitiesSchema = z13.object({
|
|
1271
|
+
schemaVersion: z13.literal("openpond.trainingCapabilities.v2"),
|
|
1177
1272
|
capabilityHash: HashSchema3,
|
|
1178
|
-
jobKinds:
|
|
1179
|
-
methods:
|
|
1180
|
-
executionModes:
|
|
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
|
-
|
|
1183
|
-
capability:
|
|
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:
|
|
1189
|
-
invalidBytesRejected:
|
|
1292
|
+
invalidDataRejected: z13.literal(true),
|
|
1293
|
+
invalidBytesRejected: z13.literal(true)
|
|
1190
1294
|
}).strict().optional(),
|
|
1191
|
-
placements:
|
|
1192
|
-
controls:
|
|
1193
|
-
cancel:
|
|
1194
|
-
stopAfterGroup:
|
|
1195
|
-
resumeFromCheckpoint:
|
|
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:
|
|
1198
|
-
limits:
|
|
1199
|
-
maximumSpendUsd:
|
|
1200
|
-
maximumWallSeconds:
|
|
1201
|
-
maximumArtifactBytes:
|
|
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
|
|
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",
|
|
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(
|
|
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
|
|
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 :
|
|
1367
|
-
const offset = cursor === void 0 ? 0 :
|
|
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(
|
|
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
|
|
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-
|
|
1528
|
+
//# sourceMappingURL=chunk-GJRXJL6G.js.map
|